From 1b0520ae9e0920cdaddc3fe83ef9ebd303ebdd3d Mon Sep 17 00:00:00 2001 From: mtlpst Date: Thu, 25 Apr 2024 16:37:11 +0100 Subject: [PATCH 01/10] Added API examples for IoT ESP project --- IoT/README.md | 10 + .../import-and-publish-projects/README.md | 60 ++ .../import-publish-and-run-projects.ipynb | 580 ++++++++++++++++++ 3 files changed, 650 insertions(+) create mode 100644 IoT/README.md create mode 100644 IoT/python/import-and-publish-projects/README.md create mode 100644 IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb diff --git a/IoT/README.md b/IoT/README.md new file mode 100644 index 0000000..4e846f2 --- /dev/null +++ b/IoT/README.md @@ -0,0 +1,10 @@ +# SAS REST API Examples + +## IoT Event Stream Processing + +This repository contains SAS contributed examples that show the capabilities of the IoT Event Stream Processing REST APIs. + +You are encouraged to contribute your own examples in the [User Contributions repository](../User_and_Aggregated_Samples). + +## Examples +* [Import, publish and run projects on K8s cluster](python/import-and-publish-projects/README.md) diff --git a/IoT/python/import-and-publish-projects/README.md b/IoT/python/import-and-publish-projects/README.md new file mode 100644 index 0000000..bfa093c --- /dev/null +++ b/IoT/python/import-and-publish-projects/README.md @@ -0,0 +1,60 @@ +# Create and Use Asset + +## Overview + +This notebook leverages the IOT ESP API to import, publish and run projects on K8s clusters. + +In this notebook we will loop through all XML projects in xml_projects folder and do the following: +1. Check if projects have already been imported +2. If yes, import it using next version number. Otherwise import it normally with version 1 +3. Make project public so all users can see it +4. Publish project +5. Synchronize projects from Studio to ESM +6. Create ESM Deployment Cluster on which to run the projects +7. Start projects on K8s cluster on ESM + +## Prerequisites + +#### XML Projects + +- This example will assume that at same level as this Jupyter Notebook there is an *xml_projects* folder with XML files representing proejcts the user wants to import and publish to ESP. +- +#### Variables to assign + +- server - the SAS Viya server URL +- username +- password +- chosen_deployment_name - the nmae of the ESM deployment cluster we want to create + +### Packages and Python Version +- python 3 +- requests +- json +- epoch +- urllib3 +- ElementTree +- time + +## Usage +1. Download the Python program or the Jupyter Notebook file. +2. Edit your variables to match your environment. +3. Proceed to run the program or Notebook commands. + +## Endpoints Used + +### SAS Event Stream Processing Studio +- [/esp-project](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=getListModels) - List all projects +- [/esp-project](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=createProject) - Create a project +- [/project-versions/projects/{projectId}/nextVersion](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=getNextVersion) - Get the next version of a project +- [/project-versions/projects/{projectId}](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=createVersion) - Publish a file to the Files service +- [/project-versions/projects/synchronize/{folderId}](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=createSynchronizeProject) - Synchronize a published project with SAS Event Stream Manager + +### SAS Event Stream Manager +- [/deployment](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=getListDeployments) - List all deployments +- [/deployment](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=createDeployment) - Create a deployment +- [/server/cluster](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=createStartProjectOnCluster) - Run a project on a cluster + +## Supported Versions + +- Viya 4 +- 2023.08 onwards diff --git a/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb b/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb new file mode 100644 index 0000000..579ed78 --- /dev/null +++ b/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb @@ -0,0 +1,580 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "{\n", + " \"cells\": [\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Import, publish and run projects in K8s clusters\\n\",\n", + " \"This notebook leverages the IOT ESP API to create and publish projects into ESP.\\n\",\n", + " \"\\n\",\n", + " \"Pre-requisite: This example will assume that at same level as this Jupyter Notebook there is an *xml_projects* folder with XML files representing proejcts the user wants to import and publish to ESP.\\n\",\n", + " \"\\n\",\n", + " \"In this notebook we will loop through all XML projects in xml_projects folder and do the following:\\n\",\n", + " \"1. Check if projects have already been imported\\n\",\n", + " \"2. If yes, import it using next version number. Otherwise import it normally with version 1 \\n\",\n", + " \"3. Make project public so all users can see it\\n\",\n", + " \"4. Publish project\\n\",\n", + " \"5. Synchronize projects from Studio to ESM\\n\",\n", + " \"6. Create ESM Deployment Cluster on which to run the projects\\n\",\n", + " \"7. Start projets on K8s cluster on ESM\\n\",\n", + " \"\\n\",\n", + " \" \\n\",\n", + " \"Note: Please make sure you run [Imports and Global Variables](#imports) before executing anything else in this notebook. Also ensure you are authenticated by running [Get Access Token](#authentication).\\n\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## Imports and Global Variables \\n\",\n", + " \"Run this cell before any of the others as it imports packages and sets variables that will be used throughout the notebook.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 55,\n", + " \"metadata\": {},\n", + " \"outputs\": [\n", + " {\n", + " \"name\": \"stdout\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\\n\",\n", + " \"Username: fsduser\\n\",\n", + " \"Password: Mercury7\\n\",\n", + " \"ESM Deployment Cluster Name: test\\n\"\n", + " ]\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"import requests\\n\",\n", + " \"import xml.etree.ElementTree as ET\\n\",\n", + " \"import os\\n\",\n", + " \"import json\\n\",\n", + " \"import time\\n\",\n", + " \"import sys\\n\",\n", + " \"from urllib3.exceptions import InsecureRequestWarning\\n\",\n", + " \"\\n\",\n", + " \"\\n\",\n", + " \"def bootstrap_server_and_credentials():\\n\",\n", + " \" global server, username, password, chosen_deployment_name\\n\",\n", + " \" server = \\\"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\\\"\\n\",\n", + " \" username = \\\"fsduser\\\"\\n\",\n", + " \" password = \\\"Mercury7\\\"\\n\",\n", + " \" chosen_deployment_name = \\\"test\\\"\\n\",\n", + " \" if len(sys.argv) > 3:\\n\",\n", + " \" server = sys.argv[1]\\n\",\n", + " \" username = sys.argv[2]\\n\",\n", + " \" password = sys.argv[3]\\n\",\n", + " \"\\n\",\n", + " \" print('Server: ' + server)\\n\",\n", + " \" print('Username: ' + username)\\n\",\n", + " \" print('Password: ' + password, flush=True)\\n\",\n", + " \" print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\\n\",\n", + " \"\\n\",\n", + " \"# Suppress ssl warnings caused by verify=False\\n\",\n", + " \"requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\\n\",\n", + " \"bootstrap_server_and_credentials()\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Get Access token \"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 56,\n", + " \"metadata\": {},\n", + " \"outputs\": [\n", + " {\n", + " \"name\": \"stdout\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"eyJhbGciOiJSUzI1NiIsImprdSI6Imh0dHBzOi8vbG9jYWxob3N0L1NBU0xvZ29uL3Rva2VuX2tleXMiLCJraWQiOiJsZWdhY3ktdG9rZW4ta2V5IiwidHlwIjoiSldUIn0.eyJqdGkiOiI5ZTNjMWRlMWFlNDI0ZTgxYTBiMGE0YjRhNjYyNDhmNyIsImF1dGhvcml0aWVzIjpbIlZpeWFTQVNBZG1pbnMiLCJzdmlkZXZvcHMiLCJzdml2bXVzZXJzIiwiaW50Y2Fjb2Rlc2lnbmluZyIsInVuaXhfciZkIiwiVVNTQVMiLCJyY2ktY2lycnVzLWRldiIsImludGNhd2ViY2VydHJlcSIsIm9wZW5zdGFja3VzZXJzIiwicmNpLWNsdXN0ZXJkZXZtb2RlIiwiaW50Y2F1c2VycyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJzdWIiOiJlYTY1MTZlMi0wMTJiLTQ0MTktOWJhMS1kMTY3MWZmNjc2ZDAiLCJzY29wZSI6WyJvcGVuaWQiLCJ1YWEudXNlciJdLCJjbGllbnRfaWQiOiJzYXMuZWMiLCJjaWQiOiJzYXMuZWMiLCJhenAiOiJzYXMuZWMiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiZWE2NTE2ZTItMDEyYi00NDE5LTliYTEtZDE2NzFmZjY3NmQwIiwib3JpZ2luIjoibGRhcCIsInVzZXJfbmFtZSI6ImZzZHVzZXIiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJhdXRoX3RpbWUiOjE3MTQwNTIwODAsInJldl9zaWciOiI5Njg4NWFlNiIsImlhdCI6MTcxNDA1MjA4MCwiZXhwIjoxNzE0MDU1NjgwLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0L1NBU0xvZ29uL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdfQ.QY5XfQBtzrN2Wg_sKv3w17qvZWmPz6otR4z89gSC8ZkRppMXdLqaMLwpKLlCsBAznGokrKtVklnMC24JS2ocm-001zWrgl3Crjz0Nm8OmkmQJfyeNBoQfqz_krx3qRNvgLF6ziIDv8zZvS3_1t__9fDKxfFUQ0MQQWP0zAqwteSrqcOp2STyvVNIGf0fPF7HAHgp4xrUmMZb0XyZ4sakPioOoaXTKgumMpPpefU_P6v81HWJCAL_L_0folsv-YById-9KZXF4VadtR2E8t6awdLQ9zpFrjecpuAevO6CcV-9efGvYcb0RLxevUmJ-iEnx84aPiZP06Oldq0lWdvrmw\\n\"\n", + " ]\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"def get_access_token():\\n\",\n", + " \" body = {'grant_type': 'password', 'username': username, 'password': password}\\n\",\n", + " \" headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\\n\",\n", + " \" access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\\n\",\n", + " \" verify=False)\\n\",\n", + " \" return access_token_response.json()[\\\"access_token\\\"]\\n\",\n", + " \"\\n\",\n", + " \"access_token = get_access_token()\\n\",\n", + " \"print(access_token)\\n\",\n", + " \"headers = {\\\"Content-Type\\\": \\\"application/json\\\", \\\"Authorization\\\": \\\"Bearer \\\" + access_token}\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to get ESP Projects\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 12,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def get_projects():\\n\",\n", + " \" projects = []\\n\",\n", + " \" get_projects_response = requests.get(\\n\",\n", + " \" 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\\n\",\n", + " \" if get_projects_response.status_code == 200:\\n\",\n", + " \" projects = get_projects_response.json()[\\\"items\\\"]\\n\",\n", + " \" return projects\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to import project to ESP Studio\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 13,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def import_project_to_studio(project_body):\\n\",\n", + " \" project_id = \\\"\\\"\\n\",\n", + " \" import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\\n\",\n", + " \" data=json.dumps(project_body), headers=headers, verify=False)\\n\",\n", + " \" if import_project_response.status_code == 200:\\n\",\n", + " \" project_id = import_project_response.json()[\\\"flowId\\\"]\\n\",\n", + " \" print('success, project_id=' + project_id)\\n\",\n", + " \" return project_id\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to get next version number of a project\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 14,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def get_next_project_version(project_id):\\n\",\n", + " \" version = 2\\n\",\n", + " \" get_next_version_response = requests.get(\\n\",\n", + " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\\n\",\n", + " \" headers=headers, verify=False)\\n\",\n", + " \" if get_next_version_response.status_code == 200:\\n\",\n", + " \" version = get_next_version_response.json()[\\\"major\\\"]\\n\",\n", + " \" else:\\n\",\n", + " \" print('Failed to get next version')\\n\",\n", + " \" print(get_next_version_response)\\n\",\n", + " \" return version\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to make project public - by default it is private and hidden from other users\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 15,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def make_project_public(project_id):\\n\",\n", + " \" requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\\n\",\n", + " \" + project_id + '/authorization?private=false',\\n\",\n", + " \" headers={'Authorization': 'Bearer ' + access_token}, verify=False)\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to create expected project model to be published\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 25,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def create_publish_project_body(project_body, version):\\n\",\n", + " \" project_body[\\\"name\\\"] = project_body[\\\"friendlyName\\\"]\\n\",\n", + " \" project_body[\\\"description\\\"] = \\\"\\\"\\n\",\n", + " \" project_body[\\\"friendlyName\\\"] = None\\n\",\n", + " \" project_body[\\\"majorVersion\\\"] = str(version)\\n\",\n", + " \" project_body[\\\"minorVersion\\\"] = \\\"0\\\"\\n\",\n", + " \" project_body[\\\"version\\\"] = str(version) + '.0'\\n\",\n", + " \" project_body[\\\"versionNotes\\\"] = \\\"notes\\\"\\n\",\n", + " \" project_body[\\\"uploadedBy\\\"] = username\\n\",\n", + " \" project_body[\\\"modifiedBy\\\"] = username\\n\",\n", + " \" epoch_time = int(time.time())\\n\",\n", + " \" project_body[\\\"uploaded\\\"] = epoch_time\\n\",\n", + " \" project_body[\\\"modified\\\"] = epoch_time + 10\\n\",\n", + " \" project_body[\\\"isDeployable\\\"] = False\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to publish project\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 26,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def publish_project(project_id, project_body, version):\\n\",\n", + " \" folder_id = \\\"\\\"\\n\",\n", + " \" create_publish_project_body(project_body, version)\\n\",\n", + " \" publish_project_response = requests.post(\\n\",\n", + " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\\n\",\n", + " \" data=json.dumps(project_body), headers=headers, verify=False)\\n\",\n", + " \"\\n\",\n", + " \" if publish_project_response.status_code == 200:\\n\",\n", + " \" folder_id = publish_project_response.json()[\\\"folderId\\\"]\\n\",\n", + " \" else:\\n\",\n", + " \" print('PUBLISH FAILED')\\n\",\n", + " \" print(publish_project_response)\\n\",\n", + " \" print('Version:' + str(version))\\n\",\n", + " \" return folder_id\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to synchronize projects from Studio to ESM\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 27,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def synchronize_project_for_ESM(folder_id):\\n\",\n", + " \" success = False\\n\",\n", + " \" synchronize_project_response = requests.post(\\n\",\n", + " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\\n\",\n", + " \" data=folder_id, headers=headers, verify=False)\\n\",\n", + " \"\\n\",\n", + " \" if synchronize_project_response.status_code == 200:\\n\",\n", + " \" success = True\\n\",\n", + " \" return success\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to get deployment details needed to start K8s cluster on ESM\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 45,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def get_deployment_details():\\n\",\n", + " \" success = True\\n\",\n", + " \" deployment_id = ''\\n\",\n", + " \" deployment_name = ''\\n\",\n", + " \" projects_running_on_deployment = []\\n\",\n", + " \" deployments_response = requests.get(\\\"http://\\\" + server + \\\"/SASEventStreamManager/deployment?noDetails=false\\\",\\n\",\n", + " \" headers=headers, verify=False)\\n\",\n", + " \"\\n\",\n", + " \" if deployments_response.status_code != 200:\\n\",\n", + " \" print(\\\"Could not find any deployments\\\", deployments_response.text)\\n\",\n", + " \" success = False\\n\",\n", + " \"\\n\",\n", + " \" # Here we try to start clusters against the hard-coded deployment name\\n\",\n", + " \" # if it does not exist, it will spin off cluster against 1st cluster\\n\",\n", + " \" deployment_items = deployments_response.json()[\\\"items\\\"]\\n\",\n", + " \" if len(deployment_items) > 0:\\n\",\n", + " \" deployment_id = deployment_items[0][\\\"uuid\\\"]\\n\",\n", + " \" deployment_name = deployment_items[0][\\\"label\\\"]\\n\",\n", + " \" projects_running_on_deployment = get_project_names_from_deployment(deployment_items[0])\\n\",\n", + " \" \\n\",\n", + " \" for deployment in deployment_items:\\n\",\n", + " \" if deployment[\\\"type\\\"] == \\\"cluster\\\" and deployment[\\\"label\\\"] == chosen_deployment_name:\\n\",\n", + " \" deployment_id = deployment[\\\"uuid\\\"]\\n\",\n", + " \" deployment_name = deployment[\\\"label\\\"]\\n\",\n", + " \" projects_running_on_deployment = get_project_names_from_deployment(deployment)\\n\",\n", + " \" else:\\n\",\n", + " \" print(\\\"Could not find any deployments\\\", deployments_response.text)\\n\",\n", + " \" success = False\\n\",\n", + " \"\\n\",\n", + " \" return success, deployment_id, deployment_name, projects_running_on_deployment\\n\",\n", + " \"\\n\",\n", + " \"def get_project_names_from_deployment(deployment):\\n\",\n", + " \" project_names = []\\n\",\n", + " \" for server in deployment[\\\"servers\\\"]:\\n\",\n", + " \" project_names = project_names + list(map(lambda project: project[\\\"name\\\"], server[\\\"projects\\\"]))\\n\",\n", + " \" return project_names\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Function to start K8s cluster on ESM\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 48,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"def start_k8s_cluster(k8s_project_body):\\n\",\n", + " \" success, deployment_id, deployment_name, projects_running_on_deployment = get_deployment_details()\\n\",\n", + " \"\\n\",\n", + " \" if k8s_project_body[\\\"name\\\"] in projects_running_on_deployment:\\n\",\n", + " \" print(\\\"Project \\\" + k8s_project_body[\\\"name\\\"] + \\\" is already running on deployment \\\" + deployment_name +\\\".\\\")\\n\",\n", + " \" elif success:\\n\",\n", + " \" # Here are the deployment settings hard-coded for all projects\\n\",\n", + " \" k8s_deployment_settings = {\\n\",\n", + " \" \\\"persistentVolumeClaim\\\": \\\"sas-event-stream-processing-studio-app\\\",\\n\",\n", + " \" \\\"requestsMemory\\\": \\\"1Gi\\\",\\n\",\n", + " \" \\\"requestsCpu\\\": 1,\\n\",\n", + " \" \\\"requestsGpu\\\": \\\"0\\\",\\n\",\n", + " \" \\\"limitsMemory\\\": \\\"1Gi\\\",\\n\",\n", + " \" \\\"limitsCpu\\\": 1,\\n\",\n", + " \" \\\"limitsGpu\\\": \\\"0\\\",\\n\",\n", + " \" \\\"minReplicas\\\": 1,\\n\",\n", + " \" \\\"maxReplicas\\\": 1,\\n\",\n", + " \" \\\"useLoadBalancer\\\": False,\\n\",\n", + " \" \\\"loadBalancingPolicy\\\": \\\"none\\\",\\n\",\n", + " \" \\\"averageUtilization\\\": \\\"50\\\",\\n\",\n", + " \" \\\"loadBalancerTargetsList\\\": []\\n\",\n", + " \" }\\n\",\n", + " \" k8s_cluster_body = {\\n\",\n", + " \" \\\"distinguisher\\\": deployment_name,\\n\",\n", + " \" \\\"esmDeploymentId\\\": deployment_id,\\n\",\n", + " \" \\\"gpuReliant\\\": False,\\n\",\n", + " \" \\\"loadOnly\\\": False,\\n\",\n", + " \" \\\"project\\\": k8s_project_body,\\n\",\n", + " \" \\\"settings\\\": k8s_deployment_settings\\n\",\n", + " \" }\\n\",\n", + " \"\\n\",\n", + " \" response = requests.post(\\\"http://\\\" + server + \\\"/SASEventStreamManager/server/cluster\\\",\\n\",\n", + " \" data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\\n\",\n", + " \" if response.status_code != 200:\\n\",\n", + " \" print(\\\"error creating cluster\\\", response.text)\\n\",\n", + " \" else:\\n\",\n", + " \" print(\\\"Project \\\" + k8s_project_body[\\\"name\\\"], \\\" successfully started K8s pod in deployment: \\\" + deployment_name)\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Create ESM Deployment for projects to run against\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 58,\n", + " \"metadata\": {},\n", + " \"outputs\": [\n", + " {\n", + " \"name\": \"stdout\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"Deployment test already exists, we can proceed to start the projects\\n\"\n", + " ]\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"def create_ESM_cluster_deployment():\\n\",\n", + " \" deployment_alread_exists_error = 'A deployment named \\\"' + chosen_deployment_name + '\\\" already exists'\\n\",\n", + " \" deployment_body = {\\n\",\n", + " \" \\\"name\\\": chosen_deployment_name,\\n\",\n", + " \" \\\"type\\\": \\\"cluster\\\"\\n\",\n", + " \" }\\n\",\n", + " \" response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\\n\",\n", + " \" data=json.dumps(deployment_body), headers=headers, verify=False)\\n\",\n", + " \" if deployment_alread_exists_error in response.text:\\n\",\n", + " \" print (\\\"Deployment \\\" + chosen_deployment_name + \\\" already exists, we can proceed to start the projects\\\")\\n\",\n", + " \" elif response.status_code != 201:\\n\",\n", + " \" print(\\\"error creating ESM cluster deployment\\\", response.text)\\n\",\n", + " \"\\n\",\n", + " \"create_ESM_cluster_deployment()\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Loop through all XML projects in xml_projects folder and do the following\\n\",\n", + " \"1. Check if projects have already been imported\\n\",\n", + " \"2. If yes, import it using next version number. Otherwise import it normally with version 1 \\n\",\n", + " \"3. Make project public so all users can see it\\n\",\n", + " \"4. Publish project\\n\",\n", + " \"5. Synchronize projects from Studio to ESM\\n\",\n", + " \"6. Create ESM Deployment Cluster on which to run the projects\\n\",\n", + " \"7. Start projets on K8s cluster on ESM\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 50,\n", + " \"metadata\": {},\n", + " \"outputs\": [\n", + " {\n", + " \"name\": \"stdout\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"\\n\",\n", + " \"example_project is already imported\\n\",\n", + " \"Creating new project version: 9\\n\",\n", + " \"example_project.xml successfully published\\n\",\n", + " \"Project example_project is already running on deployment test.\\n\",\n", + " \"\\n\",\n", + " \"star_wars is already imported\\n\",\n", + " \"Creating new project version: 7\\n\",\n", + " \"star_wars.xml successfully published\\n\",\n", + " \"Project star_wars is already running on deployment test.\\n\"\n", + " ]\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"def import_and_publish_xml_files():\\n\",\n", + " \" current_dir = os.getcwd() + \\\"/xml_projects\\\"\\n\",\n", + " \" projects = get_projects()\\n\",\n", + " \" for file_name in os.listdir(current_dir):\\n\",\n", + " \" print()\\n\",\n", + " \" if not file_name.endswith('.xml'): continue\\n\",\n", + " \" version = 1\\n\",\n", + " \" project_id = None\\n\",\n", + " \" xml_file_path = os.path.join(current_dir, file_name)\\n\",\n", + " \" project_name = get_project_name_from_xml(xml_file_path)\\n\",\n", + " \" data = open(xml_file_path, \\\"r\\\").read()\\n\",\n", + " \" project_body = {'friendlyName': project_name, 'xml': data}\\n\",\n", + " \"\\n\",\n", + " \" if projects:\\n\",\n", + " \" project_that_matches_xml_name = None\\n\",\n", + " \" for project in projects:\\n\",\n", + " \" if project['friendlyName'] == project_name:\\n\",\n", + " \" project_that_matches_xml_name = project\\n\",\n", + " \" break\\n\",\n", + " \"\\n\",\n", + " \" if project_that_matches_xml_name:\\n\",\n", + " \" print(project_name + ' is already imported')\\n\",\n", + " \" project_id = project_that_matches_xml_name['flowId']\\n\",\n", + " \" version = get_next_project_version(project_id)\\n\",\n", + " \" print('Creating new project version: ' + str(version))\\n\",\n", + " \"\\n\",\n", + " \" if not bool(project_id):\\n\",\n", + " \" print('Importing ' + project_name)\\n\",\n", + " \" project_id = import_project_to_studio(project_body)\\n\",\n", + " \" make_project_public(project_id)\\n\",\n", + " \"\\n\",\n", + " \" folder_id = publish_project(project_id, project_body, version)\\n\",\n", + " \"\\n\",\n", + " \" synchronize_project_for_ESM(folder_id)\\n\",\n", + " \"\\n\",\n", + " \" if project_id:\\n\",\n", + " \" print(file_name + ' successfully published', flush=True)\\n\",\n", + " \" else:\\n\",\n", + " \" print(file_name + ' failed to publish', flush=True)\\n\",\n", + " \"\\n\",\n", + " \" k8s_project_body = {\\\"id\\\": project_id, \\\"name\\\": project_name, \\\"version\\\": version}\\n\",\n", + " \" start_k8s_cluster(k8s_project_body)\\n\",\n", + " \"\\n\",\n", + " \"def get_project_name_from_xml(xml_file_path):\\n\",\n", + " \" tree = ET.parse(xml_file_path)\\n\",\n", + " \" root = tree.getroot()\\n\",\n", + " \" project_name = root.attrib['name']\\n\",\n", + " \" return project_name\\n\",\n", + " \"\\n\",\n", + " \"\\n\",\n", + " \"\\n\",\n", + " \"import_and_publish_xml_files()\\n\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": null,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": []\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"kernelspec\": {\n", + " \"display_name\": \"Python 3 (ipykernel)\",\n", + " \"language\": \"python\",\n", + " \"name\": \"python3\"\n", + " },\n", + " \"language_info\": {\n", + " \"codemirror_mode\": {\n", + " \"name\": \"ipython\",\n", + " \"version\": 3\n", + " },\n", + " \"file_extension\": \".py\",\n", + " \"mimetype\": \"text/x-python\",\n", + " \"name\": \"python\",\n", + " \"nbconvert_exporter\": \"python\",\n", + " \"pygments_lexer\": \"ipython3\",\n", + " \"version\": \"3.11.2\"\n", + " }\n", + " },\n", + " \"nbformat\": 4,\n", + " \"nbformat_minor\": 4\n", + "}" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file From eff9ae2d3daf6bae62bc8d096fb011c7f3b1f7de Mon Sep 17 00:00:00 2001 From: mtlpst Date: Thu, 25 Apr 2024 16:58:45 +0100 Subject: [PATCH 02/10] Added XML project examples --- .../xml_projects/example_project.xml | 94 +++++++++++++++++++ .../xml_projects/star_wars.xml | 77 +++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 IoT/python/import-and-publish-projects/xml_projects/example_project.xml create mode 100644 IoT/python/import-and-publish-projects/xml_projects/star_wars.xml diff --git a/IoT/python/import-and-publish-projects/xml_projects/example_project.xml b/IoT/python/import-and-publish-projects/xml_projects/example_project.xml new file mode 100644 index 0000000..3c0471e --- /dev/null +++ b/IoT/python/import-and-publish-projects/xml_projects/example_project.xml @@ -0,0 +1,94 @@ + + + + {"trades_cq":{"AddTraderName":{"x":345,"y":295},"LargeTrades":{"x":470,"y":175},"LargeTradesCopy":{"x":595,"y":295},"TotalCost":{"x":345,"y":425},"Traders":{"x":230,"y":130},"Trades":{"x":470,"y":50}}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + = 100 + end + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml b/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml new file mode 100644 index 0000000..12c3656 --- /dev/null +++ b/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml @@ -0,0 +1,77 @@ + + + {"cq1":{"Source":{"x":-435,"y":-400}}} + appadmin + 1700211019156 + appadmin + 1700216552811 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 708332268e1d8c3dd2f4d8ea6f1db2d0c2abb1f4 Mon Sep 17 00:00:00 2001 From: mtlpst Date: Fri, 10 May 2024 15:04:36 +0100 Subject: [PATCH 03/10] Updated XML examples as well as READMEs --- IoT/README.md | 6 +- .../import-and-publish-projects/README.md | 56 +- .../images/deployment_in_ESM.png | Bin 0 -> 59043 bytes ...eployment_with_projects_running_in_ESM.png | Bin 0 -> 55784 bytes .../images/imported_projects_in_Studio.png | Bin 0 -> 36411 bytes .../testing_imported_project_in_Studio.png | Bin 0 -> 188762 bytes .../import-and-publish-projects.ipynb | 538 ++++++++++++++++ .../import-publish-and-run-projects.ipynb | 580 ------------------ .../xml_projects/lua_connector.xml | 87 +++ .../xml_projects/python_connector.xml | 71 +++ 10 files changed, 722 insertions(+), 616 deletions(-) create mode 100644 IoT/python/import-and-publish-projects/images/deployment_in_ESM.png create mode 100644 IoT/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png create mode 100644 IoT/python/import-and-publish-projects/images/imported_projects_in_Studio.png create mode 100644 IoT/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png create mode 100644 IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb delete mode 100644 IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb create mode 100644 IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml create mode 100644 IoT/python/import-and-publish-projects/xml_projects/python_connector.xml diff --git a/IoT/README.md b/IoT/README.md index 4e846f2..3a7685e 100644 --- a/IoT/README.md +++ b/IoT/README.md @@ -1,10 +1,10 @@ # SAS REST API Examples -## IoT Event Stream Processing +## SAS Event Stream Processing Studio and SAS Event Stream Manager -This repository contains SAS contributed examples that show the capabilities of the IoT Event Stream Processing REST APIs. +This repository contains SAS contributed examples that show the capabilities of the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API. You are encouraged to contribute your own examples in the [User Contributions repository](../User_and_Aggregated_Samples). ## Examples -* [Import, publish and run projects on K8s cluster](python/import-and-publish-projects/README.md) +* [Import, Publish, and Run Projects in a Kubernetes Cluster](python/import-and-publish-projects/README.md) diff --git a/IoT/python/import-and-publish-projects/README.md b/IoT/python/import-and-publish-projects/README.md index bfa093c..1462c45 100644 --- a/IoT/python/import-and-publish-projects/README.md +++ b/IoT/python/import-and-publish-projects/README.md @@ -1,33 +1,23 @@ -# Create and Use Asset +# Import, Publish, and Run Projects in a Kubernetes Cluster ## Overview -This notebook leverages the IOT ESP API to import, publish and run projects on K8s clusters. +This Jupyter Notebook uses the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API to import, publish, and run projects in a Kubernetes cluster. -In this notebook we will loop through all XML projects in xml_projects folder and do the following: -1. Check if projects have already been imported -2. If yes, import it using next version number. Otherwise import it normally with version 1 -3. Make project public so all users can see it -4. Publish project -5. Synchronize projects from Studio to ESM -6. Create ESM Deployment Cluster on which to run the projects -7. Start projects on K8s cluster on ESM +Use this example when SAS Event Stream Processing is deployed with other SAS Viya platform products and you are using SAS Event Stream Processing 2023.08 or later. -## Prerequisites +This Jupyter Notebook uses the project XML files in the `xml_projects` folder and performs the following tasks: +1. Check whether the projects have already been imported to SAS Event Stream Processing Studio. +2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1. +3. Make the projects public so that they are visible to all users. +4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager. +5. Synchronize the projects. +6. Create a SAS Event Stream Manager deployment whose type is "Cluster". +7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project. -#### XML Projects +## Check Prerequisites -- This example will assume that at same level as this Jupyter Notebook there is an *xml_projects* folder with XML files representing proejcts the user wants to import and publish to ESP. -- -#### Variables to assign - -- server - the SAS Viya server URL -- username -- password -- chosen_deployment_name - the nmae of the ESM deployment cluster we want to create - -### Packages and Python Version -- python 3 +Ensure that Python 3 is available and the following Python packages are available: - requests - json - epoch @@ -35,12 +25,17 @@ In this notebook we will loop through all XML projects in xml_projects folder an - ElementTree - time -## Usage +## Using the Example 1. Download the Python program or the Jupyter Notebook file. -2. Edit your variables to match your environment. -3. Proceed to run the program or Notebook commands. +2. Ensure that the `xml_projects` folder (which contains the project XML files used by this example) is located at the same level as this Jupyter Notebook. +3. Edit the following variables to match your environment: + - `server`: the URL of the SAS Viya platform server + - `username` + - `password` + - `chosen_deployment_name`: specify a name for the SAS Event Stream Manager deployment that this example creates +4. Run the program or Jupyter Notebook commands. -## Endpoints Used +## Endpoints Used by This Example ### SAS Event Stream Processing Studio - [/esp-project](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=getListModels) - List all projects @@ -52,9 +47,4 @@ In this notebook we will loop through all XML projects in xml_projects folder an ### SAS Event Stream Manager - [/deployment](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=getListDeployments) - List all deployments - [/deployment](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=createDeployment) - Create a deployment -- [/server/cluster](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=createStartProjectOnCluster) - Run a project on a cluster - -## Supported Versions - -- Viya 4 -- 2023.08 onwards +- [/server/cluster](https://developers.sas.com/rest-apis/SASEventStreamManager-v3?operation=createStartProjectOnCluster) - Run a project in a cluster diff --git a/IoT/python/import-and-publish-projects/images/deployment_in_ESM.png b/IoT/python/import-and-publish-projects/images/deployment_in_ESM.png new file mode 100644 index 0000000000000000000000000000000000000000..81b8f3fc2323a7cac9d8b4ede842f67afad85fa9 GIT binary patch literal 59043 zcmb@t2UJsAw?C?vPyIX=jv~_G*g&Z#(p%7jz)_k=uTdgRnjsKMfLM<7q9DCQK|!fP zs0k!0B~l|T5JHF&N@xi+Aq0|tJmr3Gym7~UW4!m)7#SIR?YZ`ztIaj%{QY*~Z7Z`A zKS};{;J|?sH-Eoz=fHs@h6fG^<^KDypvL+xqeAd^5PHY#w*xhU(u;zNfB9Uuynf(7 zUHY-Tdxr$qM<4#~3_Wn*WXF%+L45GL`v(rp>)gC?-7dmog(Cb&)T`ZyC!B!KdQNY4(1-xJ1q=rH;>`}5R&<_mS9gIohb1AVB} z%>MlFJ@?8Bp5GN}5);n$2$cL$zV5AN?WbB6Xm#axSXp%ctN5?#YwKU06_2SHQUgY= zIR5*uy4%WH&07}j(2q7G@xP@Y?@mQ^122*OmiWl9ZCs?htB6*wAXcYTX!9lQD?tOo zi#uq04w^kZFyN}b^{>C0PNat1TOik(wY3_|6lq`3axe{uQmeFlLzANRj90rC7lcFU zc^)Goe@WjBfA7L~0Ip1}!5oGU^t8D|{nuYNFz%D?fqVO@0T1y1Haz%e-6M+P_-FOi z8koY-|E`g5k6UPRjflOhifeFe+wMStX@N1c*5q5I8kO(m|IrDC3@3VD*w#TQ*R1XZ zxf!j0@{OeRt-MJxmQ~w!86$-CsWe6@*+}NofpzolGJ!X#@MUSZAYsle>U7Ot=-F6xu^FI z86AipxkY;otS+^6VYBoBUfrKtJg?VOeEhy%$&A*C%D$hO_l#iId6chKFd=#}P%0es z6?mA}G2Pmu+2_#pEHkI;LhJka^JIrg$G}FpnXj`b`WNF;iV`BVDZHxxC&941vt>!F zO*O&IdOS{L1!HBx4R`LyAf2T^V{oQvm3y(}*lKSuEA@5oKr)yap`uOM9G-^o4<^$- zFmZ(iR(^{|4;;8npGbrBl>^TtBO`Rv+IOF|Je^84*<7pWXe zD+XetK9{oeyk(w$KWm`3>|KDZztP1g7VuY>T63U|(18OVWVqdbd@`Gj-E!gVqI27o zIm%&cJiykL6I*AA`1pRZ6#){b!)*HOZIi&M{(k-s(J<$%y!+(rSAp=3#?ttD>pO&2G4KewKVw z7Y=gog>vb92#FR+r4q#B@2?DkgM10)3tW>-d*l9Aq& zRq24|Xtzrv3-)p%?uXrpet2`MpYXL|x|)Q#<9-&)33|B_?xd9!eU=)`blRMECD|2c z|Jbt6&bEn|Pd23C33?hiPnNBQterqu=-va90jUka9B5_LkB558}#g$4r}Qd z#JPTYp?LD#Okz&y>R2uQb8i@6X(_3?1|B(1QR{kV0>^hf)x)C&(<`<=Im=+z7btp; zDlzA30O;28;tYo&&cNLIdL{o1(sk{73%{YA_5!5bzdgUX4!S63(U+Fs8bS&ni|@X$ zgp9{5MyaMOQ-POjR*>1{thCJZDRFJf_X%L8tJEbgv+j?nN||2RpT&6V?R3`r(j}&Y z-_SB3yn_dU)b7oWl{4g&cnTzKPEX+okfL{s&uYFOxwt`18n)$~i}Ma!+zlr`$JG)B zNIxs&*pH7jV>va*-73Td>OS+O*ZLQpTrbP~{AzE@bl`I$;_@W!IYZb`Mqu#<`d_Th zID&$t6q=*eilaRvr=E*yzmMCyyi=DXj=76$@t!5st-InoKM^h=%VqnPuKszZj5ggh zDKz46e7UP80M=MW3#)HTWrvmO3M48zD8D~Bs@1ujOf)M`m#ur-hujU~?t*A-3e%~@ zpp`Ss>4(vKODX#^FXBDYm%-ln6Ji+9UsJ2oD3P0I)U z=60Q0yqPU@&nQ_<@rn`LjnHpAFTRGWj1K$i@k2?XtM4Qz2pMWr9g7FzKE;ld% z*y`%!IzH+gNq9ALoi)_#9zu?Pz`GOCMb)}7_hOZ{zV1~=N0M*g_lJF3UAzn)n(?sS zMtj}{7y{5HTd6iUhHQdtTBg-p>8ocTKrbNhd<7E%ZMe>b#*l`J>8CclbV)xZs2< zBwytyHAU1=oXbXUuMR&eyp-~~x<122D2+Doc-FL^mhgI2tJ9L*E{&I; z!_TWd%#T#dC=i`E<3CJnIMFcsTC;BL>r+}bN;u6*iP-tB%AnSAYIyluLQXcGV>`Uf z@$Zk-ue@cCm2!o3!Pf`N0zwOxUCCwdrgBr|mner@d&6nd0cQmL<@m}JO?)e)qPAYAU+d)RM5R|lEdv&YB0{)X za>)yW!37vCKYS?}U#pkZnIGl~+-g!Kg%k}+#$vS2HW_MQY8J6Wn<>LiTfxr$=zSo$GX^)4!P3wGh#C_*V@m;mR zQZmnZtZ5X3tpqcc_Ge07n{}J`vAfJ;<%EH z2+3axd4iyS6bCY3uq-}IcHG%n#gbDYDk(--pv z=k2vqoBvao>BXy0#1I3nwOTKfj3rA5P&#pI*yo8M>~>^oHXh2M5_X9kAb z32Z@jSB1GS!O^}dg(Mg>SGKp?dKC6@F$e0V#iY<-^MJa`?bJ+G(h(kaEaGZq4G7rA zo&R#5Bi1Z%sQhPk@x&W*5VKC(o)|UBkcgK&W^c<(Ij1HSi~F{kFerDESeZr$_S41+ zd>W!c*zZAbfjR0I?s}qIJ8$$WpS7LaKK=<39)d{TZB85GW6rrCF7Hb~Xgj>UW^h+Q zFrJO<`AN%Fl**^Y(L=o_DFNjztZ%(eJ3)QF>vvGfqQ=AB-C$IH_mq%uB02sN*N6UM zXkir>9O)6@FZE+5JI2TA6z`grPyKpMY4Q?_WJ)JJsC^f`SsfK?vB!4WnTJCjvg+zh z(q#=Rv;rs3NNES9B&j0`)dKDO=#jpmy=6^m?XXnUAb|nDd_EqQV$$K-9Z02g;SvN> z=d0ZMb#qN8avv?O88jZ#^gfD7Noaf~W_e{zt$n6iSS?*BsEWJ$tB5I5G={fvyKoH= zev>ZnTo1rA_G#Hlw@Me1vLIbxB`~bgSg;F$(n8wRDNRN-ltxv75ZQK{wR}oyda&%L zP@rxxcge=4KGe@5lK!@35y2}~Qr)KmAluGw0rYol&)xK1TK%El1h(hE#6217WpOrQ z{+kZx+nzm`xW`-)hZ8b#?@;D`72H4JAc%<)w3q!>Nvtm|u#W)9I^>8MCd1N30&a41 zZa0GU7T5Vk;@HfzJ%{wi4`)tLJ_gx0@~RVXxEGeIEqm5?1OxJ;z%tKrWqux7`X-2X z{uABQnDl%)C8u|>U=r}BMgqZC&R-gL3|eA3v0R@^C!Y5!{S)Klr=Eqcim0%RG~{B- z+^3tA6DRzcRa!67ngg?TT=el|5cD!VwNszU!WD3lq#j&-4?l7KU2gW_Fo2f zZ~D(@BRs^^YN}GQf`e1oTJ~Oz8fES52dCnh)T?M|kJCubm&br_;A&b+2dnSFU(@jI z>Fc522pTJGjJi1pQ_j)n(#lC8>jxrKAgX=sFHIf^rC~k{)YPt zMQjoH*ApHIKVi#6O|KR3Q)_{16{-ORFG4|YxECqfe|7jnIUMxbXEJ|{jN5h9GJ$3? zq*VTHIx(^uD)2x%pc7BcQCIRSL*?Fbf8;3yg=MEN6Xn64*zlfuyZU{dJ~0S^Yi(c8 zW|W44uA|tqJH8OgRKOF8H)%`!c0c#^#5gXozdh)h1t{C{&j+kLhAD1YxSpKm;>SpK zLfbm>9vG~$*4dNe#o~k*P6uG^Yk+M24Roz!ZR0{xZftC_?@&pUjvg9mbhS*as(&f` z^GN0leY0G_e7fW9J&U4rbxIjV?fJWC&*)PD{9dPr%rErt-?&qo40=#b=Nkp${jdPr z%(xyXcyAtjUFPXp-O(}NSw~?G_$H*SMv5@CoPnQ?wRkzc>0r0sUQ^IKplX}f224}o zebA*e(UAS}KlFYjL4N-g+P$eSp=DQ-Y%^|mqi^cNuY-ypk>DmnWrhUtO3>oV0prd` zgLUf#GWChwbtBv=t9|g~aK*cdTk(#bM9m`Fca&*&RZ)Agty!lM`$Q6qG|Te zct4cdv|rGhA8%@kGtykA5e_iTX z2HV8`@P`f@unaE$jX>Rtbk}0Vwuz+g&5!Mjvd`kJiK}8c?8ToAQIe7%+6oHY2#oyw zxNdNWopS$AuU@D`z(S60R;`k8etaV`DwrG*zi57_N>o zA|gMzJelSVh|q>&&ALZQt$V{W^%-xRLVMy%tsOu)neeP`XelZvERzG`M&VlwmL1sn zeO5_cpc)dM@keb|SIOfe@?b%}WLY1-?-Q0ZUcVg~IPn6omf5qx!v#e0sq5=s7rFDn zxu{^bSdWE>)k&4@be8Vr%H)>484+5exn8%iqkSzuaed2~vrES1Ss?G69%6mni*XN$ zxD$1I>gq~o!1SsS5v{=hD%nZ+7Z*v|GUd*C^#ENU{BPn92~)Y66(H&MR;5pxHjwc( zdU(L(wkMaq(d9z<9u#&0s|jGkb8fJw_RP$1HY4CquFm#WclaGkbN1s47}5$*%hRG+ z#oeIWRTL0;JI5C}Dnnt%z&bF=qf>DzCHqI8f;UjlmW#r+T?j1a!lopP<;n2GPt<~f zfa?AXXFxr3s3$NZ=2zc4{V^&^wP3E}-UlKJ@#e#rtw~C-5zyOEU-$3=y1;TF&tA#b z_am^XCK%zJ(iVPwk zNpqugT! ze1cI;R9zieFx`;m-81Wl>O5Qm(AsN~(^g4UW4OlqPy+0aq@+w@8gZeYQ*n&ugVnMc-+ zxkhmDtWF2QY7%8~pTpAp7I7yu{l}^P$g|P*^+Ip6RI7DQ4qw(>k)4<(Gm<@~3XwmY)I4E!2Xw%^a-k6rZH+3prR-%0}C_w>v z%hk-GJE=EAhYgmZm4(L0tEE4Smz50P(*MPTx1wgXt?W2v5l5>1b^ixtNEcZuQE}$TvLgtkzw4T4Kuzw2E0Y!<}|7r$QGovuHB*gylY z+mz-TZkLk_T^)6b{oW99X?(!b%WmqccAUzRlr7R6Y&&9@EJX|7H$=^BC3|q}3c+o5#HKVJ7Wd-M2Q~ zI)nG{_3RoOUgidc-?ayuZTkKWU^ApZiL(-G+?@71Kp>7jAWTu3;*Sdk!-?#z-;B2<7h3Vv&*9 zIs-@7oIx?mR4kNhl7sC454S_XkkkX3&NCx4@W($A&Iz|?Oo8fagPEdg9zgkC6sIZ5 zgNNh+lu2oGhd$l!DpfCGMz)u1!^Uy$4Ms4ll$&W6jLQ_*Im^E_ye5Z-_pz8PkMw5u z(=?Ej^oZgx4tr`Lm?vdnkg_@2C0Aip9*T>C?CiksHOd1Y&2@TXDw z)tKKcYEF4lBy-#_dWZS5T~o_Z>lchmLVg<;=lE_PdsCJK_r9@g!vTNXAQ^jZk9W_a zXM(gJnr=wuo!uuCWLNfucVW(ZdjJjQLou53d+!3hb2J^S;; zwbqtNgMz~}0gu}CE>x%y|v&VQsgEDeZrLxQf>T`7)Unri{NBXKned5FrS z4EtI$=0}d{tdeHK4IARi0WCu1ofa`X>Sv)k-uiyE01a9AR z=8w-cY49%kEKre=XYVuN$Qnol%+3aw$q);$?5kbTc3*INl@Sxey^mAegwbd(OwmE?^WF>~2Shc*x^hUIbpIA&SPP4o4 zIWhny`Ox4B8vg_Rx@IGAS2x%8o7YpP2X*F+hw5f2P8m(dcWx(NCN7HMf)YAR| z{H%yxlItbNu6tC)f{nF`op-F1Ngu3Vvc8lZdjp!O@nA=3Wkv39JAH^k(kIRpIf;Qm zE^snRUi!&&)n_U>E)D6Q*lOvTe#;-CvK^6w zpaN0wE${9%LRdN@3`QeKw~5$Po(tmFs~!Rk=iI0iQYxvB8q=;x*pNG!ez1Lma%di1 z(O*##M$L@~W;^`~dl*cjvl^0!wbebildurEpcpw~l?P0*Nf5Q8^;Cr_rL8`0>A2Y<3fM34idd z!d6nATClES5J-q^p1KfK5z}y`Wz)e`27RkErrH4xu~?wP2v1zxl^3cbW4%*wJN;E; zVzk)A_AQV5qDCuX)jtuNO_CXa`JU)p89Ax5DAUHIJjaWDf-@4+OgW{$Sy;<H#XwP}_fE8hWAJ|0PjJH6YLx&+2Vf%*gRrb@W)EqpRiq zSg|^xQ+$R3{sEf4dbesvC(W(x4!0ITZcoJ$KiQxk1WvuwI=%z9w+o8Uufdg_A8%jI z{%$?QWpiBLP{>WXZ`LI96RoOCXjo?V%)n+qoj3SKfsnrkO8umvhF)`|c6M7n(rxc+ zMQ%IuAjB)(nAWhb1a^qTM&sM1vY0_h3Vr^y2%`O}73t?@!<~@AUwP?}kLi3#YuRWg z3-Q~_>%nF;21@4PwPjzNZ{#SWCDgKO$|?4@MPjw;2nSBhTi&fTU4C1IncU5G#1U<@ z9)?ai0~O}?-UPQr480i`cO=i9^cO3VLyBx_$NxKTT(KlNX#BFJ97xD+??bRfknTl! zLLrh_e08aLcX?aNIwqy(r=HH*Iuh3iTCnKU(TPoEb z)f7Ajg*N@Gl8nmaK8$BvxK-L<8|HNTbhYrZXt-)c3}TFOhe-RdwTnQN?9KIF=64l} zhXfH{M#GmuNWG?D= zUgOLi0^Oe4}JJ}Kl#f8@5Eo<#enx~JLRXT#w zmr=tq&3ZvDE$6Hl)4Gf+PB?`cAdsO8G{VE$IUaV|D^fW=x~r`qJz(|;!>g*ihp|yU z8iPRc(Q0_t^G%=55B}a=NmZJC`99^{A8eSNUzVP~zpaNLECTl8HY7JeA(pVzCcW(D znHK;^j|^v7p~-(->8x5cZ>IffZ*A+vGN3E>*f{0Q8^`0~nnvC3>V}FH#s%Ywo=aIB zo}9*~lDw|SxeZ@xjmBi7YER>CVHmmE_4DUvJx!7rFLFTLFJ&GE^4==sijp!t_V`wA z==k2=4dazgpv7{$n}M!TT~=={obpXPGT4N1~NX_4^PVzwoKi4wqNQP);G3VjVO|Ai3xu!%08L)$+o^GPDu>k zpkLPYe5Aex_SaIAlaRQ;d^bJaW6;Br1-^zJUu?f{Z*Gv0vl8`ySLZuCl(c*t*)GIzOjAnf`U-1oup3Y65x zP@V*!Y;KE=Ea21W@Vn7(>F1G4o zl)LUlq6NKp`EXMV;r-A&yhF0uesJ(I*SlV&cfK>Xcr`Q3V%*O{nQkkqt{NC|3|((t zZovtSe0&<`Ve6sj4_KPuLoY!XQySEq7CuC&brl%(|%;w}A zsbrUWR?N7V%z|?+RTk=+Zz;*nXM9c$Oc+xMg}E{ukU29 zQf}*GKuy)46pTEH=s1fBS6x-tyk$C&p4h%Tp})G@o%{Hhr&E*M5h_JK&JFYdbPJ7t zbRFvX5qNVy%ui|!HpFjoErpw~-2ADH-Rp1Pu)m1cdwXIT?-+pXk2e7;4Q}=j($e1< z3`^*9X)ZzT>|3!D6>MD$WnmuB?&;JAu*n`h@ul%Dg#|6OktP|H0Y}x&rVPkY(-}qp zheFNsanc22Oj9uWEw}ZdII^%@<6FdVirk+j7hZhUFly`FWP_h=z*GxhexM*nG?;qG z$n`Xv2MN<^^rr|CZl$3f_rjY~OBZs|(#_JH#PG5FF?7esdCj#qS`b1`6ZCZ*#ZQpZ zedy@dzr$jrTp(p@3cH;)o|cqRSM`n1IhGo1Vqt`M@N#-Q!aeD?O@~vNz1}z2Nf7u~ zXsmVgpTU{N5&f}Y_3c%4GJYD~_@#_>KrTpZJf^|RfIFOIsJLdqwn5kCqk0c*f~~X$ z8BIR|P96CH59uuD@tiS==t;(vwSW0uwYEQ`owfO)Fe2MA5WGL#Fct_Pt{Js zXZ~_ONRx|SHwDS`Q;-}*Fa z*l~wiWmr`;LCJ1twc(iaYkyJJzCHaG6JPw^92o0sz)l?m2u9!eD8?KuJRI|a@i+dk z^GgJkLMF2Q7jU7$WZ^rvIYl)-r_%=*a`*U-)3SH;zSUnU_)4bA{sWw>+)5p8SNW^{ zBjfx(0M7pt*zrH2A}Uc^bel%Mk+O*v2zc+iFe0I%qGD=o8qN%q9Y%*1hyK3&*NYD1 zCs+SQu#*gMh%bC*9QN(X&fk2!{A9`33j*lm!M_T|zWZ!PgvtEX;2N~fo}O26QhS+u z?5~=yZlnJ;MDV#(pRT{3*>$gWMeT2Ko8f;zoiCBRault3d|HNC<&l%6k>(J1GQ~Q* z{Z}B1V2H}-zVuIzL*&C-FI(ZfA4-R;#0ze$cbDM0Y2(((_td7dvNTjFmeCR8g;yRpO>TQwo2g@Sg#mxL^;I z(k{dXuV8|&9^dn;`jP~7*fUUVqc3Ro!CE!fXLr;$mK}9QJ;npCM5mk(A8c7Cz3UG` zckp&cbZ}{2jIX{7SAJ{E?Vs(KgrQp zab4kN7$33j{FO3&uWQxZTiKCT4r5!yPE;l#ou;}U$pZw4el9+xy~m3&M5C+SMVC)< zf7?SML1O%=ulJV3JgHrkGphloEazs`rlc35FP6|A6+HVJev~_th1iRYu4A8Azn`62 z&DlS(-ipG?5g0X7>bGWQ39Ll+DY#bkc&sew{Yg=CwG7k}45%yg>|A?+B}1{Jij4hF?&~YA&Ni79DJDh*w=4C@ zM{RgBLFR+de?Ut(`pMbkc=n!^L93@p)$j2}(F%h)2FH#RRAqU_WOrKgaW?BCqNil| z+xYeJEF~()vH2Nrj{pIM{p?I>WDZs^U5XpyLK)_-zQ zt|{E7=v2F7d~;4B_k#97#nshFDM<6nJ_F@^RolDr970C2$d2 zOFAm%60YnPz1Z!q+6D9Z#aV>z6Xiaiz*j?C=;d|y!FPB$$nFyYUairBk+>uKa^f>S zCrbxDj7pUn)%0dJJ)5pf>Fo`$JSI@*HUH#6eQwsgI@*T)RWWU9SY@R$d>Mq+xy7&%2WwP9YPY zdK?1pQ#?5Zd_UAG1%=yb)uCam zy+sdsz%OF?%py-;oMA=LvX&ti1WHHpbv=7hYLERrSQA1kNsPc_=tDIC?6H@Hp*C(D z>uLd$kSH24n8rN5d%c01&NL+m)z=F@%EUc{7H+;sND~S=`}f+v_Vf(wm>VYfn|z}@ z^=)90iUC3vq#JXqfj3B)S+ZuJe{Ryftn24H)qK~uEtGlt?+$#FUHocg)3oxLemf?x zFYv@$vF@Zy{Z*|0^})+d1ew;u3pEibCtB0xsj=0xh9O*E__!;EJl!#vD5utT3xsH?CWwJDNo#a}D5+7C2z&U0=k}xgvcN$OrcpiM;cciWcZXq};g6dmV6~L= zeJG*o4dg%ch%&hAUoBq!kDLjYRR5@H7@qPUx`lwtKUkoxru2g)B`B9qqMLtw${;BJ zuY8XGPn3=S(Tn-d6B~bg&@fhJS>Q?QP6Y%{w^c6U9?WV(%aRcv;P>`jC;&S z9?Ts7L9d9FYml>-&2sjeo)SmCY}P?UU6>O7DC^y`B_6%8qOUOBcAB+0|Z9Dg=Mq(#dF`eI*y}M>oNy;CObaIX2nB8BY5DP<``EhZsXJ~7H zi-Cc^ONx%6=cke}=lwL?`<<~RZu1QM0(eS9e|OICShe~C(c zfIV13pkhWCoYS%8eiWhG9|3J1In$EqZx?<;m34KZhM})x0pGZy&X=xrtYE)FNmIGo zzu#Cmnn@e1JZwS*KJ}dVLt=exyS*e#>lk@hb(h+1kWHl+N%&uEKhpJTMA384KC|RE z#?jk2w{M(>Tkueq6fJOieh|dM{#2U+aoa6X&2y5P{I)VxIzD#loTKpdPf zk?u$)+PIfGMyZba+)inUaXW6Eq*&~7Tl)L2Uw@zG1ESf_ijOp;v3ih))O|YppZPD* z?=;37#~MkrBOW#c51l_eRUkVpfa{NR<1bOt2DPC^O`sp_07jD^iqCrLEf4;I0gvIb zd-A(M+S*qLmHYmqz0XF#_o;gulgQ_w=_3xyv4DAaY3WK20HDly=#CUcDd5-CU_Glj zZjM6K0t{yyKSmDU5XuCv9Tm`iOG~L?b9J6wQ@I+K5e22(v=nFadZ{;Bs%g&SC(=|` zGv_XChT|fB5E?3ld|`^7!_J(K(A#*2)(i)kBXds)oAL^c17Gr8C|?xt)J4rFq`yc& zIhEFFk92Voc=1(WgF7BaJ@%lZ1u+_98e0ed0 z%?ag;#il9Nu2Rr4P@QY&x9PLSQaGNrF07nD)mqzR zvxoo$AM80_O50q{i^cBUGpS}CVLepp1&3_t4Fs36hP-ZnU-p{ z7w5i=iK}ft`F_M5 zuZ+WLl%0^2&O}-UL8id~8o50qGOCNtl}*N*YQE|64f(jDtJ7<07Q=}$U=RI^)%ft?67T9;sC@7U|!d$HV96~Dc?8h0a>l(a} zL6{T9zd>azczWF|9DPopo^Zmqtpir#PZ6jvo7K{1;%Qmbu2I9>ISFqVzD9%)`&`OzjeCN{R z^f@fm`JrR2)35IwQ=%^;{^%V;0li-~RM(gIQ zP+#chwRdf?R{gu)QSx?Y_iO1=>tAMbonzA0LLw~?8qT$-;muQb2}A$Jul@M4E^L`t zy+o7aM}(wAA?Epui26F2wZV-FjykhS67T_Pk4dP|33MCV3m;CJvmY5WFB8xoQpS9& z#^|$J`^?x&+Ktgs{E7sg{Ydt_ya=?S`)ywv%u350UK|}m`l??k>-qt$7~X6GjvPxl zHfi68x!bMPWNpm8SsmCOYC84`_CiIU9JkGgcdRHYDi}rR<5D-t%~cOPO@gjE6B{ac zi>tL!%496l&JbpQRfd*vNkLKG;Zm@>{e@Wj58DfA=1XMzRJdZnVc(`<@O_v8`CMw` z@mk^|_5j{&fhr_cF0xrEUtHKvT^OAG9ow~c)C>NFd-0krNfW;o9;X9%zLj#TXO!t=l6~J6mqysf5bPRmR8tE9sboJLg z5C%D}h6P7#w+?=&NEDHukFVTy%#!z_WNao)c@hmBG)vq=P6Ey$P6GI4_0P56O@5>N3X=DQ2VhKM>t>4Y0T{36oWGw{^0rQWA%@Hg z%ZUg*9{bA`x0aS)BGpn^@m{5QJcXC0H-oA!y2#{8^;A~%??=T9FSrEqE?HyAe~8va zXAy6FEPf#74!*cL&4PD;uhmu+CK=pnepBO#e1xnWXhdDcYFWDaSU9ZWo1s1qfiW8&Jfto|1UiE1A|iKH zL3nQT&Cn~$#i`mino>qE^Dbd4?*yx$@d+XQQgwdM_O%MDL06}DI!L`sWV4x5Cr=^++c`ImLIB30!PIk+tSd<}YQ z!#?xqPxjsUTRL0xOB_Zs)R;)2mCV(l(Y!6yp|{@_ZKFP?86X}DtK!#64CBJ33f-AN z3Hknn_~2zxD1KTJH7u(8%JDe1URg0H|I}QTs7-9R$xCXp1@A2K@Kpo_Q~mPgEZSdky)rz6a_-E@X4ZPmp%0s9@uSz>JwI+`h;L+a zT7w=`$f`w;D<@`TW*R|3$}RGyUK>DX_0cWh(GQqe%(@GtV@n*$Zg@vGRNgJeul^TQ z(ZeEbYD~cDS~STH8GmG9qbf1n>^7zK_m69?fEV}9p!Rr0BAa3Xk%v3`)Z{Pq zsFydy2qt%dyO%7gX(YTL>IU{F%}ib0sP{4e8o}n1rpX|)l6r&gmqije%2$#Th3C|0 zo4u5MRBz|OBJkHg;%QkG;hx)5f(^p^4%nEE+dojf+0&81C!|QAjxB(s=Y-#Yz6c0G zR-BAB-SwG1l5a`Kr@g7z2Z(D7-+Icza2mo|fSHfH!mx{az?ESs`TELwj^hf1cClkv zbpagiP5?ckbOPFX(!XZ~S6lJrvZOXgycSL-W0kt`TmEHT4LfUPzzTH(N-~NYd}_+Bwn-Cc1Zk zJ13q{-?cRgAYCmTdBb0|6+Jwp`$mKy7%dLkyY@Y|TrK&Yk+c}aq3T`TUT-t;;)vH! ztF0d+2k&2;E8AR#DSzBKgz!@g!Kf+v%rj#nS3NIrx65!#DVKhaBxxm;Q8ZmTN@p zqlnMNGookmUKUERWhN@WiS0%zVYPL3-E}p+2Z|*!)nuh}42D$?yQ}N4OFt9a<2zeM zdcpmTBVb6rZlIe86o96QpP3(q9rge}s{Ra-84 zH%grW5B7n$74zJ^s@&LtN8)?!`Tk@McrgrJ*4-lIZOXY|3*OPjpD`#7kPz^H&W-i8 zs74N^st{rv$h({2mShlqzUnB8SrShpZeh{~I;v(HohAG;^e-=u>fRDIH@ZtmU2J{} z@)dAoLIt!Q5RIUk(3R|HwmTNQEHo^4CU`&QW*}!(u7{?hzUvN@Z^Z!sZOpvZY#mCF zOIa?CX3pcayRd9UgqhktPNh94|&!-nH$OzRyHvGv2^9!j5z55Gg=TKr7 z2}t75@(g51B{CY!a4tkJ+O)Lg-LD~-;dSYHGEFACQFy9>n+_f{gfy552eyQT+9t6ym%=XW5GfPScujuw)KZ{P-w(-F` zLB|YT+0tUD;)1gm^wbjkN=>`J=+EEiIW#iUWoCLYp41j3W|4ZzaG~?d>?I!eO6zy)H4>|X1(I_kW;Y7(BdQON;ByytyYDkI4-DY%#el!sFMfG0V0o{8QP0?< zzX!aT>ldH)zjhqaW|@-fA!|$M8>E`|dTtp*J^K%ilz?_Qe#k+KN}k$0Ii(+Qn?hAk~gNf8(ZhkLrpp$asFhUUhFFaeZ%f@YD|Ev zqNm9+7NFYx@}tnxQp-t|nO71v!{4fL*Nh|;{V;&aq08NKv0iSV#=jvxTSUAF~82#J7&*F!cA8MTyY zs2_$ZA^?iJr-qG)(ZLT3N&en7a}Rsomx75jaLK^_eu>7agQB3)M0!^uHS`u*5)}odsx;|M zdXsKwQE5^`4*^089YP2Y2qYmVsJPyJ_P4+DUHjYTpL5>ly5P!_%rno-Ju~;*bI<+z zO+>&)FGhs0)6S7kTrxrU1R#m0F^ViBE^B)amRqghXD)xqB1!4vWH78K6aR$*KC2?a z^J$Rfk3*0Chb_R)eLvs0EE}@^oV5UVoMtcgumFRmy>pn04sU(Fs+!-0%9g5Sx-QmH z%9rS_v-RmT9+!wbF&UWQ7BR&pmRAVUSlKYT-q0}Vm(r2l`YiL9nuaB>c$p~DE+v3> zv>bPW3|{pT&L9uFiRHZMwmp;})Vemk58>%0W;YOqr`?L@PYl>^o6`wCLM+^aAR4Q* zyY>WXTvL3YYRku3x;9y%hatBINK0c>iNq`pIv(zVP>NP94<9RQs&MGLd5(RilC?v+ z@WQ{_`OfnJo%3Ip2_64a;kh5(1Nt~8rg`CRW)zJhM=F`DIx!RqY#|<=?zA{;)tPxF zFb8qIylP40_%m~mX0*19__47v89&TT$)MyUx?lIp@t%a%*5-JsOL()QOL(3N#P-mD z_I8!O4Eac!k8IH4bE0%FTgq{NDKf{8`<3{LgRRQ{x}((Oe;^atnCt2Y0c$mTh*|@G zcwFfm1*)0BDTozcedmD3&5`afbbW*!N@}mlN?&U5gA{)w-CWsSNoM40kNo3PW5Vir zW@TLuMuA!1PqyW-AHGgyH$j~19X)-0YhBa+dff4$?=PO*DVpkgDkFNKTO%kcYU;II z5OdqwyQicDsUYC{i^L+}`=8DS5Ns@S5kHCfYsGp!VhH*f;Kjr?xQbs@@lNQ8!YqK>)^?tf zOr3v$)x3k~U#=kA-X2TE&u0Hj`B?3QqW!Tx5Oh3-@2Bhe8PDa-kMTa&4mOwNRTu7y zmn!Yw4oK1F)Th7BqUk%-wciWG$h)Ve!z zLiViMA%2yIKA-tqTv|Mys9VsKUhf_lin8e|VmPZnZD8Ok^M6&*1)ynhp z31i5f8;EA3bI#6i?NYP3W8Y6QQNxRJPPT0>O1n25^tBoj2QEsU37NuJ$_?Ezq zGBjr!B{9;jVgs6%KGfRLAKZ*k^mxdf7<0~qybJ;^@Bz30@lkbqw6%w3XQf-Dvk?h{ z>_)UZW82Hx&1m!fH}lwtDZuN%hV_D(5A-mt&Eq*OW1-GrvWbT)^h=irF3n+MVp)El z#k-wT^*M}oCt-Is@mx+(#3b=43dy>)6fU~W0g#hbD&JfpwLnaVto@g3Bz%*AhFg(~ zu8sZzdU2hYva=g#q5q!PUiO#Q`Tv~-WYgU3>GC5Y0&ypci1?Yh)M}Ho! z2FSBHtHHkcX%bfZbzqr2LxOa=tqsOM`^Vjvi6{F0M)_Nb0Q<;BNDj#5%M=`c;S`?oNhg8-CD)&&6gf!S>_%T{$Xc4xPk19GK1 zp3-R$X-&lfUXzt}i88f7gPzl)V-cn+17+3LZS`);?N4hxgS!(t`61)$>bCmKb%Zjh=VKW@_p9~>=W#+b*xmt5rgOe^yP!|n1u!G}97u4mex=P62C?e2p3fbB^ z&(bzHQ(r0=yQQEoViP6nBG8&C&k~`2-1GJO!rWU`l{^JbAhbH~>vY?&2(*0kDFi3W zILRnrFGG9KEy;p!Lm-*`@T%bO+^AXWF=xIsw2!NuyYptHF`=U*IVnlr+T6fp)r2y$ zK&|9!rbxS&&lN(J)Cex~Gt0*;YrVDy7k5l>&eb5ZYAS9XyIL}fZ0jbWK-jM@oI8?B z4oQUdcr-@2bpT-zw`|SNq$=DHD(HBg)68be6afHudr+RRbSMTRIK_Z>nqH@>UDs;y zFo$1ushZ&A>Gg7Ks{80Tj{KWBft^r(WoNX`)ukzwJiE+Gb#5B_2z7F=z1FtL@_wC< zauHEzRw7SFxDUl5I7O4z^JE&@7s=yoRiZZbgrrlq)kc}!+A)9#OK*DE#%||?)n`@;f4>)rBts(< zV3{==l#Kd%mRWf+=JcoKnsoS*+0;)VIABi@k=nd?gLpkgq$E>YyhP|HfZ5OxLW{XH9W|8Ua@(dO4*jVDn(UYP4ljQDUY zVjM6bC%N&hUbDk@uo_trPMQrR_1aF2ePd*}E$^P! zS216*#pmsIk_RH#eg0`Abo=E8a`{S4TQ`b&3ND z;7GVu6T*^pbg%LXop=jWF($fYx?@wQfvBA*QAwiWftNtsRWTgAd$-)j0aEm4Ir~CI zDK=?4^=;BNM}>@n_2Z<8a)Zyev7@yr0gJVPR;vqqPPGLc^vQ4~u{^eJf7ZPOs=E0^ zyF$uF8z$1NLMbwEtBhNm z1CYC;hw-D*xTn&iAYgYms)Zt|5jOSe#LRntV4wJ5Y+rxkUxcyoGWirPU8rQT7`Z<$j2Px<6bmB%H)g9^Ka|2 zVOy>NP)c=%E%}8({?jM_WXwkL201x5QL4++e> zqV1+Xgl0FdQEi&RdsmFTZ!LSwgBX~$53wlHI7{k=WR;TqRZKXL-8+#V8vX(`!|ja~ z6#Q>fDzVkm9a*NugbTs+9T7|aD_fgYDP$a<+hRokN2O#?iLLnM2!Q~}+_h^|GxNq#0iVW-44-1fhhCt$xChM5 z3SlGsw1&1vX}~sL+VqSWfT`zXP)X|huCK-318D@ey}ANy1YnR*=<~#8Y{cEsOnw3A z_HbR{USL9%B7zMC-J9}pU1c`UeLH7`z)q92DM~3Ns~ItLC(R zcrUZ?)(~io<14GDnsvftxU?(BM28y8<2C76=h&fz@u@VKy_J$y1Z^|@gIK9yox-#l z92>qN`7Fpo6WPTa7A0R9Zku|ZJ2S=iN(#hLPvfTql@JwRy3YFPK1X&u))Kn z)6(EHu-H$Dw{GhNsk>zP&oVja^&jzdR9!;z^?Rnowb$qUHdspq{h5m(Q{x{tGlAF@=N({kpCvM^ zin@W}caA-lLi0A{mh^k1Xg=a>Yu>MnAK}8j+TZbyM6oT*mI#}XUQy>jvzoq$A^_K? zm8V=xia^iKZf5Z4xN7ix@vPzJx@G{)py_q+d%|W7G><3->$4Y|ET#}CRWAOc$L;pm zn~|#H=gZ?z&_JcDHLyHOio5463>UH$sT%pZc0*UzDN`j&huvhz&)oOX*bcuEj;#;J^)R3(+(h-q9PaZW1yf4!ZxM;O1c7`6&D(&xykl0aP z%Pd?~Z!;w?%!nH{2x{#FG*PB@tnI0E4uR3Wi%I~3At4Z1cVRo6V&)D_uDU8G+pt#T zkL^Ngh2Wu85uzFtg8NIHw7|-svRNl~()&>4@Bc4rkso3mC%hqPhMhRMeVox;y{16H& zhESdxjUp_0%-NyWMe2!MrCY6w%R8?ZsNn(`%h4`(x2YSIPGpFH2nPS0 zw|AqsbY~gt9H0c1B@d7Swi5sZ3*s_g6Om<{OQoNf>x}upd{p>Kb!D*_?fGX?_i?K} z*~*&7WA9?$iBhf}8zbGJ&kp?6T}}h%IDuq_T6C#fcMsNT6#R`X1j2pVrfi9B|?)(SVd4D{Ix^5x?>C(Z09*)S;Xi%WI8KUThN7`09Qr~qcJ zw)8}JJ}ji_cx!EC`D4?1Ic5R$H~IX!wwdO@%u#-6`Ni_P+B;!ajBohixmO5X>Ukj z0yU7d)OAJ7Zv>SIV)rQp`6Np>Wc7=_u}tx_H8ZKT7E-?C!Fc?t)*_2KJ?_3NuLv?( zTdi2OVu@YgaCsAaYS#>~9$m1+sDKR*#>UcJnWAwxdz=E@tzu^(*M!a#jc5c(9FnJR z)({$G{Pl<4S2yNh3t0HLGhu(PJ=I=w==7xwEQrv73XcWg+4BwiMmzL!Ho#Mz^2FT0 zAkIs>MVLi1G%{(2NP5cSdzJ2OSqUq)EWxykd(6PaW(Q5YgyrubOSB`@Qty|Dlb&{d zAPp{z=waNxi40zBkeDq%6K@@2cuePBIA%dYVuxOMl4Eeq9nzG(pO`P0806|~JS=7eAf zx%nk5`K;w$>)~?vuLtLDFBsdUHcm&S)(IBZuceddh}PE}4eO&m3*VNf^R-jhgXy5< zpP`rx5<>sP2mTWU$xnA5$z1#w_tDOCaRKsZ661p)_4Ul3Zl_Oy|3iT12Wb}zgE|kv z6#r{b^hW*|=}QRT>|U8aPj9gk#i=>pQIJSp!58-lUKnqS9CCHINx5=i*!Pr{|ymJzuSBGqg5AXfHmnR-g@;bm+ zFm!#3IFkJ800i>Ixl;U=?Zty|_)n&Fsh`U8CsPkP`0%VZ|H^enIbGp0*nz%z9Ea{5 zN`7_A*6X`5wdD6$7`{SJS|~JA_?rPw0v>cMrLwVmSMSQHLf(T{Dn~ion?%3;wLgkXXLy<^~+@XPrD^@3mWs< zwA9}T(t2mszx#c>Xv1m7p3mbm*Ahir$1d7EIiFBMPbMP7Gf{D0{Z~}`V~+2^(UML= zYhwl--JUm@JLZ7N0Mo zeHgikFT6`sOZ@%%-mF7&Ql`E`?;{mA=xsF_ADacEea;YMM_fDT841tLNN{~2WWb*Z zd`Mamvx2l!eu%Asqx{ghgICE5cUOLTnn$~!4*?RqWC0W41M!XsTCLqb16W{nBVK@KaR1ZqPL|9Ys}xOt zqu2U$#ob$L@H|0-`ec>|x-`##JNV2?%;bl6IvizfDVYc3&CY%BzHL#Hc+@F*@kJj$ z9%Rzft!k+mHC+Hy&T1NeX^1VFx+;1gg2x;WRJum!EZy$HD&+<#viH3>q3kp1#NTq% z%&uXxeFExESifa!VhK!nLGkcEXcFbjHp|R%-pUu9HFHJD;n3XKY{x?ALDp$Hvo-ln zX%$}c1{;R6jmV1C9)r<8b;J*Tf4nVJmoh)s%kJiSzv8a?YUSAs#W4W%WIICi!y{Z{PWZvuwll@)cLiti3BiBl8z-pD;=Qxlv(qAi@Nh)EZ*K>Pe$L#sCi{e{Iosp-|E{+Q5=EUEjv3OB>f^16ZGMg zgEs1|9zCy-X%Dv&@sIW%;Ku`iNR@u=3@rIsdW0yzZ<-#Yh>y% z6CT6^8K>zCf-&7S1L#VpN73wt!O5mIpEXS(t33YIWAY~ajU4I|Z-lgrE*)gbsU0ej zUZ`Dky<)3w=dF0+aACdyN438I%(O*`yuwOet<|PrZ{3GT{h~Zo&Ma_lGak+mcREpH zEtmRoF8fsNXHC`qjINE@mP;G~tM#byUaOLN_pkFxrFnK#DsFt8x9}Ih8XrJv zGtv38Hh*(i*fj6g@6`G$_~=vfG3RdC@|}X5e&75+WQ8MMf}zXs*S@Pn#J8cuyl=4y z_KwCLawRp_siv7q7m89eXa=J4JQHI};)cKM#ZRm!H`<&!5*)Kns_O3CojFxt>Oa?r zG}F-{`gE016n+c({=jIn(-v5rqq@zLuGxDuXhW-WQaXw$v|4NQ?^M0|U=>qgK4*jD zG4`NtM+qGx!}B2qq8EkQ@2mAMnn4Ui4q9S7?%Tt%i}@wZw=vx}mNO;(o*@%7ywtmI4}P7S zBS`dX>=^`S4iZgYAkEwwlnkSX^pOGw1y3;Iv|z8=(qKE53P;$d#2-yvLe1L0X&=lb_vAJb! z<1uV3VmVf7z*|y#;r++;4Rn?KyL1Fp+UWrMKR**N?RMBOZMtPh1 zJF8j^PQCrY%{F%Gb;Twx!Umt%;?~OjQZ{M7<)t&b{@p28lvK!kvsxo3$}5;&fu)=O zsATu&vr+?W0oi@0#rXn;SfSZ8cWcu>4&ZbQJ(t~|%u4AUr$2RjFx@73%2v)?h=J{3 zvZ&SMG|P54o|?DYi1fVI+Hdt64VKEte1U#9*R4LX+@0KWWBWx5`z9R8=`EA-4>sXRC+ z-?<`*e-!P%V95V_?8pCQn&f{c{ACILH|eJTEysV$@yCkde~YaA-@WJmz1~y#KU3l0 zlS1Y#+FO3K7k%R`T$M$!LrX>^@s~AY=l6dK!TZ0$6Gtbznn_jK`Yq$=;qM8R1dFmR z&i-+K9GjB~-?`%}6M{m&Ofb&d>PVh}bI)xB&24HNe-`*L{YWzKL){}Og9+~FpI?2- z`MnbP&!>=2t)|@Ns>IMt(~8$$w@bdaZ*kv7@>gu4GJ(oJ!rGXAWcVe;iJ;P$=^siE zlTL)f1T&|})C}rQKNiv&t*sR~C3bzzP`|liW5oJZrR2(P$-mQWqm1}O zwfWd-Tb;Mu91VU-^h-+NP4+P{8Ikx=xtga}@W_O#h-^y@vq88{Y_%1Ea#d)Vv#5Nr zNRqPmKuJ>00`BrqPc6rz1axMfirqWPhTE@!%Y}kW`XK4?r0!iJ^b)%>uge{LacCCI z?+Q9R-0oijpe~hXv{cQ-%v&vvfXnk*Hd?;Lm);otzDO#Bw@FRBP5lYwPU97_X&%T@ zv1%dG!(xT}EK^cA%OB9gGUHr?avkr~?(T6KZ!juK*PS^vuf&P)eR5Zi&Vzu*7*%h= zeJH(Z*t|IDrtHEBoeCTmDvYGZ9jz(#N|TGdSr-A7;HCBV8KFpMI%=cCGHin4r*%D` z{sjJ~`!j90a+!~{1UKmOd@Apf)pS;J=HN?A!T+E^gbDavb-=pfu&V>*4iA`0g$XUF}bl}CT`CUsz(8c?~KBFj24R7_@F^(kJIKVh5~j{7;BLIxAA z(%Qn#->^2@RJ;kw@ij7LgxgzHB-{`eT)$GQ*G$D`bm_BZ(!`D~d-$S0>^}TDl5|5( z)$*;^k+D)sMw$GZyB4xnADHs@3#$WrtW~Vm%TKKnh1D~jHZOgzjK6+=$vO2r1SFZ~ z9nX@aF|mG4(5&S86Nw-?>M=@bD| z*^S+RLiQZyN*MVXScOxx#31BnxdW67KZBKvxkkp`F7t0ubHgM{VpPeEWo-_@F?Xvo z*_)va6mSoL6R>j!2`OVe2O$(qNC_3A~S)FD4cVN>f%Zz7pOjp>2@okHDV ztC*0F{-a5B7CJ4AU#o3|3u+P?0v=Oxo753#TCDePZH+`%$2-5?#Z}@<2?XR;M8CFz zAoG}jkmDa$=#YO~rBOvWo{^W}pPFFpP@nT;n3;41d}wOPZRNp z2Pyz=&r>hLds;jw;*D`f*;ZtUe$#-ET8n(2%VOEN|AkFIll9j_cDDi0m)ObZJ}A+_Am3x`!ZabR1u5Ad)J#kW+D=8w3d&Qn=enJ;s12F zns)0h>#Nwbt8cPz=$W4V7@J<9eiirrTor$%Ia7^LT5Zhtz3A`I&^N1AR^V4(iaBu( zC(P}?RYgBkzu=I5;%>XL&Wns=Y?`N|uNtW`wc%6ZS#O>=boK)U-nP7mP4MrA)9{Sj zozyXp{S$TeuQW&o{ahE+Lrcq&ni@GLbXl`a>IGW2;q3jIkzY~YKayd44|u`ox6caB z9IU_TcasiBei5har~J%$>z91??}}9q94qvj|MW4FfzNJO&ZXsLeM7?>VbiMN6>;pu zPCm~svF|_LeWo|?4gyd$|k|+h#?d{?}8OVbBd1k7UI4R>4?t|xA-1b5?&5)Oy zwnQ_{w4Q*=$T+Vh{@C7dz4;4I;K>yiubj`M@=AoYz*SeDNYn3fyno0_- z%)o<*+xO?u-1~)Q&)2ZzYP7?B0vDrx%3LC^f} zOpj<&e_5*w@gpAi$o)9OgX@2HRQ-RTIUP6Gor%KGR(`rHYWn2;78)=kj=GpAuBtOX zrBi>Gg~g9o7uO(NxrqSV^&y;fC&;%|`c&jSw?!xP2B(1Da`c0gmw9~5`<=`$27D$= zcrRU?kk8+V_ERB4(%2%aWU@D^?H^5v6pfHelYbhv3^M+T(hJ5gqfvFsJ|<+qqTwM8q??)_0+J0TWX(#YIOrYq$ow54ei4KI2Kfj6bBuaj zG~A$yX#Z_O;U+a{x};t;GAlVJ3pT=6`j_=LuqsHqg)OAY{-@M7MHIysjHy+;xeD5d z&)5ge+m*iNb{+&N#mzEJ&r{h2a2^x4FZ`FfJXuH!%M}?%88)xG87`HE*~Ju% zEVkGEzVAHPOVe7llOO%+mBaeb@Tao2E8)GcIc7m9-JJc(*^#+NC&hY^!8$Dg?r9Y) zn4zZF3at(4I3Z>fnujHR7RFWTf0~8B;YIS^%ey+4oR&1=1+Wv3hy%SfwlBLJLgT;% z_=xBE9iRV>meT$L5E5>fZ)Z23Y{(2=mA{T}yd*g^m%FQ}xQW1n7NL3Bc-b1Kfo79v zDLt{6?whbJL-}{s<7`8pJ9iuNDb&$~?c2&AfLEXQ_$!#aUTLdoZUWWUPz+F~@q7^P z@HGX!$oRPzq<8- zU>^FQDv$*NDUD!9(5iT;J7klp5(|B;n?6pI)rS~`fXBIGc63}{c%N?b@y)2}+b9!p zTx7OI@#xuajj*BtX+~Q`br|7!EZP@K-tMgsWg4PR)R~EWRYOPElSRE9>>cZP5rl7( z*IVn?LyBn__%3E;DqR_9TD%ifRC4_)i(Skj8fA=p*^%j$C~Xph49Fjd9UTtKYpoN; z+>N3yAYEcPa0CT&-y>Ra_@9Xn>ua5(gC z7wg@wkmVZ~{Lw9*`B%)3PZ*EAU+m5}hqCWF=1@_QYapguJkSu_n!Eb^NewQ^MEGh+ zOfgTMoPf*3N2RZc_igG{N#O%@SSXsyBs+9-g`$&w({`M%nRiH7-O^AW;`(=imU=4G zP+yv{zq?M%mU~UYsy^Mz>A_N_ExvTrQ=x|(w0c$HYB>3YMLEm&}@$3nc#l}_QuB=Q9JyDy>99jC3 zYEBPM>a7k9&~}VcDhetEd~o!&S+!ZN3Ia-P+J->`j992Emzp)1&HIYD(+zeCqn?dJ?ur(i>@Bn&3)$=4{kw1YXGOm1Y`9U*CT56~%wZiPYcv zKohQTZp{%ZX}S9l6uPyrg+ihz=r>=zhNwOtd9`KLngIoaD&G0J^4X@mnCyma^pqud zIl_H01=b*Se$7!2zNp#dkH4)*epVjQvim4;Yv=MvT_hi918IrE#ms{Yuu5`XWyTzk z++e9XSV&F(wWVjaQ!C33!IfL{czbZ)+aB9aS-ryrN=W)aqsePywfOPj}wi3HM9xNZ>X3uN<1sh^tfOmxLc`d#09Z6L8M zRbtT#3|dM7nN|$H&V43Ts90Ef;Y5w^ov@6+)G(zGUeEY!2tcdNl*O*RzV!T`5?2ZN zw?delx8Wgs6j$Nhd62|z-9uRh21RslCQ}0YC^DNl*GDsXHD2-&>$H;XMiK}(#+KmK z`q!X>Wk03<4SuM@fBBx~UR`~5Dr?b)GlmYmE1?p0jZmi>ihznGm7?9|C(W>JK@1*l z)ElmN+sr4PANlzK(!$e-B@TAJool5~ehXOSccoB-uz1MHrvTBX8s9)0b?e$jWR9{} z=GvAQ4=mi;sy_q)#X!jjkxAo5&6EvDzX-UB{l{2Jn?E@&vS=*w=-UnZMv(9>Zs|s8%}$H9R|kEP8Xu`2`7{qXsx`Ru zWyGAAXW-@E$`vj=jCWwp%QXN8z8de#DHO6i$y-kz#**nM4+eXk<``% z*RE%Cn3L6@R8t4Cl0m(<-ZcSqt1ifer^nNnyNah7KTN4|SXOGbTW|8H-0bD4A;VFX zRqhCfSCXZQ;xGN`e;Wv}>w3i3z)GlqCIuz9V3Xi>q7&(pnUERuT zK!u9BrG0O*xsZ(}Pw&7|dUH?RsnM%MkmE!5lR)urac=qBpyWfG8HMe1fp!tTJhE?De1gEGr$AGpcU;9Vif^gL68yW6NCgOX$$yLqC_ zBgt}*mE^W-(a^Efbh)%X_rFH2sF_9;q7cjw76i#5b3lYSzU(9VNI=e9iC%ks0ay10{ zOp}Yl!TkXrTO6NjRjmOC2$b0IDd?=S+)%S*EqavG&}Wj&|IqiIc5)#Yea~)NDHudn zYGFBr!(KqOjTj$S@W2%o(EToI0k@=K0y@ZX*t-lAcaJx{Z2MOaE3q>zCqr_#)^LfV zG?*BESH5zynVL@>Xh7vFrHxdN52!>ohf>Ux;9k;&WD;;E7X{BZH;odd+|AthY$|_o$!;e%>E#hLju^>yX&;DTNOSw164_V zh^?c~v>pDQ+ZmXVfIhI_-F7kkIy%i_S)?iq^hp8cX9^}eBt#faLYyqf@3Z$PJfnBV zTSv_5E=g$KNDI(-P9^JARYzJif=OR=^m}l^3}0{>_31UL1<+EJOR?Mr0V6jsFejhc zsoR?5Rb_qZw4~w;%<_2)2%AndA&)U*2xRs{`AS+Ct2XB%NQXsWAn|>@$wSg}W=+?n zD*_OJx1C}P0CvSuF@mMb&!S(Lk8uEUt&5xx&dZiLlT5d~S`dOeLQ{AT$7RV0H(bwS z$WpC#MQ#ZRyv#mf8**ya^X(SiBWh~}n`IKP7c9K=R14C*{odKQ91zXypaXUQ(v@2B z6LTCEoaDEvZc>`FC~mMZ-?(l*+$x*#B)8y)z5I-q-(l>t8xxU8%r7YDj}eZUIp8;9m@c=z}R&!JMRq_EE(FoyTNL(=R-fK%A2Hdpb>mfFzg z;7U*X@Kvdj3p@eoTNn@Pg=Bh^jK1++6?C2aEafKCo!yj7d&4ah1<#0DxD}3>+h1@r z2xHDp70+$q2kSCeHW!}QDlC>|QX)7Hx;2_g6iwf+VPqixuRd$UB)_hf8Y z{$_o)y@-M~AVJ|yxvJ#&w0w5{`U6bqoUT)D96J;iwu%^HKg4jF|14_n^&lT}UGZWh zG*@2=ZMX7jUXa+qu~@|gWb?N$s;-(EhnfB`7VBpRE+m00zkTuWTK;I%RrADE_fzkX zWW>jS3^i21$DHlKg7!A8^PVZI6dRJ)zzsZ1;krx5svC>!vTw1yB7vGr3~>5nlhq_; zp3^wsJd&s0o>^%-{%7-O9d^XMOIj<_2JMk_)AbjrfuRGk z9Jy!_tcvPK8Nd%PI;$7w0l(Mi)L|B8Gs`4?n)yj|Gp=ACKlgr5(% zUV5?risY%0cggEY$X@$QefmNYSLgA0+W(fOD6}uvq7v~lsU1&s(9ci%|Nnoq@Mo8F z9{U`$yX!YNIB4GyD=bwDa>SIHq9Qr%b?FvFPH0ml;B3blK4387mt*AhIqkkd@0Cva zGJ)?$FR-rB?b&b?dQ4C5;fgut$J>BnVA#}n_qnB-p5)*lf_=HVO8#h&{g3p^Ec{;` zi-wmDf=cK=eHr}oAee@JxBr;(2kj+546TQ`sAQ)eN?moSSTEA|%XWCRN3P7-L68-Y39@Q%452*9W!IGaKr%+Cd z@mykS53X2zNLx<2NcdykMdL*fk@iCPD8tL&LeWq8Sl~qO=5$0$_4AZqyd>S^)xBIy zz`?iG)U`KHsx3v>VV}EG=L^({_3L~N3!){xxs`40g`YKjMFAO>t7NY`f20H%M;NCV z7aKPiM;fOZmlz|^%;k#v68dqyW_*#dP`bA^&Ob}BPS37eGiM^}XEe-G%-7<~iXh-* zrQMZJ$@v~1i1EY(Vj}LwD6p!-F%_-F@GNm4*GDxvBja1pnQI9ecyz5 z1&WWN0>t7SWgwmII}1z`@QaoPK-EJnsiF`%6M`g>Mf?RekvV#~d{<8X?)KxVR>wHB zQhBnCf7fR;l;N4WMncKi3BMvy$fKS9=^4|vBKW$SgCo<$z`(Mi@r9!dY2fdlMGZ{g zX7n@EE`&?PU4zv|`;{9Kq)t8a*He5~+*HAhd+?!X)*4hnSv|LyCCF1YD=E~+#uigN z4UxinO3fb)%<)ZhqARNX5xn_l!Nj%xPC(aCTq@$)u;02i-lg)&>fKFD&SyhE zSQ=xdk@1M%XEr%D3mzJ~+~%K^U=7tDncjL6JKx|gxni6#pzcUF=4F867trgu8d+S8 zqaMd*$b)AGuc{mCUgBQoexE%%IA{WkYqeo`UB{_kC={hSSFn}`Z~u^#A6C1r|0q^S z)XR?UH~MSg1S(gQv@L zh*C_EhpMWYkO^D6xVe+?)foKOYn;3>^D{CILi!3WA!o5kWw}!i;6=&}pRzx&u_Oe@ z7wH&gl^qvP)U-S^?qp~l9uO&m3O$ppp!Md0uONo{qI^}xy4bVb&_=Ku9kIz)v3-PL z^LA!^JGXF5(VCn?e!ii2@Z;(Yj24qu30IuNU9^y3vor_8v(@Km0%o>qI4ukUOS2!V zDFJ=$Hmj#h#aHGnu69D>sp4e&E!2uMLmF4x{5J9eiHDh>L=0?oT zO67FvSMlzV{N1BjO||Mtvusy2^-tc3e3VdfXG1_XYIqgw(b9Tko~{?cgsZq!J$v)? z2i3vue{gj~8)9{~7)vseJ;ObOweOo}Hd)6w*x5bYQS5E!OU?g79&!)vju(l|wic4y zyA(4Xm9bKDJ;tCu-RV@loC##Xr#fNk57Uk4gy_84cD-~DMGFsDNIq}!Risna*S|X5 zSh@{vO^P8NZW0Xq=xs9}sCcC}E9MSAbolf>Kecrz1 zjpR#zUUam*E=NzlRl3B0ZAy5%A-QN8^JJ7a_t7GK3Ghra6C~Nt-_OWa>zV6NKNl%k z{ZLrDct|0x1iqc^&{OmGtYgIBnC$}zSc2hrn{hj=_@S|6bGtdZ9SkJ9&nlT_!cWZ$ zqMNRhTLf{(J(BQt4ec5%t5svQ75B8qW9F`ls=%AI1%XCkXZb%~?d=5CP7oPSjMDw% ze(y+m#_jJdJ5cc;r=oy@lOKEI*CV8|wDwe*^WoBl9xjZEf1Q(8)b-Fyr&M;8bkV!l z!u|P#B+0Emj%p09+*2OZBFa4RD~<&ujI`I@O7>EW$qX5Wn^-7V+IJIWh(iG}*Sj8d zm3J#ldBIIjRZ^5Zgj0*gURlg@S{AogHH4mC2oK6yY*SRz$BFhvZOcu>Gs!;CexN@- z^vp`tFXsK}!as$?(0Lw~d_w&!>gy0~ht=VpZH2jA32UvW5K2r4@ANwq>+Z2u|D;8M z%Q7A*5gU=ueBGzMU(`Q79qo>aGTFPNy>^Q}&-D=h^vf9a$9}iKQ0E=HNLUuV^(|2+ zXZ+Kx3GU+_3Y~6;rKpMaua~*5NegahpUX;ZfXhV5_`TNSdIqT2Rx5S= z9cl*?+duu}m8&FINHk>h4%v0l)wEPV)=;dy#4b z4>2ek{=M+VxvRpJG8cqjfaQlcF*EK9Uaa-_!k_6mX1XzMhQ%oX3eu!YWp(R}jgBgP z6?HWx%Xqo*McZJ4i-;@qvrXPwUVydch9J(smfVq|H}rjVd(7#}&Qx-_ls+8%vc^z1 z*|Nc_GQ`s8vFWPyHGt2Gx_((HVYu}wF~ZT;U{2cQ;xlJaKjowin!8g0V{O~ch=_pN zdQ)pM>8X#W=UULp*aR<=cQuF7_4pMHrw+(o3c8ujZ}aZVCH&@22qvW@t7%_U41+zDL%~UhB3=!y{sT&rTdJ(rF7hss9S|_~whEJAuNpACsPz^ZA~v znkXdXxelGX(h{$*q4nVp{SN{gfulTrBbKKgy%^;jn=sfC@HAUle_=jgGcwC$*zV-* zD@>AR%d_#z&Nj0a-{l7tyTpzA{DroWi5NIGafS^e9nHv@oQ;m6m^4hyXy42vzll%C zqLfMsl5W+w8^}!L>AyJxKz;S;a`?(8>|lp^Bub=ZvdN^ zve^b>;{^C;y@tx>_Kpu3Nle)i288>ieeGw3EtjKUeBj3n4E2VaFFmazi*=^T{-zrn z>3XbTjO$l7_86O$-e@s>|yltl|%A=dT`dGZ3@9nNpYSn zk(k%MZ(ka~bsGU>Ef&Y`Tz|CMn4N;7cvE$>`dyHhVgze0=^iZ*oPiZR7@Py!uA~|4 z?ITvq=|)LS%x;k151ZYo&KTz764lk5_W}DfB2LzMj&$hV>60hr8sUKwHU@dqF2cQI zdEpo*Hv28b(P&q-28FnLl0xFM1RD^FX``~G+Ts=9wSm2A#v?xGq5{!tpCq;Oq-Pd- zx|RdA`wW$E`qn{)=mK09zitZMBIwpez9=IK!sWGslla~nYJ*$&*5q`3Bx!J>2>{6z zkRhEkzjb?7>um^Lt9R|W4rhv-+AFTx0BvB)ydCw?2DY-4JT4I*aqF;uGGD+l~Bw(x0oJ^Kf*|!*cg3ahS4k!FUhXo|*6A!LK-% z;s^TB`5dtOi;Y0a9~vGb9oG)jWCpdw2t=A!``4+LnM=@q=}4L6^Zoz>o{gzEfX?Y(zUQ)}Bd zin7ryh-^hfx{6YQfbMUlqq>Gs=568ad$8&YDFu3 zZ_(o(Jz|wW3VNO~8^i1RRo6^e!E)d=pPN^dPqrr5^)%txc;)0QkkPKQaTO?z#2t_` zW}#)v_*?j%I_tD@_?t%Y>et3argE6fIho~wol}+_4@_%gt1Rk|RI^j+PA-1ydr^lr zTJA&QmDT3ThS8}yS)1pu_N^&qNuzrYJ`G)_I{upPq=_@0)okiBgmNo5_+?&kYQQx? z_wy}0n+&|J$ZKLvE%SWuYEsr`^B(7ZQF8Vhoe+Bp-Ob@}HVzUei~EB(GyDSiYEHB# zJGPOSQp=%B?=-lY)Z2v$$Trh+fg_g$`UVH{i;7eXP&OsQMyAUV<28PLa>?(NTHk0gSE^XIpXv>4>{1^v(PZ*qBR>j+#IbG5mGp#|D>V0mszvn8$}U)< zt+9kgTUf)>X1?iI8l#LQNZp7zIvz8S)P$|$v=dGoNOGj<*{oF5Z>)aVzqW(4aYe>S z8RwP`zJPAPOxkl=87CXZLN8#LtXb{Smxf))PanNT(>bLu70sulvZM8Mi-KEjBp|YJ z8^@Q%OGz21ajh;*KFt>^dD6yu49%1_*&6zj&C}=X$PAwH$--umqViU#DWSDi;bnyw zCb}z(A>J((2HQRrJx{x|&UoK1yhmatP}W7Oi!09WCC*qxusR4n#uF}+ho9?YVOJ2JnC3|f@T`34 zG`$g!b5-a|77A%)!Zv<4O}|$QSCdFwOvTT+;8GmshB1M}M>SVq=7Lry=sq#F#QQI*OoeTJNkIv@o)N-JB@OtlkA zeXrElmQ(w-ly*Q1l3rC zQ0gUo)xz~9+C~$Byb(*;@N<{Yy5%jyjhUk0sN%n&&Pn!~Y6a6dBBKVHw!PZ6L7Obu zY&eUW0q}jDfv*FVwO+-}KCP`BSj3c5#T-Z}1sPp)nbVW4Y?%0G`30hpVBp){En)}C z6?~?*;Uo0Y(IQ3jdr32wUFaiAZ(y}oMiS9=g=*P!Xt2$M_ohR5G!r_ya!yf*iWzTP ztzaCV34`Q6#vh66roR>|)v6IHFbqPYzp8KO!xgAI`(njHwdR!Q>7<^PfVA4sy!)tu zzvrcj6dG9L@^3NAP~yL;e_|#RC5mf`kQ1zx`p%JliOM& zs40FtaZv4-EGzjZfqCv+gDc(TD?bk?!~XF|)#YueyMKP;;S5E^{+gn;F9@#)`74^Es2|;$nh6Emk z59fNG?PGy-6FHAi>04>dhdvO|+c1A_$_FMe7o+is8E?aUtR^JIjrFqq3QhQBWQAtg zy^T={lRKbE++Z})ZR$x+?3Qkl6;oTEv^^4JssUZL@&25rM9yn8Y97nxrQxC2shd6C zC~YZA8oQX1+cT(?Dq99O&UnXsFDX$}Q^wUT z2Y!_>mXJLJZLeUdQp(h>NPc44!0PmRbW%7r@r`}vYBtCar#}BjWh3TiwFII&tpCnp zSai0_O&K@aOXi4~96^#FL-gF5{Mly6_-sfQqz^-(lKj2zVf&~GMqt?Z1xDRi}6 zeclaE1Ms{5Eu+k*zay^5319qls z$O+;;#pj3?694qNMp$tiz@OIl2$~Op2k9iACD_%t)U_D#YR_DV?4LWHwvnH$_b%7> z7yqE=FJ7g`U011YPd{v}SYy1n_d>aD#afVr$S6~ckOus+mVz8y6NHMi8ZKx#py?s>Tr$eY^56s4k?EAl`aHa%ZiR zX|GoNo5=pA{K2H-Df8)MtabOo7#Fz*t@*LJSjSGnD(~nZv}2zK_tO>xz}Xm!#kW^B zHbbB_*)I^rQW|E?qVbnlPJEAcw}l*y=)g8%li=cB)qFoh1-__EBxM$mrd;2?LdEfK)_vpiSu*7 zFC-dx=erAU--vmw3d??VKlih+A-b)XA)>5Mp0hy|BY2acjH!3jlc3lYF|GhMV#x2lSME!;e&J zDrLS%tjAvzllVp>^(?`UcYdWEb5f;f5ExcMQ*FX4DmY2GJs>!-#KfI^@CA#qi` z6AZZci%sM?mW7x_-BTZoO<}_#HLa8f46~SchPv_}j?#4O^WnN-03Y@9s=NjK^1-W8>WR^p znhdN{udNANj;EPSte8Ph9L(C;Td)jn?vL?HKE_+jizjWpE!v%0Hq$>kQc?z08&aQq zrcppF9d@3^Yd4-mrJR4LgY?hslo&%PpHfH`cF%d5vJ$;q!@+xb~VRH+zBGMK5*$yx=p$$b;Nb7prz*p-<#^M};B z@tG_ADZLtJX-f+Gty5J5o8430`t_HvgBNZ~>(6{WJT~d6R@c@?9t7-IZHx+7Nr(2} zsPZ@8aN;e_;oRrnxKQEC0D)sy;a`L=dWUTsL2d;z{1?P!jU6g5izyu^?%LnV_^=%M zjw_snN2`_F$4&kyn!-^h4+P7x8+78`OU1IFIRO6r^GZL}K5dy>sFRS(dU&d$Mn%?( zhUiRN(bsv}^UDha{^kpsP*9z1^$Q#{e`Lk9*^u1pzGl#9U{GjkY*Ce&%w|Y5(VdUw z!5HseV4N;otJoZulG(p_E!M(W1zY?&*;!y=!uHd_dJ#l(HaUse1VW-gRBkk6KNy^1 zhNdZbs=3DP+^~^yOH^-bHFMPaI9e~uHY(^K*nA(G@(VmF^KFL;h_b}i zeaSDVozXHL-m7brwd`%z>gj%D479vUYM~4$%p@a2&-A7BE7raJMLE_jvBe^t z3wLFO78BhEMx{rOc2cMgn$(luWCi+BadK)rE~sAA%$%n2%=;7iM}L8w4uHN5!Ey*@ zW}s9dnWoH)>o|WqjsQUFid=L8;`t#CPj6c(0K?nGtj0$9ZBmsNrb=_*?!RmyDnZFppdnlG#xKS(& z(j@~pLKpz306XMgS1OJ7b^3_76B&R*x}ME?6X(=!`JH3E&XI1EK{{vDL3;VExjk?7 zU{y{q2D1$HuFIZ9LZ$RUaYjn$U9JTK&{X=>{_|Go_g+wprkYW!DyY;K0i-; zHrK|dp|q%!rbX+m0#Fdr<$ z_EnS4=OcXVDq`&0;gYaytr&CBxOku?zG=W{j5A0~?&g|hNL2(}}= zy+#QEfiGsDr7jVqrcM=wqJ*WG1rld4A&FB5rYUPY-4}I{eOG3y)+Jd}7TXQWF*wb> zDaNlpx8*bouM^+%uCjvaG_+N33TQj*LPcG_UAuSxa=lgdLG$^0v1Zn5PYtdR5#0#| zI`r#Se`D_{m}(R}dv)C=8T+SC(v}TYNOa<4BxS_Db#zU_w%FFdy(-6SGEC#xFc>(W za^R?K1NDtCZI01y(MpFW@K6GaM`EL%^#=kICT=&n%i}1^rCA4@IyRWaZ8@*wiaqCrLG|dW*IL47dkzM^X^kfjM~O)G|FIz^S1C5 z%Jv@q-+ai7Z6<0q!E-Wnux;PYedAG=6$=Q1cZ%z%OSiMel#%kMw!M;`=;BdnvJ+^! zZF^0Jxv)}~V12oz=hGHj#1kuErTcbw#eOieF(uz`1_wGdE`EWr|B6ybD&DXB67o80 zzMr-1{H9Lu;Cspx(bBEjA*C*%79?}0+tODkt1rX?!@1SpC*X!KpVVMEU3=DpB*p>V z@EM^~DBTL$PQQniC%p%NJXRw}IMp0z(5Xn(ia{inN>V)YNpj)y@XIPX76 z+D-Q+$Zf&BH%bbF86(5!#%}V8qzIE+EoZd^B%mZPbhAhAjbO}^qdhGd7kSIU@yA)GO!TkKXp zKD|-tTMHKDO-;QRUgQ? zuUrEUfQTi|m_-=K^58~c?k)xGFQTsx5aoq)^)DnSu6ksB0ogu}L*ws%C~VH4a+XgV zC@7P4E!6>2E%e~w;({;gNPqjyX|HiDvXqF*{ z(YN%0Wq8?rJFBV71lIv6z34w1@#q6ya~5aFuIc}x5YV;zE&fe1uqI;L*3 zz6z+!IcB1cxKD9RK?H#Bylb6(NkQ$&e$*G1=VhB3+Rx?KO$;}hBui7Q3%h=cvz6wk z2tPCaEc^vP|8}Q`=B*V6hd66<>(c6`P&d9-41HrnPZZ!hdC$FgLu|xNXu18#ip5>> zcC`~*$vN@oexfaGuEs^@rD!s9bA|6ox`6e__*}}l_$?uCQ)7#_dqGgX+g#-g?uW6$ z0_|~v)M78*flNr3pSe4yvqyvXr6b>81L9xbsEb?HXBd-Y=llY3CV zYYGEvahsn_x|V%(@=Tw+lB0Ag9_He-G*wi^+iJ9>Xz1zcREcb1Y@-L-Lr-KxMO8P4 z2*YSz{Q42n^X{!Iw?=+vN6i2s>tOy-d7-#u-{k$}E{}q;PA&V87V=I)7m6xqd&X$K z!ywu`HTxn_S{VT64>(}-tOKu_YC`LIWJ%~AFMhOcM*ENDU-tU*Tuo(n8PwY-l~j8a zzp2HTV`rSzQ=k5FHTXQxu&$9PF9Z%~*J03zT_v{~^CU9~Na8OAAj$g*L@RE{ODp&f zMJlbvK7sQlVx0&FmW~a+))MA~Ejz4~s9Gc4b|44Ki1et>Olb0Uzn`F^U<+2KiMUPh z>NWpE+QRDbV4{$0&>1rA*dAa-e! zj;$?(pZ{s%*5AVGY4;AC`)9rKnug{6U3RN?{NDMojdIEq7YwIj$>TJX22t1ty8`UE za|Uj--Pk&_NZ}@i^dhqmi2Pe@c2Bv;r8rJIP}pHGSVRwWpl>lDw|-P#R_L2uUK~6S zb&wG2s>9|ns%!igZgzOHfE;_`%K^S&pZZ+?CYoFD)vzSiQ5V;D4`xbTi^mzU9$~8N9L{qL&%(~RXm)Q-q~tG&InD7EC%ln&U782H z&*BQ|j=-O>l0ys5lCPPIk!9>KWcbCCT>JX27C*{S%jX&qCyPmXfn zcuXDPI#HJ?L!%w>0*}|=?#TY}BD;F1RORp!K;%b|{;5X;023~Te)QH_KK|}En%ncj zNi)M&MVF44mEfJ$2SR??aPp&QjKz5TMMya;u*`Wq? zb^QR~DRrpyW^({N29LxZu%6;3Ykm!XboA z+f%r*43?1IOPJLm1+;KjmCEIb0pT6H1@4+g$@tN$L=WvB@1h=dHto^^DoQH4QZ61?F{A&jzHXDK7egi%q4R#kR40eI}?5D zaBV*m3@!}(D-LzVtEZlGWL5_sDpit)U-QP;XfVIEVSXGuO@U}hhiAgKXsIA?N$x71&IR-}<2KUM5 zmwg+sL=wMF6)wbC4~&+4O@~5oi@5`-3>(!zYyP-|DgTgg)Hj%%G;h5VqMe$O&m7?{ z`!ByggJxkpQ=M0qJ3~;T;Fp(~9=ro?>!7!H9%F9v;p)KsF!cdXO9O1*U)XIuPdg6^ zPWX~T-^rI4iv?q^FV5IWQqOPw6lDT?U;m$8)3KHiy`_e0{G&^W{Nw96Hj}aLBQ{xM|fw|R)rIA!~+n# z99<*l>H+oQjFddNVB-`y>v2^Kd?mKn5mB}eu?7TRkn8y^EKl;lgm5-xpA0mDlW)~F zJFlYcjj%34qz%X~hg|M5Ak`)cKKP1hAg4Vw`NcsBXUuqIk)`VSWvAGB(G2fjxX{Ag z|K7{%dYl_27_|26>#0#@lWUZ<)=uDaA?uB862Ty>+u%U8mpPs^S=5{O@Je4pqi-|f zudCa5IsZM>^}R3Vu*ZbQi}{vUJ$$kiWRN7G9L5=aHdCSNJS&YqGO?Z$~|-)nxV z&~ZL5H6i!&bL&_s_UrTodQnAV=c+f0K<{rzAj=h%>6tO)K zGT1?``tFEy4wo+*_&1&M#Z-Hmhv!pUPN=XxZb$dOOuo$($ z*FZWtXZe$HP>TIV`U9+E_&2Fr@0{%2++3aM}*u?8Oxq#4-!UUE1zn~0TSkFMz;cW7( ztyM*JvBD^eXY8|>r%D>71h?M0jTz0k$=OQwA00syU;w~V@~a1IrJoA^CM)X39a2=V zyO1~^VLabt$@!~zRU}CbNA0i)IDRe@8p$V+Q;`NADmiSW>9EJkl?Y|!InAKdx*WZO z(5#W_ACzYm+qJI66mC}1^{E*Z6%dPn#_UKRqv7nmX@~B}nslU=SvN0SJTkHFLLq!b zbAXbSjOzx{AyYQ!#7e*iWsIaNi{KXfk6F0Ko8GHJa^Vtt7i4xdJJ#|LPdv0TG>){a zHdp{{_V??dkZczv>vm5_6uJ4hG)Jf1?H=6i9(auLYUa3GmV~6^yqHC6XRs_g(i+@g zL<-&mi?E9j7(4Up&>n3$n*p=MY&r*jjM_OR=&%a}DeNZPh!5o7_{2-{ImxsI^HpQy zLGp(le}03BXF}B)Khw{<#>qw1?p{>AgEXsj#q7P)TE>=$%eg+bLG#>Sqg%OHz2x$o zm@wLgY{P~|4+Aft77(a|_cpct??0;dN4%3d!D@(@Zjh3_{o(l#O!W=oEn>XsbM;n@ZdNA%XC!oz-TC$!RsXKKdMjn$rmVG0KveG%hjXmS zRDZ&U$hVNkHE1Rbl)K-%E?>WYTXXE&qfnY}?*?O$7M7N5jZb7a%%WvI$--vsZN|L1 z0M(O7p}Xv;kbcOOkVbNTJ*0a{7JLn4GJ%6HzqA1WS-+L7avD1G|WB~(K;KF{j44vKR0eK)(pux{SpCE?ZG zo7klMr6AMmR8%=%yz}_yQmaMvAz@-_ge;#zxHb}Y31MIa8UL>tiPgz4VN5TJ-MdtP z1*D+fM$+^7j@jjspcd;|@Y-97`pWA+hut^Y|Lsc6XSw*doPo)fceXA11G3D0aX+vE zvUDZ+u?}5{SL_+xq?}UULl-8%vtun7R5sliyHhz+>oi<^x6>hcA?5sXDb(|U!9AhM zcP9rwR$05PTWjoKiIk#@=j~9jbY+J5JLi9|x!<|`$B{a_D8euYc2c6J#8>4h6S4ui z%MAC=?2~fZz73!O|87eF!oa-D?J1+jsrC8XH=nn5F-RZyNFQwV*qBVUs|soBd+B28CW@wt3H)0g2QeElKwtNhrVgzZ89nlY0z%bzm`hQQr3IHxjd#DMWiYta}hw_d;zYrp>HRMwnO4xrxz-8-*;YcmVinC5~E}8F~xG2K} zvsa7Y`%+;%z!1EYJFsPqbv-e@v)cHThRY@RmC6JTc6)>d>pZ_qnN;Z&5YsS3!{r{# z{rCCELrU1~w!~9K>^c?XChoG3{KbZ~%abm_>^+~5*mYYmpH><~&;`wtiM_76!(zuc zk-Oy)RuJ!wgWXnPGwcq-O^~lcJt3X%v{fov@)!wb8g>VWxtiL5BdNrUDw^h;V#+m6 z%`=)p!udN*F+Zh}HaZNWcJptcd78!MYg__~9NLVyk*hWV@D$0|$H10c`2?6zqF(n) zrPdC19UZ%Rk!m@)hU9?aA>HSBga)IF`w(9bj=2XOZ;T(~$l7R(zIHk;qGuA7VdK~5 z!0Hg6YOJ@NV(0^W}&TZKTWeJjhRHqSXO+_gUGc_&!E!++4SkA{1N znw`4}K2pUxbg*~@MP>(6z|u!(CP+ybm)*sh6njc+u^*ag&?!?C8slD&y+XcNdHC@N zjrQoLefN#BQ!;YI(GcQWU9)?A-gJ%o<7FT!Ow`|BgJ&EOUs5O+Va4fu!c^0`;88#; z43@EPDr2IG%g(bCjo3Z!l}P$u$c>Tx@ai0CnkP1ZO~Qo(06g+CTkniI*?+7iUP&Me zPbm(*7;XDlAvKnRbG^Ez0+Q7!nTws_Ctm%o%22Vg zjzUkz=UNQhOxfv1Vaxyxdww}1PtG_Y}SAY#I!te≪?z<=b#zLc-AgIB)j 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 literal 0 HcmV?d00001 diff --git a/IoT/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png b/IoT/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png new file mode 100644 index 0000000000000000000000000000000000000000..f80947e2a43caecf852d459cf8934351705bc255 GIT binary patch literal 55784 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 LKSexw@#g;k)e-{B literal 0 HcmV?d00001 diff --git a/IoT/python/import-and-publish-projects/images/imported_projects_in_Studio.png b/IoT/python/import-and-publish-projects/images/imported_projects_in_Studio.png new file mode 100644 index 0000000000000000000000000000000000000000..5d14dc25c9159d3204cb5aa5c9f2c63148e6deb4 GIT binary patch literal 36411 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 WYv;;eWoa&CbQDs#2P#1 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�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�y=fP;35uqI=L?{WWmNC5qX4C&@- zfbzhvRH1`@VmsQ9hjsj6ybM#HFifTkIoHmtuMA;CO~Z(?-i52?xf;;C@jP6CSFhRj z-Qq>A&Paz|D_46@2bG^%WnEZBcu%H!nW~OJfo0lw>oL7Vq52M>%7r5}IR!>y{7;(g zdmzMsDVrbZrR`)M!sB^V9t9BFtJRHp25vBnDkOEzvu!w8GcM$5)KdXBlWEb^w(!qK zV~QU9dZb3W7J*CnyJm5z$J}IYEzyb1DHSDx5m0-yw3}6&3`z}>da^` zH9l_xR=egzl9+T8yzC99?b5}COeX4TBrgZfvR!Dt_|3Wd3-ybIZ~ zBR%qJETAoL1nnzJ)a?Q&;8>{Gh!}{ulDyx`kxKMK()vF-5#(SYhmUaz7w_%e<{bdu?>pIC+_3gp0RQ}lhgI$Pl@vMMXFkr+bD6XoNURb|~ zljUATyBqrMso0aneEQsg`H=$VHy$p)t;zhgKV!>pGsUK+See(R0a{jV2QqZ_GLNj!$jg z|EM3g{417Q9nb%yh2U9SJT4~rZO54kB`T^urA5N20s2&9Zw&hYthiE$h{Y9&X10~#zs8EO|&Qt`6ebn@8;7*ArC!ZG>gc(TNi;I z$w}a!`7M1EgM;@PX01An%M}R~kuP3GQgA+~MzkvOWl||Ksl}i{fwHs|Eg<@^EMQ)1 z@YP^pM(D3(#OZO3%QG&4AcD~LY3e+ybN384E=wY*pcB;ygCgRS8FJ*heM_5{>63Ei z{@LVg)v7MYw{mJPcbU-L8K&;qbNK5HjfCG>eRSFHF{B_rw_6U2v-Q>Zevux<*>aDS zow`V$3PW-krnnVzmHyDI4ETSTdk?6lw(ni^91BI72-1s+f=HL%RS={LNEa|5O{58- zlc4ZUFGQdb@Sad8MEA%6lGRTTkeD5 zBbl6>c>{*ED#vAlf_OfB-sDt*cNNq}PfI(~82gW}NiX*#`kLfZU(@i9`jvtF7Vj^P z9ZR@f@NXE$HQI3-y)!7Fit&LKtf@7!!)y2H&J^7O$Z+eC=qZ%r?4r-5RgLfNM%=S{ z5YCSfoZMjK_GPVDYcz~+Nvpi}@_Q-nkLU(VD_pqxy9D`V#&7rii~<>d!Z=Es(N{cj zTsW0*161)-Hn03+mdClsdcB1!jkF#qe@00QlMZ*&Nk2$#Qg{a|xq7Yw?#8Uz=R!vw zL)KXK;^O+toc(8uw@Xr%GhD$OH)$3fN9JG)L{*`g;Wl9t7Q6-vtb0{uC03$j4PGr) zUyRXpz{+ynoEn@$4yZ>V7>Np50*$Csg{-qgg{;}pG+ZHcad!xsN7G6W@M~FTk9xB{ z^=W`PxA!qv{W||RvQUT!a$qL1g&6G(i8KS%>l8y~rV^C1n~^DeL!lO7n^iZ*k-wC# zLUQPUM0%EwDS*pF;KiGzr`G>Nr7O;t{{k---)QIjkC7M3m;Xn|i`!;jCxArBN%P?^ zR^w7_8sn}RO667eGm+y7i9g8fHsaVgRcziXYM4<91zU zmhXWdPTVq4okC`gFW5SdL6g_-8NihzzS=m{+ZAwX8LladG+j0N@~t#}R@U4^(t)6{ z{!H<*Q0iCH;^1--Ze0>>`-q$$a#6l|I?%w|BU>dS{EZeJwSym*MEHhKT#2@p5wK(H zeE-s#vVf}EOw#sFn{z^SGm~^Gc}s-}t=}Uls8%ZW;79G(mk2=80Y9Q(qU)Jl^`<)& z5Vw{K7CpfVD%A=b_sf?em^TvgTa>;x(mO3Id=P^Ti>W$}ODBRfC&(v(O`IX8Qdq74 zbUqQc5N)4xL2J&_wX3{VxiJnwYAqE9h8-s5u`1~93}rT&Q&N`o zBlU*E~VksXDyT0;l+Id^2YncWeSN6Z% z-6-dU=XSuA4BS5J_#FfSfc>K zLWpWBODvPvE3sRr#4G|2fZ0SQmSjwNlRwOqc~`}xu+vrY=oj`Ql8dGwvwnI7Wt1t2 z&5PLF6JnC(kZ?|OGDx;M)4wiAX_P!DaF4^*D|P>R#rc!EkJqj;s?LO;TOxU0y!F1& zUi+Qt)zBJ8&yh+#u!Fbx^}XSxmO7v7g(fY>hEgPS58hz&QUlLt8@z&H8LVi`yh z^k#l7RZ5B0oVVtU_s+hIpVHlu(_Bp|l$2PC@xu-dRTVkk+-{=$LQSIEo;4Ukux1Ug z0})NOi^qB#B-+foP?2QozCNC{hi=a$^9b*BwjZ2Sd8XuM9|tUm+(qlB%S;yA0SA96GpNLD#b3;$w0R}kbH4P zBNuC+M8p-Jo#RD17qR9S@}X;fQDq$uzPed&qe#@;(1- zO@__m^QRrSS5{r-jqcMun<1oG(9-?IQy8w@U@46^)7xRCpn$n%=F%&aP?KeGG1c@HL-eHw>YO zx3RpZTOff9A9yN~Q{@pq_FM})Wn8X|yWLUwA(5Z-7lK1<{|AC2BJ&4=NgdCpxg$d048JHtd2qfX#kqlnzoIa*4s zBzr~GDYtM{3))%mcU!p0g2&m3Gjr{751da`mRJPU{Z&{v^0fA*kyk&=#G@9UX$QUC zd?7nJ^V9>q=u|G}yO)Mx%fo*ktpt*kOjhVT=)5{UlW8N6+uObLtj^^2F7nF-n+{f+ zn!#CT=kv2Tw(XR+x0FyFN_@QFg5v`|hh#9R5{Vdh z1gJ4_?=mp>Y$?5}7OzCM;?M&PH6T{yQtzUMchD@eTivWioED?syLMO*&A#t_NUU7uhN3x`<)6v zSSo?!+xmd3Z9Q3~yPa2{jPlSE)2qq%oD;JgChPs5yK*!HenaTbb-1KEB$u>g2Bh}n z^1QosDsyEPevb`*qGlYa`r$o<_fZJ$ndUN6bgI1ZTSuypGb#3x@9m-EwdoD>5+o16 zOUm}ijA`+|`dxu`olP-oyOr$vZku=3^C4>Mn;(`$4zs>H=8Q*G2QFeGkxqV7g+X87P-Z-;k?YpD(L#rE_@#kWIwHrW^n4_L+Gl#{fVY&4GZYr^eLOS3Krl!nv%+hF;eAREOt3S# zrBo|=IMFL_ZQA1&b&&y~uH`sJ)deQ3FCqpQn4*t!9sQlFE5^rPW%($xrWQY)kH9Tt%pUd7E1;jq_p z#If)EqFSwVf9Vg+xU&Tav&z(8=a4^TP=&YXv2Hf(gv%l4>GM6uNFyGy3 zaRtIzDZYXQimv?<9TUzirEHbS z`i8dPrb$cW;RlYCw!=i3oT73bhDC79@~h|+E-v}vX+i_(z_slm*}sRL`Hs%hpJ{iG zmot>7{1PoUA)OV#?eL2n1xUoGOC9c?yEJAOn-YHqWuY3#hYojTbLGOm%I;pi|Jv^g z|FhTE-bG4&-Tla{vf7J${e`txn-^Th7Dnwo9bvU#%;p2^CsKQCbCB^0t?@tianEU0 z;6*~_2*jMq9*{F>4PEtH{Hk!j1w%m>UoD{XOf63|m5u$bv6&qQ+R8)4CwJX}RyxY$ zI=jk|@*VsbefG1hGteJORS}*7> zs_5TjD6;o<-@h?Y7K#_Hhc1ANXxKU{&B_(P<7*?RC18tXOGA` zEO*TuKAAaAa#Yp$6RCf_>-E}hB_OH9iG(i*ov&WH$86$?)G3ZGPo!7tJPw-jq_}#Z zVyI`|ljTh|ljW;kTaAZA+YII^b#@^?gP2e0P`;Ppg6zyI^EtKPaeH5P08F`@e6qRm zI$STFl4X1^8)0~8=Mi3xA}V_6?NQ1r)jFy1MAiU`{%lWnV03KmLKpn~7cnzFrkt_CBBegeT0Hnf{tD_B)S0T|6`P zLYi-F zCx1(|{ns?J>{r7Er<^=a#jE;v-7jhdT3}Lkxn5XG&rtm0MG4rV;_)9oA?v-xdGj4Y z2Q>TDH8-RB*3d=tfJG1wLF3vLyvDm}$JEs^S7vDb?ro&Q@s;c<&UVR2T?T#IE>q;& zP5XJdH~;XSC=>UfvGrZI7+R|i7&7j*V;vP-3oPf%h}*bk7;Dxi(=(@ZgM-r0oZkQ^ zVsKgGTYFnLeW@0w*DgPC1sS+gm`Nlzd1N%atlag9r$Q3pOx$5*_KRlV2?5HG#3OD_ zn(VM!W5b!kR#09?RDk}mR}xtQqF3!m2m*i2fBZ^zM%C8nOn<_xFFz;A46o+9b0wtm zO=}QEC)LCC?=jGZZMIFNxf2B+jsQ;E8HHKBkAqr*A2LToyoj46d2B(Gp~@&GxuOov z!K&6*AAlg^)@esnA(yF}v$8NIjtp0saMjqCd(6MmbplSb@jV%lfYc9Pd{-I zamzJFcZh1p^6A{dzZTyQAn=jxLSybdcMZf}>zwms&TpD4w8pd(iF^)US3bD`eG7sG zicSXUCyrj~aqeRPVmH>{j@B_zPDQ@7AVmt7qWH#tMXPSiRb z`>}-7bG7UDcP)UWod3IREpL3& zM}Of-R;fe_hORDE*MbtoyRtMXoCLH);UKxdG(G^OBu>h3f_~#|@pK4vTia*di-)t+&*_%b37qn|j zOiT})GUg7cxbV7JL3@p?AqPA{zFF3Tm(N6K10D?`#{5Dsz_GSBW3vqo@lASNNkB@I zIL>fF?WBxVT6?O51= z`fgF*Y!O+bT+i2sRwMozCrx**D~RRPC9M;5y0iU`n}nCRns=4@;K>R7C^wH>_C>3# zy7{EP5ARPZSjD`!N5QsCxt+s3?rYnaA09vQQ%&lqiijqI7^cGB1gcOkdW6j{@g~~t;kyA zV(r+Hp}brA?3Fa^Z97`l(XB08HUeucp5^XDGW1{UBY{R2@~H@BWrh1x=}*$5 z9&~c>vRcpZ-4sLMl$vxA{glzbmZ8a%T&|r(Ej2DS^@4DMj z(&`?UGAcb_yG3*&!)d&h+KU0MbKR^7VH1!Yj zhAG`24?V@VDE~v5LBziNIPA6lkDw$Oa%zeKU;39vq`>C?N8zY6JBx>4o@?m_8_Qsv zKK^LV19iR=OKB0I@g4&dd}o7y`a6;01iyxKgR0iO_ZT|D|DMGlh^`v(RBe_>5{JXDE- zON~{TU%!wpIVo+McYpq(&Goz3=^u%kNts_CZIbP-$x;{`3Z6qqi2C|=ulRLAI?Okj zYxrSJs1FEILwpUb&u49mm$;a}=48`5dX|Op3D|6vF882dF&HGI*u<24o^)`z}!Eyf7zY!v-AG^2|>F&G$St#&)!G&6RN6Gm7U3y?$Z03hF5;slZ>b@o? z_j+SXcbg##g@>m`FO?q-gzuszAK{KTw(#IO*=d3o|0^xJoSj|*4u$lp%@Jl* z!Uk~G7qKi36M4GB*l%3}m1ztcFy}KJ=~%`tM}`|xZkAq)LTydvYOLL*q)X*~KU}Bh zBtn$%5;Sk-KAEy^zlqAb@vG5H6B{YGoIl+=e5g1m>Oc|ui^rqFtM9OltZiTC3Q)tR zVZ$_;tNyZ5$3mb>968DAo(xw$>PYxDozgvbmXbsBi`HJMv?FF~`;X0jcoios>Tof~ ztXjdHP7$XR;K)l4ZfhVc6G9I6#&6=h_8J6_QfWBa2`2;`_@N~*&h3D{@n|HkQEvfl zf=OUteZ9)3pgF&$NgFYRr2k4U;^o29-QaxAF7AbJL^SR(Njrr0DF@W$w@>IF+dk!c zUpJ5;W&GwV^)^?24DEM*0qg-ATyXAMy6^xj{w}TH`*vLg9Fr~FKXCTg?W+sjz&KN{ z;Q?FPU6&rtG~>poE8*{rg;3uB#)DogADxvCuipUWnn?8YH6!6T-#kw7{T~WIAMo9Q z3T3zDJ)kdP-9fcf64opBY$kh%EHosmX>+vJBl5EKDS=1DK86v8A=E~EN>qIE4SRn% z^zaBJx!u%SG`~++Zpw2hv}k3e+n%QQD%%$>tf|x}T1vWZiMd(_X5kt~9vDR(iyX4q zJ_pIZX}PrjAv^QVGuQGZ>5D%+_30mqs0OK!Z3#s=v*_V>JaYjw-L;78$XnM=?08hR zq-h%ksG1U$c9n$+xAw2?W{6FO>>T;*a9n)wb~R!4`MQ{lYW3vbIx;W6Ir?Pj?>PLu z>K+v@Ci}#|E>?aSQe>?B)F{`zG?|t1S!{ur$95o7J>+9?YKlJOXs`J&xN7%{$f=S^ z1{w3&>L|K_BB}R>U&#;7Q)J(^QXpVSQtBC-`Lbj!mA0qcxsIaZJ^e16l+EVJTGahm zm>L|b$GY>L(CjU{fA*FP>mMM|OmUiDgK9gms60Byq610^TI7?(K~Fwq=)?hz;^t+4 zySkMc!}uL|-0n=5;%MHMx;V!c#0eqx0&S92=KfW`5n8H#_0{&UbC9+SK+o>U#Mb?l zQ(k&)K9_Rntn@v;w!(8Iv#-xGtZHjRS-EoPw*41$d-WMwZ?l1ecA^HVeRbB7l9ZmT z8ys!*1Y_=I3!N{XomZ=_{K8k>f8nR1!H^wsb>;wSr)J6V`Z()al4=ORgvX+&?8#w3 z36--=^y)gL@B-&mo`Q(Gn#Wd`dT%hr|8V4kV@06wIJ}Uo@FCU~XBYro$M?Ks1Rs## z8JDS_A1j{dtR+GtCq#TNFv%*CtW&HdYJ9zNo~6D0J@(er3-9pDcA*qeZ`nYHzLXJK z=8a{Ba8GX*FWYS4$G#+IfA<4j6OIp6S#>-yV4`!W0zP2R_{p#?E~zvk{G#oAsQ` zOe1%M>Q~HR5&g)nmw5f@D{*hFoYci{8P?3YYmTREC>GSxdp2r6lY5&!Rhw>SUU7XL)Ky*79tMWg z_L>CWCFo`eFj*8^Z73@8y1;jv6h{Y}R+9cRO(?NiZgKNRW>*!zIV=P?CiDbLTIiW- zz%^W=!6mjmy_(fC zOD~REo!{Nx(P;l24W1~xj*rr+Lf;0jUYSU}{@zGu^q0tb3GSe*tKM3E zJhP(8Gh^HhF2A-}KxMCYQ5NGxBKn4;>J7l0ZQEUIspa37q+xSjcf%&x?>}*I;wiXn zJ$$eD@lLvqXPtGqok{1#n!LovWT_R_Th;8g4n7vYc87FM zdvyx01Xc-?A8T}$27}pK9t6tzGG-7b4oxxtlZgWY$_dV64@*C`0I7k$lK&2Th!7un z?^Cz`$5B9jO7;B5@xQLoN#sv-AvilEmSv?V{(DCOnv~5O#L&|vaA#V`gfv^s(gFY5 zAc(Mb>|Qs;8WE~q{_X@93GP(1#BI7Pq<+L~Hgzc$jDvUx*Z(bxY1jXYrTw>rwEYQR zPXn_*j{jnwaSu`d8LzFZ3>`rb4s&qm)@kCJ6R+Adz7EU!$GuMZ>Q|)uzqk+9ZhEcp z{d>>!ittmB**}i|rN^H6zY#X46BPZt&UoH8P;|vTd={T=9BY*@_wjYjOoYQN+gn?o zW9J%|8nb!7WX1DsRnH4DTzJN9%KeNXo^{J!&{%LrZ|+y*kB4DP$9hLk^)UG#4y2-uw!N==r9|x~8vBePIf4=^|Kl8xWr(?lt-=A+JgBv&r zCriVOVFas*0WcJ=^YQv>Xw{+B^aV>)>7B#fxJ2wK9t9>a;>C{wx3P&X?M*jM3!czV z8KM5`2V7TMyZGzOwwiE)0?)!ig=mZ(1D*DgxsSIh{G=AXp1|UoaEoiQKfcls{n>x|7b@#cOSMeI#Vsh#LUg1(NzRevY^(LBLX zMC#V*4}PZetIT5h^81H$BEog12!lM-kMXz>5RraO#g8`qag`qAiR+(deeY&g z7KFFf0^tl@zzfMTKq~o41sO^|kUG!=X-5a^u&yMNuQgN{s8C%24~+q8;yP5;3oAU+2{&7BV;tX#exCBQ=`eXc=6rR)-n@UchID82h-1acoFis17 z(z$C6;s|MaKQ8%i0m~{#0yFes)dSd|K#L8!5QP(;Lmc`op!?e-JlSlMJ*2_(ADgIu-iW$kSQJ|1AznP4L60eUi(x*+;&1gBQm7$*H6RhxVa717%^ey z;$8a=^1ujs1caw(gbU|^Fo3;AZkjHrHjx=|ma0ECecBvzK<0;O5R*H)w--)5Ti|*O z(6CYI%O2L7?U-&fI0^fwKw`(w_@%J@3&L(Sg=vm^h)fNHMcVoR9qcJS{`QTq^&xSO zw;I`NQ)OOzV9V(9@Yjyv6bM2C)-IQK_9Ul}d^il}U~F@=W@f@E&n!5eVP}kmqC+lM z^=LIECO1}@A&Qr4z*PFAsS3=!8=fkMC;D+A^25fry1m94W)C0*bb{V_wNk!Kt$z9z zhgwq3$Js!EhBl7b*CL76K@_U0e2gaB~{w&W&_73^G#a0%A#w$H?fuv?b1*5CcT$w~-vy2LYC%=7Kxg?Ja0 zTKSEd$Do#Z=Gh{*(F=fsE(r?o=CCM6egh|rn>B(*Bj#R*Z5;T8Yzl(-p8It<00z!O zLq${SeF@w5rjOx#oZw3wtP`RW;K>u@Un^#_`|wCInt}jlCehibZ4@Jl2I5t7oy`@P z;N{(4Ja`~PzC7LdNa`fb2;LMqF7>?6tIT!0;nQjW!3SJ@f>NY1D|&oHV6B3jr3T;3 zcW)c1E;Isxm5sOaPT&&P!PmgP0#*G@b8d0sVG4f*P0R4Nk-waikKE5=hkamu&?%yc-~ zKl_=lE%=+rq0|k{S{GL)f3%;Qo0!dWrs|1WK!+%@X8034^|wI)e*h~r~(U1QOvW~ zUzgzsL834alJLXR|EQ6&I)}gvoT^bp z5mc#WU#VLcr>mb-C3VH(B-qmK$Y9pRQiO`vGw*e?9Kd&mT_iHHpu$T82g9S$ZetmjQ?RS~?_D`cpLEhHZ?n z|Fi+@f)=VA7QOvdjWoz{z{REj7v;KPW*0OMQDmMf(&obrae`>6>#;}G)!8-@l!*#H zUe)_FUJwINxi7 zePa#D@&Wfa!H76S&Mmgb0fzQa4{BDnT2*gCQuef|?|>uhUK7><_;lqOAQ9b5wJvuQ zT1-3sy}(Fn=GE40F?;8|VvS&@17AfpAE%VXIXiAhV?oN~qmHEFM@b! zw%b~&pkN2Xz0Jbu3#2Gy)t|1(F(E7PM>O}-1_mvX42}LN_}uM_iv3X%nN`+#-;qR-Rz=ug=klfr@;sdP6ll9?Mf^pT9TJ?d}mM?{i1_-&zw&+jV4NQn}w7{&cj)= z;PLiuh03xT!3Nk%zqX*e>yHRqZ#ZPc=`KnTe#ElZ)v$Brj;@$MNFlW(2gt~~0(-!} znWnFlGjwjBgN1>bnl!jwksvow4Npf(+KK45h3LnvGln!+ocK|T?MD~RuJ~m?BB-|o zH_OWghZn^^Jdypxrovur%7jziL+p#m=7{?!ioPy55?3XyC2ynOa9<>PV`OA^HVeB* z0->r91xkqTf#SS`CY-5155NN^H)KHl^b=QEnQ(R{2$iZ?Zl z=f4QAt!9fQ9Cm~QP_3$vSBw!w8U6N=&}0jT!HLn}y7nkd(}9|90Dj1{h5h4seJ%(Fxw=SyU?+ zt}#Lphp&DC6GZBO(;`hR!z_6PuvvgBdJ#Znj4(@jg{dycohh!jr@vL7f4T zy@D|$1<8S;+z5Qm4tgoa>dz zDDv52H+P4(CtB9hM`6{j&xZBkUwA@-@O(h3WElbWN-5h%_AJNW#n|nJlT|}L$d>VI zxkyQe)nR9f?F*oDIf~KrTVuw16C(hBo^WCq&mH-09rPl{v?;%7l?@s#aVnx+pzA zKiO5aBFxd|(~sQ1$LkKgeG1L}Z)qUQu(h<~GdK~il}3xI?KY*N*863U!nAQLV{o95 z@l8tKr&fo!fp)lVGHFO)QT8{V{$lht0^R}$P?{e3s}~dU$MmqxfrlqVgvX1<%elgf zDfUcas3*m`g`8BFv8SuIvsFT^XjzI|%(U-jZ{Klq;Js9KNQg6I(0LpP0aHc6gC(V&#cp&VnEX%hm zQLr!26p99@54wh;)@XP8{ZhXzRn{_M3Yxv#;)>dtgvTeMDEE$^X8xtKA9IE~G^DUA zocwH2UJ@97Yk6)vnGZ$ZAjumx;W+O)pN zO_!GNB5%g8r5fhwph}UWvu#c!!p$0<$o>8^JDKBsx>Z_6o_NgksLez$J8X_uEchN=V`N?v( zC>x8-n3O?j-PnzE*LhK-%`bN<6XZ!A(TMGfnoV3UU|Pz>v)2|d#s)Y(XHqni_bpdt za>ezgv6htA)CNt}vD0VE-EORQ^V(ez_V8{JUN8!Pr6Z-e>+);8m|iT^&u*BBMv?E2 z$!^H^tbAVcUCP6G6*>b#H)}(9&9vBakxs*b@Ts^kiupu5rF^86>_)>gpx6kk0nQKr z335Y7o|sH82xIeT)243_dqFFdwZ;`ud?0NH@j-NJ`xt|p#vAd>cKv(D!Gg%;P;DRA zM@$Vz&$OCf84OdMIJ1wJyU0PxjZ%x9fdd)`87syGVpk|fD$EAN(qm8?0W;CU&iVq4%1yn`|3j+eJv64?Yel)6qVvbziAeYwB~_ zIE)_(9+JA1)Idz4+*n#x$FJ&33#B}$sYYFy%MbCTw3=27h0Uh!HdOK;H#Cn5La=JHG9cu|1J0 zazQmho0*-&NwT=@W>X1Z##8@n&p_n7NbL)`$O{b&&b~S5xd2%6u{IeO)Zu$Jx`>u4 zx^>=};}I`9MAIC+d|xTm(wv^8a1gT`rmGe;e+(&GZn`<)XE2@H+@(SZiFWKqHbAC%?r6RNAloq6H2oAQ|HReG8MI7+WvnI#9Y@i1Of^I$1k}SddF$9P z`Guqc#Nz~c@7c7_WMsN^1t^jM)gudz6aGN5$AaD8pv~*qxtt8Iw`66^ZiyV0Vn7!$ z3{9qC2_~&}QLq&X8tM~YNv*qM4sY>*r$F7bZ}adDV!X*}lv5n0FE45TJwOT8EbII@ znIkG!7D|z43-aBklF$C6EpcFBbG8k*K9*GUF~t!>o{^F&Ggo^!ky=v9rMfES`mE=T zXKN-glp)RO>6(n)WK{|8@z}N}Yq$20s`eYGiLubUpVAvAkqi#E|IDAV+h5&R;D~<% zq=6P#o}eg&7ZFOZnHrK{T}I5?WAW8&kbdf2nTGg}UPV6e6`f-UeqBpmDgAZ*Xh5(9 zz_>dx+=A|1Z=f%C5UmjJfjsxE?DUWbiVCDMiEuGrGTTB%;LQd}@k(Ayfjl3=g);F2OB z&E#%)`~7Uk6H&dY;;|)b*otafh)Bjhbwgs#>;~J=WTqFBfe&Galn0{VXsDVVFng>! zZ|slpW{RR91NFC=kMK}_azqI~U6|L(7`CVr!4wE44lM|;9pVAqd1qm7{1USD!-?%R z_qI6=af9gCo8M$Rgw78pBWc2?L6{oTfZt*ec83rE9uOeTEr zDF9dtt}!AKaVtevrbzP2gwG4qejUTp1{r?J`dlL^zY|vYR8F`fvp;`F;(RJ6t7n8y z8G9l5{S+o<6=%$$SUVn#up|#mVPa5O9F~+Mr{hV*Lek&~LsT?=EDm7z2~+$i?) zJ74%Ku<2pQ7L~$kdvDQP_0MS^&I8+ZH&_{a?m^%bItWAeb%|^ZRPjLs7wm3(DC^NywJ@e51J2Wqp`voK8O1i;k@wr9;6kv|s}xK_TN^zr%Dh%U>z{?6K2I$+ zWuZL|Myc+UFnMnEZF>(`mPPQ=@vROD@Q-D=v)z|jn+v_orCJwsKQ7@Sx0qcuFQ8ME zBG_5OgUZ}HWo}^yV84i_I(n`iUu{3!=QP_Xl8cjGEewU-ry`YbT-ZE&K&_O3PjEBb znOp}-Q}^#C95$V z>sf`_jdj1Ew8ZDM+6|8W@k!TQ^tmDA2UOH2UTl}zvJMj5N(b?QcWEwld*9#D$k%$@?p>G^q7g)ddT91_)6$aEYe-`o^Sy zsiG?oG*rh)QsPa&=G<%E**~XqYgL9cUHrs3v)!kPp$n)vVEOv;05Jw;04xm$bRk{zTn^!{rvXEEWhXz=On!< zM??lJsPXLlO*nTlyf)w%A|m@CA}6E-(BHRwm<&HWo3K0lU6zK5VpIA{?}LFbaq0__ zAa{FXueY5pz)ji+-&{*3?|VR#v!>a0Hj`#lR`^Sx z6q!6+SCXBLL($5WN#i0*07>wxNmWRouV;aOj@e4U{bga-jZv-kv~;K8Ae>L?4sqVR zQ3y&q$U`={GfZZd3Nb!SwHy2L+8x*q0O*}vwsbJ5yGL++bR#@rS0mDO`w#@^Gj#Hv zD){NfGe-?`5T6KzbLGKR;RCb1L{nOILs>9d`0rb$q2Fl)-^fF0lqGwqh6L;_@wKJ;UFKSl}ta=ll3pBIULm>U^`V_ zW*cVKC!I9-s+K<4a9@XA_V_ydUK6w~n3hKq#nJPM-|?5rve7&cRlO0D=&|0MMli{M z2Z_P>wCrm1U0Bz}m4wfDV1i`fqkj8&OC`=}!zp$USsst#uPYgWN(3%Qup7#7SvUDM zZ_u5`d6)a`F4JGx9vj<%nUymD zY1Qy&5~VAKXW>)CtU;ik_<7xgoU)1LRW<{-l}3fnp#68BT!q;$(6%5W1%jME{)i9I zZ9p6xG=Rml8IBw5B!!AsDM#}hZjEa5?NM z3uwpj=ffRQfh3OFrNxSOf@Kj}fW|1N!c4_#hsjAH)dEPF z1nQ>4Rw0;V<4*W?;xsNBTbLO!6Q!f@cClHJaD-Ts73EyVuj+uuwk5WWPsW|=1oG>5 zJ7+%!QeV)|*31=jNOVWYOV)40D3DEJIde?z`9BKsJqc>-iXq-Xr+VR|224*w;Iide zQff*9cDN}|L+Nm%3<0x=GastQVFq*}sqDz9^sL*$$Q2KpX<%n4_%C`+xV3M$(CIvi zs}uv_4vW|FpdqX-^(9#Cl2YIl@sX!s2?2}IkQ39x$xy-Cn{2LM{}uqzj6V5#fiM4J zVG|yE=%b)|)*KYD+FFV+%WUoVzy+@ycb3%(oN_E`VAvmbX@~a@AI0)*er)T3AW%!qkUul!&%5|w;B)KU$XLTz)>qWgIm9g=*$Gg-YP9+((NU?0hFx`cxPCec$0#DYn=f{;=t@Nespz6u# zxPyR1C0}8Lem1-32w*nJz4z_-IpX4a>V{025QwJ<@l6rG6De%p_cNycmIvH3N%tFb!K`q4j@Loy?>gr(G#7J$R% zj8ner1=~bZX!}a?Dj(e|D}*EBazayUh##%33Ds`%bGwA&CIW@zgsYM}*V2HFB0FnM zQO#0`_f+V)JCmIo1Ojh zMxxPK&BR`DV>kvKEyh8dDo42`#uRYda1pWx^R5EtIEEj)_juE#4gn7)z1ruaT92!y zd>xG)3o7zZgDSQCWXYgNBLe3kPfLGisuyKEPPk1lLD3`$vJrZ_ZtqT9DDsV_)C;2XLcuv^>Zvx88tkO z->+i&a`k=o{@tm?5x3r$+4^42D37TfunNU1!%uMVmZH6; z^|+CVP0aR)b!00-;czApu+z#&Ba5nc@2)bT5UO|OR}8JJdC*_kd%+@L56QH0(rMJF z7ht!x)7hwZbQeE+=vFVCa;}AN*sfT)VjtC`crXnHKQ`n$l$XuDe3)WDe}1$pg7Fv* z5>FSni}TPjcF2mEn-1Ie!}P1drwRCjLocp(y;{4-s>Zzn@sG z{Ug7nPj)a4zYW^qc3-t9KU71N?O)uHDwB~4*qafsu4!+&C!Ya;P=U%f4$9jeQCbpj zsagg?XT+$+&fU%-ZO2V|O;ZuAIY2XzX!Cr}Yge;H1jr^9XqCAmF`MI(Tb!vGX$c++ zOdp-kNgq+gmLUSL7>5r+54_Ge@SY1;b;Cs8(>N|Jx z3pyZG(;z=e&;GyetDb!?M6HP1?klova@`-bYmYeN6LvTkk6++XbP!p4L3D(ni=Fe4 ziWUJmR2`d`3L5 zeO*UFjVODI1@_99D?$BI97zQ8I?wR-DC+~L<;k;zUN-W@W@_1ui>iMi-u?|SF?WnK z@;hF)B(QXmcapy695VNs^i~ji?T(%c6-rr}Sn%2(b1ZTtf}geAlYi%UcIZh|86Ueg zOZ7aja-PgXiG>>{5uNe;iaN^)xw=TYkjc{z_pOwkvM~D+yL-rH<+vc8^IRnpuL=!5 zh*sBY5@__iCG%=!iptO^gC=M7dSPALXG@N|>fh&xCGjO9_XdJK&mW_jECX^HZDLKh zwIkKu7f~K}bVz1XX%U;dhROaZ#wOzd&uigxV(8=6oAMDF1-ucVuFuJ)Y-wlsSzal9 z{!|~uQgwGK%`M?8(-CC8?ZKTh|Bbfy3~Kso-+fh(q9S0Sgr=eb0@4D3&_x1B6G3_r zkP_)lItVBz5Q_A!27*WvklsY31?jzp9(oDVOU~l=JmlKOQ2dow}X)k*Fzge_5z&T?m?eRmA`eO>&^n~;5tDe%TLMkEG;KSb^ z_KHfs<45NuxxL95Z`)3#Kd_OhyJF=%V(%wZ?`xP#G3a8vY1S{bGV9)EV3p>kJs#mI zVZ*`~zs0y4axw#Ha)=tt6l0g5{M7q7&~5PW#A~T-%VRED;a4bk0RvG@+r)Qg*fV%- zp{h~Qyg)!+6s80l)Kk}+yv-&!c2TqFTAl??^!}1Wsu4krE@QsDGQBt8EzT4-j3~P( zkG`nq@Ar~{eYT{&LAYj6EZrBuf$a3lYGIFZ@L;vp_cs=y(i`gXKix)R)4Z1cl*MSz z$-%RW*fQl_kDj`!y}@Bp+Y5s1_`G&so|bPf#dphcvXuLH4T)n)%nsuGe_vRc?V(Z9 zV-6Sq3PuD%|chc9sKFxvG1>>okK*wxQk*U6)S0Y04c8g@JHmqy>T8PRkrij0u7fWAr0Uj zwJkbfl!O>+Yn4Z^EHJ5$2D)8i?kI>ku}aHv`XZT$AS+9Xb`HrSUgj< zjGV>Z`b499{n5m-_`LN`bbu&M@s9vIrgH5CQ$3%*590F7}NZD8Ji5TiGwfVFN9j`3JGsnqm_Y%Q4$It5sC#$JnZ}pf)|A5GzjM`ZVu67uVQV|uXn^Y zuQH)&l>Gg2Z9Vm+Wz8@lRxB!vYVhu;)OdP3wyvRj6mggR z+D0}Z-X-8FTWmo17nPxQFHu$rgXAAsTYJ?0`*IR&oQ0KY-CsLAAIXH>x?0~=8bI4- z+qK;#jq~|e?Il6ipr{F3CL#8xQroN+lI*IKx4!2s?yY2T3>ox>CfzOWb^R*u$x*mE zt^#Qjujwj{h=BKVFUHCyzj)mtPO41tmFCLr7r)A~kVK}q6DoMwceUPWuyK6#`yvv! zkr(!ZU7f&kfj$-{ugDI^^IuC`%R)1PXCHE5jNvh_=cIch6ll9YgpNG=s_ZPaIpc0n zLR2~}55v5`S8Vyg?K5vSD0apbo5OSCOkz1m14M%}nT}+h#`#VWIopGlU|;bBrn&P4 zLUUPfaq61=E>bRkAZZ=&drlt!(Byp{CC8aD*5rLWC8-N_Vka~*8-%eLWN!de|%S&F$3 z`RAw1;j_Kg2cuHUck{VsZH%sC35Jqf>V3#~Z?(E1#g=D;OUOq?Z(H6vUZq)8VXVg&Q>^? z_@C^|;?@F~^zF?&{q9kfjQ2acw0ErL@dyiccOyQ(w!EX*Z`qv-W0akdeYE1_O^DlSnl@^qSwUhK6R7-HNzLWdU92o@%wS4*%TqaO~C- zb}BU0un43NYVKIqd#jC;1i~4XN!Gt=*ysX{{M`M##}uyxPY z=2EgHt=4BJm(l_4FnwK>akg>ktVs5?};1c=Q5(*2z z2r?J07OA5$U-V1jg;1%?ni!4y-O+a4oeOLT7so$HntMMLle~i znUL7`nvg~tRe4s^(eURDsjtq>1DU} z!K^m-M%3%0^=b!0*qBT!P1eWoX{NP-ic$KffD^d!c3A zjz?7%J@5(x7lgLFg1&b@;_Y>t!%KeEil1gktZ(f ztYVc#2qV08erI=oLYHkv9ZsO3P+gvH(64W(m8Bb!F4(ZW4(TB7JblgVf4s#@xK=Ow zChUzFEu6>s#6p~M(HT6~F`bjmBi`$YI6U>K-!;X#J+TbVlKpX71?HYFooUYtQ>Uv` zZV5?_2CaRPdTf+pK5ez{&lDq27cfz52VaA{eKJx@6*e5c`$gdP zSYopkQtNJaf@6?UcVx3OD2I~iL= zX9sTpSzQ9cir~GfuEDo1F{s41xe8zM?Sz+Tu9eZ3B_Xasl3xiAc0X+>=~IM3k`_O! z%e?=26Ez!tXT~!f72d2$Vch#dwyNjc<3=IWgG|0*9mK8ZU{W`0Thq|)Shi2K1ykqF zO-m^~memUF?pBR-iV#3?QI08@OQEQs@b7Fs!DQaMNuM~Vj7O|edp!_nWyo!1Imz0J z11d-%)I6G_)g@Ex{0gFH5h3T5uOa)%DWds4=5_l_g-{kB%9?94LxF@I4QYiz|G2E< zNw{BB8I`5^q+)LbUXUP)~=5=&6u=cohyxQ2Bc z#8#%2Kl9RniQbzaCDKcRij2Ngjj{Dzv9cc_d{$8{Bxqy57t_!>o=!Mtg?1L>2QX zc?NBmzy2d0&b%OMA@D50>uO7};-%mBT~|<>5QUH^SRRBX#N1)GM>6-F4aA9!5yI<*v?Zd>phj@lM#X zP@L7rt2}d66Eq+XP~YSmlI-Q=GDv^EQ8Obh^zC1!X7a%+GKI?9_bZwfKi|+&c^35O zHCzY6Sxm(Mt>UkGm*R>k!jj1%Wo9k?I)sO8owomked1)O{N=D|c0-?iMFm!;SEJC) zhw7Z$D`rnwRzd}n9$vfP4*fpIL~ca~8hxIhxK)nxkIN#{@mxm8ee=8LTA~nPcS?JC z>scX>AJ!ie7+ed=iBKs)cwn;|;={`*&OOW;HWJ z2=+^*QR!ApPDpX>?}iSSOIjEmuXv+;t3R>%F>jdr9D8s5L_uMN_M`TE)C{`Y2RCg{)agi>^Z#zjqxgJ9u39gk;m>qq-e_|HWG_&#>rL`Gdzo zWb9&$l31a#XOl?MzE;7iqz%F`_Qw8{p_vxEK^ueNhG%fPGsyngBT)T)A%>qpW~b4S zh|1%|Q1N*}L}t0XV(f#W&yi$*Y!mX{Wbm(r0cmUqdJQGecp zO%+eaUe)VD$`#2l@`NL#>$Beh} zp;y1Gj=Tt>dL=ShMz(@K=vtL4^Lcqf8nkT3Hh*)Tfmpopf>go+wv>$Z?oEl7-05Za zrjjYU!hu3gsnsVn*`AwIDv04a;mWQ|4_M0%S5LEqh#8a8QecV-KLsQ%aZwh~GQTid zr6<&z#HWXUnyIj4YG^2XY8;hrNK%!TudBD&XDd!EX@6Q)`S_8zl1{_EW|ZQED>+fR94*rM)jVn2!yE(} zB!WNj@RD2A+r6(GTh`~L+Qk&o^0eQC&pwuUTVrz9e_YpOv}_lSDgEKjnkg}T_**2K z5U^yw#QB&5i@0$@<`$~upO?jx-&&n|bbNK5eEwouB;h;{!B2#5i|NnX-gs|PtTI+| znU$2fO-Lg7f`rIhm%DNA?3&z?==UU#>5kMOj&((TPqP;wvN9i$-*S`%Qm)KPG(3xN zF|J*+QDux=#WRVqZ4Z?QqFBe0vc48Pc7#iEX#dmudIPzzcM)qX2f2j2@uYBdQSJh( z$~&NP>W(-Ko&gib9DthxK!6mp_Y9iU42|%0-a!& zE&Gv7aZokn!i9^C!BjS#L#3I}Pwb@n)%j5D0K8>1&?R!|2bVu*2&Z~s)$%vT*4rUk z(i%+YzLK$ql~_%+4;IoEm+`jn1j@%z^qfbKhFE{nABnzi2p?qN?6b%UD@GQf-eRrS zYZbE*PE4aDE1&)-&$AQp!`bIv*RG+@$H`ndQXP5Ra;-pJMI(`S<3K8ndNdGf=}$Se znPSVfB;$AcX;VoK<+qsARPH&p3wNdx9g5rT3*a0hqO-9PI?JDa3n!{c8u}w|SWW;9 z*waT^GE9(o)X%b<#eqb?`5$nGy}1UdZO(Fux%CJR8+o`JX2Xl@)7ZX>7ao(XyEWWU zawP}ml=}VmHRa#PWU&HLqeRx!7eZqnzn>hFby?qw`eSvF(gOJb>wS;cxVEZ>Y!!M` zqG=qTON*y{;z@ROuaUzY-9Zs6J_BHF)*zRE#a5s z&^)+yD$Miz>k&=;nyUAoi;Pemq>X>wWIwiw zCVzF*zuE+|v*}&m=|r#SoJ&bhSkxtVw3s!TOa9*Nm`n`);ZHnu@-oE8&o}kgNbJRO zX=drM^a%;w+y)XnOLm`Sl_~4JU#>kWM4mGnIJx$}kTdYZGsQyx)6HG({!e50|9l)e z8SP_{?)i#x#Sy$J_hxx{~~>u0~>Nbf6dK9ds@yELhjze4{x z=VWQ)(y=qYOnl|?zaRwu&&RF)ci;J}`d|!aOo7kvH{K~sviXxJU^@KWbfCVU))#m> z)BT#{?|>$oG2p)7!{U@N_RIC#TAKSL<(X;OSYBVNyASkyeP8#%9pI#ir}_}uOrz!N zZU$4c8Tjdn1uc7NvfnUVf#%ez(NXI{lj=yWiX{re2O3puOD6m&(IFFp%*hu0psPQaMK zAtCd?C@3Ai73W9%6813FlBsyoXS-vwkomi6SY7@IIAw^cS!MWY?{79z=PGA=&7xpuCKc=H>7GvR26Vc_ zCuD=bbWB%I8OU~Er^**}$4-Iuwp}z~my#ouX4{Ld-4DFOE$0|s{g;h>=7%R1`^=)e zTL|yAxx+Rr{6o4<7GU+r$*Y6PdQRXiXsX{f_H}!-f4Vos`)4~Asle>?SQHqEvmyc8 z!P^|wovUHEwhb3Tr2jGd@v=^K^LBh!LFEFZNaahkSQu0v7=yon0c_-J^&nojDqkso zO{1mpK*+kAYZ}yOew~n&nY5Vtq~FonviMp^@w;tNf0nGeN44(`FIzk*V}4{)IH8w+ zV2|EG4}LA}0z$&zw;gYboj(X+eHijai(d#!S>*g7CgqfK+#TneH56`}R@ei7KB&xB zJ6zMrTRwg#oC#J?l?nc(7i44sSUwyJB}2yEl6keeqg#msxel;UoaFAX`D{_=1M&Kg z`a6&7h)dZS+69e;@AAt=zkQcV?{YYnHtO51u-~Y}v-UA(>${~M<6rr*SsZ-s`EiSS z^6Z!vwJ0R+EdQDE-dS%s-5{Rw9k09BhqaHC0Vnr9S?jhN^$iwvsTTYJD-Q3zFX;y> z9Ne;_fXsmYuNu=i+38m!B?#7rovNGP zO<^K91_@9rMGYI@atkhP)E#vJR)f45G5+B?NAo--3<_jMiWK`Qy`8jC?4VNPQt6N} zJ=kVS7KYxOCz&nQuQ)F`8{XF###eXaj3@9dr>yrLcrMoneyUL=*QxjZb_S8zp}?9m z1t1UHup)X`VaSf$i&}h*k@bHwC!HPx4N;vQW^8&J_)#~@_ki5?+LddyP~w3=14ZSGX&;)0~wQ+ zzkFX<%~7|U`K*{uuz8I1{iPaq+!Zz{2@x;5k`9sSN_=z6eEGQG9hD@(dm`gCJA(#W zB}&*ZkXw>H4LU69GtV6$9j8x?AP){K+OU=T37f!Xc#ca71^z$r#9^l}-Wa%#`+Rt> zSE6$@)5l6<9d$3e-s#ViQ`y=cVYv&hvHI;#?~fd9_}}t58VhSd&|iQ60N@zq2#^b>W)or24&>+`cd zcd}P6eKm}C7nG~2Y;0~}9h}*%zbB4JkcOLWL$_10j3|HVGhJ1(z~@b8!s_Sx_F?7eq0 zc_j+fpHp1%Fx6{0XF6M2@{_aCvAXEmkG@$E8pT&HJ(Cb+p1eioe9D=cg}P5-{5uXkDRV=xo__{83SS|e=a256ubqI0SxdP zl3;Il8bL=&=~tFfTi3B(zk6`d6`6nBsWXeyJAmUA*iOXl_XzFaAbotYfj0KDhVpKL z{Z2An86Zh&J81;C5O%#~9Uvc1PAf{BeH=n}3VE#e*Ow)wQ=TRo}R= zRjpSVVKw60xY&bkoNBOYQIpZc_*}CGjDXDdhx1KdZrwFILnhK!7zOY8?Bq7Je9PZy zUm6(n?$KYKZv))Y9Z<#9YrBbT!1#Z!n?ASERRZDd3nf@bBQ`8-<}33M1@}m2+vI?) zZt8(gb8iGkgdUfIy3IbblCDlqtuV{2rPRjLvpM7BT429d>P?ZEmruN=+U|gv*m?|u z+o-wRpSiY}S=Dh8Y6+S%;L3xfose-n$1x2`&8Du$V=CZi*1gKj04`GI1F#h8cE0*Y ziTtLI4AZ;MeIGUpYfAsV11;_>^H|Qwo>4ulJ6dO2_%~be!vnAt+)LlR4cS&E&L9_* z7aG<&&IwK;g=x?msNqTjhPLZ!&=l22b z!Gj}Thee!!!sa}mf92u&4*=g}Rj{Sl7Aqy%6jYj3+0~z172qwQ@*Gd>IH_*l* ze_2_dTN*1jIeu8bb!H4=BC<}C9oi7Hvtv*97kn3Vv%rJ znQy`_Ia&y6*^^k^cvV~rR4o}5fe$5?YECWr_o<#rNM|;#Q zY|^(7;*oGjGoveiPn z#UOn5r^!v<-PC>`pdHcW-0lk_o3`c$cJna>HduJTPoN%|9ayd0A_~w zPxogdVLxh0v1OH#%VVVX>}$4yyQ}w_O_MC*^XtYkSC5~(8o1v6eO>x^de0Q}1t|O& zxb;9@gB?<|IP4ayZ1u_R80>Y$twq4q_+KGsadp&nsNMNi|CEU(;cJ5PmG03Eyl^rd zDJ5gh5a3$qSa_LogodiwW{rcrlfjwIU65k;DPkukWA#Q?Zsz3HoJ;@qf$=E$dJbXl z$v?FvS7=;oHkEF!P#Xp%ZbkY(OLWiHF<4Gm`z*O3-%hyeX}3AmP*g&DU^*YC6Tx!C zd4y5Oml)OFAsA}24}ApQipn1oQUNYGCHk_WXqUUWgSEo-@>27OXNdeiMRUfi49_~} zWK})KQ5Gd|NPb`H!K&Utaf7qY!wpG+I~=^Tg?ZVVi7}1`7db`SM8%2#^GpU5EhUTy zt|{)INO+YUoSF2j4ETMAA6BnEtGu02rh#HbXEqIiE95O*eI#o3BBVu#U4y(&^(+|J{-7E#fLit;^nsRffkgVgDg4TW|cX&^vuP*}Gmh zggS229u3sdnH-N5H5>qXhwF-Q{PaEz!`hI;(J!AyCrosBFsl9}AE~8Ahs$;fA_D@p zVeX-QR`<6#D#WuMis*@lkdk=)S8cm6*@G7|Ny6wAw>_(*@{#%h@DLu_O`ez5&iUtkWHT*J>=aPbX#MkbMnj}4u zP#tToOs6W&=DGt|7e-axGH{t|wvgA1C}s^rATLS#Wq*}0eTrs~%0uxW67--4_U zp&8$|+3IQ^E(HWSwi{~XEqf02C%fGx_-{_wG62NgI%Q>NJ-CXqFzAK4*s3RA5UTby zBw;N2tq7aMfra|ZGQ|$wQN_fSjm#usbrvX zx9<8T{^FajK7Q?Do7fB$f9IP2SM`h$N@#+rv{Tx~Wu2@P*3;Ejx8Bigr#W3<$mIIl zyVVLh4!psf#)Ugj2uCL6kz7>JxtF{?5zg;>EJ-^;Zx~gF?ZQ%6m3rKJk`FZmYmW@e zQnzEbg-`rWYr1mxz=c>PDtL#WWwUZ$sn+!n+~A*cZQO6}d2TDs{(!Ng`F-)7R2^Fv zIQ7^Jc(;-EKge6WcLs*u4?)X5+lndDV?O4&tKA*3>rC*EJ?hU9+glkZZzo(>YT>LX z{v?3og4ctp9^oi+0>ork;g=jy6ORDFziZuSg~)xF8`<(YX;4Ac^0H_Q$&htfm<8x} z+;#0r2WG5RrmJ3qlO<%b*1P2sxBm8tU}^7#KiUoOJ}HZ=lUD3t5>q9cvL|;~*IkPi zA^*bjon5ZRaRWyy6EH{O;|Y5-O5_sYxBOFiKSxh79i;lCVL~u+=Y|rzx*j{&ofHpx z{^XnwAR#Z?r&@NlrEa-j2x{CQhC|7GnUdKCEA`zsJo#lPZt!b@LSglKm2L>#> zYsP1o~4`#al=82F182t|-~;`FUoZ%=*n?V*rw{599M5yC22r6VntU+BALBS6u9!;_Ng$1z!- z*;+l(&-7@mJd)kAI9|^(=^yAO_zLFB*vlBUn<8KML*Jg`K6=E;j_dIlpo7Nu@f+n9 z1tX*&A=cfUU&g2Oo`u6Zq!XaIlI5iu;UB%G-_j2rT7o^W#+dHe1GB$h)e#ZQdSbg9?*KnNDLV5iQgZiw*VB74*dnt_1oH?n z5jBTqiV^R1WU@#SZeiqEI4Ry6iPgXowC-=Q`U|~d>odOgo1G$q>Xv3YKk81}{Y2*! z0=`$7@54MbRTrtab$I4hWUw&Cg`G{vZrnUl(zsGhHBFG#Rqb=ncDncJutd|{^S+q% zS#ckjs*pmRRX>>pbjYw5!2aYrheQI3U&1?gsV1!@nw` zMt6GOS*UO&U?gj@;BM?xC&zSSO;Q?z5zL-8sZ|@wCd)U1sfnt`YdEl7plg&`(R;-#;S3ffQ-MY^MN{&l z*SgjBuLdlGYYJ>31ME7t?ZpqEN`1rurnqJ|E0nNy0 zpJNs?{JxrbB|sipXk+DtG@sJX8d~0Pl&a7wREukgjT@1<3s7JO?d4jwCPJpI*u2O* z73!o*n)pb9BT*!_(>&8e+b^Xrwt9)#HaUH_uWDzlxJD*~qrio)X45BiJ@M)VdF0cT zW3v<+uoGP^6OhE-k-o`+n}=W>EQ1_L6-3FCCNpriWG3|usVTMQ+XE1>^C4aqQ~~mE zMt*%klOa3RG{#KzUBB=V35KoL;8gtWYc4iqiutIP){Bk6gXYpiEV3XBH+yv4IiFx+ z+!l!o^ZYuw^?1aW#Ns?!ElK{Znx%P51aeE_8Nt5nv@Hz2_~^1*&N#aS14*(!Xs@W; zzu5lp)7y|}C6XaGr-J-LHOcYqp@Kro#<9+hlb+%sC7o~~W-vTZw3?f3%vzA3V3Xs{ zHwLz&yZ*e>`x=;Nwqgo?7ZkQVgI#H))-8EAz+5*b+1J%y&3#hX1TEr?>?Pl|(jgK}Dj+fe+Kh40O^rk@zvq4!PqCscLv}PL zfQr_Fs87YDLPBr-+?;Nl6|@&TAbt*Eg`ED)CO1cm*4n5`Y`y)(Bx7HoE_D#=VXibg zLGAb5Z?#AHP2g;!HG};p|AY1zb2(Ae=HF&Z$TRy`N(x$Lr46Bvi$G8hmkcRkmt)YA zpQXy+t^TYt=2X|KNd&5&q=?T=rGU@>0*+*k+Bh`L)YrlFQCdwYh3%#+JMDQ*h^&|n zkke2V`8l!=!h8-v1;bz>z+=@_N00n@$iyHk|6kY<;|E#zvxx6h(EH$M8g$C!2CY%g z@KfwAf0bi)+Up35>tJJGm0SYH&GL33#pqg%3vrmDqX?bKvESHlNx5R07XHgLmSleo zAcn$Zviqzk|8VO$ec6%b*BXAut5z+fnEF{E+m@dJ98lQXzSbuPty)>J;>5qiI&Zwb^xk+=jhLk zxSjM2JuNk>o=*yTDt?c^jU%*fwb=C!#VL*97usvKu!ehB&0cFD9-`2<_U*n;xIUiN ze|&hd8ItnbT=5Nt$5-!^&|di4yiLGDEREHA^z-_2AoUTvNf9>ada%-z8M4{xBQ8m*D&THtTtUnUt zp3xp3lP#*=SJ|eBwV#Op=6MQDZsz=E6+fRdIH>xu*mVZpQgW5AdbRk;q=T2=%)JD| zXIv!NoupATndIo>lI4LMOVSJesr95JirKEG5o|=C?Sr)b(SeM=%Alp zHQbw~o}Dr-ly(*tdzneP{=6-dy79D0>&qN9wjOld*_ErdH}Lm&Mpa=GKL*@75d^vX zA1`W2=|)b!obyGyS#BE0@0pWgl?tVNMIz7N4)irF(dEEKaIi1zOV%l5m$4B&TAn2B zMsA|n>>vpVEM3J%WPu-INet`vdAdk2=0?v7ua1`BUpe7gvr(`9DeTrqaLklYwdhHdX z;%|Ejed`D`*WZ|g#8#8O$l*9MVv>FPYYpb^2Tk4StIa}O{3A^qnsJe^=26?{LGh0> za4g-QZR5!JI_`6lSGkqkb(IAUUH#Fgwq>1SKR>Bz}SaMQGp11 z&|U6Qz3m}rJB-@$ltV>`G=T2?CR48x%-)u90wH&6N%>O%Ed}U|XX&V7fkyYDRXXh6 z?QUn#PifoR;=<4v>r6CEVo{^E_X&54j8YkGq}BbNHy0olXA^9qyb#S#w6UMdJ+S`J zDnYXk%?J9LDc??_04GIn1ikBXywx(`-rn=GKdU|POeWL8CDBRF08|nsL%q&JAY;D* zu401=%^xKYAwVr7zQ+T(0#RKiP+fmW! z671ZO5-P@)-}o^;?Kc0gQxooWC68@s%pTuuN$t6-vZ6YYB#9txEE|2*zOXjiWR0_B zm#}a?)s12eugV&SA1&@Zrvn=LFTC|Et`XyeRXoOA*BX*SC=Z%&Jd>3&}hdiRSM zg1IE}B@e@VBY09m!$zM+NZ`Pn7rrX>A*ccctE=JFUw8K~~Z$`U@y#}i`cFLB7 z`PdeVrS`CMj24d!UMd6!L=Rb|dm`pjiGD7p?T5=c`24x0_@nkZr$3yH3`)xAV|^Rd zw1R3n0u7$zAhx;3*7sJMNwq;q{lP{tYG+xYbXl;ky33-yO^$SMkwC+if5 zs(D%A*L1!3Z0z!VJ5>(I3D~J}7a~YW)sxnN`kxA4rcb4Z_6uS8Oa=#XH8nC+k76(n zv+EH2qG2!i@XVfHZN)qZKp@G@l*2FJ)<@lXM7_`Bt)4lglwg;~b_f^1TQfae$u-6p zWaZb36mTn34DBpLEPp6>`yD`hx2rC z=L!XxYr9I5^(ICz%{EKYlC+O&cAMUEd&Mc9UZcQ51S%A@gl4STw-7eJ$K&)+X9>__ zs8Czp|D0-_k62Eyz@HCzdZA&JJ;VI2odID!yoP?>BPx4DI>L%~hv3NW2`!wg<#Ye&&qEcln&~P z@5ZXd`8m3@sLGWUEdXIUlxj>Ofnxk+_vOT9H~WtzC?BYdlTc|V+y(}l%fyrS=)T3| z)M9qe*}qJa*SxvK3UfIt<)Ov?cjMs#MkdLJl;bKrx+Wsm%n+s~#Vr?(JN%p*Tdl8S zZmKOkK?}fEpx1hJbu+cAwyJ>w?q1{BIV))|vhq2bxAuc)f$ z%J(+vScK~$%X|O?UUP)4jZI$l`kr}r0+*YPf!$7G9rRL9P)2jpJ9=YL zzX-Ae(7kyl+r11Od7DE&lEDL6rsN3{jMboY$DJJMF7%BA1oQfdXXtPSAq_J%9>gg_ zZw&rgYzFW2Z6Hubchv9174lzui5}ieo>)K>UYv325dPLLwws);-PU$M}A|r;n3jJ#>riys6y`bnuMw%xETaBwLI@7@Y zdds~{IxnPWK@S)>O2D841y_lXd|RW!pFXt=!cgf8V`A+j5+eL5ja3VmMsUT4v|}b( z2}zT_4-M4b%z`OKlm&g7sILDd(i;PX5T#kKoj=7A&$VGW&+**K9KH35BCQngT>d9T zi&dIhElT*?J0m~%`d#$+SQOIz4wrN%1D(^06OqmbY9r1UGGpsCF~`{l<(@^vk%)^s zWn#H`bw+%ApR}{j1uDxUV}_Ew%;@?m33;u%6yN3re1#$@S|ginAJ-l~4PMeOta@dA zZz2V*(j)tZtCzAl%gT_WbotL*g8rVlo=*h)=s|AYxYsWq;R#~dr@gdfrnfc zue{0}YF#pWylwnQc+Q+_aMuN86VpJ&Ms=lz0OKEr(%hO#5`^~mepNN!OtvYY&E}aU z3qXE0_CF~-15}z*lJacP&%FdrAcg(9u{vdHh>zf5CDTQ>Gp49eq<yH`E@_VRxqQ0?gx#5$2%Cn6r}>|HP9LrmMvlpu zPk=$Tn|(=B*O0MP54OMbBr;X>DL73@Jg4QO1i(FPwGsZaqU0co97$jNtGQ$;WDD=O>z0a zI!S8aIjGTd@VK(C+@XHI_6z<(QR=5YMypiTx`U2)m%Cij_kP2xU#G$EJT%pp4b-t< z*B~S#UNh5pce*@$Y8>eAIoV(6=k{vJwJY4i^1;*ITS>HIqma}Tm9Bj-s@oL(k@>n8 zLGx6=&N%rhYN<=KoKZLmn-3fgZncZan-VHsqb`2ijDdBj+Y-5Dd)2IyX~} zMOH+CA@g89M@5Oor^u4}?-gB*rm?HBP@^QjS zXF{JI^w+b8mfJeDuAjp@`OvA-v*AMKjdtG9g7_@H_5?l4B@doH=K{t#-hO3o#0`Nb z{L|Hjm)odG9V>QCbSfWO2>`3Aq%-1(GEltE1@69hj`b!BzCwavI}537EZiC4ZH3`#CJbqcU-dRj`Utj zTwmspz{ejNzm`O?s>k1)fcelua!f>?-4}ci<4qS~&|}U9>6zU7@<+}23<;*qS-r6XZ7*}Mq@Fu^)K(kU|u~%#j?fSf`e_=U&)qMHoqqNu+?3sP$ z74ej{xPHX<56%F+G^}zpyym|OzW0`LR=xWM%8a`8FLpQTzS#pS8Z>`C>c zVJ2$dut!}i$xeGGj%san`m3OxpvKj-brnnSzJW!?UwF=w964k(FJt%*nsZ+RKV5wng`wP z;-3`)bMmTZwP>EC!0!Y)%nx13X3K+`YGRe1mo)rR@KK--&f>*B#^@-c6+I&Bxr8`N zBE%LF_q~tp9~}y+-m(yx=SDYBSYLlUccdcb306-FEe1Jvso`9K!KzDgpb(haR6tyQ zYA^8dZ4Q_0t>9*n$?Pk4qB{D)afv%wcMh;Bj8lc_I85k~!YO|c4r;uXehEUj`--(X zH@-JseK(Xm_$9m`p^nEYlOIi{Bo{BV_Tap2{}{1}Zbe_LaMG6bgG!|=P~Z9dY4_$q zH}<|IP@{zsXZoQ3JV`|4ffZ0hJ`8<4-uX(0pp1SEbZe`yzfXpmif!C$Pwdv*>NU>p z!o&8ELow}DdN=C9A#K2(6iW;YRw?PhduZ=^7kp2RkYy&m?S$L<_uR;}0JR)jOL`S# z5`27edium-LgAepwIq)*5u&FyqU4EfecEgG?q+=CP^hcl=SdOz939-l_RI1}MMyT3 zN4y@A&tVx&?O`dr^KO^3uXyoO)1qX-`TXZ+HT^{coWiKdNDcQ-=>zrtL=Wk>=dUFi zgg3zu<@>a{VSFAU(kdSu#7}Au??Je(=inZeYL$!5yK77o(B@SGVf=u1d8^;3l8jdO z<($}&W+tzNz9jQ@vG)jqVA!jea`C8ngT-s{w!pCJr#R=>PSdpkOIZcpOy7SrDDTC; zfQwNT*8)#DSh|dO8vEt|v|$h?5Pq7>!jJvP$n0_7)(aZ2pd#_glrXn9v#ocAsdqpY zl5;D9+_XEa&Ysia8_i(X*eZ*7C-6)EW2PPp+B^vxHzL~GpPMWskaD?1?(h0U^Jpx1g#4hf;4|=+bo3$7HUg?JmcG)DWvALd`6=eYgFKKD4C&&opdg z8U9DrKM>tN*qxTe|Km9z|8KLq|Nr=R-AhFr8UI~Y4R3xKfiOTE7+l&8T_*mwlo({h z{D1ydaMJ&T`u;!sD)SML>`Z=fWv4zn;eHF^D{#~Q&@q4;q6L`^I4#^jYUr##fY7vw z$pV(Y;eWE5I>DX{PI^8qV(;oJ%hUwFCIxFeE%E_9snfe(p4S*mWV7>x3L$6}BxIH-m1f?t$UC03ON_bO1 z9Bwtc2VA5BvPFft$IJ(gZ^{M`X+Ixbw}I!%+`JYmH6Z`tQMOu|e$DbkBFFK%JiXD4 ztD;kH=;}jk*;oD}o~8wb_#fhFI#6x@+jyGEO%)JNBLa`jI*&{~ku)AL7m!?ngX|Y% zS)`AQ-z^hx{eVvc``7K*_L+mPR@8QTZ~GI6vFN%?-e;4n{4Zp}W-r9E02HtT7F!yj zAmSfI6l(#*R;$P4f1gFuzCaBCJ^|Oo?tS;kx0Kh-(jQPX_Ob#U)A(AW&Aobk%HD<4zv({OEo(aIYl0_$V2% zu_HH`C7W1sljtY*mXf@!T=8% z#)zSV-8%Q}Lk_U{oB(`oTm`fMZqxbYlb6n}QdevpO(1$BKl!tY4>?UrP`10aI5{p?v14S-w&mN}LSH$V!N zU)Y}K$(ndZN|bARvZV#K|4=JR)bMEU>ZPK@wGy z^L_4l`A&yG+quZIsF;DQ+dP$XAGd_$*{MWfV50#USg)4;9c|O+bS@Q^DvhijNm#9X z%AMhI9a~li#(1Uy85@@23+DD4!L5eX!H+AWn9kT^TGvkm4*z0pV0E#u?(o$W;N)_f zHICv;lwvtpe%Bq+*p)1wVS9Y;Ax{B-r@tF+1U| z>@Pm>+!=^!vhPl=Nq$}5Yi4i4n^Akqtm$wmzU#~5hVGPQf5KgM!hTjZ*8NaODo6_Q zW-#u@Taxc!-+?tdIKFZMoSn!$HB#LYAi7rWGcBbjUp4MGuQ0iQ7m&4F9!ni_%|my# z)$XU>_vaDa7+ZmSYc6%K>T0#&+gVPU$bp(<69>!dZgv6Wz(neFLi@mX>%W%rS$NSI zmRD2%Pt^0w2azlf&MGUtrbHd$-qth3Vw^ zt7GzyUR+ z>zCOh-_K~R)s=9*chwq^nm{=e3DPknjWaBpD<8N)E%t;_lPf(*@mB-RGK7v*==LUo zf8@6zJg-yo2!H{e1MIv=6g(KB zr6+DYoHkb9?87~f-&Ui9-nxgnl0|*{jdpc$;{ilx2x!{QbYIB!NZ%r?B3c$PvYh?NMgZ?<}Yu1TD1{vwuP|m}QEgq(;{6Jbk1< zUM3z{9K0PEo&J9@_nuKrZf(1^6|o>HN(oIsrArIFi-Zm$NEd_{dhdj$prTaiJxB|% zXi}x4A_M{iDblNyPz6E_AnX~}v)<=<_ugagKi?kX8^a&VA4|b-&wI{!9p`ZZPtID$ z-=3UoJyb3m`IsCg;+21H1v%TMp_lYpZE>+Ye+-$-ZrBhQ5e-Q3GIS=9#Z2>+8tM4p zuXkD8SUDvhAkp?bQK&B69pFtB78si9_~cu(7dv-^%vC!9U0hPDK#~2Dv!7T@;?~F% ztgm&SP#d&aK}Pn#LMpl-Jqd3PL({QSkVDJYP1K0$$8N;R83s6`J#)lo_mp-`#;5DF zu}*}>oet4eGm-tLPK*QeH84`-VAJViV9o`+!LHa3Y#zcV$Pcqh9o{hGrE_2v{fU+_ zZVI=WF9}=Yw>zh^sbg6-wMsu_4E$HKE?rt7?N;SI##mH{;>t6S0pII$?aT0=ACA31 z&=I6I4>Mv8dzh`0-JE>ib`+&JRRt0W$k znHBi47FXa+8sWNeXfUm?G;yLHYqRP*sTecVwahEeGWF4d^clt=b_jlU*adgZAI46m zc6}jJ@YD)S^W<)(Fy{JB^@Wl7hVq>dslMP5s50}hhEEAE-jEuTf%7E(#(IfacOw@W z)NWVwmd8Wy*OzkE4V@K=xu)E0x^m-JZj$i3t8GQWk@f0~TKrHVAm&YePwB2|(FK5< zGnJXPVMb$#%W8+#+~%wG{$BB?W))LCW>j>I0bn$RA#i7gv-)?$0?0QmSP=m&T@|ie zg~ZCr5*dWFpZ7!+Eom?l20^}rd8jq)1iy8^qWgI#8SKmuS6*i|dwtr}A&99=KJu3~ zAG3YhTtQgE?TtRR{2@`|vxBWf?$8B<+1=i;tLFW2Szbx~SGTg#ajt@|pfo1kqoTw< z9ko3(Rp}VeJm{mt-7_$nc(hY$N*7Wtm5Oo6nRU`;a?H^joE*wVjs>r}V$+Wfz)6Z= zE8_+YyL46by6!kR>;}i(_T=<83DeBCQnD_I-MWFMW0i|RQ_cJ%0{Wp$5&><0QlB!^ zrL*T9RB?vZYwl)vP)~4F-Wt<7pXjhaRs-l<5~#E(36jt7^Kq$RM-j53PbTWUD8aei zt8hIoo8_GBV%Mm9pb6jNaK)H%1HIr3eigO9=oM z!jTceY0Xv63Y`&8cUvhqMO(H#t&p8YO}ka4t#TH-_ui($1A^WDL^8iTK~XV^w!@$vaoS+B`V=GStsy?Ssk8Jqfs~yjXe0E;~iq zJp3RZpXxIxpMARLSC+bZXR>K>@6w!=#PjbT^ z;mT6GvIapY-Hv>e*<(Pv8&e()H$hKI)LgBQ<>|3FG{kjXQ7QH_N?@;P+measaUcH6 zgQsGwLpXGW2P4>R`lal4Ape86&uHdv4)I0OVcyKPS0r}W5eq(j@$m-wK#YThvGV1T zj-f)ru+ zSzf-aj0tM!DLR`Y#AwlO9KqwX4xKx~H>l$SQ*Olmp57Z~T7Er8zuYm`43lX2A;DL{ zcxr`HlJAR0@RVkH?C7isqkzT3BPKlMQW@A_v|W9nNRiyt_4Sa!7^{xn%N2r;2ym(D z;5Z|-Fa7nA;z%TWhhQ5&Qj}NJkOxq+-$ybTEK>_-$BTJWYwyPwix&27n>VVbs|Gy( z%Vn9`@00!E_mtV;Me!$v$M2Pp4PcP#a_{!>ywML+yrF0FzKl>5zuLvqYL%YSCZz>V z(8tvY6GH>_L-5p#3<6`Cy}z$S9G#OSA9y_JLfJl0H^7}7{d%^ivOdj>fqget@O9mD zx{|1K6(jnDs|cB;)V^@PuFc#M476!ZC`h0HE;z;hnc*v|BV=;#c4%yVv^UUrRMzZOi?FKZf7#&{0`dL`gx?~VeovV z)`Uix4`*0is64X!F-^0$%dw?StW@Qbyf$@gQl#3vcX-2FnApGPp%51K?_t3&3~*1PVv2=*m!=l)_-iP2TFagI|ZyT!%z zXndoJ`qnKjCur#R3Z9AW-rI6f(&&q}e7X$<_Wg(9Shn~tt8S02p6J@EuyNI$lPGu_ z>v;R)x8s~Q_FQSYicN1U?kZ<|pL8_AR-v_7!qTUEX-qen$ct^q2&c|Hhl3uOR zRyT?*(QOzx2In=2$;zPz=QHRz97C7N)Y$C%+7D_rf3{_y^2Zl#+ot{I$->~@DD+`XI00ij)0qe@yT%4$rzHU*7M4l#2Ifyls{NQwD+L<-#>g7KtK=> z`#uVZa$*RolVNLMQDyd2c7C6(3$*6(WbdO`*u(dFbLWAu#vVcg@-f3=#SBw3_0XbT zF;tL&;kGB5CAeI~AEmuFo|8APuBf6wx$;4Kh9m=W`^*y7CLPpx?h6$Jnrtbq!ATJ* zbXdRHMvu9AO3{F(vkzI@YxR&9!`1Q2mzP1SgtsWF%@7jUS0PC+Pw7}9lxEf-_U4@P zV+9K~OpSV@$D`wZ?HBsgLl?0x%cFfF7A^)vMbaJ_t9eRxWJ4R=e&a;`>dU<2f#Q%T z6+_Ljmk@pYP-NNAc-fWAqipS1!TTq^JXWbAk-M-_LXmY}_!_$67A6JOk6dl%_a%I*F@H;r8nN(?g{p^&a1S9vWT97|Mnz8H(-s88R=MRHk9Ojr zccUsCmW)yw@3}JKX|+S(&76nIVY+xlwxJQDPy#DPA~3@IFBjD5P6;ttk#Xmi{l*5c z!T1w-~y1aw+tI zTcd;_8>U2fD7$>kTztsB?*)RBuiEnS3sAM~y-cQ55Jwfq`X1IAjAfx+Q|u`j5TlS$ z%e^xe91+Sd$_7o)Ijt_L>bDCx!|=x8f||LqG&0vgOc++1ZRO5ex!0kgw{AhXX3jzO zO_$3$*UMx_mXvJG)3*mZOJbS)i(*r8yKN#mwK-nAVhpDQ-~(Xn5R=!AF@Or*pNBB@&CH=pjgP zSGXdjeYXJv8-c+_lg%o-#%BiIY#L0K{k29uOW%)LR7ibE?S<6&1wgM8E$r zGPy7J2m61}PMP(=FnWFKJryxI*H53chRu>sa}@_3gqHIeXKi|1%m-Yk=UEQFc-)S9 zL+AKa2f4-iBHi)8Q1e2}u3WMP8!aYd0Tv}Nbm5E;s6qX}&~brdU&F?a`O_{%4hayX;<1Y++ z+8Qz}@qoTs5J-t9Q(ZoReie*)bznRq@IXeRV5_etMPl~7D6!ifa%Ts-T24S6INRFa zz5V&OnyE2%p?t?uI7OzQ|4yH{+=0kHPiNs`nytp~%tlf$ScuL49|# z*!bol_!#Yk;xWfppLQn~+>J#G#+1vZZPc`pa-yN2$vjRH!ou?egN z*HO{j7p2$p-Qy>maU82^y9O_sN3@WOW&Yd4YD=oGQ&c%H{K9AOKU6Q>c!-XaxL_c}s2m#k_5t5U;YD*z1-;^DcOyQX z^RtUcc@~&_H6pra#I#Px!kE65h!u}-7FcMjEP9zKY|S%suX>TJfqW>`Z&tttMwccr z_B_`$%vCZBCa@d4BF97_!s$>^3ZP!zWoW1seMyB5(THku( zc`7Yp3}x-!#bnkeIpvn-59Xs0j3z@{jF6aBfdzv{ra5FP{9N2qeTo;F&tV^mYCH;Plk$ zRyFPE);L#naV5BrN>YU30tq)L4jm{y4D>VMudHvWJHp^Mf8@pZ z`HU<3$Vm&{rBpq#P*trdttzTSyiZ=4vYl9r`(* zBZj%%@d%x5Q17|4cYd&$Jt3qj3n^r)DcN0Vo^y zWV*L??g7hFej|FG>D_ukNF1>;uGoQ%Gyt%^z-bGfIXJP20J~P)3;G ztt^i3ar)f9vFc9APtZl`@aB;Pqn%{d9I8^*e&6xV0SQg(JK&L+L@;0yR&L_WMHsDh z>~fB!{^MczTnDCNwj?h&Z7!>V+$;Sig7WM1Q>W$mARN}ixz{6}u{V+xyyDNj_EHc{ zXrBsy~Gsg!K9ElLD#pb)kb6La2lPEN3}WSJwhxXcwbi|t$W4BnKixOVeB6Z7T198 z1D)LHOG5IBjs~A8*!$a@`@i9nAHT7R=f4zn$!8$8hYnt>YLSr+9j=?TdeKf z?$9G9(EtZS=6>}1PqgnI#c4s|->tEW+USdFK6%%{6(Vq53H~s+lSd&;jj*I=UL-YTE~1LpP|?@zAVtO$mv)Uhjw5bfV$K^6LgTIvCltaqto$CJKh* z+u}6#)U#>&kKU7YgbxqG1hB8)b8a|{!q`aM_e#O!FgvYVo*2)$^7<0iFKgz>RwDYLZPT3|_P-iYT92i(ESbZr= z6HEjOF2v2Aip(qUxziENP{)^oDTD+E&3y;LSxmyI3sV|n3GpYqeNm_QDUjz*aZ>4s z8((hzBB8tvbDns1j{5NHW+vMMPb@$G1be@GSsD$VXNUn-62}OSy#57JooaU;FP(md zK;g7AC?6~^)h(L#UUWbG=xtv^_1rt7VOUA6J=- zdSdY^D_K))4h7jS8XoX-XM75MgnQ3qqC;dPobGS9TNEWHgWzV2O>)dgX2A}OwGE<` zjKQVXLQh~*i&rvriK%#k^ty4jG>)!>YG5Z{^ezI=1>vM5uR~AWmR|hcBCZXMm!YV) zw`!8&l7v+`+jCHj=vNC%61WS&!&%y3HDRxCV9M)PQiX6E@wiu5ycGLiyU+5htvcbI zkZP2bPY&O_D|U8He!19Y?uqe`PN_XFxX7v>V(TWFBDF6l_uQOAh1$_ZL0BGTEI&AR zHOcVq;oF-Vj6soIUAo*Gv8_%*7V+gQzRXFuL_x(N{eX~lyrlc{-rkqK;(e^Lb&abM z#_I+H*f55zY7;nG)ZajM=K+Ble+O}WUXD7wnd9>Q)9nMlCrX_ zdQfG1BJmmSLT$=wTtdoCN4~Ha|IvLz^=_a=N?;qEhjLJytbiRIpdxwG69D#fir$PrKE zt*uqoK@A1k2naB66^duwRk3*wDK)My9$!T-z3U5uw?sTMepJn$673e@7P<8vwx)1Z zJm=uuD0nqFUML0h&E16GalC021r0yRG8*2)&Lx;jCaFeR@lfT@_`u>QrId=OA=hmT zp0@?r(^Y_L=r)H=c%8_ZZK$U9!u!Oe18zozgbG=y)Tnu>yr@|%_!ZH^IeCI`2B!l2 z;yiP@q_P_%s(+h6oMMfrS$N+R-jG+s&byqc9R|DAR~JoqkCP>tx9nehut!s!>zTod zXhuguaUavB?)LOgw+iP)!@G`q^S_ln$EpTo^a$5o1;;-wNMoxjvLn&P0hRxHg_@$t zo_**x*5S$C=I(?$8=(^~@;{j!24U75kBS zu9MCj*+U1j5_CIF5u?I}w`H3@J;gi2X6RtpXWo8f3u0dJ3usm}7P& zdX)9CBD-PhR0i2pMwc#CdPwhJ^$6~bhmgLwZM$vLQt~KzmPL906c6Vp9QXMv^1q|% z1S|Mmu9Po6Q$FVYtJ%%}PGHWV+;Ijj5w_vq$M@9Cka9`8aO(_5Ao-xP41T2nF*Je% zw`s$ZLrF_2%)i_?dbA{#a`vA}T-Ir`T;V;s+T7vxeMCv7XNqBq6&z??E$?QYwKBr- zoXJsnAeSL1_;fwi{r*s$%%ET+f_j;8s9dnPNTy}iW$Ls4<7(bQ)RHtG_7|mXx@gYR zMk$?YzO^R__r^1vDPfq)IF{XazP;sA(Up5U`S!jBIHG29VuB7kt1L*z|L9xVvM&s| zqf&7Sa$sGP_vP-Cm~`VJh31El7ZsNN;qOmZaJ;a+Ofl)Mm(}ZJ`2kMD_F@#STEzo7 zy~NTJ2an0AF5@YVxL$dVpp-oqKw;beoz;N7RsJHlZ31Gh2*f(2; z|H{>&N>5Lch|?5KsZIKo#F=b`KLGej%m6A)?{8@p2~2t%GTr`vD4hDw_O1V^zw7_z z-1;x}>Ho?9_aG00@;l!8Z){R^*Rp{?lqUGHT-HUwhCz`rp6x{}(hB z>Ce=)2D}f+D)!{$(hPtMyu^reu`R4&e%wI7({NC-pv!OqN|B!YgD%+)fP#((q=D&Q zf!$IWegqXBW0FivZ>o1SKYDhU36ru;;vR$pXa6@^GW}%(j!w@06`MJs9cP)7BfM-z z$<*hre6wyIx4xz>9He%zQYk%e6-mO|>kH@@euDxEDqwx+`v_(j--f`5krw280-q$l z*#PnU*W4vF4L-zVE7WyvLR>*%Ie^L)^&) zmx4~w)THX8#i7!5=&cU0-Q^Xr&Y5an%(@J^5dO4l9c_fre=-=NHs0ne`tYY+tD<}G z-|brJT6M=j`lVUnKX;aJmiY5<%1rbK*azNa01dgc<7dKHjOk=j6(c6LQV~1Gp62|3 zgfJoK&yyTv$G1sUS|kS(9>8LsfEq1*v-E3Qy4uHg z%ott1U7sO^CC1JX?h=Lmn|y4+31=)*4?vf1g708ho<8f`cs-Kp${qN$3 zSx%4t26ztl;jz&$aAfC+n=ZxU6eH;|QSh&asg4KP&Qtz-!vEA~O>eV0L`f{?gCsAd z-oN1`00ZUz8(t!rdlulHoxGo30sY(U<7Q=<3>+3jnW7E$_V;I_3fJ?i%IB}`gaQ>= z*2LDcuj?^W(Z$X4D_j*7pczfTbPRArCr_q&i+%y#M0oo-EFx(Z0{Gy|o5*5yRT; zYE8%cC5^jv8-NiNZYH}zOPl!PtHwSlg#dmIbHCTR;X$|3{zPF31Om8_UmMGXfs`cX z4<2Rjm<4#VNoO!*`nLfrVh2b?7|(|PZw+8%u_rsFdtXZf{dIPz`avjQr~IT-c(m#Q2nW()^Y8Q#kn_16O~>@y*1<`9^?8d}{UFATfjXr=|d*^3%!sAli!= zX>Bis#~%HpX--;5$~pS7$sptBEd~^qUq#03sZhR-ekM4V3_*nIFzCPI!WjS^Gmzq7jy6MNk233^uRu7q-1YwP-3HJl^1}=LbDY$wX8gM_mo!&6?yS|soOYgc zKF(RQG%LqHDE7m33ylF3r|=cn6^jMz9v?E3gGKCT*~?(E`l8n~$1u`zcKOr4YrejN zA?rqbsbB5^ZeTXvKbH`E)UrA2?Islh8sA9vD(cg(?2l{rCVR`S6#ZeM4yV5aw}2cB zs83q6ZfAWo!SrSPA1(?|H6kP~3ItK^fZUXgK+O~rM7*s(OjG{c^=446)!OX4v;3sC zX~J~Nj|-bu!Bx_mGos&o@MBrh0aM0K*>%a*<0wh{vG~KrpWvCk3}8-|+@^h951Yde zLOmou7G=OjaMGS8$d-Qu0;e}Xqaif-B*C=K*zKvM=O7@UosTxpeg*T7`DMwJ9~wy; zss=8t>#zCzZ3Z*0UK9wcKRo&c>-&`lQECr6S~O{UW8z{%tZeKyHTk zLD5dDTnFgQGN@JYXCncEdXMR<%BBJiU%#d{;<$g(p%rig^c0ruKb6|}{CiV!qK=o* zX%N`n)nCy2;3iDsn^;`6=wgT z*|L~5C_be=3EmKU8vx0BO@dPh^t{}o&~c#JYQ6#r$llpJWZNYHoWs|o8p$>L#eN4f z`w5&@h`bm<{WpV^HRB3;bI8*rJT8$qEKyd@Q@ROz1Z$q!?Y_>h$A?1c!)YVln~Kv( zj9%lL=5y`WXVwD)s}3AjqAAyFW~4`}gwx9)Zyfad?UXo{vDt9ym#Gn=lVaP;Rhn0hD*ov(a|9PQc2Yg!D296ZU^0#VWVXyJ z<6!mV9(t#5Wst3@)aLQ#83Tngsbg?wVyS-=K28mF*9my!_(Gy3MlHZ9MNm%F=RNXP z`kB#w@G#RTmGjmuX3c=btK=xK*PyxwtXX9xi3b zaIk5(qv96%b$T)A@_kyRWnKXFFH5pS{%2JhZ`1zIAGzB|lRJ~`nkfSVLW#YcBQVyW zcjLpJOMSTqn*Eif|9Ge1!FqoPucQFm#HXGG<1e(v6i}0`|4lsgfvquxz6^Y)pjSVR;U6uQH& z;p+;P{MVFX|itmO-XXCuf=B=3`1O z{BSmJq|P7mquq;Ssj4CMbV}rH_pmw%Tz(iJS;6)^1TfT~GNN4UmTWr9uoIS}X$ZKn zHpLe5yyt{Q@Un=WmMo8tX&xKCHbh|iySWz+*J65>(qW&H$P&?!ZStuj_2~YgT;nWY zE}d|JIpz;iVwjU-VxaTBHqFY-Sq<$3Xgp$f3t^-~$;w>59&UY)Vv8;N^X_w{Q0Ga) zVlb3~9dFX4b1fsYUv+(w9&3F+c@P5r8 zXpqvAiNu^C`gJr3rYh_nba=ec^o!H6hgX~2J`osA+gSiEQ8d+kqc&nZmc3fi>?(T$ zrraK-=_8XN+Rw(lTr65Dywq~A<&!=&zqe9c*gN|cj8E_5_abGF_p!&+cp-w>?zq;{ z7Kk0T^+wzC9mZv(ROc6AvrUj69#5Hvssv;&(pGy)OWpslDiI$~m}L#)xv_pW2DZ*T zqSu$;x83a&z}1XGig$*Tz9+NJs~uq@D;5p$(tg*QKST{s zC-*Br-yeVBg9k{L;|(Is*GQT z+ncqH49RD2!tGJH_l?(?(388j>(gclqjnKfQCpJdHgyheIq-${Nynd7oa#jBuds2Dz{a*qh$ZxO?Ni|W^F4gN4`JwXYtrbdg9F zj40WP5H*eJ+0E%wnHMrMx2JGC0M5Oa)GN0cB2ZyPh|ce;cCi$8f3;nbJnj;Q3hWp~D`%6SVo5)1XY*63TM zzE@cFEXO1eeE7m_-r6t>gH27|#WRKe&VIBrT}0!{qOZpvA7jQ)%?XBODdRTPytB;dc8yuV8TNDY_>TtguF@`b&J&q&>eoX3$}PN zWCkNNXR6X9!_U}WhVD7K6OuMH!U-$$EJW$@fz(&`Vf$|GoExEsqO?#dE7G|PI^Qys9kAbkYDmROy4 zO$U3;#-D-^ew#&c5chzK_dwTdQe1f|A0?{NZ9KaIJ6Ut$Yty`8FB`!@!lUn+`Hf0> z>~)JynG74qe~ck}2pKiR015DG63thZd6!pqDTiuy(H)k+ze5-CG@KUx9HR3|sN084 zCn8o$r5Px6H+)R9x~`!9l)!p|B(h|u9mJNlG%z!XUY^LZdE$I8J z-MhO9`8*j6R+h@P^Zn%@{f62O`1#Hy9v*1b4NsoXM33g_P*N!72#||y+3Ui1Bk4e2 zh$b(6X`<9&96T27Ek&F&(-hhf5u@Y-8NC{fbFWk`OE|kYx@u_RmvU5`TBqPd5OBX? z_5GQd_-?}q=+OOSi{a`keZ|A`a`o*5TW2O%XZOV6n0E66v|-CjUddU57ja&qtCCkVT
w-~XWH4K!pANiOV7OzZUNB{D(2L3l8VgmU3o&`*NglDSJz5@qMOmh&E0R?ktjM+*9JVR*O(6#oDYCb zJ{;kla?2J8*596N-C^ckZr_vW0ZAt?bzNRl`|9&VFN7PQcnFUM`=|CB({4Y-!Pd6% zXPG8`zsOG->=#p>#sjx6G1o%*d;@Qf=Z7=Ocb7qzc6bk?hCC0~H}&-P?x(&i-h+ih zb@8f8yaLv+-1n(Dx|wNDaxY2f?B7^y09)l$r=N9R>(}?#g`bORT(5e(I&(5=R~o`w zJar@b+!6WUj-Q&ui#RX)eTSa7!>uZ9N)oYNIw%!9CySYHc|5d6f&bZGPM4m$Br~lLq_K5KFFQeMNvnY7WY~`5) zKqr6P-E5Tg?fY(7u-{Aa?&??emG}ms`#@+gbi-j zuU9!s**s$P_el`?(!0HigRR!$QJWGi#MZDE-$4edcYFgBG~L&6Vsw9)r7a~K&Tf*( zaY1Zh2b#jZFD+p)Cpq&R@hMhHRY7QI-JWe2M!!>%CR&KuxtXr7QSoFIvZ4qWK3L5^ z3}5^#>O?xBqT3#`%_`g1`}Wjnn?~@4Yc=HIDDCqUGQJQIp0fn*!k!fLGhXYtup3{Q zE2FfLLylPn&thoC>|O#0c_w-7HwqGwkD_(2YRhIuwz$cUl)(5Q?)daW4Ag3Dm{OuZ zo9Shxd7zFJ%f{F_x{DHzrZQ*Sv;qjTDMKBsBLs?^yYpit5A}+yVNsM|RAf-jJn+IY zt++%mh1oZOCiDmvgY&S@k282K-HZLiS>IlfL&*pE;L|4AIZQ24n(Jl(g6qW%Cw@|; z9F)X8P=+131I5CEus&TMzd{c=wS?ejC{{TslmpQscjdzVW{!*K)gx$BMMUc+3omF{m^HG$ z0JhAOvNyKWeT(y`gCwNZ-TE~|Bjn@V?dcl>?xhHl280 zL15mBLA5>HU+S-yc9%{!304s-jz>Fc+u!QqTn1Ze_p#hmKlir4bQfE~MwIFl>E(<* zTv=6a&#BsxB`8ca{r(w{(2>VHWhEUKyt7P)Ks4mo6MP|6_U%v z`TYSiB%QD&d^=F15Igs=&Sh_94}oP#o|73$(RX`S3fP{Fl%@VCQ6gP@1lN7h=F&d* z#rifp)PzehDe$$ZovB<*myEF52Izwk}(Bi=OrKT>PFHA4zWT2*hH^Xp+%k?&d^5VK`Keve$M`81ntv09$Ij< zH#%8yG5aeBXhw)V^`HiRiPb(?kOVC5et9AVISZOO0>AmSYcTsjndMIRuL&A$8BZNp zx+Omd#y-)1%4q7H*}%}wCYP9j6AB{<%D79!98QJ$b#2%2HSIs%x@lmz)>s^I&=ZLM zMjseyNZsSvt%(?-UKOIascxnjWeX`-B#yrY?v_ba@$qt(7X1c6KQd`}@@kgX*JPmPmXBLdo~j0?YHqys;^?N_uUWciG`hezG4H_ z`sg?FIyH!|YVK34Yp6E)2<#*1V5ueon^hqxgBVHPzSn@?0^I;-UAE!aF!eA|+ktc! z!{RAB%A8iOrhY-^*0*oteyvhr&gXD?`~{Bs**=m!YfXoaW$Jui7g=Ep0(~(B)5Cl) zSm5>J-|Ge05%P?JfomU*EE7)gAH43REiA4!I+6_AW}*F7Q9&uOIK8|W_Va~*K%?S3 zy^go*)rHb3XdFqsRz~#|+-K5AMsC)^q7+5Uf_gbjoH&#&y7HEN`zi1}L#Z*`Eqiek zD+qW`cT*#$p^`8%ON|dG*vEMM_5S4b5ZUn>XT2LADctjw`**b`a|twa8kUcgv4g2U ztPid|S0$zf64n2T6;xgA66(nx5NKka!XLc<@vlXLJCb5(7Iu?SDDwATg}X%qY^c&E zAqP}@c3Owig}qbbots?~yGB~lOEMv3fdoz)qxEBfD8ZCxqt4V)({}&3>iQ zwmwDcnRb~;id$9aPzKI(Z+%-4oa#xP+~%y09KcpIj20eaX3c7TB^Ja7Ah6iC03;)^ zS)FX&`g%iIrm+(!TzYd~+6DApO=5x9WE|Lw*i>E}TC7g|vH89<%;h*{cWG3l{%I7r zv9i1X>UebTEg9Ai8rfk?>qqFv+}+eEYvxGmvv?f{r92|EK+H$)rq284P8J1eE^u&z zWA`cl?ItV7CG;EB>~}SrcF)rb9-~@)&+YUrst1(za^fGe`5~##Sr^T>y~Pq}Uix>4 z3T}uVssuAM79<~wfUSllWT0P2B6Q$ioT8F~Z2T^`Jm4$I;1u+^df{Xtqw0xTV?)Sw zHrO}%RKM@KLRZ-=#omCVfS`ybGzhNHvp|{{L~eIyhd)bU#^pjMJgNI12-Usj%-^?X z`a+8mz;ZkQvNIhaw^`L-TIpvxJ~5_XL>FMM%XzSdT)f^Tges2+G~8~tg4n`TZ<+^! z8|IH<1o4RHpGmxx|2%j4ta!YWLFS$;!rnJiJE~VULS)+SNT5g4Zse_ek2iLDVB{Wm zys^7&M;1%s@BM?JJcpw^mY;w&L*47{*L}{zhi!IftrjZZ{#75yTrR%Yj)Tj9gcx8WjuXbH9A zsnii=on_r9*~vJ*ic+Kg=LA1lw4>zjZK0n7Zt8m&=%Ns0Oag%ov_PFX=_|MwR`8SX z()Nsl`>QV?Mt$>awjx4v&?3wuqPYj;z^LP$OsMktXgrX&DIbZ}og82I>G8_yV)eYi zvv+r!sOYWDKyq=|pmUK57b^vME$&5FI-8)aS)MVngSMe0N}o{&6B3_!iR1cV&O4G> z{IwvTY~fD;A_Wa8>Tvf`eGG~AH|}T89B0|k7@c~`SwUpVj;k|qO0*~k zd}P5MKkPTswwd{Bv>mQ*JKtJuA{o1+kx{;)TrAaD*ti^6dD(e_Pv_sbV>XZDU!OF( zMRVkPg>Q$gl^~E&zR5_uhFvM2VR3OwJZIr-d@^I{-|x|{(;T8rQ0$FsGm5PoVV9^+ zpMgl#%uHLxrQSlKdg~KY`OvEVK>h!fB}Cm{Q~iM=&v~wXZfUmg57r{@Q$W!t%ALeb z`Mo(CkL0RQX9np}Y0%N~Ow#8nht9KdnL$!}O)Flos``P+E4-nA>s#%jKYgD)uGyJs zZNex{S5mRS+6)Y}^hnt%NG(TOB)=<6RfuA_p!aQR2qD?hRurK7``fBc=QGH>FW@u^3l~ zB2H{}d!yUwzKJ(VC@aikAw!=WR`tCm2KBB#AKi<)@a_8GIj@e2X*1MCVxd{Ok;H@$ zMFZe;+g=UP1ty(zc_Tcw*UTYuDA{k;MBTP@U?Oo@ZmK+b zLthfL^u-nX5Jj&@*A`9&y@77i!!DBaS#dTBKc}Ws1fG3<;cb8M5@Dj!!H_rwg!Ecx zd-$`ir<}TtaOSeI%fugm5AkMy{q^kttD9s1jwAx@f-z@yDwkTWN~kYT}tO@d`No z;G}}n{a}rEB_Wpw#=s=(@r} zaU_cUGK^pdV}&9K_A4_jA^N+Uv+q&bNlKIGRo0#unY0iow-~FmvheN9`zYLreZZWM z6r05SOCzx;nx~a^UCeQTPz(H?P~qPc^eebhEzTojT5SHrBVJItP#9ANc>Q?&U^0ro zOit)i1%(2;l$o*jB|NG;p?8MLS3Mu?7F7+Vlr{Yr+!?6XjBZZ48e70XbO;dg&FF9c z%~s(=f)xa!oR2sZmL7iE9n~1CoJ6jKq&h+d8_XE^P%0g>3Xi~@ua=>ImU`m>jCVjd z+5A-<{|?sveW;;kjb`p_i@1t3YN=2A50dFn>v`|box*k86IguSS}soh0`%8BXml+u zJ}FDXg+`dvhxUOv$*iH%!@2DQ!}cNeis2|E0hm&2PeU#Ip$z*ly1w5|;xnIMYI z^`)B?MES~B)EfP592iT~4H-+XWMoYIYqt(onU_LmY#V)@2F8UF^*y&)`WZG?)q-NV zi?Ljtnz|g^M2)>K z{{D$XK5P_1^mEHmOJ@Pw`R!@U%{S z5C5X9fx4g)tdrf&MpFBTfzC2`$U9J4fPuHV;9+~qg{1|OuW3bJ$R6~fenq?`mvb*jx~-q+;VPwfx#;D!5KYuD#JIuOCxL3 z9?J#6Tqiij;IVL|`ur`?&AIc~CfK!Y%es0hO|i@vGPBY+df(RD(mmaOyAc)Lfu z<~1o%&M{^8Z`YMxf$<>weY{ul{XMX84IN5@MG6dAqt+jyMuCN5cHIpp`Um7Zz{^e* z2h?56_D$N2zkU{Bl*(>9bD)-e4n!r|-z@jaSTkSD=g-OV|iEmSEXls_>D5 zk*syo;&pT8Xl3^F+GE7#+p~m6qbDE^%B5M=E*vBEqa8_SqYAl7>+Hwl3(P)=-r=yvI9(;<^U)F%Lzmgo!wF1pLTh_^F8=pG!$J5Rx+o-A zc9EYqvrNAb$H{}L)2QMod=NYD1b3F{cZ$l$hH@O^p)1;8-oe0G_^t!RMcSTv}j-#PSRjrY6MO49Jpz9A|ubbJ(H!hj8D3 zro?53;$l1Xb(g$f3XK^KyeSt8Cw+80{R=+v{Vy9KP2lq~gijoU+f5bnZIl~sdiedL zf!RPL|7bK>6%1Y0M-#QAP&VN?)*5K@0Y0#!%3aJrZ(~U&;VDoY;Hz$zs0e3Z%LcEU z4d9F0ZrzeF4A-^{e|yh*n5lxi>H-Wah_Ko{n5#l8JcHg(mwWvCA-KrsD}tBQ+R7fY z6cD=rr?~(PM-mLhD`;S+1fKG-#mUV=dz^S6uSM$3WsQU&&AhaTFV-MSDtY+Vo)jTD z*CvNpIo4)}w4{&D*=>8<`)k6tOYo&Ox|;zgIK?PxEbqf62(&Lz()z_sAT15%W^lkS z4zOIaHkTMsq$cXM=o~JGVYW?yP|9*^s~|}=0Z2+D(vON>ME9z{CJi56fgf%3!LRTy z?JGxa2YuYqQAc6l;u00d+6q_c0%M>;0*&}0LDlz>ccl*BE5-WZCDrt%esq0>7Jz2E z3bEWWa9+z9iT%$q+>|x(;*vk$0r(e)x$}g?#gZ@t(ysv)+W#N@&K|j{xKYb+FDY{Zl0kTvW(|9wT*!5T>Hnh>ajN@HgB_W4wQOc1|>gcTkE9W zqJDdYK>+{L0T?x#dS%qUq8m+oO0wG71FPA;vCv9SdTnlv5zT7R<|cdO56MUpK!G+) zFhvlRsz^FJv8xPGfP(loo77qkMu%u|{>Llc&$k$e8E!|UQ4XHBQxrs<4Vs(-5Sxvw z>l?KsSfhLF3zC!j%~eLo2`&}%4H{UbdtBO*LX3hNVQL&0bk=C($20f;yO8z@1j>P; z^7E|vp%;ee1Fklm-w&z!@|B{PNM)ygH3{A7giH+P4DNPmk_>gNwss10zx z6+$XDCdn4VnWQDU!1p}^=En}Elq=mOsR+L}WHW^&bzEdeoA@{n? z_{?`wC?&wch&f>2oYb5OXS4giTjON!+jWWzs_9h6u638#0VovocmC?mDE49?aciHv zGlsxW=hFs|42qHcua>wI07+0q${Z{Xi@$)k`p$K8>Y!hNMVvQ5$dHrIHGpcP36#%% z1u*0xC~{6PaqZYo28d)S&{CzPl4zL1z^ZNV{j~;mByx&H_e6pGs!9HnfNNqFWBP`O z_zf_@ZS4VP(_nKzm{Nj&4L6>DWO39Eqzcsk!Q5L$MZNxgqY8+iq@ci%iV7&rP(umG zAPpjlO2Yu7NOvl!FqCx1z<^4FAT1&cAvJ?^3OJO~UFVv8?{h!@`{?B>3B!|6YCnrzfS$GHr$)eVKBtfIesIruuikF-3tZHMJiQR9KAwX}BdAD1?4 zcAeFDaL%|hx{J@q+=aYL7K#c@N7}s;niAu^wR@q#Tc?=>*-klxhdcPk<5aA2c54y9<~`P_NQ_;q z$~9!8eo-e(ro~+}H8M7qK?|z4G8xNku=|}s$BHPy1M%s%bU=Q32@dE9L33UVF@w*X z(WFVw{k__4%E+RX;u@0sgJKUDUJdeT6B->G1QjLbGMaB2 z*YC?wPoXGMy?&=WU;9`(;t>B7CMXMZtHmDUs?tOuE%TCESx6N5j3GqS>H(04q#+8@ zoz*G65%f4l3IH6sV2c(cs)uz;K@KK&u?PIdddD7fex@o{;9O$1!a~wlhl0Y3Ah&T< z_pii=S&*)3U;t2_j0<;V-qVFp7+Xe)E6oIJ^SCL-o@#!A3fdCVh2|Qt$P)G=P_WP^9g?mJW+q(3Mnb(F(VCtaU!RC*}T_8`qGk+mj*)gh zAiPL$FZ)51#lL4pdnV2%3S*mGkQ3c*7#K^YPU(!n&(R;F6)P4;lb}tak+;vk2her% zo*X9eIXLJlz|bbx@Faf;mU5c7B!gVH+qC;}rzmd5wobb`%MBA*=yx^C=Rqn9UkzBE z)$)9B?scGqV1?KrX9y|TAHcpRrl~Ij1jwJKK42*nAZ1?p)U|r`NV~v4TvEM-gMA?9 zv)DuRMFpo9MnFI1{Y5RvYzPw#x>tXY^&bquEj2(8`B4Es#+V^Q(XbJ&pUALn{>+>t#A(?IURh!K z!P3+H2EGXNWX0x)X{`!>JI%wBV8vVHq6ValMOr?3(!4D+{qV#qQ%s*$zorD-aIR+= z$_p)@gS7}3OM0p5X3%31$xR7;l$o)Dfk??|Uzb9{*Q!a`=#*X#Uji6S)-tGHYm1Ow zpmg1QjtPy{M-vhjSPQc}$!|3i{5B)ZSkDLK9c+WW-I=A8rh1|Vu?9WN!tXQB!IH;zz`0K4rS8`y zCT^)4qb+sZp~9EDALOFeSo^G&t5VEw$ZbY!8N-~VdU%%Qc4c;i zDc1FdA1b(4G{};mR=G*M=J~qKN6C(!$`fn@54Gs-S%rJ;G93l&ILj}0GwyvL-UQOe zc`v<D*AGtN0_2E`R*lW4NcFFriqsNry{ZJEhON&}Okr+4#LFM;2Z!$aUT+@_WPy z(|}@N16THsgLgDHmx`ENDOeW=X8!%+y9_{L$T~N#ilvZ#c{}+NxX*xNngrvPF@zNP z6=l1QF@HaBRg;>TmG*!bdmaA@sG&meJ)6>s^dPK9&sJ+ljqXjm1q6gQ*VEhHpk{#SDSt{1%GMI@svr3x&W?FL(m|J#(uM z-=`$_ zKkwb6Mhy$-)_+MCk{yk=IY`SFPKWDOvn)N`WR4KrPH~U_&3nD&+9w*X!#Cq^nC=_X2Yy7^M|*Wd zWV=#4`FQ|lC-gn+u1OrcjL`Ck0K6JD+V|h%i`=W?wlWo ze-%})`CNn&_D($H&iKgen?;{7s3RgYx|SZdUu5TnkkZNLwx@(KBrnv3X|o-SG8=N9 zNA7<5uX#PMyc8;>KF5#W6#)9nM#Z+bq4yxF_$4EjPSqf2WGa{AR|*w~XUdcybs&zS zn>PV?BX%S-aUI)Y13@!|x3hzTKq-3iONSV=Yojf(D;Coj{Ox zD3>avZ1}51{5Aas(TXp~bHRR+dp*%6)yD3f8o1&LK znR~?WQ6fb+2#e9{DwlsJ6c}?{Z98i47+mw|bnje#EV`NSS_nNBUe<^bwwiZISGr0X zJLFzQt1Y)P7(}893Rdi=%A4Y2~EGM z%F?4j4*DlLsySKJ^^|khM>3i3NB-I>zz@99(`(W*b?W6COG4QSD3>L0-B!F8=<%tv z$y+K4W^58Z!;b$g51c9H2dJC3zW#Wt6PS;>nXjzNkcZ@2FU)*yUn7RGcWZ1)R47Hu|!iN7HEFhj> z+9W~CZbiJNDD~y$rS2x9@TB333`E7}l&72VaEsXPTY`0wqN$POkgQ3Xu+jEb)r3q1 zfA7Vk8tqJFEHoW@e5E1Bd<*zVDDY&PUOW$Y(9OvtaXaNxK&i%0MiLG${2VdEg}#CO zDxe|Og2>$IVtkDfl?Kp6WsY)K=yt!EX6xMp%^*Rqc=7}<`a<(D{mryLIRh!#7HoVf zXaRk3&^>qrjn4viWOGIi>hEsIo7t^fixi^JHt%E_H)5@`;@YE0|9KYscmeo4V*&#; z72ICLJKjbMgI--0hD8qa948WZ+Ru?-ub^?1)uJjd2R80EwmvF6jvBD{^6f461X-*$ zcx{lSHsZ6))VvsF6Hr;!0>ycY#N*5AeOp6@RX z+{^pShmi(?=D2SgiK<^w1Mdc<&F=HOQQAzWxvbgBUJxjt{5t#`H`c$NVvL?~jwL%U z+WSpxJ*xd~Ykbk*PhX)SZadC#wL?m4QRk$-&5>vnS-#-S#=%J6tO|HW@||u;5>u2> zev|gf%~<-<5YJq2^g(Yj1cjo#<3%<4qq+F8R15J9x!hXxy9$bn?(oRH ztN0r(_H%5iwU(y%+Je=CHWhFWkf|aVsbRBaoBASF-fbVP+H|Q7Y)WCB1YTFkx^Vou zx^jNq_gQ8OBsxVFUU}`p*uP~Fk?i0(3FJgc7yy4cJ8d>wW7a>FWYhXK$ zDCjB5dhHZoHpr@Y4K60GCPqz=B}D4gfU0q8ZuTqA#M6t< zi;rnpGLY5rTF%>;O!`{|GrS?)y%&K|YGNnJkjRsC##S)VfAeRZ4ju&e7vbHMJIYMWKkltu(;=9~Fc)bzz?B>1p(`-DM zzDW=lJ-e7^mL=+*z|yQFN;Yqf{3u&}bwp`$(n@`cafd_SPoGwovrM~}TeIFMlk0vwXlLYKn8gPF%?i3HuQ_M@vjmQB&;Q1O2 zf3FMKeCOq5@6EYj25kzYkP=IdzSacO>JykJy{sVY+JQVleDigKSr)^OJR@CsixhOP zCAbz|JO}^AEzswxZQ;juMBjYp_*&|D)HxAbPwlHHyeX<3X$gcRIlSpJWi&q`+D2KduxeD)LsFDMB z)=GeemGAtE7w46K*iJ!%q8D5;$u7Y1sQTy-i~%sji-AR#4-{h8s>GHX*-^i&$=n9E zr@b^;`W_g;^Z%W$53PvMa%5$)KQSPnAeiV6h5o>yO)a03S`N8wE zyOJ#cryu@Lta@WCn8Ck#r`h>G`)>Y!dL{qwH~wf5BzkMP14gduw5x(xoiGY4>nC=H zO9kD;?hfxK4<+|OhXl)V5U`kk+UXs^*6jh%tsO};z*hpc-bRDJ+_M@yH3)#>Hb2X9 z{S7$A4p3aEQ{23bY?HS()yU{DmHFpGZP&_g86Z+gqhR_?>JjUkm~{jEq?JSSiTetk z{|MlKX~v$j7aFs&TygJmX8Cg!mx0Q<@3FC4g5C0mf-Yir>nbq0zVd_B(Q{{ZB|dx6 zxeB&|7XaC^2Xm^Ijl{rxhN#^a&MsZfeR6y0tK$HkwCz@gP#FTmz7nJ_-0;m>8@QKb zYU;c3)aaU*6NpW)0+iqqGqpD`jXbOd)`C63vx^E+J}79OiQmpoJ5Z+1`N|lK0ruv~ zvtT$(d{s3N`q}GVCZ>BX;ctXH{%wWqt&BW?heMlhZ2kdxm{bUE2{>*h=IoX4&jii{ zG%BXXOrcDHM&Wq9j8os&9l&bCf1|5@lygeA10VXC-WbIJK%r^h#SvD3f~J-R+Ci6GjKc5D0mN_O7;*D|epYVH^x z+5x@>S)Y>~$qL{d<@Y(>;Hdzh4%g@O`CC(OAlS04#0gXv*L+@2B#)ZJ3Y6qU8)y|}0CE)`g zg6ssM9c-}!YAJ|zsxQ&RTXz?Tt*7ftzzp=+=FIoQPGszZBk=iH14#;aa-)3f_ohsD z1*3-n!N4xRax>DvOC6@>P*-B!TGDw9c;iHxj(`gw*z89|x8SfhPxoV>Rv7T_UI9eM zr8lX79jM(A*tv?>dvozGE!HSw&2P=eay8C#LXRelnl+Ifgqw`QSzpBiSW$m=3p~Ms zs2Sq3;=Pb639NxF zACQ=XhwgyExQ3~Hp!W=Wp-jPf<`C3Rr{6K@B)P+m3S z19->dH*_p*qI5J^9{G%Ym>c-JCxh^cCqA^)!2lHoF*AE~jFZ4mUIAPlP%?FL+Nm2p zpc1WCx?(X>YFt$|VfD^aT%R;i#-Zg<$-@ztDgzHtW0_U_ye{ng5j9Y+L~3G zT?G<&WC}vKd^r~0_#J}i8#%DTvCr15M}hPwtw($~eU!-e49RfQd**F@2Qd@?X;+Hb z{ae3wNl~V24LCyj5A*y6g9zzcLH&!sgT4|5yK-FLBQb6TcrQbDK#NCRqc8?rb0xU3 z3X<7a*hGn*qzvgmj$RS5b|Sn}rZDP(Wpnw#oFRQ9iU{&F5M(!w3q)sxOI~^e>_`Tt z3^EMTX3O$7A8*d4kCS14dl60?QI>HFt7WZGqhN!5?xX$hdA+^#gqbbFBAo9V?*M2( ztOOuGeFU)HJ!PI$MJp(N0Ityd9b_VCAKA{izWI3=9z`_?ESeR>l!9YUG6ohtIPK|M zdOd}s(Y}hEq2~crUkzh#udIFtt2vGMibwxB@q2ku&bR(=c0ecd2mSxz2SCR&@q`T{ zG6Wk;&0l1WHj|hf8siW;aywQ4;s0%(`W4er08|{ZWY<6v&$pp^ZV`2dtscp{8Na@0 z>p`|Y61kZ#@t=VDu6U>S0qXR+aDBhh<FnvAIB>R zu&jb%aiaGwrh?C!S2J4On0ZA|9)0>YOXR8@?1C5}t(8WmsDNsU%^$n{SCf{b;BoO0 zTT#$Jho(@PsX`YHOOcfD(;%w!!4Ywl`&W}w#<~NAG>UD+9rB5;N0qLb&sKC zyLezp60f&hTV>A;;=MC}2-Vv?Vr38h<=;*4_$klMv{Fhe29sHck5g`P(kzqbsHgjx zpjbvFud{Uqj-zE`)h5*UiYEzAj?*~vd*!WUetC?94bp0EX^!#vEQy!~>-|;^qxqwC z_e`f*$0XL~py8J392kKm+FkROms!^9Jx#P%3}bBO^}kbzFLB>l{Jx(73LjBN3Ax)& z#Xq&#P2IH%@46W5K@kT-NUywAVHaAjNAUr+n;9SdUT?dYEPWCmvz4u~*JAFz}+P3?irdTfUQxA23YqOPOC9_&jTwA9}Z;J*qdp%N|bbZj<{mTeSd?!>4E(Np^al|!N> znTNjSM)xBuU~DuN_6BQ#RY;udgS3D5ck)l$DnSg9HGmH{sRm24x=9)XlE7ri%u`Cl zbLmkC;e76TWOw<^v#1Op zG^yA@`hXA^1se^4&#uTYnl4er6A;Am4s5=94*kO2h4`xTGNnXXMv;d^8~D+k+P3rv z;Aa6Hnm>ztK?&mHx|E+MEWu;KbR$8Y+Y^WuF0~j#ls`O?s@}qFR)WnrWb1pB%wI-% zZh^r$B7dvnw~^KFsQER+BTDL5$7+;}JuQ}$ z0P?8^tGMCEA8fMZ=`qsz%9I3h3}y;UA3j}6oIZOtqo?6`ok}^oVWPbc*ZzY7q{Te* zTmu)ZKTrS4jxHq8QfFNiXuhK$JzX&kju}i@FRymkvq$cm%V626jb0zYx=s<*q{)xZ z#IjPjSS40@X7}b^j)HpJ=FqR-fUtw3B+YYGF@3lBgDXoOF*S$cU>&4TRqaGN>uZT4 z`s)5J@`c5Pih9jOw)$-P8YV-UDaH?4IWt)|6Sl8BI0V6U93||zAAN7H@dm^zbEw?o zxno_O3{I!kjjs`3^<>657m|#j7i5n9fB}7R(qaB;%LACy;2*qG@oBF7b>90IFKtH7 zW%O!+n}hD!;JzC|SkMw&%`SCkQwi5oWr%QhbpY3y>7v>8Hoh;|Zz%70csAW>=&6nM z(W=-@5P&jV`P`vVV9+heco*&XgQ*q-4te)#Fod|i=lroqC*$no=K`vCLuGHRfr003 z%w9YXNdOrIND1mK%NV?+!u}O3{#|bFSv5{})eaXJr*nyQJrfwmR&@frVe@yVPg*(s zrz=lAeEw3x$vJ9EEE1_p=`BFq1JLhNIYAM7I~}U;EmBf z?t0R6<@7HtnII6%gsg(cpITAO{xOp39kt5b$B~Y&j7?;)Fq+1qnsRFpt9EHzY}}4p z^|9y+`|`GH)cEZt5T=u(cMOD|9iH~Qwy(2u^6j91i8=vDAn~48GsSYiakLATRKmuw z4upp|SRcCPeT2G)!_|eA1T9iD7wUk_C5+3C1){+G>R!;(^gz9n=s7oV3F`*s7@oG- z{8w0ua8Ce{hNIX834?c0^3ye2Mo2; zN!bh(nk2~gs(7Jj#@xsMD7D_1zLnMK&>Mto-2ij_P~4iv&d~IM%e^KV9w8u^>Cu&^ z2>#oAcHaE(1&KBrkLwGI@eX{X#Ml?Y2|Zezsvvc>lu?XZSWaU68;p7BN9BiF`;JfD zIxx0@>#v`LyD|vp1c9jIj%m5weE>P^F6=#jI(mK0eaegA=>N_OOYzu0dLw6bexPOb zHR&$xc((_IrpQlWMXo?Ot-S7Y<5*E*nA*3K%o<`WmrZh;W1&d9B=%(UIKC2TJ1F!@rq)Fg*{dzQO2TNkaYXV)#zh$p-$nG2Vw{9hhI*u z@+9!)ss@NMI~J6?Ca^2MpFP%2?XNn1lJgg|S}DWtYVgn1H2d+&3g%I8_e-C>*Dg_& z_HbDvSq=mGqf*JW-(X174Y=~a>VQpW@Tu>b%ruMWn7GHskD0R#$KbHuksk|kb(Fg= zocJdb=vb6lW)8DXdL4jjrWM6<2MkWlm)VOqk8(4%cWl_Bj}Q2NYS*PE0-$a}q@j=C z8;ylJD#W>W089I%{9^Ziox4kMPgvL%ekaY`&@Z$Hr)#6+2)Gq{*=jyu#RJQHIBGZi z3zA0|Ae{jn#IoHfa;7F9Ak(q|7Hoqrqd(?cAR51HZ@_cJpYlX9PXxQTs4J6F(}2Pd zW4422&e2C9zzE#9w>L1Pw&pS<{qqsJy0SUuw}Zb6VYTIA!1FOfW#tQf+T7E&%-Lb5 zAYKGtnb8;8?gXa?Q2@^(;d5{lF1IDn7k&Qiz$;Bk_0!+tYL*On;0EqM%^iksUkADs z81%70q-K6jCdVO^Y)C7sunDcH`x|I7T`Gv?z8!lxNDUYi!&f_bB2+KD8L$97@aoAW zFcs3l>T&zHNzXazM&JjAhk?wZh#WSYa9?>AZPDu`ca~!5Nmu;t5Fgaa1eha6vrZqG z($3TCW)H+37E>V7Vl#oj>cL8eUZHY|$sW-5QR6TE-tl;rb_f8FtB~Ch8$Ni3@ExD@< zP(i9(*P3S9s=mdKf84%$-AvI;tgY(Lyw8e?dB zjkeV6ex^$s!5c3>hZ3_w*$Q5E&&@b#JBXPne|#6xEZI()lGa5!UX$Rg%xm%iEJHRTy$$#bMB4TumgrL$2 zAjr;WcI-~7E3VUfFW@78G{rMrp&Y@i2;moJd2!mS(xyesP2C-PcgPe+N;7!J9Q5M+ zV1hqQ2YGyx-0sJJ2KR$p!UQyTN862s|9N|EMAS0ZMe8`Tc%Q+l;{s;m^dXk?@y+qB z9sa#r0Y}d_M3XUDvQfOBMAle-cGzwKMfFFUG{Rr$0PReX7o23LyOSPS{he0%2~AgE z$=8f^(Elu&ZqunWz~d%)?{Tiwf@kKN4V&s}04z)N+xwT|nFButKd&C;zPwu%*K}Gk z_o*tb1hWu}EzMhqeW?L&#;}Y2a|n@d{(AX|s zl>;CulmjCCrIRdDP_wO53#RXyuc!;@rw9ZCKm~eIb}L-2BjuY&)a`$`T8w@ryg{{J zD9YE$YpDZsr+h%zubK+~Xn?o1XPxKGE494~`)Pmjh9%^dQXWhFe(9@C`^Fq15FWqq z++XhG-Mv2I1TO;)ovtbk!P+m9Qun#<``R1(_V$AiOeTm8?sX&iHT;U`yo}~?-z+*EVzr8ab1D0>=XJ>Ck+vNrU z-p0E8oz?zJ&W@T(dJ>Sv{>=1=@qmv9EXn-<_2$g5;4)6;gdR6~tbqPkXIX6^P?+`c z(!viyLsMXOdO{1`PX-w`FeYlfR=Ov~@8}Qx@Od~KCqDuGqWdd`NT;d;} z^Pta%f;3VHneEM4>mBe7bb(gqoOL2a-8W)&NplG69Y({RN+i}S?euvlXf}W7!pjr$ zQ)Wc_0_L8|LOs*HezSmExG4v&m0DKcFt(2@sRIoy{Bc*lfJfpj{_A%Nv{c>O4-bLv zrw?TVqBm`M5iF>0=#3n~NT{apX94uRGz&S+F!dQ!wnz9q&s2X%`Y)FiTO$^cUmt|q z?sCUQbiE@dms?_y>)NsdMpZ_9M@eOG-6+U&P6xszzs5JTQMcgv40gm{T#n{h&H$(n z|8W$-WMM-(GL|RPQ%M4JeKT?pwvTNx4hYPFOXfOQN2JZ><~h9tIoZ>d)f$m z%*6cuYWF%D$Xar5tn6FjLJ+yY!Clu2&?iTfOOaT`&LX;b`VfA^e4^y1lKK5G+)r)p zR$uz3R*G-b5+htPKqjgrr_!h>*XFWO=&_ll=aJ$0OYNT^R$TkIdznAHEX%2#1^qL+ zC~Il^BTf}9i}s!hI14KKV>Z@AMB(RO7HM>@0eL-l{0Gq`>2pYSZ4Mw@M>ckA3V^RT zN7FeIb)X~Hb3m1s1(TPrtnWO%L8r)tdUb*No7fLwONx?#rFZ16)t3(zh8K7$MaoR^ z?e;N=fQgZ`+@t>zR6;)@Ir-3ivx63nh)w*W-9Fv6=eVBM}nUz@3Cb0G`sBC(2BBjG}DTW=jj?zC0y49g4Prx7uS!CMT- zs2x)LBu?)w@_ricGxA|Zx8Z0vFO|`J^kBz;?-|W7lTpEM(#M0W$fp)8-TY#OXdkj= zjb%AlG@WeTkBNXYhi^8TjXuChyf+k*@vGqn?-)4Ax%eYq@z6?587lk+@U`&C3gA|* z!A+b6+U!IJx4=egHPYv0u=KJZO7-yMHrDdgH}RwTlY)iVy)QbyT$-?zRg~#lM}^BW zZbxQZ|E@br9YB`ApOAoznCcg66!%S*7L_qB3!_P7JWR%}v5s+HKyq#f{3iUFGq+kl zcLpw+2@Qi8eAb5Wx=%P^g}Y*wqLZJ6^JRN-=s#_J%A%F!JtVnY${<-4vfgxtH@ zhp~>AKWP3+vK2-|QCNegEBb~(p>5{LX|bbyf#%OYLL_GC;~=s0L%(_G)>@gl0_6$_ zquHqd*B{w<_W7i~&&me=?``Hu`*gJEb(QcgMzRvf>?rK*zA})b!buDwE{lfy16Jld zP>0gI!EPVM#l{&B))~8{e!b=XW^0w$@>zE08=xkp4&mjuy;O|9R|a|M(bd!1!%tjRM_51`yvqFZPgcZ2w&i z!mOHURv-^1tJc7`OOdWY3-%j;fgS3vu=|ZUYPkb?vHJAIGzi^4eU}uiqal4llw1&t z1%T_Kt-=8$D320TwO7OMmUI9aT-5nydr-H8+XtG^LqM^~9D&;+vmn2h-(LN653x#M zsNm@?*w`gyfD6Y*L18wS;hT#4_mE`=|E;vuPker87FSs3gD^|djRke7v{w={$rjPZH^_wh62QA<;XW}~nX`sw4ec*?YrUu; zsw}ul`I>>d-f%>fPhP_zuX|VZ*>B!6wmBf`aFDV;@J%pyOu2Iz`y_lizkAl_iK(BP z1I$p!tqts{Y^S|Pz`*?;3|-D4h)mcYVr=O@OeXY=v+9Aya7vS*wtpHLycLmn(=Og= zW5D1jXKVw)yBHAq9cW_4JJ5*(rW5teMhg!~$S)|xH5Bxk5DgxHu=PRhL`T??nVS-` z|6exh{{@^?M>W8-aL1pH8q{T$_HS+@#^u$Bh+%8(Jb<9>8u86i7^yx-ewV4)<5sUi z^`BnsZdnD(y)9ngimS5=Tz6k~o}4ZBHE8!O44xdUbeul+nCy~AdK-uT!`*;ARK3(s zO31)CZYaMX&N=Dh9m_vPcLQI|8g(C33Ob~kJRf?ca6s(z4(S^?C5BV;%hZ9ROzEkR z5_|jSd;V#L1fqGw4j?;}<1G=>#_W40vMd$9OG(ma3 z)N&MF?ZLHjXUMdQ9Wfl7VU|@^nl|L|XG(cEAx##i|KzM9+VbfFWE&J&ApPDWK-WO2 z68qI|!G$1aB{^Y16Fh2VI7o&3@Y&1k&EN`0qH3RLeys#5Rh}aNTSB_Vh_v%6F~!=C zxCh*M%*?jXZV964MpsIkGfy_61E}6m+xvsW8PwF}F`{4{y6ZCANr2Khf*Ji8N5Juh zBk2jTjNWH&(nDFNiTLwo1I1O)t>FEz+B+@}7RRwp?tA$DG-h-O@&~MU7;8nJ-(MHN zu>aZvcQ!o-{2Y0`^Pn^6#+hXaCd{K;)26OVbSw#1^2ho>T*;YMA%!tKB!Sk|3&xi@2@T$oEu$ z+r6AG(W&=8bs~TsZEcS49y!Bqc$ffntJmx#RWL*?RC%no4x@ zR|d~8?C8G$PDRQc8@<#B#(X!sx8tY4V;6Fm1`h>7p{gBZ`KjHH6(aD)3Yj9Z>D5zw zz~hDwIkW;?5p4hgpLN#2{wHrPPPgXI+#QHMWrgqTWm8+QjO?3Fc6EPCCw_<~8Uv1QdJOhaYsJ7id7W2<1q&v0Iyh-UhGg?bqyws2Ykr)_ zac%B^&6k?E=(ae9ZO?Wzk=g6_eQaPK zKKQeljbPWu;j=pM{I66LZ>u5kXd<%QKq=BdcZ%`V)h@g!kDS>1EhB&d3p6V_;-58I z5=$9{!9v|8K|Kg-uMk*|4>O3SS_bG_msSy=-wwS;*}`M5`z2@gM%L5>xQjmjvOd2B zf)4LYRDFk2%M&D_p?<%`vO1eK6H0?K^NG)5D}kOG0iX?iq9Ukjif_m&Bg0H)sZ%rh z$pgbjE?(>Zc8AF-a#*-*rXXn?I)QG(|ga&cYqRL4Dcl zKKdKD)w4jj4#U%Q1H+*bJ1RWLqAvVfKe%qXU$TF}d)Xt8ZzKPn)A2r zs#d9nVvs_!B_qS|t@O%8x>oV)!)UkRJS`mFzE)$$gN0j4WhS^Cu^Aer;JVvsYAV?X z9%cViKfuXV0(p(BZ~Ly;otTC^eY!7_+3AG79Th2uD`jZzE9VowM0;%n^md}cwVGuB zupG5v{8xp-S`feskaA0vXuXN(UJM!K9+_%-v1ju39_KhP5^C&W(&)XMzMD+? zX-_)6{#Y@>xo6Kt>-t^>Wa%i$Cn6t8)DBtQXF+S!_VOutO@a=rR&k@as7rHqcE>?N z$l!B(7IUJrA<13BR+R^6!FGgNi~@0}8@D~H7jq**?@1z|*1~9|2Qc_v<~~11%`GWHFKINP+s=^<#9n*0k!BP8PC*)dO+eX0jJu~0 zj-SkfYYmN3La4zGRo^chr+P1{;epScIGzb#{CM*_pskb9jPC5Q1U6rjnu)LQ34R=} zqRtt?zV zh+>@n8I73t?TOl~jkYu9EYM}foR%Es9zWL42YttS%k}({r+!4w|z? z&`0K=l(^`A?23kmzS1lpK^#${`m@^(UVDpKG>hPZW6$|!W|>6NQ}Byvw_*2~74N6; zexnHgVvp;5O9mgNkFjw*&uwGDfiu*&NCny3m&`id-r7GQ!ozt%OlQ%N-@K5p{UiiN z2(A}2EfyFkdjHV&k@gnPNjj5$q3HWuiX$W-Dyayzj#IgKMOn6@_LlzDA@@B`FWt-}Ij$)nr#C2lpw!CEsC+_q&4PSi7SIWF$IyGuioi;!ilonaD{7N~0_dsK6gLPN` zM;f%W*4pwr%Z}%SkgK=Fyb*hKM*D#$+tnN+y)Z`h=jBDBxrryw!l0@fR&W7Tp;VAt@v@KCKgro(XA(2r&D~cR#=@soM|tWf zpq#S&sm?h`H6}XBw!Dc;jtn^`{`9{WjJb6RFWoH33aAYY z4=;%|^!WMN@@Fl(+d|dkmcp>byk#m!laBmVwbEGWzPw@ECGJO?BSLve&@#bIuD=%( zu|D%c8Dbq8r`EecPHtTYusS23t7l24{({F|HWZAi%~@zqPD`nJ6P9Kn_-yV%K=@@B z4D6RRRGWbH(Nt5R{av+@uZefVb*C)JY%%p^m}N{H=dV~DJ+;xZbSikDAgPg;k~T`L z{n}9zv4A&oG0dbL(6Y6+E<^VBln>~yqURMT^y z`))CaG;quT5}lIdy}{4KY2WroE>*v0Y}C~C{&ot+O!oV8PU-IjwJ&rPieN_2Q8v$! zs0hT{c86ta2x4CV5e%n-yiRteg?``kS$@7NqA!QjWh@{mQu5PsO!|<_^7)7K8*M`&xZK_^8Z$}|VV(gvq-H(1r7L9{F$o@#@mhzTzjT24X zB);ttPR&?VWllwsbst!bFf3(B7HPOpA1{N`^u{e!q2KT;Ko?^@*n-Fy_s>QideD&L zwQ(sosipE4GJ2`_!|1ok?v7yRnTG9+TJ?0=*PN$ru6b&+>GNF^|6OUf8M7wL&VzU# zD>G=$57bI@f!omiE9Y(*FG)DPYImcG%w6T)Wv5Pyr|jb9#Y26sKo`ECeZMcstjw1_ z-!fD^t*g3(T>^L^#9DO5^W`4w%N;pVgTKoqS0iGkf3US|sNcIo9q#7*ie;fD%a=zN zW;ar%dySVhUIS8r=VC_ZS+YM4k+m7*C3M5In#X%Z_2*d#y+n_Ay3e9jdxzR`x2V>h zLH&YY^cKZ5I#aQJPx@dkTN}Ua{_wHBR`+eUO9UlcjC!dh%PTcw4M)_gc{VH+Pr7Ac zm{gLZc8)e_))oul`tqY?)m|;Pj0eAV9v}W{Ec{qv@BHVR8|(R7)?7Jk@0(p;aIbYk z8^ivtoH*&7bbr1$e1UK5qSS6}*1dFz1XvDxUS-CXmCOSLu?EKmu}ab%sRgM!N9nID z0WI+$r%hsxe<2VyZOA@g_pkt6<&OXtx{@lCr$z=9$adete=Is5_p{fn-lZd$l)`xK8e8reYcIj%S zek`5cJ+Q`cq>+^sgu8DOtpSt_X6jFE{NjCZkRS{nM9^^#{C=0F&Iih$`Gro8M2Pft3 zp8X6IvSIKH%t!&M>9$-tdc+^{>6fdk9Va5aA)k$Dp%18wSp%a~3~v)C123)0^cK(G zT6l}Vv4p@f$(L_`+%*n|TXvm$b7!c#jv`yXsgnRyUE;DbC~}ZMfQPy?>8NUN9r>z~ zZbmG`_PIuNuy$-JbMuWWV%bQ%wF>-JKiwvnIj(M4WEEI=6;x6Rl?3tXyP9zYB$vd$ z%27;f?tHR|I*XGed)_&GWA!rRc`f;Mp%0fwRNY$c?DDPT<1Z0>Fpmq+8nV%Jg|{c6 z4=RnKF2Jwq4OuklTT|-NW!rd>iGP`zJ%~QoO#WDJk4WRad$58NHPR3*UIwP6o^QxU zD}(tqTwUx()yvOB0$#BU^#3?WBG}<_xZUdt>#OtRxxU`NnB9>3r@(&pFtXignW99k z^J3Sf^Kox0w56Bw{*u43!F7MKgX#yMQ4B`EAqlT9U_})pT_xT+%f%x-Exfb}o|$^Hw5-& ziD!CoRD14Pq}05F34kGTHj-GSAxD6CfWqk(hrX0Qx($E#+GF+&9KQB2T4g zSeDcdHw`7ZKS-IR9Ez1TcrDATG{=H?e~ea)J4^`W!Px%x3;a`5@D7}NSg#E{rh;?HiOzV5oR_+iN+zv$+@90$SG%)vxst-W(-DT*R+W_l*1;& zOk#{{krcz;P<+p-0Q)5vL0OP^;*|j>wA4Z zpYQuxzw=v^v%;K_ScuZE#WiMW3S<~mAd=e{H`zlPM-nI>D|O_YlZb}Rx(PHCF-hFMNP89vHlJ9 zo|YLo3x;()S$8hljXiK5$3;OXN5umC>pdiGUFr!7JlU1RmYP%fm-O9gon+_>{K{JW%m>Or&7yULz-x7?9jHIcus@xA>(>e1 z;3qSqpJM?aVpL0?n*QmMMIdy#sGOR?{AL!;K1tIMesVhdi4pC?mkp;kVmM$hD0CIN z8lG}R`Kd9mTX7i?;{9@KiI}i3FSmB8qyVE}QGli#dYvD8zIq;JUSBtfo`x-Ft>ahC zs^^1NgOFeP%xKs%meY?dhesssCd}OA-%XU}uH=Wj843<=A3c0WxqQsw0}iM*1Mosd zu@7zg?8UaRYE78(sli-~^~JGA5Tjn6%Ta2=LIhA$Ryha*cA1z>f`(o|30Yth7ysdk zy#@XyOoax2hLPwN3dTe`5=zAV1P11SiPGR7h@gtzYe+kHvJI0Aq#wLAkJ>XZdm`4j z8S*im#6M1pP&aIawq_%$h(@;XB(=Tr4B zbV9>62!S^05fwfnMUlQ26bUteopvYCKLw5qR&Lo5q)kdmmrln`)-=RLsxn~k*6Vyf zU<;$7?uTCSmWC&wT?d&cejA>VVZEp9R-`QvXwOGP3^qFvPS(1;C#oLlJa#VOAgaXR zf#=zV9F!k4sTcL*;a|=%tjZiyElB{Nuyu+6T9H;$f1Ln*NSr5ER%d61-J3Ou@%l;G zC$cg$U{-qGiwP=AVS#g^)UGNs^*sBC2 z2Hn9pln3;(AR;e9U+ugG$)IF3{b-P4)T^zsX!O7_tv?uQL%mITy`q0 zbbwJT_w(_Zy7OJ4zB(u3puzjfGK%zW3Dn^Vsz0E2UsUxD&~B<3y4=Tn!$AVQ95Sc$ zHPT}Gk+X^7+?q2H%@V4+{1lqweoQ6g7iulo`ZSReR=oj{oDH{by6*lm>Zz>DXKXcv zVD7?uQ}AfQaa>2czQi>cp|X3-@7sPs=2(!B_(S^|y_2QxRwSNS^R>K=Nda2(MZLWt zKJatSbh`(>AbRl4YpZQqg3c=!biM~m-B+D%1or9R1}`*lcx_9*+$^VE#^JORhO z{9(JXcj6~M-@qSj#R-@P)X+C(CW9eag(wGm_n8izsrX*)nq}ZK&q$DK`i)o8^|SGA zaNrs-F*XvkfB$gleG1Eoehk%+3nTmAG1`07q}w?)C$5&!bx1;MmiViC;NKcr^|7?c zcHkPhdvfqOOP;>To};PKCTqE6wEtv8ko*>JOZcHC1{H0~V$V`rGA~S+#U?k0SpGL6 z0!`@K`}5i>GWZ`v1UI<9-#r@rL4r_n*u--t;%3#pmcn=I&cbfFJ6~ZRSrxkENmEhr zzT`UNlif*FWUMh>UUnN}6z~MeoGgpx4mDO5M+WQX+@x<>j%nu8H14AE-FI!|Tf0XO z&-sNSq`G|QmwnzoP5(WP3-MJt687 zWw3;Xd8yFMYu~$7(u37s2gU0IPuUHDN~cnNZ(5rHW%{D&IV#tR)c7vt5Bm9}x8CE3 zNCtuP(xfAZ+1a;mP9NG52Z%iA4L+wvRmF@MwmIS}6afy8<^aAulr|*Qs~BErZMgT9 zztQm%X-^2Erw-ia0P!QH35uHC3E=jN7R?mm7$BuAJh;Wd)1mlhhJNyFsg-NUxbLwe zIPK2*R^5K08f)Cd?(weSe{3MfmIbe=KM(URI}L)bL!=!NEt!>_k?paVn3v{jMVr63 ze!A@^kAEsC2lC^kE1%&y8LY(lJT0Ajn(CU`BNUOF zVFeeTuv$q29v@VOl5YIA&oj&;?fAHFRI0o0XAy{m@dxWLIyg0LoGOc7=7)DwXkS3S z^BlHXh_K8tP*h8GTgJfj!U$jyjRyH{V_avjA{yr877udU9G#jLx3@4hbBUXqNBnlkCjF+&*LaAFy`+5A zxuacRF@2x`2h*Hg)|C(AiBEiQm))SGgJYFiq=L0HN8N1P(q>ph2}$S+Dx(nA{xvdU z_}Ck_Fw-swQ@uv|xmU=%me`rv+_zoguEN68JE5CZ@2MYm6Y}Ov9$J03NaZS)U+;Es z5j%nKG48n*LbXIqbM>ErjNg_ObI&~88|TdlicP6XjLa+H>f9DN?N670>*nqI=D%%b?HT@2?&JkAU*0rfRjsn190A-mYYLigI{hY44s|@7K_>)ysAD4 zF|zJ(+Atw1)n*p7_v|8DgRQ!vNJcx4^nmtJuu!fPX=M)kiduczDm)Ln#}n*f#mf$( z;YOuSj4$Xvqq%#gn0!{FR@>`rMo^l(KWEyGf{;Uk%TK{f)#orbq z)BKECa<)9;S&r}KmB1MLDKpcat?;YMp8J{zSRJ-Lo=w^tt-a3lM0kiS-&^*|zX3lX zemb-Zb;1rG-g&^kbVzcYoKkWvtm*o#M{W~9a5D!4ze0Ngn4wJ_2B)WRm)pk5#U(U- zy;q_~jz7N zZf~8J%30BvQ{l-V=QeDRJshcL9;@r6b#-+XX+|!({M^gv-a~9P0I!4x%++PU$zi(y zrIiWp7tUO`3VP$qCSn(Aze0F;*<#ADR4@EGp!ruVRoTC|TsO81XBQWk>WXkm^T@ax z;a&k2qkj}^=~gg~{^b)cA-fvhI-teKok6m}dMKp|Wj!^XOABK;=$vsCVTh8k2Yi@ ze6M7C)KP5uCmhlPyQsz-;p0nz8{mB}87K4{aSR}$E}?J+mJq$Q(?6k^$uiBZo6ynyJm2h zy%gmtC2f9p5)#^WH}vjVZ^eKC(0kK\n", + "Run this cell before any of the others as it imports packages and sets variables that will be used throughout the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\n", + "Username: fsduser\n", + "Password: Mercury7\n", + "ESM Deployment Cluster Name: test\n" + ] + } + ], + "source": [ + "import requests\n", + "import xml.etree.ElementTree as ET\n", + "import os\n", + "import json\n", + "import time\n", + "import sys\n", + "from urllib3.exceptions import InsecureRequestWarning\n", + "\n", + "\n", + "def bootstrap_server_and_credentials():\n", + " global server, username, password, chosen_deployment_name\n", + " server = \"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\"\n", + " username = \"fsduser\"\n", + " password = \"Mercury7\"\n", + " chosen_deployment_name = \"test\"\n", + " if len(sys.argv) > 3:\n", + " server = sys.argv[1]\n", + " username = sys.argv[2]\n", + " password = sys.argv[3]\n", + "\n", + " print('Server: ' + server)\n", + " print('Username: ' + username)\n", + " print('Password: ' + password, flush=True)\n", + " print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\n", + "\n", + "# Suppress ssl warnings caused by verify=False\n", + "requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\n", + "bootstrap_server_and_credentials()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get Access token " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "eyJqa3UiOiJodHRwczovL2xvY2FsaG9zdC9TQVNMb2dvbi90b2tlbl9rZXlzIiwia2lkIjoibGVnYWN5LXRva2VuLWtleSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1NDk3NWNmMi0wZDhiLTQ1ZmMtOWZhYy0wOTlhYjZjNmQ1MDciLCJ1c2VyX25hbWUiOiJmc2R1c2VyIiwib3JpZ2luIjoibGRhcCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvU0FTTG9nb24vb2F1dGgvdG9rZW4iLCJhdXRob3JpdGllcyI6WyJWaXlhU0FTQWRtaW5zIiwic3Zpdm11c2VycyIsInN2aWRldm9wcyIsImludGNhY29kZXNpZ25pbmciLCJ1bml4X3ImZCIsIlVTU0FTIiwicmNpLWNpcnJ1cy1kZXYiLCJpbnRjYXdlYmNlcnRyZXEiLCJvcGVuc3RhY2t1c2VycyIsInJjaS1jbHVzdGVyZGV2bW9kZSIsImludGNhdXNlcnMiXSwiY2xpZW50X2lkIjoic2FzLmVjIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJ6aWQiOiJ1YWEiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiNTQ5NzVjZjItMGQ4Yi00NWZjLTlmYWMtMDk5YWI2YzZkNTA3IiwiYXpwIjoic2FzLmVjIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiXSwiYXV0aF90aW1lIjoxNzE1MzQ5MTY4LCJleHAiOjE3MTUzNTI3NjgsImlhdCI6MTcxNTM0OTE2OCwianRpIjoiZWIwZGZhYzMxODA3NDFjMmFhZjRiYzM4ODc3NmQ4MjQiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJyZXZfc2lnIjoiNWQwNjgwZWEiLCJjbGllbnRfYXV0aF9tZXRob2QiOiJub25lIiwiY2lkIjoic2FzLmVjIn0.RbPBDUuFrLRkFAu9Da4UsvKzIQr2jJ7Clp-gqJn1X_P6t3Pm4YYI-ODEqJ5vKVmupvfPxaqY1pYrMBEh9eDB1jiov7tov0ZM_NK3cH9tNMiwlTkvcOv21YWvu3q2O_Bf9UrT7qeZ967hiEMYL99NlLfY77cnEeW-oCfTfbA2wwDHMoRblt06-FAzB_56QOc3_hwLc7knDIxKT9ItjLUSCFTuIpOzvhMtG2FPFjmmUH-xt0qC4g2Ix_JoQjcgSHIhfb1tqvj2iEiQqldiwccDKemWZJWKNYsec7NvylHYdEVUxkP-9_UAxyANeMuoBDLHVaxObnoggDmx-3qA246I3g\n" + ] + } + ], + "source": [ + "def get_access_token():\n", + " body = {'grant_type': 'password', 'username': username, 'password': password}\n", + " headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\n", + " access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\n", + " verify=False)\n", + " return access_token_response.json()[\"access_token\"]\n", + "\n", + "access_token = get_access_token()\n", + "print(access_token)\n", + "headers = {\"Content-Type\": \"application/json\", \"Authorization\": \"Bearer \" + access_token}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to get ESP Projects" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def get_projects():\n", + " projects = []\n", + " get_projects_response = requests.get(\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", + " if get_projects_response.status_code == 200:\n", + " projects = get_projects_response.json()[\"items\"]\n", + " return projects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to import project to ESP Studio" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def import_project_to_studio(project_body):\n", + " project_id = \"\"\n", + " import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\n", + " data=json.dumps(project_body), headers=headers, verify=False)\n", + " if import_project_response.status_code == 200:\n", + " project_id = import_project_response.json()[\"flowId\"]\n", + " print('success, project_id=' + project_id)\n", + " return project_id" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to get next version number of a project" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_next_project_version(project_id):\n", + " version = 2\n", + " get_next_version_response = requests.get(\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", + " headers=headers, verify=False)\n", + " if get_next_version_response.status_code == 200:\n", + " version = get_next_version_response.json()[\"major\"]\n", + " else:\n", + " print('Failed to get next version')\n", + " print(get_next_version_response)\n", + " return version" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to make project public - by default it is private and hidden from other users" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def make_project_public(project_id):\n", + " requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\n", + " + project_id + '/authorization?private=false',\n", + " headers={'Authorization': 'Bearer ' + access_token}, verify=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to create expected project model to be published" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def create_publish_project_body(project_body, version):\n", + " project_body[\"name\"] = project_body[\"friendlyName\"]\n", + " project_body[\"description\"] = \"\"\n", + " project_body[\"friendlyName\"] = None\n", + " project_body[\"majorVersion\"] = str(version)\n", + " project_body[\"minorVersion\"] = \"0\"\n", + " project_body[\"version\"] = str(version) + '.0'\n", + " project_body[\"versionNotes\"] = \"notes\"\n", + " project_body[\"uploadedBy\"] = username\n", + " project_body[\"modifiedBy\"] = username\n", + " epoch_time = int(time.time())\n", + " project_body[\"uploaded\"] = epoch_time\n", + " project_body[\"modified\"] = epoch_time + 10\n", + " project_body[\"isDeployable\"] = False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to publish project" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def publish_project(project_id, project_body, version):\n", + " folder_id = \"\"\n", + " create_publish_project_body(project_body, version)\n", + " publish_project_response = requests.post(\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", + " data=json.dumps(project_body), headers=headers, verify=False)\n", + "\n", + " if publish_project_response.status_code == 200:\n", + " folder_id = publish_project_response.json()[\"folderId\"]\n", + " else:\n", + " print('PUBLISH FAILED')\n", + " print(publish_project_response)\n", + " print('Version:' + str(version))\n", + " return folder_id" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to synchronize projects from Studio to ESM" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def synchronize_project_for_ESM(folder_id):\n", + " success = False\n", + " synchronize_project_response = requests.post(\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", + " data=folder_id, headers=headers, verify=False)\n", + "\n", + " if synchronize_project_response.status_code == 200:\n", + " success = True\n", + " return success" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to get deployment details needed to start K8s cluster on ESM" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def get_deployment_details():\n", + " success = True\n", + " deployment_id = ''\n", + " deployment_name = ''\n", + " projects_running_on_deployment = []\n", + " deployments_response = requests.get(\"http://\" + server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", + " headers=headers, verify=False)\n", + "\n", + " if deployments_response.status_code != 200:\n", + " print(\"Could not find any deployments\", deployments_response.text)\n", + " success = False\n", + "\n", + " # Here we try to start clusters against the hard-coded deployment name\n", + " # if it does not exist, it will spin off cluster against 1st cluster\n", + " deployment_items = deployments_response.json()[\"items\"]\n", + " if len(deployment_items) > 0:\n", + " deployment_id = deployment_items[0][\"uuid\"]\n", + " deployment_name = deployment_items[0][\"label\"]\n", + " projects_running_on_deployment = get_project_names_from_deployment(deployment_items[0])\n", + " \n", + " for deployment in deployment_items:\n", + " if deployment[\"type\"] == \"cluster\" and deployment[\"label\"] == chosen_deployment_name:\n", + " deployment_id = deployment[\"uuid\"]\n", + " deployment_name = deployment[\"label\"]\n", + " projects_running_on_deployment = get_project_names_from_deployment(deployment)\n", + " else:\n", + " print(\"Could not find any deployments\", deployments_response.text)\n", + " success = False\n", + "\n", + " return success, deployment_id, deployment_name, projects_running_on_deployment\n", + "\n", + "def get_project_names_from_deployment(deployment):\n", + " project_names = []\n", + " for server in deployment[\"servers\"]:\n", + " project_names = project_names + list(map(lambda project: project[\"name\"], server[\"projects\"]))\n", + " return project_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Function to start K8s cluster on ESM" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def start_k8s_cluster(k8s_project_body):\n", + " success, deployment_id, deployment_name, projects_running_on_deployment = get_deployment_details()\n", + "\n", + " if k8s_project_body[\"name\"] in projects_running_on_deployment:\n", + " print(\"Project \" + k8s_project_body[\"name\"] + \" is already running on deployment \" + deployment_name +\".\")\n", + " elif success:\n", + " # Here are the deployment settings hard-coded for all projects\n", + " k8s_deployment_settings = {\n", + " \"persistentVolumeClaim\": \"sas-event-stream-processing-studio-app\",\n", + " \"requestsMemory\": \"1Gi\",\n", + " \"requestsCpu\": 1,\n", + " \"requestsGpu\": \"0\",\n", + " \"limitsMemory\": \"1Gi\",\n", + " \"limitsCpu\": 1,\n", + " \"limitsGpu\": \"0\",\n", + " \"minReplicas\": 1,\n", + " \"maxReplicas\": 1,\n", + " \"useLoadBalancer\": False,\n", + " \"loadBalancingPolicy\": \"none\",\n", + " \"averageUtilization\": \"50\",\n", + " \"loadBalancerTargetsList\": []\n", + " }\n", + " k8s_cluster_body = {\n", + " \"distinguisher\": deployment_name,\n", + " \"esmDeploymentId\": deployment_id,\n", + " \"gpuReliant\": False,\n", + " \"loadOnly\": False,\n", + " \"project\": k8s_project_body,\n", + " \"settings\": k8s_deployment_settings\n", + " }\n", + "\n", + " response = requests.post(\"http://\" + server + \"/SASEventStreamManager/server/cluster\",\n", + " data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\n", + " if response.status_code != 200:\n", + " print(\"error creating cluster\", response.text)\n", + " else:\n", + " print(\"Project \" + k8s_project_body[\"name\"], \" successfully started K8s pod in deployment: \" + deployment_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create ESM Deployment for projects to run against" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def create_ESM_cluster_deployment():\n", + " deployment_alread_exists_error = 'A deployment named \"' + chosen_deployment_name + '\" already exists'\n", + " deployment_body = {\n", + " \"name\": chosen_deployment_name,\n", + " \"type\": \"cluster\"\n", + " }\n", + " response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\n", + " data=json.dumps(deployment_body), headers=headers, verify=False)\n", + " if deployment_alread_exists_error in response.text:\n", + " print (\"Deployment \" + chosen_deployment_name + \" already exists, we can proceed to start the projects\")\n", + " elif response.status_code != 201:\n", + " print(\"error creating ESM cluster deployment\", response.text)\n", + "\n", + "create_ESM_cluster_deployment()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Loop through all XML projects in xml_projects folder and do the following\n", + "1. Check if projects have already been imported\n", + "2. If yes, import it using next version number. Otherwise import it normally with version 1 \n", + "3. Make project public so all users can see it\n", + "4. Publish project\n", + "5. Synchronize projects from Studio to ESM\n", + "6. Create ESM Deployment Cluster on which to run the projects\n", + "7. Start projets on K8s cluster on ESM" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Importing lua_connector\n", + "success, project_id=3166f279-6073-4cf1-af93-e2d230335ff5\n", + "lua_connector.xml successfully published\n", + "Project lua_connector successfully started K8s pod in deployment: test\n", + "\n", + "Importing python_connector\n", + "success, project_id=b95dc84b-8c9e-4ade-b69a-42bcb5a9d40e\n", + "python_connector.xml successfully published\n", + "Project python_connector successfully started K8s pod in deployment: test\n" + ] + } + ], + "source": [ + "def import_and_publish_xml_files():\n", + " current_dir = os.getcwd() + \"/xml_projects\"\n", + " projects = get_projects()\n", + " for file_name in os.listdir(current_dir):\n", + " print()\n", + " if not file_name.endswith('.xml'): continue\n", + " version = 1\n", + " project_id = None\n", + " xml_file_path = os.path.join(current_dir, file_name)\n", + " project_name = get_project_name_from_xml(xml_file_path)\n", + " data = open(xml_file_path, \"r\").read()\n", + " project_body = {'friendlyName': project_name, 'xml': data}\n", + "\n", + " if projects:\n", + " project_that_matches_xml_name = None\n", + " for project in projects:\n", + " if project['friendlyName'] == project_name:\n", + " project_that_matches_xml_name = project\n", + " break\n", + "\n", + " if project_that_matches_xml_name:\n", + " print(project_name + ' is already imported')\n", + " project_id = project_that_matches_xml_name['flowId']\n", + " version = get_next_project_version(project_id)\n", + " print('Creating new project version: ' + str(version))\n", + "\n", + " if not bool(project_id):\n", + " print('Importing ' + project_name)\n", + " project_id = import_project_to_studio(project_body)\n", + " make_project_public(project_id)\n", + "\n", + " folder_id = publish_project(project_id, project_body, version)\n", + "\n", + " synchronize_project_for_ESM(folder_id)\n", + "\n", + " if project_id:\n", + " print(file_name + ' successfully published', flush=True)\n", + " else:\n", + " print(file_name + ' failed to publish', flush=True)\n", + "\n", + " k8s_project_body = {\"id\": project_id, \"name\": project_name, \"version\": version}\n", + " start_k8s_cluster(k8s_project_body)\n", + "\n", + "def get_project_name_from_xml(xml_file_path):\n", + " tree = ET.parse(xml_file_path)\n", + " root = tree.getroot()\n", + " project_name = root.attrib['name']\n", + " return project_name\n", + "\n", + "\n", + "\n", + "import_and_publish_xml_files()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb b/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb deleted file mode 100644 index 579ed78..0000000 --- a/IoT/python/import-and-publish-projects/import-publish-and-run-projects.ipynb +++ /dev/null @@ -1,580 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "{\n", - " \"cells\": [\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Import, publish and run projects in K8s clusters\\n\",\n", - " \"This notebook leverages the IOT ESP API to create and publish projects into ESP.\\n\",\n", - " \"\\n\",\n", - " \"Pre-requisite: This example will assume that at same level as this Jupyter Notebook there is an *xml_projects* folder with XML files representing proejcts the user wants to import and publish to ESP.\\n\",\n", - " \"\\n\",\n", - " \"In this notebook we will loop through all XML projects in xml_projects folder and do the following:\\n\",\n", - " \"1. Check if projects have already been imported\\n\",\n", - " \"2. If yes, import it using next version number. Otherwise import it normally with version 1 \\n\",\n", - " \"3. Make project public so all users can see it\\n\",\n", - " \"4. Publish project\\n\",\n", - " \"5. Synchronize projects from Studio to ESM\\n\",\n", - " \"6. Create ESM Deployment Cluster on which to run the projects\\n\",\n", - " \"7. Start projets on K8s cluster on ESM\\n\",\n", - " \"\\n\",\n", - " \" \\n\",\n", - " \"Note: Please make sure you run [Imports and Global Variables](#imports) before executing anything else in this notebook. Also ensure you are authenticated by running [Get Access Token](#authentication).\\n\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## Imports and Global Variables \\n\",\n", - " \"Run this cell before any of the others as it imports packages and sets variables that will be used throughout the notebook.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 55,\n", - " \"metadata\": {},\n", - " \"outputs\": [\n", - " {\n", - " \"name\": \"stdout\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\\n\",\n", - " \"Username: fsduser\\n\",\n", - " \"Password: Mercury7\\n\",\n", - " \"ESM Deployment Cluster Name: test\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"import requests\\n\",\n", - " \"import xml.etree.ElementTree as ET\\n\",\n", - " \"import os\\n\",\n", - " \"import json\\n\",\n", - " \"import time\\n\",\n", - " \"import sys\\n\",\n", - " \"from urllib3.exceptions import InsecureRequestWarning\\n\",\n", - " \"\\n\",\n", - " \"\\n\",\n", - " \"def bootstrap_server_and_credentials():\\n\",\n", - " \" global server, username, password, chosen_deployment_name\\n\",\n", - " \" server = \\\"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\\\"\\n\",\n", - " \" username = \\\"fsduser\\\"\\n\",\n", - " \" password = \\\"Mercury7\\\"\\n\",\n", - " \" chosen_deployment_name = \\\"test\\\"\\n\",\n", - " \" if len(sys.argv) > 3:\\n\",\n", - " \" server = sys.argv[1]\\n\",\n", - " \" username = sys.argv[2]\\n\",\n", - " \" password = sys.argv[3]\\n\",\n", - " \"\\n\",\n", - " \" print('Server: ' + server)\\n\",\n", - " \" print('Username: ' + username)\\n\",\n", - " \" print('Password: ' + password, flush=True)\\n\",\n", - " \" print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\\n\",\n", - " \"\\n\",\n", - " \"# Suppress ssl warnings caused by verify=False\\n\",\n", - " \"requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\\n\",\n", - " \"bootstrap_server_and_credentials()\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Get Access token \"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 56,\n", - " \"metadata\": {},\n", - " \"outputs\": [\n", - " {\n", - " \"name\": \"stdout\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"eyJhbGciOiJSUzI1NiIsImprdSI6Imh0dHBzOi8vbG9jYWxob3N0L1NBU0xvZ29uL3Rva2VuX2tleXMiLCJraWQiOiJsZWdhY3ktdG9rZW4ta2V5IiwidHlwIjoiSldUIn0.eyJqdGkiOiI5ZTNjMWRlMWFlNDI0ZTgxYTBiMGE0YjRhNjYyNDhmNyIsImF1dGhvcml0aWVzIjpbIlZpeWFTQVNBZG1pbnMiLCJzdmlkZXZvcHMiLCJzdml2bXVzZXJzIiwiaW50Y2Fjb2Rlc2lnbmluZyIsInVuaXhfciZkIiwiVVNTQVMiLCJyY2ktY2lycnVzLWRldiIsImludGNhd2ViY2VydHJlcSIsIm9wZW5zdGFja3VzZXJzIiwicmNpLWNsdXN0ZXJkZXZtb2RlIiwiaW50Y2F1c2VycyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJzdWIiOiJlYTY1MTZlMi0wMTJiLTQ0MTktOWJhMS1kMTY3MWZmNjc2ZDAiLCJzY29wZSI6WyJvcGVuaWQiLCJ1YWEudXNlciJdLCJjbGllbnRfaWQiOiJzYXMuZWMiLCJjaWQiOiJzYXMuZWMiLCJhenAiOiJzYXMuZWMiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiZWE2NTE2ZTItMDEyYi00NDE5LTliYTEtZDE2NzFmZjY3NmQwIiwib3JpZ2luIjoibGRhcCIsInVzZXJfbmFtZSI6ImZzZHVzZXIiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJhdXRoX3RpbWUiOjE3MTQwNTIwODAsInJldl9zaWciOiI5Njg4NWFlNiIsImlhdCI6MTcxNDA1MjA4MCwiZXhwIjoxNzE0MDU1NjgwLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0L1NBU0xvZ29uL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdfQ.QY5XfQBtzrN2Wg_sKv3w17qvZWmPz6otR4z89gSC8ZkRppMXdLqaMLwpKLlCsBAznGokrKtVklnMC24JS2ocm-001zWrgl3Crjz0Nm8OmkmQJfyeNBoQfqz_krx3qRNvgLF6ziIDv8zZvS3_1t__9fDKxfFUQ0MQQWP0zAqwteSrqcOp2STyvVNIGf0fPF7HAHgp4xrUmMZb0XyZ4sakPioOoaXTKgumMpPpefU_P6v81HWJCAL_L_0folsv-YById-9KZXF4VadtR2E8t6awdLQ9zpFrjecpuAevO6CcV-9efGvYcb0RLxevUmJ-iEnx84aPiZP06Oldq0lWdvrmw\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"def get_access_token():\\n\",\n", - " \" body = {'grant_type': 'password', 'username': username, 'password': password}\\n\",\n", - " \" headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\\n\",\n", - " \" access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\\n\",\n", - " \" verify=False)\\n\",\n", - " \" return access_token_response.json()[\\\"access_token\\\"]\\n\",\n", - " \"\\n\",\n", - " \"access_token = get_access_token()\\n\",\n", - " \"print(access_token)\\n\",\n", - " \"headers = {\\\"Content-Type\\\": \\\"application/json\\\", \\\"Authorization\\\": \\\"Bearer \\\" + access_token}\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to get ESP Projects\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 12,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def get_projects():\\n\",\n", - " \" projects = []\\n\",\n", - " \" get_projects_response = requests.get(\\n\",\n", - " \" 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\\n\",\n", - " \" if get_projects_response.status_code == 200:\\n\",\n", - " \" projects = get_projects_response.json()[\\\"items\\\"]\\n\",\n", - " \" return projects\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to import project to ESP Studio\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 13,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def import_project_to_studio(project_body):\\n\",\n", - " \" project_id = \\\"\\\"\\n\",\n", - " \" import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\\n\",\n", - " \" data=json.dumps(project_body), headers=headers, verify=False)\\n\",\n", - " \" if import_project_response.status_code == 200:\\n\",\n", - " \" project_id = import_project_response.json()[\\\"flowId\\\"]\\n\",\n", - " \" print('success, project_id=' + project_id)\\n\",\n", - " \" return project_id\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to get next version number of a project\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 14,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def get_next_project_version(project_id):\\n\",\n", - " \" version = 2\\n\",\n", - " \" get_next_version_response = requests.get(\\n\",\n", - " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\\n\",\n", - " \" headers=headers, verify=False)\\n\",\n", - " \" if get_next_version_response.status_code == 200:\\n\",\n", - " \" version = get_next_version_response.json()[\\\"major\\\"]\\n\",\n", - " \" else:\\n\",\n", - " \" print('Failed to get next version')\\n\",\n", - " \" print(get_next_version_response)\\n\",\n", - " \" return version\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to make project public - by default it is private and hidden from other users\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 15,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def make_project_public(project_id):\\n\",\n", - " \" requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\\n\",\n", - " \" + project_id + '/authorization?private=false',\\n\",\n", - " \" headers={'Authorization': 'Bearer ' + access_token}, verify=False)\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to create expected project model to be published\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 25,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def create_publish_project_body(project_body, version):\\n\",\n", - " \" project_body[\\\"name\\\"] = project_body[\\\"friendlyName\\\"]\\n\",\n", - " \" project_body[\\\"description\\\"] = \\\"\\\"\\n\",\n", - " \" project_body[\\\"friendlyName\\\"] = None\\n\",\n", - " \" project_body[\\\"majorVersion\\\"] = str(version)\\n\",\n", - " \" project_body[\\\"minorVersion\\\"] = \\\"0\\\"\\n\",\n", - " \" project_body[\\\"version\\\"] = str(version) + '.0'\\n\",\n", - " \" project_body[\\\"versionNotes\\\"] = \\\"notes\\\"\\n\",\n", - " \" project_body[\\\"uploadedBy\\\"] = username\\n\",\n", - " \" project_body[\\\"modifiedBy\\\"] = username\\n\",\n", - " \" epoch_time = int(time.time())\\n\",\n", - " \" project_body[\\\"uploaded\\\"] = epoch_time\\n\",\n", - " \" project_body[\\\"modified\\\"] = epoch_time + 10\\n\",\n", - " \" project_body[\\\"isDeployable\\\"] = False\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to publish project\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 26,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def publish_project(project_id, project_body, version):\\n\",\n", - " \" folder_id = \\\"\\\"\\n\",\n", - " \" create_publish_project_body(project_body, version)\\n\",\n", - " \" publish_project_response = requests.post(\\n\",\n", - " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\\n\",\n", - " \" data=json.dumps(project_body), headers=headers, verify=False)\\n\",\n", - " \"\\n\",\n", - " \" if publish_project_response.status_code == 200:\\n\",\n", - " \" folder_id = publish_project_response.json()[\\\"folderId\\\"]\\n\",\n", - " \" else:\\n\",\n", - " \" print('PUBLISH FAILED')\\n\",\n", - " \" print(publish_project_response)\\n\",\n", - " \" print('Version:' + str(version))\\n\",\n", - " \" return folder_id\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to synchronize projects from Studio to ESM\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 27,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def synchronize_project_for_ESM(folder_id):\\n\",\n", - " \" success = False\\n\",\n", - " \" synchronize_project_response = requests.post(\\n\",\n", - " \" 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\\n\",\n", - " \" data=folder_id, headers=headers, verify=False)\\n\",\n", - " \"\\n\",\n", - " \" if synchronize_project_response.status_code == 200:\\n\",\n", - " \" success = True\\n\",\n", - " \" return success\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to get deployment details needed to start K8s cluster on ESM\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 45,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def get_deployment_details():\\n\",\n", - " \" success = True\\n\",\n", - " \" deployment_id = ''\\n\",\n", - " \" deployment_name = ''\\n\",\n", - " \" projects_running_on_deployment = []\\n\",\n", - " \" deployments_response = requests.get(\\\"http://\\\" + server + \\\"/SASEventStreamManager/deployment?noDetails=false\\\",\\n\",\n", - " \" headers=headers, verify=False)\\n\",\n", - " \"\\n\",\n", - " \" if deployments_response.status_code != 200:\\n\",\n", - " \" print(\\\"Could not find any deployments\\\", deployments_response.text)\\n\",\n", - " \" success = False\\n\",\n", - " \"\\n\",\n", - " \" # Here we try to start clusters against the hard-coded deployment name\\n\",\n", - " \" # if it does not exist, it will spin off cluster against 1st cluster\\n\",\n", - " \" deployment_items = deployments_response.json()[\\\"items\\\"]\\n\",\n", - " \" if len(deployment_items) > 0:\\n\",\n", - " \" deployment_id = deployment_items[0][\\\"uuid\\\"]\\n\",\n", - " \" deployment_name = deployment_items[0][\\\"label\\\"]\\n\",\n", - " \" projects_running_on_deployment = get_project_names_from_deployment(deployment_items[0])\\n\",\n", - " \" \\n\",\n", - " \" for deployment in deployment_items:\\n\",\n", - " \" if deployment[\\\"type\\\"] == \\\"cluster\\\" and deployment[\\\"label\\\"] == chosen_deployment_name:\\n\",\n", - " \" deployment_id = deployment[\\\"uuid\\\"]\\n\",\n", - " \" deployment_name = deployment[\\\"label\\\"]\\n\",\n", - " \" projects_running_on_deployment = get_project_names_from_deployment(deployment)\\n\",\n", - " \" else:\\n\",\n", - " \" print(\\\"Could not find any deployments\\\", deployments_response.text)\\n\",\n", - " \" success = False\\n\",\n", - " \"\\n\",\n", - " \" return success, deployment_id, deployment_name, projects_running_on_deployment\\n\",\n", - " \"\\n\",\n", - " \"def get_project_names_from_deployment(deployment):\\n\",\n", - " \" project_names = []\\n\",\n", - " \" for server in deployment[\\\"servers\\\"]:\\n\",\n", - " \" project_names = project_names + list(map(lambda project: project[\\\"name\\\"], server[\\\"projects\\\"]))\\n\",\n", - " \" return project_names\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Function to start K8s cluster on ESM\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 48,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"def start_k8s_cluster(k8s_project_body):\\n\",\n", - " \" success, deployment_id, deployment_name, projects_running_on_deployment = get_deployment_details()\\n\",\n", - " \"\\n\",\n", - " \" if k8s_project_body[\\\"name\\\"] in projects_running_on_deployment:\\n\",\n", - " \" print(\\\"Project \\\" + k8s_project_body[\\\"name\\\"] + \\\" is already running on deployment \\\" + deployment_name +\\\".\\\")\\n\",\n", - " \" elif success:\\n\",\n", - " \" # Here are the deployment settings hard-coded for all projects\\n\",\n", - " \" k8s_deployment_settings = {\\n\",\n", - " \" \\\"persistentVolumeClaim\\\": \\\"sas-event-stream-processing-studio-app\\\",\\n\",\n", - " \" \\\"requestsMemory\\\": \\\"1Gi\\\",\\n\",\n", - " \" \\\"requestsCpu\\\": 1,\\n\",\n", - " \" \\\"requestsGpu\\\": \\\"0\\\",\\n\",\n", - " \" \\\"limitsMemory\\\": \\\"1Gi\\\",\\n\",\n", - " \" \\\"limitsCpu\\\": 1,\\n\",\n", - " \" \\\"limitsGpu\\\": \\\"0\\\",\\n\",\n", - " \" \\\"minReplicas\\\": 1,\\n\",\n", - " \" \\\"maxReplicas\\\": 1,\\n\",\n", - " \" \\\"useLoadBalancer\\\": False,\\n\",\n", - " \" \\\"loadBalancingPolicy\\\": \\\"none\\\",\\n\",\n", - " \" \\\"averageUtilization\\\": \\\"50\\\",\\n\",\n", - " \" \\\"loadBalancerTargetsList\\\": []\\n\",\n", - " \" }\\n\",\n", - " \" k8s_cluster_body = {\\n\",\n", - " \" \\\"distinguisher\\\": deployment_name,\\n\",\n", - " \" \\\"esmDeploymentId\\\": deployment_id,\\n\",\n", - " \" \\\"gpuReliant\\\": False,\\n\",\n", - " \" \\\"loadOnly\\\": False,\\n\",\n", - " \" \\\"project\\\": k8s_project_body,\\n\",\n", - " \" \\\"settings\\\": k8s_deployment_settings\\n\",\n", - " \" }\\n\",\n", - " \"\\n\",\n", - " \" response = requests.post(\\\"http://\\\" + server + \\\"/SASEventStreamManager/server/cluster\\\",\\n\",\n", - " \" data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\\n\",\n", - " \" if response.status_code != 200:\\n\",\n", - " \" print(\\\"error creating cluster\\\", response.text)\\n\",\n", - " \" else:\\n\",\n", - " \" print(\\\"Project \\\" + k8s_project_body[\\\"name\\\"], \\\" successfully started K8s pod in deployment: \\\" + deployment_name)\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Create ESM Deployment for projects to run against\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 58,\n", - " \"metadata\": {},\n", - " \"outputs\": [\n", - " {\n", - " \"name\": \"stdout\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"Deployment test already exists, we can proceed to start the projects\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"def create_ESM_cluster_deployment():\\n\",\n", - " \" deployment_alread_exists_error = 'A deployment named \\\"' + chosen_deployment_name + '\\\" already exists'\\n\",\n", - " \" deployment_body = {\\n\",\n", - " \" \\\"name\\\": chosen_deployment_name,\\n\",\n", - " \" \\\"type\\\": \\\"cluster\\\"\\n\",\n", - " \" }\\n\",\n", - " \" response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\\n\",\n", - " \" data=json.dumps(deployment_body), headers=headers, verify=False)\\n\",\n", - " \" if deployment_alread_exists_error in response.text:\\n\",\n", - " \" print (\\\"Deployment \\\" + chosen_deployment_name + \\\" already exists, we can proceed to start the projects\\\")\\n\",\n", - " \" elif response.status_code != 201:\\n\",\n", - " \" print(\\\"error creating ESM cluster deployment\\\", response.text)\\n\",\n", - " \"\\n\",\n", - " \"create_ESM_cluster_deployment()\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"# Loop through all XML projects in xml_projects folder and do the following\\n\",\n", - " \"1. Check if projects have already been imported\\n\",\n", - " \"2. If yes, import it using next version number. Otherwise import it normally with version 1 \\n\",\n", - " \"3. Make project public so all users can see it\\n\",\n", - " \"4. Publish project\\n\",\n", - " \"5. Synchronize projects from Studio to ESM\\n\",\n", - " \"6. Create ESM Deployment Cluster on which to run the projects\\n\",\n", - " \"7. Start projets on K8s cluster on ESM\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 50,\n", - " \"metadata\": {},\n", - " \"outputs\": [\n", - " {\n", - " \"name\": \"stdout\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"\\n\",\n", - " \"example_project is already imported\\n\",\n", - " \"Creating new project version: 9\\n\",\n", - " \"example_project.xml successfully published\\n\",\n", - " \"Project example_project is already running on deployment test.\\n\",\n", - " \"\\n\",\n", - " \"star_wars is already imported\\n\",\n", - " \"Creating new project version: 7\\n\",\n", - " \"star_wars.xml successfully published\\n\",\n", - " \"Project star_wars is already running on deployment test.\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"def import_and_publish_xml_files():\\n\",\n", - " \" current_dir = os.getcwd() + \\\"/xml_projects\\\"\\n\",\n", - " \" projects = get_projects()\\n\",\n", - " \" for file_name in os.listdir(current_dir):\\n\",\n", - " \" print()\\n\",\n", - " \" if not file_name.endswith('.xml'): continue\\n\",\n", - " \" version = 1\\n\",\n", - " \" project_id = None\\n\",\n", - " \" xml_file_path = os.path.join(current_dir, file_name)\\n\",\n", - " \" project_name = get_project_name_from_xml(xml_file_path)\\n\",\n", - " \" data = open(xml_file_path, \\\"r\\\").read()\\n\",\n", - " \" project_body = {'friendlyName': project_name, 'xml': data}\\n\",\n", - " \"\\n\",\n", - " \" if projects:\\n\",\n", - " \" project_that_matches_xml_name = None\\n\",\n", - " \" for project in projects:\\n\",\n", - " \" if project['friendlyName'] == project_name:\\n\",\n", - " \" project_that_matches_xml_name = project\\n\",\n", - " \" break\\n\",\n", - " \"\\n\",\n", - " \" if project_that_matches_xml_name:\\n\",\n", - " \" print(project_name + ' is already imported')\\n\",\n", - " \" project_id = project_that_matches_xml_name['flowId']\\n\",\n", - " \" version = get_next_project_version(project_id)\\n\",\n", - " \" print('Creating new project version: ' + str(version))\\n\",\n", - " \"\\n\",\n", - " \" if not bool(project_id):\\n\",\n", - " \" print('Importing ' + project_name)\\n\",\n", - " \" project_id = import_project_to_studio(project_body)\\n\",\n", - " \" make_project_public(project_id)\\n\",\n", - " \"\\n\",\n", - " \" folder_id = publish_project(project_id, project_body, version)\\n\",\n", - " \"\\n\",\n", - " \" synchronize_project_for_ESM(folder_id)\\n\",\n", - " \"\\n\",\n", - " \" if project_id:\\n\",\n", - " \" print(file_name + ' successfully published', flush=True)\\n\",\n", - " \" else:\\n\",\n", - " \" print(file_name + ' failed to publish', flush=True)\\n\",\n", - " \"\\n\",\n", - " \" k8s_project_body = {\\\"id\\\": project_id, \\\"name\\\": project_name, \\\"version\\\": version}\\n\",\n", - " \" start_k8s_cluster(k8s_project_body)\\n\",\n", - " \"\\n\",\n", - " \"def get_project_name_from_xml(xml_file_path):\\n\",\n", - " \" tree = ET.parse(xml_file_path)\\n\",\n", - " \" root = tree.getroot()\\n\",\n", - " \" project_name = root.attrib['name']\\n\",\n", - " \" return project_name\\n\",\n", - " \"\\n\",\n", - " \"\\n\",\n", - " \"\\n\",\n", - " \"import_and_publish_xml_files()\\n\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": null,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": []\n", - " }\n", - " ],\n", - " \"metadata\": {\n", - " \"kernelspec\": {\n", - " \"display_name\": \"Python 3 (ipykernel)\",\n", - " \"language\": \"python\",\n", - " \"name\": \"python3\"\n", - " },\n", - " \"language_info\": {\n", - " \"codemirror_mode\": {\n", - " \"name\": \"ipython\",\n", - " \"version\": 3\n", - " },\n", - " \"file_extension\": \".py\",\n", - " \"mimetype\": \"text/x-python\",\n", - " \"name\": \"python\",\n", - " \"nbconvert_exporter\": \"python\",\n", - " \"pygments_lexer\": \"ipython3\",\n", - " \"version\": \"3.11.2\"\n", - " }\n", - " },\n", - " \"nbformat\": 4,\n", - " \"nbformat_minor\": 4\n", - "}" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml b/IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml new file mode 100644 index 0000000..1ae51ba --- /dev/null +++ b/IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml @@ -0,0 +1,87 @@ + + + + fsduser + 1715251562335 + fsduser + 1715251567920 + {} + Example + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IoT/python/import-and-publish-projects/xml_projects/python_connector.xml b/IoT/python/import-and-publish-projects/xml_projects/python_connector.xml new file mode 100644 index 0000000..4a4630d --- /dev/null +++ b/IoT/python/import-and-publish-projects/xml_projects/python_connector.xml @@ -0,0 +1,71 @@ + + + + {"cq1":{"Source":{"x":-435,"y":-400}}} + fsduser + 1715251658799 + fsduser + 1715251663688 + Example + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 616182b2027a43b0a644b21af6ce90d533f8aa43 Mon Sep 17 00:00:00 2001 From: PetreStegaroiu <92522455+PetreStegaroiu@users.noreply.github.com> Date: Mon, 13 May 2024 10:34:40 +0100 Subject: [PATCH 04/10] Removed outdated example --- .../xml_projects/star_wars.xml | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 IoT/python/import-and-publish-projects/xml_projects/star_wars.xml diff --git a/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml b/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml deleted file mode 100644 index 12c3656..0000000 --- a/IoT/python/import-and-publish-projects/xml_projects/star_wars.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - {"cq1":{"Source":{"x":-435,"y":-400}}} - appadmin - 1700211019156 - appadmin - 1700216552811 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 7bb156564073f727cadb74783fd8f053139bb71b Mon Sep 17 00:00:00 2001 From: PetreStegaroiu <92522455+PetreStegaroiu@users.noreply.github.com> Date: Mon, 13 May 2024 10:34:55 +0100 Subject: [PATCH 05/10] Removed outdated example --- .../xml_projects/example_project.xml | 94 ------------------- 1 file changed, 94 deletions(-) delete mode 100644 IoT/python/import-and-publish-projects/xml_projects/example_project.xml diff --git a/IoT/python/import-and-publish-projects/xml_projects/example_project.xml b/IoT/python/import-and-publish-projects/xml_projects/example_project.xml deleted file mode 100644 index 3c0471e..0000000 --- a/IoT/python/import-and-publish-projects/xml_projects/example_project.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - {"trades_cq":{"AddTraderName":{"x":345,"y":295},"LargeTrades":{"x":470,"y":175},"LargeTradesCopy":{"x":595,"y":295},"TotalCost":{"x":345,"y":425},"Traders":{"x":230,"y":130},"Trades":{"x":470,"y":50}}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - = 100 - end - ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 425af37ad18a40b5792d07b79f3467819894ecaa Mon Sep 17 00:00:00 2001 From: mtlpst Date: Thu, 16 May 2024 09:38:08 +0100 Subject: [PATCH 06/10] Updated Jupyter Notebook to not have sensitive information in it --- .../import-and-publish-projects.ipynb | 127 +++++++----------- 1 file changed, 47 insertions(+), 80 deletions(-) diff --git a/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb b/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb index a4a8e0c..7af370f 100644 --- a/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb +++ b/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Import and publish projects\n", + "# Import and Publish Projects\n", "This Jupyter Notebook uses the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API to import, publish, and run projects in a Kubernetes cluster.\n", "\n", "\n", - "Pre-requisite: This example will assume that at same level as this Jupyter Notebook there is an *xml_projects* folder with XML files representing proejcts the user wants to import and publish to ESP.\n", + "Prerequisite: This example assumes that at same level as this Jupyter Notebook there is an `xml_projects` folder with project XML files that you want to import to SAS Event Stream Processing Studio and publish to SAS Event Stream Manager.\n", "\n", "This Jupyter Notebook uses the project XML files in the `xml_projects` folder and performs the following tasks:\n", "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", @@ -20,7 +20,7 @@ "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project.\n", "\n", " \n", - "Note: Please make sure you run [Imports and Global Variables](#imports) before executing anything else in this notebook. Also ensure you are authenticated by running [Get Access Token](#authentication).\n" + "**Important**: You must run the [Imports and Global Variables](#imports) cell before executing anything else in this notebook. You must also ensure that you are authenticated by running the [Get Access Token](#authentication) cell.\n" ] }, { @@ -28,25 +28,14 @@ "metadata": {}, "source": [ "## Imports and Global Variables \n", - "Run this cell before any of the others as it imports packages and sets variables that will be used throughout the notebook." + "Run this cell before any of the others as it imports packages and sets variables that are used throughout the notebook." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\n", - "Username: fsduser\n", - "Password: Mercury7\n", - "ESM Deployment Cluster Name: test\n" - ] - } - ], + "outputs": [], "source": [ "import requests\n", "import xml.etree.ElementTree as ET\n", @@ -59,9 +48,9 @@ "\n", "def bootstrap_server_and_credentials():\n", " global server, username, password, chosen_deployment_name\n", - " server = \"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\"\n", - " username = \"fsduser\"\n", - " password = \"Mercury7\"\n", + " server = \"https://your_server\"\n", + " username = \"your_username\"\n", + " password = \"your_password\"\n", " chosen_deployment_name = \"test\"\n", " if len(sys.argv) > 3:\n", " server = sys.argv[1]\n", @@ -71,7 +60,7 @@ " print('Server: ' + server)\n", " print('Username: ' + username)\n", " print('Password: ' + password, flush=True)\n", - " print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\n", + " print('Name of SAS Event Stream Manager Deployment: ' + chosen_deployment_name, flush=True)\n", "\n", "# Suppress ssl warnings caused by verify=False\n", "requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\n", @@ -82,27 +71,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Get Access token " + "# Get Access Token " ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "eyJqa3UiOiJodHRwczovL2xvY2FsaG9zdC9TQVNMb2dvbi90b2tlbl9rZXlzIiwia2lkIjoibGVnYWN5LXRva2VuLWtleSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1NDk3NWNmMi0wZDhiLTQ1ZmMtOWZhYy0wOTlhYjZjNmQ1MDciLCJ1c2VyX25hbWUiOiJmc2R1c2VyIiwib3JpZ2luIjoibGRhcCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvU0FTTG9nb24vb2F1dGgvdG9rZW4iLCJhdXRob3JpdGllcyI6WyJWaXlhU0FTQWRtaW5zIiwic3Zpdm11c2VycyIsInN2aWRldm9wcyIsImludGNhY29kZXNpZ25pbmciLCJ1bml4X3ImZCIsIlVTU0FTIiwicmNpLWNpcnJ1cy1kZXYiLCJpbnRjYXdlYmNlcnRyZXEiLCJvcGVuc3RhY2t1c2VycyIsInJjaS1jbHVzdGVyZGV2bW9kZSIsImludGNhdXNlcnMiXSwiY2xpZW50X2lkIjoic2FzLmVjIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJ6aWQiOiJ1YWEiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiNTQ5NzVjZjItMGQ4Yi00NWZjLTlmYWMtMDk5YWI2YzZkNTA3IiwiYXpwIjoic2FzLmVjIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiXSwiYXV0aF90aW1lIjoxNzE1MzQ5MTY4LCJleHAiOjE3MTUzNTI3NjgsImlhdCI6MTcxNTM0OTE2OCwianRpIjoiZWIwZGZhYzMxODA3NDFjMmFhZjRiYzM4ODc3NmQ4MjQiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJyZXZfc2lnIjoiNWQwNjgwZWEiLCJjbGllbnRfYXV0aF9tZXRob2QiOiJub25lIiwiY2lkIjoic2FzLmVjIn0.RbPBDUuFrLRkFAu9Da4UsvKzIQr2jJ7Clp-gqJn1X_P6t3Pm4YYI-ODEqJ5vKVmupvfPxaqY1pYrMBEh9eDB1jiov7tov0ZM_NK3cH9tNMiwlTkvcOv21YWvu3q2O_Bf9UrT7qeZ967hiEMYL99NlLfY77cnEeW-oCfTfbA2wwDHMoRblt06-FAzB_56QOc3_hwLc7knDIxKT9ItjLUSCFTuIpOzvhMtG2FPFjmmUH-xt0qC4g2Ix_JoQjcgSHIhfb1tqvj2iEiQqldiwccDKemWZJWKNYsec7NvylHYdEVUxkP-9_UAxyANeMuoBDLHVaxObnoggDmx-3qA246I3g\n" - ] - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "def get_access_token():\n", " body = {'grant_type': 'password', 'username': username, 'password': password}\n", " headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\n", - " access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\n", + " access_token_response = requests.post(server + '/SASLogon/oauth/token', data=body, headers=headers,\n", " verify=False)\n", " return access_token_response.json()[\"access_token\"]\n", "\n", @@ -115,7 +98,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get ESP Projects" + "# Function to Get ESP Projects" ] }, { @@ -127,7 +110,7 @@ "def get_projects():\n", " projects = []\n", " get_projects_response = requests.get(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", + " server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", " if get_projects_response.status_code == 200:\n", " projects = get_projects_response.json()[\"items\"]\n", " return projects" @@ -137,7 +120,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to import project to ESP Studio" + "# Function to Import a Project to SAS Event Stream Processing Studio" ] }, { @@ -148,7 +131,7 @@ "source": [ "def import_project_to_studio(project_body):\n", " project_id = \"\"\n", - " import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\n", + " import_project_response = requests.post(server + '/SASEventStreamProcessingStudio/esp-project',\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", " if import_project_response.status_code == 200:\n", " project_id = import_project_response.json()[\"flowId\"]\n", @@ -160,7 +143,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get next version number of a project" + "# Function to Get the Next Version Number of a Project" ] }, { @@ -172,7 +155,7 @@ "def get_next_project_version(project_id):\n", " version = 2\n", " get_next_version_response = requests.get(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", " headers=headers, verify=False)\n", " if get_next_version_response.status_code == 200:\n", " version = get_next_version_response.json()[\"major\"]\n", @@ -186,7 +169,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to make project public - by default it is private and hidden from other users" + "# Function to Make a Project Public\n", + "By default, a project is private and hidden from other users." ] }, { @@ -196,7 +180,7 @@ "outputs": [], "source": [ "def make_project_public(project_id):\n", - " requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\n", + " requests.patch(server + '/SASEventStreamProcessingStudio/esp-project/'\n", " + project_id + '/authorization?private=false',\n", " headers={'Authorization': 'Bearer ' + access_token}, verify=False)" ] @@ -205,7 +189,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to create expected project model to be published" + "# Function to Create the Expected Project Model to be Published" ] }, { @@ -234,7 +218,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to publish project" + "# Function to Publish a Project" ] }, { @@ -247,7 +231,7 @@ " folder_id = \"\"\n", " create_publish_project_body(project_body, version)\n", " publish_project_response = requests.post(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", "\n", " if publish_project_response.status_code == 200:\n", @@ -263,7 +247,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to synchronize projects from Studio to ESM" + "# Function to Synchronize Projects from SAS Event Stream Processing Studio to SAS Event Stream Manager" ] }, { @@ -275,7 +259,7 @@ "def synchronize_project_for_ESM(folder_id):\n", " success = False\n", " synchronize_project_response = requests.post(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", " data=folder_id, headers=headers, verify=False)\n", "\n", " if synchronize_project_response.status_code == 200:\n", @@ -287,7 +271,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get deployment details needed to start K8s cluster on ESM" + "# Function to Get Deployment Details Needed to Start Kubernetes Cluster in SAS Event Stream Manager" ] }, { @@ -301,7 +285,7 @@ " deployment_id = ''\n", " deployment_name = ''\n", " projects_running_on_deployment = []\n", - " deployments_response = requests.get(\"http://\" + server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", + " deployments_response = requests.get(server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", " headers=headers, verify=False)\n", "\n", " if deployments_response.status_code != 200:\n", @@ -338,7 +322,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to start K8s cluster on ESM" + "# Function to Start Kubernetes Cluster in SAS Event Stream Manager" ] }, { @@ -378,7 +362,7 @@ " \"settings\": k8s_deployment_settings\n", " }\n", "\n", - " response = requests.post(\"http://\" + server + \"/SASEventStreamManager/server/cluster\",\n", + " response = requests.post(server + \"/SASEventStreamManager/server/cluster\",\n", " data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\n", " if response.status_code != 200:\n", " print(\"error creating cluster\", response.text)\n", @@ -390,7 +374,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Create ESM Deployment for projects to run against" + "# Create a SAS Event Stream Manager Deployment in Which Projects Can Run" ] }, { @@ -405,7 +389,7 @@ " \"name\": chosen_deployment_name,\n", " \"type\": \"cluster\"\n", " }\n", - " response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\n", + " response = requests.post(server + '/SASEventStreamManager/deployment',\n", " data=json.dumps(deployment_body), headers=headers, verify=False)\n", " if deployment_alread_exists_error in response.text:\n", " print (\"Deployment \" + chosen_deployment_name + \" already exists, we can proceed to start the projects\")\n", @@ -419,38 +403,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Loop through all XML projects in xml_projects folder and do the following\n", - "1. Check if projects have already been imported\n", - "2. If yes, import it using next version number. Otherwise import it normally with version 1 \n", - "3. Make project public so all users can see it\n", - "4. Publish project\n", - "5. Synchronize projects from Studio to ESM\n", - "6. Create ESM Deployment Cluster on which to run the projects\n", - "7. Start projets on K8s cluster on ESM" + "# Loop Through All Project XML Files in the `xml_projects` Folder and Perform the Following Steps\n", + "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", + "2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1.\n", + "3. Make the projects public so that they are visible to all users.\n", + "4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", + "5. Synchronize the projects.\n", + "6. Create a SAS Event Stream Manager deployment whose type is \"Cluster\".\n", + "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Importing lua_connector\n", - "success, project_id=3166f279-6073-4cf1-af93-e2d230335ff5\n", - "lua_connector.xml successfully published\n", - "Project lua_connector successfully started K8s pod in deployment: test\n", - "\n", - "Importing python_connector\n", - "success, project_id=b95dc84b-8c9e-4ade-b69a-42bcb5a9d40e\n", - "python_connector.xml successfully published\n", - "Project python_connector successfully started K8s pod in deployment: test\n" - ] - } - ], + "outputs": [], "source": [ "def import_and_publish_xml_files():\n", " current_dir = os.getcwd() + \"/xml_projects\"\n", From 5b5e159a50ef46647dcfdb3a05994b2d0fae02f0 Mon Sep 17 00:00:00 2001 From: Kristen Aponte Date: Thu, 16 May 2024 15:55:26 -0400 Subject: [PATCH 07/10] docs: edited content for new IoT ESP example --- IoT/README.md | 6 +- IoT/eventStreamProcessing.md | 12 ++ .../import-and-publish-projects/README.md | 16 +- .../images/deployment_in_ESM.png | Bin ...eployment_with_projects_running_in_ESM.png | Bin .../images/imported_projects_in_Studio.png | Bin .../testing_imported_project_in_Studio.png | Bin .../import-and-publish-projects.ipynb | 139 +++++++++++------- .../xml_projects/lua_connector.xml | 0 .../xml_projects/python_connector.xml | 0 README.md | 17 ++- 11 files changed, 119 insertions(+), 71 deletions(-) create mode 100644 IoT/eventStreamProcessing.md rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/README.md (83%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/images/deployment_in_ESM.png (100%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png (100%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/images/imported_projects_in_Studio.png (100%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png (100%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/import-and-publish-projects.ipynb (70%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/xml_projects/lua_connector.xml (100%) rename IoT/{ => eventStreamProcessing}/python/import-and-publish-projects/xml_projects/python_connector.xml (100%) diff --git a/IoT/README.md b/IoT/README.md index 3a7685e..e01cfbf 100644 --- a/IoT/README.md +++ b/IoT/README.md @@ -1,10 +1,10 @@ # SAS REST API Examples -## SAS Event Stream Processing Studio and SAS Event Stream Manager +## IoT -This repository contains SAS contributed examples that show the capabilities of the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API. +This repository contains SAS contributed examples that show the capabilities of the IoT APIs. You can use these examples for learning or for validating your environment. You are encouraged to contribute your own examples in the [User Contributions repository](../User_and_Aggregated_Samples). ## Examples -* [Import, Publish, and Run Projects in a Kubernetes Cluster](python/import-and-publish-projects/README.md) +* [Event Stream Processing](eventStreamProcessing.md) diff --git a/IoT/eventStreamProcessing.md b/IoT/eventStreamProcessing.md new file mode 100644 index 0000000..9bf726d --- /dev/null +++ b/IoT/eventStreamProcessing.md @@ -0,0 +1,12 @@ +# IoT Event Stream Processing APIs + +This repository contains SAS contributed examples that show the capabilities of the IoT Event Stream Processing APIs. + +* SAS Event Stream Manager is a web-based client that enables you to deploy projects and monitor the state of your SAS Event Stream Processing environment. +You can use SAS Event Stream Processing Studio to create the projects that you deploy to SAS Event Stream Processing (ESP) servers using SAS Event Stream Manager. + +* SAS Event Stream Processing Studio is a web-based client that enables you to create, test, and publish event stream processing models. +Publishing a project version from SAS Event Stream Processing Studio makes the project version available to SAS Event Stream Manager. + +## Examples +* [Import, publish and run projects on Kubernetes cluster](eventStreamProcessing/python/import-and-publish-projects/README.md) diff --git a/IoT/python/import-and-publish-projects/README.md b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md similarity index 83% rename from IoT/python/import-and-publish-projects/README.md rename to IoT/eventStreamProcessing/python/import-and-publish-projects/README.md index 1462c45..79f8bf6 100644 --- a/IoT/python/import-and-publish-projects/README.md +++ b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md @@ -2,15 +2,17 @@ ## Overview -This Jupyter Notebook uses the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API to import, publish, and run projects in a Kubernetes cluster. +This Jupyter notebook uses the SAS Event Stream Processing Studio Rest API and the SAS Event Stream Manager Rest API to +import, publish, and run projects in a Kubernetes cluster. -Use this example when SAS Event Stream Processing is deployed with other SAS Viya platform products and you are using SAS Event Stream Processing 2023.08 or later. +Use this example when SAS Event Stream Processing is deployed with other SAS Viya platform products, +and you are using SAS Event Stream Processing 2023.08 or later. -This Jupyter Notebook uses the project XML files in the `xml_projects` folder and performs the following tasks: +This Jupyter notebook uses the project XML files in the `xml_projects` folder and performs the following tasks: 1. Check whether the projects have already been imported to SAS Event Stream Processing Studio. 2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1. 3. Make the projects public so that they are visible to all users. -4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager. +4. Publish the projects from SAS Event Stream Processing Studio (ESP) to SAS Event Stream Manager (ESM). 5. Synchronize the projects. 6. Create a SAS Event Stream Manager deployment whose type is "Cluster". 7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project. @@ -26,14 +28,14 @@ Ensure that Python 3 is available and the following Python packages are availabl - time ## Using the Example -1. Download the Python program or the Jupyter Notebook file. -2. Ensure that the `xml_projects` folder (which contains the project XML files used by this example) is located at the same level as this Jupyter Notebook. +1. Download the Python program or the Jupyter notebook file. +2. Ensure that the `xml_projects` folder (which contains the project XML files used by this example) is located at the same level as this Jupyter notebook. 3. Edit the following variables to match your environment: - `server`: the URL of the SAS Viya platform server - `username` - `password` - `chosen_deployment_name`: specify a name for the SAS Event Stream Manager deployment that this example creates -4. Run the program or Jupyter Notebook commands. +4. Run the program or Jupyter notebook commands. ## Endpoints Used by This Example diff --git a/IoT/python/import-and-publish-projects/images/deployment_in_ESM.png b/IoT/eventStreamProcessing/python/import-and-publish-projects/images/deployment_in_ESM.png similarity index 100% rename from IoT/python/import-and-publish-projects/images/deployment_in_ESM.png rename to IoT/eventStreamProcessing/python/import-and-publish-projects/images/deployment_in_ESM.png diff --git a/IoT/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png b/IoT/eventStreamProcessing/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png similarity index 100% rename from IoT/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png rename to IoT/eventStreamProcessing/python/import-and-publish-projects/images/deployment_with_projects_running_in_ESM.png diff --git a/IoT/python/import-and-publish-projects/images/imported_projects_in_Studio.png b/IoT/eventStreamProcessing/python/import-and-publish-projects/images/imported_projects_in_Studio.png similarity index 100% rename from IoT/python/import-and-publish-projects/images/imported_projects_in_Studio.png rename to IoT/eventStreamProcessing/python/import-and-publish-projects/images/imported_projects_in_Studio.png diff --git a/IoT/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png b/IoT/eventStreamProcessing/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png similarity index 100% rename from IoT/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png rename to IoT/eventStreamProcessing/python/import-and-publish-projects/images/testing_imported_project_in_Studio.png diff --git a/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb b/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb similarity index 70% rename from IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb rename to IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb index 7af370f..ece5135 100644 --- a/IoT/python/import-and-publish-projects/import-and-publish-projects.ipynb +++ b/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb @@ -4,23 +4,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Import and Publish Projects\n", - "This Jupyter Notebook uses the SAS Event Stream Processing Studio REST API and the SAS Event Stream Manager REST API to import, publish, and run projects in a Kubernetes cluster.\n", + "# Import and publish projects\n", + "This Jupyter notebook uses the SAS Event Stream Processing Studio Rest API and the SAS Event Stream Manager Rest API to import, publish, and run projects in a Kubernetes cluster.\n", "\n", "\n", - "Prerequisite: This example assumes that at same level as this Jupyter Notebook there is an `xml_projects` folder with project XML files that you want to import to SAS Event Stream Processing Studio and publish to SAS Event Stream Manager.\n", + "Prerequisite: This example assumes that there is an *xml_projects* folder at same level as this Jupyter notebook, which contains XML files representing projects the user wants to import into SAS Event Stream Processing Studio and publish to SAS Event Stream Manager.\n", "\n", - "This Jupyter Notebook uses the project XML files in the `xml_projects` folder and performs the following tasks:\n", + "This Jupyter notebook uses the project XML files in the `xml_projects` folder and performs the following tasks:\n", "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", "2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1.\n", "3. Make the projects public so that they are visible to all users.\n", - "4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", + "4. Publish the projects from SAS Event Stream Processing Studio (ESP) to SAS Event Stream Manager (ESM).\n", "5. Synchronize the projects.\n", "6. Create a SAS Event Stream Manager deployment whose type is \"Cluster\".\n", "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project.\n", "\n", " \n", - "**Important**: You must run the [Imports and Global Variables](#imports) cell before executing anything else in this notebook. You must also ensure that you are authenticated by running the [Get Access Token](#authentication) cell.\n" + "Note: Please make sure you run [Imports and Global Variables](#imports) before executing anything else in this notebook. Also ensure you are authenticated by running [Get Access Token](#authentication).\n" ] }, { @@ -28,14 +28,25 @@ "metadata": {}, "source": [ "## Imports and Global Variables \n", - "Run this cell before any of the others as it imports packages and sets variables that are used throughout the notebook." + "Run this cell before any of the others as it imports packages and sets variables that are used throughout this notebook." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\n", + "Username: fsduser\n", + "Password: Mercury7\n", + "ESM Deployment Cluster Name: test\n" + ] + } + ], "source": [ "import requests\n", "import xml.etree.ElementTree as ET\n", @@ -48,9 +59,9 @@ "\n", "def bootstrap_server_and_credentials():\n", " global server, username, password, chosen_deployment_name\n", - " server = \"https://your_server\"\n", - " username = \"your_username\"\n", - " password = \"your_password\"\n", + " server = \"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\"\n", + " username = \"fsduser\"\n", + " password = \"Mercury7\"\n", " chosen_deployment_name = \"test\"\n", " if len(sys.argv) > 3:\n", " server = sys.argv[1]\n", @@ -60,7 +71,7 @@ " print('Server: ' + server)\n", " print('Username: ' + username)\n", " print('Password: ' + password, flush=True)\n", - " print('Name of SAS Event Stream Manager Deployment: ' + chosen_deployment_name, flush=True)\n", + " print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\n", "\n", "# Suppress ssl warnings caused by verify=False\n", "requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\n", @@ -71,21 +82,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Get Access Token " + "# Get Access token " ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "eyJqa3UiOiJodHRwczovL2xvY2FsaG9zdC9TQVNMb2dvbi90b2tlbl9rZXlzIiwia2lkIjoibGVnYWN5LXRva2VuLWtleSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1NDk3NWNmMi0wZDhiLTQ1ZmMtOWZhYy0wOTlhYjZjNmQ1MDciLCJ1c2VyX25hbWUiOiJmc2R1c2VyIiwib3JpZ2luIjoibGRhcCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvU0FTTG9nb24vb2F1dGgvdG9rZW4iLCJhdXRob3JpdGllcyI6WyJWaXlhU0FTQWRtaW5zIiwic3Zpdm11c2VycyIsInN2aWRldm9wcyIsImludGNhY29kZXNpZ25pbmciLCJ1bml4X3ImZCIsIlVTU0FTIiwicmNpLWNpcnJ1cy1kZXYiLCJpbnRjYXdlYmNlcnRyZXEiLCJvcGVuc3RhY2t1c2VycyIsInJjaS1jbHVzdGVyZGV2bW9kZSIsImludGNhdXNlcnMiXSwiY2xpZW50X2lkIjoic2FzLmVjIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJ6aWQiOiJ1YWEiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiNTQ5NzVjZjItMGQ4Yi00NWZjLTlmYWMtMDk5YWI2YzZkNTA3IiwiYXpwIjoic2FzLmVjIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiXSwiYXV0aF90aW1lIjoxNzE1MzQ5MTY4LCJleHAiOjE3MTUzNTI3NjgsImlhdCI6MTcxNTM0OTE2OCwianRpIjoiZWIwZGZhYzMxODA3NDFjMmFhZjRiYzM4ODc3NmQ4MjQiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJyZXZfc2lnIjoiNWQwNjgwZWEiLCJjbGllbnRfYXV0aF9tZXRob2QiOiJub25lIiwiY2lkIjoic2FzLmVjIn0.RbPBDUuFrLRkFAu9Da4UsvKzIQr2jJ7Clp-gqJn1X_P6t3Pm4YYI-ODEqJ5vKVmupvfPxaqY1pYrMBEh9eDB1jiov7tov0ZM_NK3cH9tNMiwlTkvcOv21YWvu3q2O_Bf9UrT7qeZ967hiEMYL99NlLfY77cnEeW-oCfTfbA2wwDHMoRblt06-FAzB_56QOc3_hwLc7knDIxKT9ItjLUSCFTuIpOzvhMtG2FPFjmmUH-xt0qC4g2Ix_JoQjcgSHIhfb1tqvj2iEiQqldiwccDKemWZJWKNYsec7NvylHYdEVUxkP-9_UAxyANeMuoBDLHVaxObnoggDmx-3qA246I3g\n" + ] + } + ], "source": [ "def get_access_token():\n", " body = {'grant_type': 'password', 'username': username, 'password': password}\n", " headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\n", - " access_token_response = requests.post(server + '/SASLogon/oauth/token', data=body, headers=headers,\n", + " access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\n", " verify=False)\n", " return access_token_response.json()[\"access_token\"]\n", "\n", @@ -98,7 +115,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Get ESP Projects" + "# Function to get ESP Projects" ] }, { @@ -110,7 +127,7 @@ "def get_projects():\n", " projects = []\n", " get_projects_response = requests.get(\n", - " server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", " if get_projects_response.status_code == 200:\n", " projects = get_projects_response.json()[\"items\"]\n", " return projects" @@ -120,7 +137,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Import a Project to SAS Event Stream Processing Studio" + "# Function to import project to ESP Studio" ] }, { @@ -131,7 +148,7 @@ "source": [ "def import_project_to_studio(project_body):\n", " project_id = \"\"\n", - " import_project_response = requests.post(server + '/SASEventStreamProcessingStudio/esp-project',\n", + " import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", " if import_project_response.status_code == 200:\n", " project_id = import_project_response.json()[\"flowId\"]\n", @@ -143,7 +160,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Get the Next Version Number of a Project" + "# Function to get next version number of a project" ] }, { @@ -155,7 +172,7 @@ "def get_next_project_version(project_id):\n", " version = 2\n", " get_next_version_response = requests.get(\n", - " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", " headers=headers, verify=False)\n", " if get_next_version_response.status_code == 200:\n", " version = get_next_version_response.json()[\"major\"]\n", @@ -169,8 +186,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Make a Project Public\n", - "By default, a project is private and hidden from other users." + "# Function to make project public - by default it is private and hidden from other users" ] }, { @@ -180,7 +196,7 @@ "outputs": [], "source": [ "def make_project_public(project_id):\n", - " requests.patch(server + '/SASEventStreamProcessingStudio/esp-project/'\n", + " requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\n", " + project_id + '/authorization?private=false',\n", " headers={'Authorization': 'Bearer ' + access_token}, verify=False)" ] @@ -189,7 +205,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Create the Expected Project Model to be Published" + "# Function to create expected project model to be published" ] }, { @@ -218,7 +234,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Publish a Project" + "# Function to publish project" ] }, { @@ -231,7 +247,7 @@ " folder_id = \"\"\n", " create_publish_project_body(project_body, version)\n", " publish_project_response = requests.post(\n", - " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", "\n", " if publish_project_response.status_code == 200:\n", @@ -247,7 +263,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Synchronize Projects from SAS Event Stream Processing Studio to SAS Event Stream Manager" + "# Function to synchronize projects from Studio to ESM" ] }, { @@ -259,7 +275,7 @@ "def synchronize_project_for_ESM(folder_id):\n", " success = False\n", " synchronize_project_response = requests.post(\n", - " server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", + " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", " data=folder_id, headers=headers, verify=False)\n", "\n", " if synchronize_project_response.status_code == 200:\n", @@ -271,7 +287,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Get Deployment Details Needed to Start Kubernetes Cluster in SAS Event Stream Manager" + "# Function to get deployment details needed to start K8s cluster on ESM" ] }, { @@ -285,15 +301,15 @@ " deployment_id = ''\n", " deployment_name = ''\n", " projects_running_on_deployment = []\n", - " deployments_response = requests.get(server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", + " deployments_response = requests.get(\"http://\" + server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", " headers=headers, verify=False)\n", "\n", " if deployments_response.status_code != 200:\n", " print(\"Could not find any deployments\", deployments_response.text)\n", " success = False\n", "\n", - " # Here we try to start clusters against the hard-coded deployment name\n", - " # if it does not exist, it will spin off cluster against 1st cluster\n", + " # This code tries to start clusters against the hardcoded deployment name\n", + " # if it does not exist, it spins off a cluster against the first cluster.\n", " deployment_items = deployments_response.json()[\"items\"]\n", " if len(deployment_items) > 0:\n", " deployment_id = deployment_items[0][\"uuid\"]\n", @@ -322,7 +338,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to Start Kubernetes Cluster in SAS Event Stream Manager" + "# Function to start K8s cluster on ESM" ] }, { @@ -362,7 +378,7 @@ " \"settings\": k8s_deployment_settings\n", " }\n", "\n", - " response = requests.post(server + \"/SASEventStreamManager/server/cluster\",\n", + " response = requests.post(\"http://\" + server + \"/SASEventStreamManager/server/cluster\",\n", " data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\n", " if response.status_code != 200:\n", " print(\"error creating cluster\", response.text)\n", @@ -374,7 +390,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Create a SAS Event Stream Manager Deployment in Which Projects Can Run" + "# Create ESM Deployment for projects to run against" ] }, { @@ -389,10 +405,10 @@ " \"name\": chosen_deployment_name,\n", " \"type\": \"cluster\"\n", " }\n", - " response = requests.post(server + '/SASEventStreamManager/deployment',\n", + " response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\n", " data=json.dumps(deployment_body), headers=headers, verify=False)\n", " if deployment_alread_exists_error in response.text:\n", - " print (\"Deployment \" + chosen_deployment_name + \" already exists, we can proceed to start the projects\")\n", + " print (\"Deployment \" + chosen_deployment_name + \" already exists, proceed to start the projects\")\n", " elif response.status_code != 201:\n", " print(\"error creating ESM cluster deployment\", response.text)\n", "\n", @@ -403,21 +419,38 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Loop Through All Project XML Files in the `xml_projects` Folder and Perform the Following Steps\n", - "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", - "2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1.\n", - "3. Make the projects public so that they are visible to all users.\n", - "4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", - "5. Synchronize the projects.\n", - "6. Create a SAS Event Stream Manager deployment whose type is \"Cluster\".\n", - "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project." + "# Loop through all XML projects in xml_projects folder and perform the following steps:\n", + "1. Check if projects have already been imported.\n", + "2. If yes, import it using next version number. Otherwise, import it normally with version 1. \n", + "3. Make the project public so that all users can see it.\n", + "4. Publish the project.\n", + "5. Synchronize the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", + "6. Create SAS Event Stream Manager Deployment Cluster on which to run the projects.\n", + "7. Start the projects on the K8s cluster on SAS Event Stream Manager." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Importing lua_connector\n", + "success, project_id=3166f279-6073-4cf1-af93-e2d230335ff5\n", + "lua_connector.xml successfully published\n", + "Project lua_connector successfully started K8s pod in deployment: test\n", + "\n", + "Importing python_connector\n", + "success, project_id=b95dc84b-8c9e-4ade-b69a-42bcb5a9d40e\n", + "python_connector.xml successfully published\n", + "Project python_connector successfully started K8s pod in deployment: test\n" + ] + } + ], "source": [ "def import_and_publish_xml_files():\n", " current_dir = os.getcwd() + \"/xml_projects\"\n", diff --git a/IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml b/IoT/eventStreamProcessing/python/import-and-publish-projects/xml_projects/lua_connector.xml similarity index 100% rename from IoT/python/import-and-publish-projects/xml_projects/lua_connector.xml rename to IoT/eventStreamProcessing/python/import-and-publish-projects/xml_projects/lua_connector.xml diff --git a/IoT/python/import-and-publish-projects/xml_projects/python_connector.xml b/IoT/eventStreamProcessing/python/import-and-publish-projects/xml_projects/python_connector.xml similarity index 100% rename from IoT/python/import-and-publish-projects/xml_projects/python_connector.xml rename to IoT/eventStreamProcessing/python/import-and-publish-projects/xml_projects/python_connector.xml diff --git a/README.md b/README.md index 86ab318..4578613 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,15 @@ This is a preview repository containing examples showing the capabilities of SAS The APIs are group into the following categories: -| API Category | Description | -| ------ | ------ | -| Visualization | Provide access to reports and report images | -| Compute | Act on SAS compute and analytic servers, including Cloud Analytic Services (CAS) | -| Text Analytics | Provide analysis and categorization of text documents | -| Data Management | Enable data manipulation and data quality operations on data sources | -| Decision Management | Provide access to machine scoring and business rules | -| Core Services | Provide operations for shared resources such as files and folders | +| API Category | Description | +|---------------------|-----------------------------------------------------------------------------------| +| Visualization | Provides access to reports and report images | +| Compute | Acts on SAS compute and analytic servers, including Cloud Analytic Services (CAS) | +| Text Analytics | Provides analysis and categorization of text documents | +| Data Management | Enables data manipulation and data quality operations on data sources | +| Decision Management | Provides access to machine scoring and business rules | +| Core Services | Provides operations for shared resources such as files and folders || +| IoT | Provides operations for IoT analytics and Event Stream Processing || Within each grouping will be a folder for SAS and User contributions (we encourage external participation). From e74901edfc9bbda0c215e41d0d1c2022781631b6 Mon Sep 17 00:00:00 2001 From: Kristen Aponte Date: Thu, 16 May 2024 16:04:55 -0400 Subject: [PATCH 08/10] docs: added note about IoT documentation availability. --- .../python/import-and-publish-projects/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md index 79f8bf6..95d5731 100644 --- a/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md +++ b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md @@ -39,6 +39,10 @@ Ensure that Python 3 is available and the following Python packages are availabl ## Endpoints Used by This Example +_**Note:** The IoT SAS Event Stream Processing Studio Rest API and the SAS Event Stream Manager Rest API documentation +is currently for internal use only and not available to external customers on developers.sas.com. +You must be signed in with your SAS email address to access the content on the external site._ + ### SAS Event Stream Processing Studio - [/esp-project](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=getListModels) - List all projects - [/esp-project](https://developers.sas.com/rest-apis/SASEventStreamProcessingStudio-v3?operation=createProject) - Create a project From d9e98792adcf8e8eb74cec7bbf12c018864d6f56 Mon Sep 17 00:00:00 2001 From: Kristen Aponte Date: Fri, 17 May 2024 19:32:01 -0400 Subject: [PATCH 09/10] fix: reincorporated some of the previous text changes - updated text in Jupyter notebook - made some small changes to the example README.md file --- .../import-and-publish-projects/README.md | 2 +- .../import-and-publish-projects.ipynb | 133 +++++++----------- 2 files changed, 51 insertions(+), 84 deletions(-) diff --git a/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md index 95d5731..9320659 100644 --- a/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md +++ b/IoT/eventStreamProcessing/python/import-and-publish-projects/README.md @@ -12,7 +12,7 @@ This Jupyter notebook uses the project XML files in the `xml_projects` folder an 1. Check whether the projects have already been imported to SAS Event Stream Processing Studio. 2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1. 3. Make the projects public so that they are visible to all users. -4. Publish the projects from SAS Event Stream Processing Studio (ESP) to SAS Event Stream Manager (ESM). +4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager. 5. Synchronize the projects. 6. Create a SAS Event Stream Manager deployment whose type is "Cluster". 7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project. diff --git a/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb b/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb index ece5135..334b34a 100644 --- a/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb +++ b/IoT/eventStreamProcessing/python/import-and-publish-projects/import-and-publish-projects.ipynb @@ -4,23 +4,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Import and publish projects\n", + "# Import and Publish Projects\n", "This Jupyter notebook uses the SAS Event Stream Processing Studio Rest API and the SAS Event Stream Manager Rest API to import, publish, and run projects in a Kubernetes cluster.\n", "\n", "\n", - "Prerequisite: This example assumes that there is an *xml_projects* folder at same level as this Jupyter notebook, which contains XML files representing projects the user wants to import into SAS Event Stream Processing Studio and publish to SAS Event Stream Manager.\n", + "Prerequisite: This example assumes that there is an *xml_projects* folder at same level as this Jupyter notebook, which contains XML files that you want to import into SAS Event Stream Processing Studio and publish to SAS Event Stream Manager.\n", "\n", "This Jupyter notebook uses the project XML files in the `xml_projects` folder and performs the following tasks:\n", "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", "2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1.\n", "3. Make the projects public so that they are visible to all users.\n", - "4. Publish the projects from SAS Event Stream Processing Studio (ESP) to SAS Event Stream Manager (ESM).\n", + "4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", "5. Synchronize the projects.\n", "6. Create a SAS Event Stream Manager deployment whose type is \"Cluster\".\n", "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project.\n", "\n", " \n", - "Note: Please make sure you run [Imports and Global Variables](#imports) before executing anything else in this notebook. Also ensure you are authenticated by running [Get Access Token](#authentication).\n" + "**Important**: You must run the [Imports and Global Variables](#imports) cell before executing anything else in this notebook. Also ensure that you are authenticated by running the [Get Access Token](#authentication) cell.\n" ] }, { @@ -33,20 +33,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Server: acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\n", - "Username: fsduser\n", - "Password: Mercury7\n", - "ESM Deployment Cluster Name: test\n" - ] - } - ], + "outputs": [], "source": [ "import requests\n", "import xml.etree.ElementTree as ET\n", @@ -59,9 +48,9 @@ "\n", "def bootstrap_server_and_credentials():\n", " global server, username, password, chosen_deployment_name\n", - " server = \"acme.kc4.ingress-nginx.espsc-kc5-m1.espstudio.sashq-d.openstack.sas.com\"\n", - " username = \"fsduser\"\n", - " password = \"Mercury7\"\n", + " server = \"https://your_server\"\n", + " username = \"your_username\"\n", + " password = \"your_password\"\n", " chosen_deployment_name = \"test\"\n", " if len(sys.argv) > 3:\n", " server = sys.argv[1]\n", @@ -71,7 +60,7 @@ " print('Server: ' + server)\n", " print('Username: ' + username)\n", " print('Password: ' + password, flush=True)\n", - " print('ESM Deployment Cluster Name: ' + chosen_deployment_name, flush=True)\n", + " print('Name of SAS Event Stream Manager Deployment: ' + chosen_deployment_name, flush=True)\n", "\n", "# Suppress ssl warnings caused by verify=False\n", "requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\n", @@ -82,27 +71,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Get Access token " + "# Get Access Token " ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "eyJqa3UiOiJodHRwczovL2xvY2FsaG9zdC9TQVNMb2dvbi90b2tlbl9rZXlzIiwia2lkIjoibGVnYWN5LXRva2VuLWtleSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI1NDk3NWNmMi0wZDhiLTQ1ZmMtOWZhYy0wOTlhYjZjNmQ1MDciLCJ1c2VyX25hbWUiOiJmc2R1c2VyIiwib3JpZ2luIjoibGRhcCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3QvU0FTTG9nb24vb2F1dGgvdG9rZW4iLCJhdXRob3JpdGllcyI6WyJWaXlhU0FTQWRtaW5zIiwic3Zpdm11c2VycyIsInN2aWRldm9wcyIsImludGNhY29kZXNpZ25pbmciLCJ1bml4X3ImZCIsIlVTU0FTIiwicmNpLWNpcnJ1cy1kZXYiLCJpbnRjYXdlYmNlcnRyZXEiLCJvcGVuc3RhY2t1c2VycyIsInJjaS1jbHVzdGVyZGV2bW9kZSIsImludGNhdXNlcnMiXSwiY2xpZW50X2lkIjoic2FzLmVjIiwiYXVkIjpbInVhYSIsIm9wZW5pZCIsInNhcy5lYyJdLCJleHRfaWQiOiJjbj1STVMgRlNEIFByb2R1Y3RzIFVzZXIsb3U9R2VuZXJpYyBhbmQgU2hhcmVkIEFjY291bnRzLG91PUFkbWluLGRjPW5hLGRjPVNBUyxkYz1jb20iLCJ6aWQiOiJ1YWEiLCJncmFudF90eXBlIjoicGFzc3dvcmQiLCJ1c2VyX2lkIjoiNTQ5NzVjZjItMGQ4Yi00NWZjLTlmYWMtMDk5YWI2YzZkNTA3IiwiYXpwIjoic2FzLmVjIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiXSwiYXV0aF90aW1lIjoxNzE1MzQ5MTY4LCJleHAiOjE3MTUzNTI3NjgsImlhdCI6MTcxNTM0OTE2OCwianRpIjoiZWIwZGZhYzMxODA3NDFjMmFhZjRiYzM4ODc3NmQ4MjQiLCJlbWFpbCI6ImZzZHVzZXJAdXNlci5mcm9tLmxkYXAuY2YiLCJyZXZfc2lnIjoiNWQwNjgwZWEiLCJjbGllbnRfYXV0aF9tZXRob2QiOiJub25lIiwiY2lkIjoic2FzLmVjIn0.RbPBDUuFrLRkFAu9Da4UsvKzIQr2jJ7Clp-gqJn1X_P6t3Pm4YYI-ODEqJ5vKVmupvfPxaqY1pYrMBEh9eDB1jiov7tov0ZM_NK3cH9tNMiwlTkvcOv21YWvu3q2O_Bf9UrT7qeZ967hiEMYL99NlLfY77cnEeW-oCfTfbA2wwDHMoRblt06-FAzB_56QOc3_hwLc7knDIxKT9ItjLUSCFTuIpOzvhMtG2FPFjmmUH-xt0qC4g2Ix_JoQjcgSHIhfb1tqvj2iEiQqldiwccDKemWZJWKNYsec7NvylHYdEVUxkP-9_UAxyANeMuoBDLHVaxObnoggDmx-3qA246I3g\n" - ] - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "def get_access_token():\n", " body = {'grant_type': 'password', 'username': username, 'password': password}\n", " headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic c2FzLmVjOg=='}\n", - " access_token_response = requests.post('http://' + server + '/SASLogon/oauth/token', data=body, headers=headers,\n", + " access_token_response = requests.post(server + '/SASLogon/oauth/token', data=body, headers=headers,\n", " verify=False)\n", " return access_token_response.json()[\"access_token\"]\n", "\n", @@ -115,7 +98,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get ESP Projects" + "# Function to Get ESP Projects" ] }, { @@ -127,7 +110,7 @@ "def get_projects():\n", " projects = []\n", " get_projects_response = requests.get(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", + " server + '/SASEventStreamProcessingStudio/esp-project', headers=headers, verify=False)\n", " if get_projects_response.status_code == 200:\n", " projects = get_projects_response.json()[\"items\"]\n", " return projects" @@ -137,7 +120,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to import project to ESP Studio" + "# Function to Import a Project to SAS Event Stream Processing Studio" ] }, { @@ -148,7 +131,7 @@ "source": [ "def import_project_to_studio(project_body):\n", " project_id = \"\"\n", - " import_project_response = requests.post('http://' + server + '/SASEventStreamProcessingStudio/esp-project',\n", + " import_project_response = requests.post(server + '/SASEventStreamProcessingStudio/esp-project',\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", " if import_project_response.status_code == 200:\n", " project_id = import_project_response.json()[\"flowId\"]\n", @@ -160,7 +143,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get next version number of a project" + "# Function to Get the Next Version Number of a Project" ] }, { @@ -172,7 +155,7 @@ "def get_next_project_version(project_id):\n", " version = 2\n", " get_next_version_response = requests.get(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id + '/nextVersion',\n", " headers=headers, verify=False)\n", " if get_next_version_response.status_code == 200:\n", " version = get_next_version_response.json()[\"major\"]\n", @@ -186,7 +169,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to make project public - by default it is private and hidden from other users" + "# Function to Make a Project Public\n", + "By default, a project is private and hidden from other users." ] }, { @@ -196,7 +180,7 @@ "outputs": [], "source": [ "def make_project_public(project_id):\n", - " requests.patch('http://' + server + '/SASEventStreamProcessingStudio/esp-project/'\n", + " requests.patch(server + '/SASEventStreamProcessingStudio/esp-project/'\n", " + project_id + '/authorization?private=false',\n", " headers={'Authorization': 'Bearer ' + access_token}, verify=False)" ] @@ -205,7 +189,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to create expected project model to be published" + "# Function to Create the Expected Project Model to be Published" ] }, { @@ -234,7 +218,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to publish project" + "# Function to Publish a Project" ] }, { @@ -247,7 +231,7 @@ " folder_id = \"\"\n", " create_publish_project_body(project_body, version)\n", " publish_project_response = requests.post(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/' + project_id,\n", " data=json.dumps(project_body), headers=headers, verify=False)\n", "\n", " if publish_project_response.status_code == 200:\n", @@ -263,7 +247,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to synchronize projects from Studio to ESM" + "# Function to Synchronize Projects from SAS Event Stream Processing Studio to SAS Event Stream Manager" ] }, { @@ -275,7 +259,7 @@ "def synchronize_project_for_ESM(folder_id):\n", " success = False\n", " synchronize_project_response = requests.post(\n", - " 'http://' + server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", + " server + '/SASEventStreamProcessingStudio/project-versions/projects/synchronize/' + folder_id,\n", " data=folder_id, headers=headers, verify=False)\n", "\n", " if synchronize_project_response.status_code == 200:\n", @@ -287,7 +271,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to get deployment details needed to start K8s cluster on ESM" + "# Function to Get Deployment Details Needed to Start Kubernetes Cluster in SAS Event Stream Manager" ] }, { @@ -301,15 +285,15 @@ " deployment_id = ''\n", " deployment_name = ''\n", " projects_running_on_deployment = []\n", - " deployments_response = requests.get(\"http://\" + server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", + " deployments_response = requests.get(server + \"/SASEventStreamManager/deployment?noDetails=false\",\n", " headers=headers, verify=False)\n", "\n", " if deployments_response.status_code != 200:\n", " print(\"Could not find any deployments\", deployments_response.text)\n", " success = False\n", "\n", - " # This code tries to start clusters against the hardcoded deployment name\n", - " # if it does not exist, it spins off a cluster against the first cluster.\n", + " # Here we try to start clusters against the hard-coded deployment name\n", + " # if it does not exist, it will spin off cluster against 1st cluster\n", " deployment_items = deployments_response.json()[\"items\"]\n", " if len(deployment_items) > 0:\n", " deployment_id = deployment_items[0][\"uuid\"]\n", @@ -338,7 +322,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Function to start K8s cluster on ESM" + "# Function to Start Kubernetes Cluster in SAS Event Stream Manager" ] }, { @@ -378,7 +362,7 @@ " \"settings\": k8s_deployment_settings\n", " }\n", "\n", - " response = requests.post(\"http://\" + server + \"/SASEventStreamManager/server/cluster\",\n", + " response = requests.post(server + \"/SASEventStreamManager/server/cluster\",\n", " data=json.dumps(k8s_cluster_body), headers=headers, verify=False)\n", " if response.status_code != 200:\n", " print(\"error creating cluster\", response.text)\n", @@ -390,7 +374,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Create ESM Deployment for projects to run against" + "# Create a SAS Event Stream Manager Deployment in Which Projects Can Run" ] }, { @@ -405,10 +389,10 @@ " \"name\": chosen_deployment_name,\n", " \"type\": \"cluster\"\n", " }\n", - " response = requests.post('http://' + server + '/SASEventStreamManager/deployment',\n", + " response = requests.post(server + '/SASEventStreamManager/deployment',\n", " data=json.dumps(deployment_body), headers=headers, verify=False)\n", " if deployment_alread_exists_error in response.text:\n", - " print (\"Deployment \" + chosen_deployment_name + \" already exists, proceed to start the projects\")\n", + " print (\"Deployment \" + chosen_deployment_name + \" already exists, we can proceed to start the projects\")\n", " elif response.status_code != 201:\n", " print(\"error creating ESM cluster deployment\", response.text)\n", "\n", @@ -419,38 +403,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Loop through all XML projects in xml_projects folder and perform the following steps:\n", - "1. Check if projects have already been imported.\n", - "2. If yes, import it using next version number. Otherwise, import it normally with version 1. \n", - "3. Make the project public so that all users can see it.\n", - "4. Publish the project.\n", - "5. Synchronize the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", - "6. Create SAS Event Stream Manager Deployment Cluster on which to run the projects.\n", - "7. Start the projects on the K8s cluster on SAS Event Stream Manager." + "# Loop Through All Project XML Files in the `xml_projects` Folder and Perform the Following Steps\n", + "1. Check whether the projects have already been imported to SAS Event Stream Processing Studio.\n", + "2. If a project has been previously imported, then import it using the next version number. Otherwise, import the project as version 1.\n", + "3. Make the projects public so that they are visible to all users.\n", + "4. Publish the projects from SAS Event Stream Processing Studio to SAS Event Stream Manager.\n", + "5. Synchronize the projects.\n", + "6. Create a SAS Event Stream Manager deployment whose type is \"Cluster\".\n", + "7. Run the projects in the Kubernetes cluster. This action creates and starts an ESP server for each project." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Importing lua_connector\n", - "success, project_id=3166f279-6073-4cf1-af93-e2d230335ff5\n", - "lua_connector.xml successfully published\n", - "Project lua_connector successfully started K8s pod in deployment: test\n", - "\n", - "Importing python_connector\n", - "success, project_id=b95dc84b-8c9e-4ade-b69a-42bcb5a9d40e\n", - "python_connector.xml successfully published\n", - "Project python_connector successfully started K8s pod in deployment: test\n" - ] - } - ], + "outputs": [], "source": [ "def import_and_publish_xml_files():\n", " current_dir = os.getcwd() + \"/xml_projects\"\n", From 3c0a7624918b30c5591f8adbc84739bf2bb29099 Mon Sep 17 00:00:00 2001 From: Kristen Aponte <40218883+kaponte75@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:14:41 -0500 Subject: [PATCH 10/10] Incorporated edits for eventStreamProcessing.md --- IoT/eventStreamProcessing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IoT/eventStreamProcessing.md b/IoT/eventStreamProcessing.md index 9bf726d..87861af 100644 --- a/IoT/eventStreamProcessing.md +++ b/IoT/eventStreamProcessing.md @@ -3,7 +3,7 @@ This repository contains SAS contributed examples that show the capabilities of the IoT Event Stream Processing APIs. * SAS Event Stream Manager is a web-based client that enables you to deploy projects and monitor the state of your SAS Event Stream Processing environment. -You can use SAS Event Stream Processing Studio to create the projects that you deploy to SAS Event Stream Processing (ESP) servers using SAS Event Stream Manager. +You can use SAS Event Stream Processing Studio to create the projects that you deploy to event stream processing (ESP) servers using SAS Event Stream Manager. * SAS Event Stream Processing Studio is a web-based client that enables you to create, test, and publish event stream processing models. Publishing a project version from SAS Event Stream Processing Studio makes the project version available to SAS Event Stream Manager.