From 14f8b20d1b6f07f497bacdf74f9fbcd453463933 Mon Sep 17 00:00:00 2001
From: alhendrickson <159636032+alhendrickson@users.noreply.github.com.>
Date: Wed, 30 Jul 2025 15:43:36 +0000
Subject: [PATCH 01/10] docs: Migrate existing public docs into readthedocs and
git
---
docs/index.md | 19 +-
docs/overview/CogStack Documentation.md | 23 ++
.../CogStack Product Documentation.md | 18 +
docs/overview/CogStack ecosystem (v1).md | 198 +++++++++++
docs/overview/Data pipelines.md | 81 +++++
docs/overview/Elasticsearch.md | 52 +++
docs/overview/Natural Language Processing.md | 311 ++++++++++++++++++
docs/overview/Server specification guide.md | 4 +
docs/overview/_index.md | 11 +
.../09a8bb60-9864-41fa-be7b-cf9a9dc04498.png | Bin 0 -> 105160 bytes
.../36c0d23f-a632-4fbf-9f7c-6669e88bbd39.png | Bin 0 -> 14521 bytes
.../43c14755-e565-4ae0-a0a3-ec6dc18a691c.png | Bin 0 -> 776322 bytes
.../54bb85e8-0428-4a56-a702-fd359272ed6e.png | Bin 0 -> 776322 bytes
.../5503ea0e-ac74-40ba-936a-1287ad3f1cf5.png | Bin 0 -> 80834 bytes
.../b5fc6b57-faf2-4747-9e77-eb9adf51d8b3.jpg | Bin 0 -> 91809 bytes
.../df995677-ab49-4f74-ab65-a160882b23a6.jpg | Bin 0 -> 85125 bytes
.../e4aa0fa4-04c2-4811-96e7-cad849e60b07.jpg | Bin 0 -> 315587 bytes
.../f7a03376-ae0e-4980-929a-e3897da5d186.jpg | Bin 0 -> 213082 bytes
18 files changed, 713 insertions(+), 4 deletions(-)
create mode 100644 docs/overview/CogStack Documentation.md
create mode 100644 docs/overview/CogStack Product Documentation.md
create mode 100644 docs/overview/CogStack ecosystem (v1).md
create mode 100644 docs/overview/Data pipelines.md
create mode 100644 docs/overview/Elasticsearch.md
create mode 100644 docs/overview/Natural Language Processing.md
create mode 100644 docs/overview/Server specification guide.md
create mode 100644 docs/overview/_index.md
create mode 100644 docs/overview/attachments/09a8bb60-9864-41fa-be7b-cf9a9dc04498.png
create mode 100644 docs/overview/attachments/36c0d23f-a632-4fbf-9f7c-6669e88bbd39.png
create mode 100644 docs/overview/attachments/43c14755-e565-4ae0-a0a3-ec6dc18a691c.png
create mode 100644 docs/overview/attachments/54bb85e8-0428-4a56-a702-fd359272ed6e.png
create mode 100644 docs/overview/attachments/5503ea0e-ac74-40ba-936a-1287ad3f1cf5.png
create mode 100644 docs/overview/attachments/b5fc6b57-faf2-4747-9e77-eb9adf51d8b3.jpg
create mode 100644 docs/overview/attachments/df995677-ab49-4f74-ab65-a160882b23a6.jpg
create mode 100644 docs/overview/attachments/e4aa0fa4-04c2-4811-96e7-cad849e60b07.jpg
create mode 100644 docs/overview/attachments/f7a03376-ae0e-4980-929a-e3897da5d186.jpg
diff --git a/docs/index.md b/docs/index.md
index 6402543..c312a9b 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,15 +1,26 @@
-# Cogstack Platform Toolit
+# Cogstack Documentation
-This project provides utilities for running Cogstack in production.
-- [CogStack Observability](observability/_index.md)
+CogStack is composed of a range of adaptable modular interoperable tools which introduce tiered functionality which can be used for a variety of use-technologies:
+
+Centralise and lake clinical data including structured data i.e. observations, results, and unstructured data i.e. clinical narratives such as clinic letters, discharge and admission summaries and radiology reports also varying formats e.g. binary word docs, PDFs, images.
+
+Search and visualise millions of distinct data points in near-real-time – ‘unlocking’ capabilities that would otherwise have taken days or months previously.
+
+Natural Language Processing of clinical text to standardised clinical terminologies (SNOMED-CT) for interoperable clinical data combined with semantic context. This allows cohorting based on “find all patients with a heart attack”, regardless of how this has been referred to in the clinical text, such as “patient had myocardial infarct”, “MI“, “infarct of heart”, “cardiac infarct” and distinguishing “the patient’s father had a MI”.
+
+Deep phenotyping using NLP allows accelerated NHS clinical coding, disease registry submissions and advanced cohorting for observational studies.
+
+Population health dashboards for combining data from structured and text components of the electronic health record to track patient outcomes, enhance patient safety and improve patient care.
+
+Advanced analytics using generative AI for virtual trial emulation, high-dimensional patient or disease modelling and digital patient twins.
```{toctree}
:hidden:
+overview/_index
observability/_index
```
-
diff --git a/docs/overview/CogStack Documentation.md b/docs/overview/CogStack Documentation.md
new file mode 100644
index 0000000..ed4cfa6
--- /dev/null
+++ b/docs/overview/CogStack Documentation.md
@@ -0,0 +1,23 @@
+
+
+
+# CogStack Documentation
+
+# What is CogStack?
+
+CogStack is a lightweight distributed, fault tolerant database processing architecture and ecosystem, intended to make NLP processing and preprocessing easier in resource constrained environments. It comprises of multiple components, and has been designed to provide configurable data processing pipelines for working with EHR data. For the moment it mainly uses databases and files as the primary source of EHR data with the possibility of adding custom data connectors in the near future. It makes use of the [Apache-Nifi](https://nifi.apache.org/) framework in order to provide a fully configurable data processing pipeline with the goal of generating annotated JSON standardised schema files that can be readily indexed into [ElasticSearch](https://www.elastic.co/), stored as files or pushed back to a database.
+
+
+
+The CogStack ecosystem has been developed as an open source project with the code available on GitHub: [https://github.com/CogStack/](https://github.com/CogStack/CogStack-Pipeline) .
+
+> [!IMPORTANT]
+> ### Tip
+>
+> Starting from version 1.2 CogStack is preferably being run as an ecosystem using a set of different microservices and deployed using [Docker Compose](https://docs.docker.com/compose/). The ready-to-use CogStack images are available to pull directly from the official Docker Hub under [cogstacksystems](https://hub.docker.com/u/cogstacksystems/) organisation. We’re actively pursuing running the stack in a K8s cluster also.
+
+# Why does this project exist?
+
+The CogStack consists of a range of technologies designed to to support modern, open source healthcare analytics within the NHS, and is chiefly comprised of the Elastic stack ([ElasticSearch](https://www.elastic.co/products/elasticsearch), [Kibana](https://www.elastic.co/products/kibana), etc.), [MedCAT](https://github.com/CogStack/MedCAT) (clinical natural language processing for named entity extraction and linking), clinical text [OCR](https://github.com/CogStack/ocr-service), clinical text de-identification. Since the processed EHR data can be represented and stored in databases or ElasticSearch, CogStack can be perfectly utilised as one of the solutions for integrating EHR data with other types of biomedical, -omics, wearables data, etc.
+
+---
\ No newline at end of file
diff --git a/docs/overview/CogStack Product Documentation.md b/docs/overview/CogStack Product Documentation.md
new file mode 100644
index 0000000..ea652dd
--- /dev/null
+++ b/docs/overview/CogStack Product Documentation.md
@@ -0,0 +1,18 @@
+
+
+
+# CogStack Product Documentation
+
+Welcome to the CogStack Documentation site.
+
+Any broad questions then please do reach out in our community space [here](https://discourse.cogstack.org/)
+
+Further in development projects are [here](https://github.com/orgs/CogStack/repositories)
+
+
+
+| | |
+|:--------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------|
+| [CogStack-Nifi](https://cogstack-nifi.readthedocs.io/en/latest/main.html)
 | [MedCAT](https://medcat.readthedocs.io/en/latest/)

|| | |
+|:-----------------------------------------------------------------------------------------------------------------------------------|:------|
+| [MedCATTrainer](https://medcattrainer.readthedocs.io/en/latest/)
 |
|
diff --git a/docs/overview/CogStack ecosystem (v1).md b/docs/overview/CogStack ecosystem (v1).md
new file mode 100644
index 0000000..da11ded
--- /dev/null
+++ b/docs/overview/CogStack ecosystem (v1).md
@@ -0,0 +1,198 @@
+
+
+
+# CogStack ecosystem (v1)
+
+| | |
+|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Overview
In this part are covered the available services that can be running in an example CogStack deployment. To such deployment with many running services we refer as an *ecosystem* or a *platform*. Below is presented a high-level perspective of CogStack platform with the possibilities it enables through many components and services.
[]()
In practice, many of the functionalities that CogStack platform enables are implemented as separate, but interconnected services working inside the ecosystem.
| > [!NOTE] **On this page :**
|
+
+---
+
+---
+
+# Core services
+
+In most scenarios CogStack platform will consist of *core* services tailored to specific use-cases. Additional application and services can be run on top of it, such as [SemEHR](../../CogStack%20General/CogStack%20Wiki/CogStack%20projects/SemEHR.md), [Patient Timeline](../../CogStack%20General/CogStack%20Wiki/CogStack%20projects/Patient%20Timeline.md), Live Alerting (through ElasticSearch plugins) or any other custom developed applications. For an ease-of-use, when deploying a sample CogStack platform, we always emphasise to use Docker Compose (see: [Running CogStack](Running%20CogStack.md)).
+
+Below is presented is one of the most simple and common scenarios when ingesting and processing the EHR data from a proprietary data source.
+
+
+
+A CogStack platform presented here consists of such core services:
+
+- *CogStack Pipeline* service for ingesting and processing the EHR data from the source database,
+- *CogStack Job Repository* (PostgreSQL database) serving for job status control,
+- *ElasticSearch* sink where the processed EHR records are stored,
+- (optional) *Kibana* user interface to easily perform exploratory data analysis over the processed records.
+
+It is essential to note that presented is a very simplified scenario, which can be easily deployed even on a local machine with limited resources. We are also using here an optional Kibana as an out-of-the-box and easy to use solution to explore the data, although many other data analysis or BI tools can be used. Moreover, there are also available connectors to ElasticSearch in many languages, such as Java, Python, R or JavaScript allowing for fast development of custom user applications.
+
+> [!TIP]
+> Note
+>
+>
+>
+> In the picture we only presented ElasticSearch using a single node. However, in practice, one should consider using at least 3 ElasticSearch nodes deployed as a cluster which greatly improves resilience, query performance and reliability.
+>
+> Similarly, in the picture we only presented one CogStack Pipeline instance and only one data source. However, in practice, there may be multiple sources available with multiple Pipeline components running in parallel. This is why, when considering deploying CogStack platform in production, one should keep in mind the aspects of the scalability and resilience of the platform and running services.
+
+---
+
+---
+
+# CogStack Pipeline
+
+CogStack Pipeline is the main data processing service used inside the CogStack platform. Within the ecosystem it's main responsibilities is to ingest the EHR data from a specified data source, process the data (e.g. by applying the text extraction methods, records de-identification or extracting the NLP annotations) and store the resulting data in the specified sink.
+
+Usually, the sink will be the ElasticSearch store, keeping the processed EHRs which can be ready to use by other applications. However, when performing computationally-expensive processing tasks, such as running OCR-based text extraction from the documents, one may prefer to store the partial results in a cache. In such case, PostgreSQL can be used as a temporary store – [Examples](Examples.md) covers such case.
+
+The information about available data processing components offered by CogStack Pipeline can be found in [CogStack Pipeline](CogStack%20Pipeline.md) part.
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> We recommend using CogStack Pipeline component in the newest version 1.3.0.
+
+---
+
+---
+
+#
+
+# PostgreSQL
+
+[PostgreSQL](https://www.postgresql.org/) is a widely used object-relational database management system. In CogStack platform it is primarily used as a job repository, for storing the jobs execution status of running CogStack Pipeline instances. However, there may be cases where one may need to store the partial results treating PostgreSQL DB either as a data cache (see: [Examples](Examples.md) ) or an auxiliary data sink.
+
+When used as a job repository, it requires defining appropriate tables with a user that will be used by CogStack Pipeline running instance(s). This schema is defined by [Spring Batch META-DATA schema definition](https://docs.spring.io/spring-batch/trunk/reference/html/metaDataSchema.html) and is also available in `CogStack-Pipeline/examples/docker-common/pgjobrepo/create_repo.sh` script.
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> We recommend using PostgreSQL in versions >= 10.
+>
+> In the [Examples](Examples.md) part we use PostgreSQL in version 11.1.
+
+> [!WARNING]
+> Note
+>
+>
+>
+> PostgreSQL by default has a connection limit of 100. Since a single CogStack Pipeline instance using multiple processing threads uses a connection pool both for retrieving the EHR data from the database source and to update the job repository, one may need to increase the default connection limit with the available memory buffers. To do so, one may specify parameters: `"-c 'shared_buffers=256MB' -c 'max_connections=1000'"` when initialising the database.
+
+---
+
+---
+
+# ElasticSearch
+
+[ElasticSearch](https://www.elastic.co/guide/) is a popular NoSQL search engine based on the Lucene library that provides a distributed full-text search engine storing the data as schema-free JSON documents. Inside CogStack platform it is usually used as a primary data store for processed EHR data by CogStack Pipeline.
+
+Depending on the use-case, the processed EHR data is usually stored in indices as defined in corresponding CogStack Pipeline job description property files (see: [CogStack Pipeline](CogStack%20Pipeline.md)). Once stored, it can be easily queried either by using the own's REST API (see: [ElasticSearch Search API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html)), queried using [Kibana](#kibana) or queried using a ElasticSearch connector available in many programming languages. ElasticSearch apart from standard functionality and features provided in its open-source free version also offers more advanced ones distributed as [Elastic Stack](https://www.elastic.co/products/stack) (formerly: X-Pack extension) which require license. These include modules for machine learning, alerting, monitoring, security and more.
+
+> [!TIP]
+> Info
+>
+>
+>
+> In our [Examples](Examples.md) we use the free, open-source version of ElasticSearch without the Elastic Stack modules included. It needs to be noted that in cases when one requires a secure and/or granular access to the processed EHR data in ElasticSearch sink, one should explore the [Security](https://www.elastic.co/guide/en/x-pack/current/elasticsearch-security.html) module (formerly: Shield) offered in the Elastic Stack. Some of the features include (as stated the official website):
+>
+> - Preventing unauthorised access with password protection, role-based access control (even per index- or single document-level), and IP filtering.
+> - Preserving the integrity of your data with message authentication and SSL/TLS encryption.
+> - Maintaining an audit trail so one know who’s doing what to your cluster and the data it stores.
+>
+> CogStack Pipeline fully supports the functionality provided by the ElasticSearch Security module used to securely access the node(s).
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> In our [Examples](Examples.md) we use a simple, single-node ElasticSearch deployment. However, in practice, one should consider using at least 3 ElasticSearch nodes deployed as a cluster which greatly improves resilience, query performance and reliability.
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> We recommend using ElasticSearch in versions >= 6.0.
+
+> [!WARNING]
+> Note
+>
+>
+>
+> If ElasticSearch service does not start up and such error is reported:
+>
+> > elasticsearch | ERROR: [1] bootstrap checks failed
+> >
+> > elasticsearch | [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
+>
+> one may need to increase the number of available file descriptors on the **host** machine – please refer to:
+
+> [!WARNING]
+> Note
+>
+>
+>
+> If ElasticSearch service does not start up and such error is reported:
+>
+> > elasticsearch | ERROR: [1] bootstrap checks failed
+> >
+> > elasticsearch | [1]: max virtual memory areas vm.max\_map\_count [65530] is too low, increase to at least [262144]
+>
+> one may need to increase the number of available virtual memory on the **host** machine – please refer to:
+
+---
+
+---
+
+# Kibana
+
+[Kibana](https://www.elastic.co/products/kibana) is a data visualisation module for ElasticSeach that be easily used to explore and query the data. In sample CogStack platform deployments it can be used as a ready-to-use data exploration tool.
+
+Apart from providing exploratory data analysis functionality it also offers administrative options over the ElasticSearch data store, such as adding/removing/updating the documents using command line or creating/removing indices. Moreover, custom user dashboards can be created according to use-case requirements. For a more detailed description of the available functionality please refer to the [official documentation](https://www.elastic.co/guide/en/kibana/current/introduction.html).
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> In all our [Examples](Examples.md) we provide ElasticSearch bundled with Kibana.
+
+---
+
+---
+
+# NGINX
+
+NGINX is a popular, open-source web server that can also be used as a reverse proxy, load balancer, HTTP cache and more. In CogStack platform deployments, it can be used as a reverse-proxy and providing a basic security access to the exposed data stores and service endpoints. Some of the functionality may include general user-based authentication, IP filtering and selective service access. A more detailed description of security features offered by NGINX can be found in the [official documentation](https://docs.nginx.com/nginx/admin-guide/security-controls/).
+
+[Examples](Examples.md) covers a simple use-case with NGINX serving as a basic authentication module. The example configuration of NGINX running as a proxy can be found in `CogStack-Pipeline/examples/docker-common/nginx/config/` directory.
+
+> [!IMPORTANT]
+> Info
+>
+>
+>
+> It needs to be noted, however, that the security and granularity of access to the data stored in ElasticSearch offered by NGINX is inferior to using the [Security](https://www.elastic.co/guide/en/x-pack/current/elasticsearch-security.html) module from Elastic Stack.
+
+---
+
+---
+
+# Fluentd
+
+[Fluentd](https://www.fluentd.org/) is an open source data collector providing a unified logging layer. In sample CogStack platform deployments it can be used running as a service collecting the logs from all the running services which can be used for auditing.
+
+Fluentd provides a highly configurable and flexible set of rules, filters and plugins that can be used to set the logging for any running service inside the platform. The [official Fluentd documentation](https://docs.fluentd.org/v1.0/articles/quickstart) covers many Fluentd examples with detailed description.
+
+[Examples](Examples.md) covers a simple use-case with using Fluentd for logging. The example configuration file can be found in `CogStack-Pipeline/examples/docker-common/fluentd/conf/` directory.
+
+---
+
+---
diff --git a/docs/overview/Data pipelines.md b/docs/overview/Data pipelines.md
new file mode 100644
index 0000000..5a89be1
--- /dev/null
+++ b/docs/overview/Data pipelines.md
@@ -0,0 +1,81 @@
+
+
+
+# Data pipelines
+
+# Introduction
+
+This page covers the data pipelines used in CogStack ecosystem.
+
+> [!WARNING]
+> Please note that CogStack-Pipeline was the initial implementation of CogStack platform and this pipeline engine is being deprecated – we are moving forward with porting the existing pipeline functionality using Apache NiFi as the main data processing engine (see below: **CogStack-NiFi**).
+
+# CogStack-Pipeline
+
+## Overview
+
+CogStack-Pipeline is an application for executing data pipelines for performing EHR data ingestion from databases to ElasticSearch (primarily) or other databases. It implements a fixed set of ETL operations including extraction of text from binary documents using Apache Tika, running NLP applications based on [GATE NLP suite](https://gate.ac.uk/) and a custom de-identification application based on text scrubbing. It was build in Spring Batch and implements only a document-oriented data processing model. For a complete description on CogStack-Pipeline please refer to [the official documentation](https://cogstack.atlassian.net/wiki/spaces/COGDOC).
+
+> [!IMPORTANT]
+> The latest version of CogStack Pipeline is 1.3.1.
+
+## Key resources
+
+- Documentation: [https://cogstack.atlassian.net/wiki/spaces/COGDOC](/wiki/spaces/COGDOC)
+- Deployment examples: [Examples](Examples.md)
+- GitHub:
+- DockerHub:
+
+# CogStack-NiFi
+
+## Overview
+
+| | |
+|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------|
+| CogStack-NiFi is the re-architected version of CogStack-Pipeline that replaces the fixed Spring Batch-based pipeline engine with [Apache NiFi](https://nifi.apache.org/). It focuses on fully configurable and scalable data flows with the data processing engine that is easy to use, deploy and tailor to any site-specific data flow requirements. Apache NiFi also comes in with build-in monitoring, data provenance and security features that puts the operations in better control and reliability.
**CogStack-NiFi useful links:**
**Apache NiFi resources:**
|  |
+
+> [!IMPORTANT]
+> Please note that CogStack-NiFi project is still under active development with the newest version **0.1.0**.
+
+## **Apache NiFi – overview**
+
+*From the official documentation:* Apache NiFi is a dataflow system based on the concepts of flow-based programming. It supports powerful and scalable directed graphs of data routing, transformation, and system mediation logic. NiFi has a web-based user interface for design, control, feedback, and monitoring of dataflows. It is highly configurable along several dimensions of quality of service, such as loss-tolerant versus guaranteed delivery, low latency versus high throughput, and priority-based queuing. NiFi provides fine-grained data provenance for all data received, forked, joined cloned, modified, sent, and ultimately dropped upon reaching its configured end-state.
+
+Some of the key features of Apache NiFi engine are:
+
+- Highly configurable and extendable
+
+ - Can build own data processors and modules that can be easily integrated into data pipeline
+ - Enables rapid prototyping, development and effective testing
+ - Data flows can be modified, inspected and troubleshoot at runtime
+- Web-based user interface
+
+ - Seamless experience between design, control, feedback, and monitoring of the data flows
+- Data Provenance
+
+ - Can track data flow from beginning to end for addressing information governance requirements
+- Security
+
+ - Support for SSL, SSH, HTTPS, encrypted content, etc.
+ - Multi-tenant authorization and internal authorization/policy management
+
+For a detailed description of Apache NiFi, it’s functionality and broad set of features please refer to [the official documentation](https://nifi.apache.org/docs.html) and [the official Apache NiFi website](https://nifi.apache.org/).
+
+## Major changes from CogStack-Pipeline
+
+There are some key major changes when using and deploying Apache NiFi as compared with CogStack-Pipeline.
+
+One of the most important changes is the way how defining, configuring and monitoring data flows works. When using CogStack-Pipeline the ingestion jobs were defined in `.properties` files and were having very limited job execution monitoring and troubleshooting possibilities. Apache NiFi implements (an optional) web-based user interface that can be used to define data flows on drag-and-drop fashion with further configuration and monitoring capabilities. The data flow definitions can be saved and exported into XML format and later loaded into other instances of Apache NiFi or just kept under version control.
+
+Each ingestion job that is being run by CogStack-Pipeline also requires a separate CogStack-Pipeline application instance. In Apache NiFi multiple data flows can be run in parallel each being managed by a single, main Apache NiFi data processing engine instance.
+
+Moreover, one of the main limitations of CogStack pipeline has been support only for a document-centric data model for performing ingestion where each ingested record could only contain one document to be processed. Apache NiFi does not enforce document-centric data model and provides flexibility on defining custom data flows and data schemas. Handling multiple documents in a single record or using a patient-centric data model is a matter of tailoring the pipeline and defining or tailoring appropriate schema.
+
+Moreover, fixed ETL operations (implemented as modules in CogStack-Pipeline) can be included as custom ETL scripts or application modules inside a defined Apache NiFi data flow. For example, the text extraction done by [Apache Tika](https://tika.apache.org/) and NLP functionality (such as running [MedCAT](https://github.com/CogStack/MedCATservice) or [GATE NLP](https://github.com/CogStack/gate-nlp-service) applications was implemented as external micro-services exposing that expose a REST API and hence can be used directly in the data flow. All the third-party application dependencies are handled by the external services that further allows for separating the responsibilities.
+
+> [!IMPORTANT]
+> Please note that the recommended minimal resources requirements for running Apache NiFi will be higher than for CogStack-Pipeline and these will depend on the actual use-case.
+
+## Example deployment and services
+
+Please see [CogStack-NiFI example deployment with workflow examples](https://github.com/CogStack/CogStack-NiFi/tree/devel/deploy) .
diff --git a/docs/overview/Elasticsearch.md b/docs/overview/Elasticsearch.md
new file mode 100644
index 0000000..690984c
--- /dev/null
+++ b/docs/overview/Elasticsearch.md
@@ -0,0 +1,52 @@
+
+
+
+# Elasticsearch
+
+# Introduction
+
+In CogStack the Elasticsearch ecosystem is being used extensively. It plays a key role of being the main data store and one of the key analytics tools able to fast query the free-text data.
+
+# Elasticsearch
+
+[Elasticsearch](https://www.elastic.co/guide/) is a leading NoSQL search engine based on the Lucene library that provides a distributed full-text search engine storing the data as schema-free JSON documents. Inside CogStack platform it is usually used as a data store for processed EHR free-text and annotation data.
+
+Depending on the use-case, the processed EHR data is usually stored in indices as defined in data pipeline jobs. Once stored, it can be easily queried either by using the own's REST API (see: [ElasticSearch Search API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html)), queried using [Kibana](https://cogstack.atlassian.net/wiki/pages/resumedraft.action?draftId=17006639#CogStackplatform-platform-kibana) or queried using a ElasticSearch connector available in many programming languages. Elasticsearch apart from standard functionality and features provided in its open-source free version also offers more advanced ones distributed as [Elastic Stack](https://www.elastic.co/products/stack) (formerly: X-Pack extension) which require license. These include modules for machine learning, alerting, monitoring, advanced security and more.
+
+**Key resources:**
+
+- the official [practical introduction to Elasticsearch](https://www.elastic.co/blog/a-practical-introduction-to-elasticsearch)
+- the official [Elasticsearch documentation](https://www.elastic.co/guide/)
+- the official [Elasticsearch use-case examples](https://github.com/elastic/examples)
+
+# OpenDistro for Elasticsearch distribution
+
+[OpenDistro for Elasticsearch](https://opendistro.github.io/for-elasticsearch/) is a fully open-source, free and community-driven fork of Elasticseach. It implements many of the X-pack components functionality, such as advanced security module, alerting module or SQL support. Nonetheless, the standard core functionality and APIs the official Elasticsearch and OpenDistro remain the same. Hence OpenDistro can be used as a drop-in replacement.
+
+**Key resources:**
+
+- [the official website](https://opendistro.github.io/for-elasticsearch/)
+- the official [OpenDistro for Elasticsearch documentation](https://opendistro.github.io/for-elasticsearch-docs/)
+
+> [!TIP]
+> For example use and deployment of CogStack with Elasticsearch please see the tutorial: [CogStack using Apache NiFi Deployment Examples](https://github.com/CogStack/CogStack-NiFi/tree/devel/deploy)
+
+# Kibana
+
+[Kibana](https://www.elastic.co/products/kibana) is a data visualisation application for Elasticsearch that be easily used to explore and query the data. In sample CogStack platform deployments it can be used as a ready-to-use data exploration tool.
+
+Apart from providing exploratory data analysis functionality it also offers administrative options over the ElasticSearch data store, such as adding/removing/updating the documents using command line or creating/removing indices. Moreover, custom user dashboards can be created according to use-case requirements. For a more detailed description of the available functionality please refer to the [official documentation](https://www.elastic.co/guide/en/kibana/current/introduction.html).
+
+Below is presented an example dashboard.
+
+
+
+# Security
+
+OpenDistro implements many of the commercial X-Pack components functionality, such as advanced security module, alerting module or SQL support. Some of the features include:
+
+- Preventing unauthorised access with password protection, role-based access control (even per index- or single document-level), and IP filtering.
+- Preserving the integrity of your data with message authentication and SSL/TLS encryption.
+- Maintaining an audit trail so one know who’s doing what to your cluster and the data it stores.
+
+The security aspects and configuration are covered extensively in [the official OpenDistro for Elasticsearch documentation](https://opendistro.github.io/for-elasticsearch-docs/).
diff --git a/docs/overview/Natural Language Processing.md b/docs/overview/Natural Language Processing.md
new file mode 100644
index 0000000..d4c8064
--- /dev/null
+++ b/docs/overview/Natural Language Processing.md
@@ -0,0 +1,311 @@
+
+
+
+# Natural Language Processing
+
+# Overview
+
+CogStack ecosystem provides a standard set of natural language processing applications that are used either as standalone applications or implemented as RESTful services with uniform API, each running in a Docker container. These NLP applications when used inside the data processing pipeline cover one of the key steps of information extraction. These NLP applications may include extracting medical concepts from free-text notes using a specific terminology, such as [SNOMED CT](https://en.wikipedia.org/wiki/SNOMED_CT) or using all the terminologies as available in [UMLS](https://www.nlm.nih.gov/research/umls/index.html). Often, more specialised applications will be built on top of the standard set of NLP applications provided in CogStack, utilising both structured and unstructured information tailored to a defined use-case. These custom applications can be further integrated into CogStack and used as a part of standard set of NLP applications.
+
+> [!TIP]
+> Please see [CogStack using Apache NiFi Deployment Examples](https://github.com/CogStack/CogStack-NiFi/tree/devel/deploy) to see how to integrate NLP services in example data pipelines.
+
+> [!TIP]
+> Apart from being integrated directly in the data processing pipeline, many NLP applications are often used as standalone applications and have a rich set of tools build around them – please see below for more details.
+
+# MedCAT - Medical Concept Annotation Tool
+
+## Overview
+
+One of the key tools is MedCAT – a Medical Concept Annotation Tool that is used for Named Entity Recognition and Linking (NER+L) tasks for clinical concepts from free-text documents.
+
+| | |
+|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------|
+| MedCAT is based on a light-weight neural network that calculates vector embeddings and that is used for disambiguation and concept detection. MedCAT also uses Deep Learning Language Model that is used for detection of negation, experiencer or any other type of classification.
MedCAT can utilise a concepts dictionary with a vocabulary provided by the end-user that will be used to perform annotate the concepts in the clinical notes. The provided concepts dictionary can be e.g., SNOMED CT terminology or full/ subset of UMLS resource. Apart from providing the vocabulary and concepts dictionary, the underlying MedCAT model can be further trained and fine-tuned for performing context-aware concept disambiguation with additional meta-annotations tasks. MedCAT be run also directly with pre-trained models.
**MedCAT** can be used either as a standalone Python module, as a part of a model trainer application **MedCAT Trainer** or be deployed as a RESTful **MedCAT Service** inside a data processing pipeline. Below are briefly covered possible ways of working with MedCAT.
|  |
+
+> [!WARNING]
+> Please note that we only provide few basic models for MedCAT that have been prepared using open datasets. Some of the used models are restricted by the external licensing of the resource that was used to build it, such as SNOMED CT or UMLS. In such cases, the user needs to apply for an appropriate license – please see: [UMLS licensing](https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/release/license_agreement.html) and [SNOMED CT licensing](http://www.snomed.org/snomed-ct/get-snomed).
+
+> [!IMPORTANT]
+> When deploying MedCAT into data processing pipelines one may be interested in training and tailoring the MedCAT models as a part of model preparation. This can be done directly by using MedCAT Trainer or MedCAT library working with a corpus of input documents. Such trained model can be in the next step provided into MedCAT Service that will be deployed as a service and used in the data pipeline.
+
+## MedCAT Python module
+
+Key resources:
+
+- GitHub repository with code and documentation:
+- MedCAT publication:
+- Tutorial on MedCAT: [MedCAT – Analysing Electronic Health Records](https://towardsdatascience.com/medcat-introduction-analyzing-electronic-health-records-e1c420afa13a) (in a series of articles)
+- PIP repository:
+
+> [!TIP]
+> The MedCAT Python library is the functional core of MedCAT project. The library is used by MedCAT Trainer when training and updating the models. It is also used within the MedCAT Service that exposes the medical concepts extraction functionality.
+
+## MedCAT Trainer
+
+| | |
+|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------|
+| MedCAT Trainer is an interface for building, improving and customising a given Named Entity Recognition and Linking models for biomedical domain text.
The models trained by MedCAT Trainer can be later used directly with custom Python applications using on MedCAT module. Alternatively, the models can be deployed in data pipelines, e.g. behind a RESTful API via MedCAT Service.
**Key resources:**
| 
|
+
+## MedCAT Service
+
+MedCAT Service implements a RESTful API over MedCAT module to perform extraction of concepts from provided text. Usually, a single instance of MedCAT Service will be serving a single MedCAT model. Such model can be later deployed in data processing pipelines. The API specification is provided in the sections below.
+
+Key resources:
+
+- GitHub repository with code, documentation and use examples:
+
+> [!TIP]
+> Please note that there is available public MedCAT model trained on MedMentions corpus that can be used to play with.
+
+# GATE NLP applications
+
+## Overview of GATE NLP suite
+
+[GATE NLP suite](https://gate.ac.uk/) is a well established and rich set of open-source technologies implementing full-lifecycle solution for text processing. The GATE ecosystem is very broad and outside of the scope of this documentation – here we will only focus on two applications:
+
+- [GATE Developer](https://gate.ac.uk/family/developer.html),
+- [GATE Embedded](https://gate.ac.uk/family/embedded.html).
+
+GATE Developer is a development environment that provides a large set of graphical interactive tools for the creation, measurement and maintenance of software components for natural language processing. It allows to design, create and run NLP applications using an intuitive user interface. These applications can be later exported as a custom *gapp* or *xgapp* application with the used resources.
+
+GATE Embedded, on the other hand, is an object-oriented framework (or class library) implemented in Java. It is used in all GATE-based systems, and forms the core (non-visual) elements of GATE Developer. In principle, it implements the runtime for executing GATE applications. It allows to run the *gapp* and *xgapp* applications that have been previously created in GATE Developer.
+
+> [!IMPORTANT]
+> When deploying GATE applications within CogStack one may be interested in defining and tailoring custom GATE applications directly by using GATE Developer. Such prepared application can be in the next step provided into CogStack **GATE NLP Runner Service** that uses GATE Embedded to execute GATE applications. This way, provided NLP application can be deployed as a service and used in the data pipeline.
+
+Although there have been developed and published many applications in GATE NLP suite, in this page we only briefly cover Bio-YODIE.
+
+## Bio-YODIE
+
+Bio-YODIE is a named entity linking system derived from GATE YODIE system. It links mentions in biomedical text to their referents in the UMLS. It defines a broad set of types such as `Disease` , `Drug`, `Observation` and many more all of the types belonging to `Bio` group – for detailed information please refer to [the official documentation](https://gate.ac.uk/applications/bio-yodie.html).
+
+Bio-YODIE can be run either within GATE Developer application or as a service within CogStack (based on GATE Embedded and running as a Service). Here we primarily focus on the latter and refer the reader to the official Bio-YODIE website.
+
+**Key resources:**
+
+- The official website:
+- GitHub repository with application code:
+- GitHub repository with code to prepare UMLS resources for Bio-YODIE:
+
+> [!WARNING]
+> Please note that Bio-YODIE requires resources to be prepared using UMLS. These are limited by individual license and cannot be openly shared.
+
+## GATE NLP Runner service
+
+CogStack implements a GATE NLP Runner service that serves the GATE NLP applications as a service exposing RESTful API. It is using GATE Embedded to execute the GATE applications that are provided either in *gapp* or *xgapp* format. The API specification is provided in the sections below.
+
+For more information please refer to the official GitHub with code and documentation:
+
+# NLP REST API
+
+CogStack defines a simple, uniform, RESTful API for free-text documents processing. It’s primary focus has been on providing an application independent and uniform interface for extracting entities from the free-text. The data exchange should be stateless and synchronous. The use-case is: given a document (or a corpus of documents) extract the recognised named entities with associated meta-data. This way, any NLP application can be used or any NLP model can be served in the data processing pipeline as long as it stays compatible with the interface.
+
+## REST API definition
+
+The API defines 3 endpoints, that consume and return data in JSON format:
+
+- *GET* `/api/info` - displays general information about the the NLP application,
+- *POST* `/api/process` - processes the provided single document and returns back the annotations,
+- *POST* `/api/process_bulk` - processes the provided list of documents and returns back the annotations.
+
+The full definition is available as [OpenAPI or Swagger](https://github.com/CogStack/gate-nlp-service/tree/devel/api-specs) specification.
+
+### GET `/api/info`
+
+Returns information about the used NLP application. The returned fields are:
+
+- `name`, `version`, `language` of the underlying NLP application
+- `parameters` – a generic JSON object representing any relevant parameters that have been specified to the application (optional)
+
+### POST `/api/process`
+
+Returns the annotations extracted from the provided document.
+
+The request message payload JSON consists of following objects
+
+- `content` that represents the single document content to be processed
+- `applicationParams` – a generic JSON object representing NLP application run-time parameters (optional)
+
+The single document processing `content` (\*\*\*) has following keys :
+
+- `text` – the document to be processed
+- `metadata` – a generic JSON object representing any relevant metadata associated with the document that will be consumed by the NLP application (optional)
+- `footer` – a generic JSON object representing a payload footer that will be returned back with the result (optional)
+
+The response message payload JSON consists of an object `result` that has following fields:
+
+- `text` – the input document that was processed (optional)
+- `annotations` – an array of generic JSON annotation objects, not enforcing any schema
+- `metadata` – a metadata associated with the processed document that was reported by the NLP application (optional)
+- `success` – boolean value indicating whether the NLP processing was successful
+- `timestamp` – document processing timestamp
+- `errors` – an array of NLP processor errors (present only in case when `success` is `false`)
+- `footer` – the footer object as provided in the request payload (present only when provided in the request message)
+
+### POST `/api/process_bulk`
+
+Returns the annotations extracted from a list of documents.
+
+The request message payload JSON consists of following objects
+
+- `content` – an array of documents content to be processed
+- `applicationParams` – a generic JSON object representing NLP application run-time parameters (optional)
+
+Here, the `content` object holds an array of single document content to be processed as defined above in (\*\*\*).
+
+## Example use
+
+> [!TIP]
+> Please see [CogStack using Apache NiFi Deployment Examples](https://github.com/CogStack/CogStack-NiFi/tree/devel/deploy) to see how to deploy example NLP services, i.e. MedCAT with a public MedMentions model and example GATE NLP Drug application.
+
+### MedCAT
+
+Assuming that the application is running on the `localhost` with the API exposed on port `5000`, one can run:
+
+```java
+curl -XPOST http://localhost:5000/api/process \
+ -H 'Content-Type: application/json' \
+ -d '{"content":{"text":"The patient was diagnosed with leukemia."}}'
+
+```
+
+and the received result:
+
+```java
+{
+ "result": {
+ "text": "The patient was diagnosed with leukemia.",
+ "annotations": [
+ {
+ "pretty_name": "leukemia",
+ "cui": "C0023418",
+ "tui": "T191",
+ "type": "Neoplastic Process",
+ "source_value": "leukemia",
+ "acc": "1",
+ "start": 31,
+ "end": 39,
+ "info": {},
+ "id": "0",
+ "meta_anns": {}
+ }
+ ],
+ "success": true,
+ "timestamp": "2019-12-03T16:09:58.196+00:00"
+ }
+}
+```
+
+### Bio-YODIE
+
+Bio-YODIE is being run as a service using CogStack GATE NLP Runner Service as described above. In this example Bio-YODIE application will only output annotations of `Disease` type from `Bio` group (defined in the service configuration file). Assuming that the service is running on the `localhost` with the API exposed on port `8095`, so one can run:
+
+```java
+curl --header "Content-Type: application/json" \
+ --request POST \
+ --data '{"content":{"text": "lung cancer diagnosis"}}' \
+ http://localhost:8095/api/process
+```
+
+and the received result:
+
+```java
+{
+ "result": {
+ "text": "lung cancer diagnosis",
+ "annotations": [
+ {
+ "end_idx": 11,
+ "set": "Bio",
+ "Negation": "Affirmed",
+ "Experiencer": "Patient",
+ "PREF": "Lung Cancer",
+ "end_node_id": "17",
+ "TUI": "T191",
+ "language": "",
+ "start_node_id": "16",
+ "type": "Disease",
+ "LABELVOCABS": "CHV,MEDLINEPLUS,MSH",
+ "CUIVOCABS": "MTH,CHV,MSH,SNOMEDCT_US,NCI,LCH_NW,OMIM,MEDLINEPLUS,COSTAR,NCI_CTRP-SDC",
+ "inst_full": "http://linkedlifedata.com/resource/umls/id/C0242379",
+ "inst": "C0242379",
+ "string_orig": "lung cancer",
+ "STY": "Neoplastic Process",
+ "start_idx": 0,
+ "id": 18,
+ "text": "lung cancer",
+ "Temporality": "Recent",
+ "tui_full": "http://linkedlifedata.com/resource/semanticnetwork/id/T191"
+ }
+ ],
+ "metadata": {
+ "document_features": {
+ "keyOverlapsOnly": false,
+ "gate.SourceURL": "created from String",
+ "docType": "generic",
+ "deleteNonNNPLookups": "true",
+ "lang": "en"
+ }
+ },
+ "success": true,
+ "timestamp": "2019-12-03T16:10:13.281+00:00"
+ }
+}
+```
+
+### Extra: a simple GATE-based drug names extraction application
+
+As an extra example, a simple application for extracting drug names from the free-text was developed in GATE Developer using ANNIE Gazetteer. It uses as an input the data downloaded from [Drugs@FDA database](https://www.accessdata.fda.gov/scripts/cder/daf/) and further refined giving a curated list of drugs and active ingredients. The application functionality is exposed using CogStack GATE NLP Runner Service.
+
+Similarly as in above, assuming that the application is running on the `localhost` with the API exposed on port `8095`, one can run:
+
+```java
+curl -XPOST http://localhost:8095/api/process \
+ -H 'Content-Type: application/json' \
+ -d '{"content":{"text":"The patient was prescribed with Aspirin."}}'
+
+```
+
+and the received result:
+
+```java
+{
+ "result": {
+ "text": "The patient was prescribed with Aspirin.",
+ "annotations": [
+ {
+ "end_idx": 39,
+ "majorType": "Drug",
+ "set": "",
+ "name": "ASPIRIN",
+ "start_idx": 32,
+ "language": "",
+ "id": 12,
+ "minorType": "ActiveComponent",
+ "text": "Aspirin",
+ "type": "Drug"
+ },
+ {
+ "end_idx": 39,
+ "majorType": "Drug",
+ "set": "",
+ "name": "ASPIRIN",
+ "start_idx": 32,
+ "language": "",
+ "id": 13,
+ "minorType": "Medication",
+ "text": "Aspirin",
+ "type": "Drug"
+ }
+ ],
+ "metadata": {
+ "document_features": {
+ "gate.SourceURL": "created from String"
+ }
+ },
+ "success": true,
+ "timestamp": "2019-12-04T09:51:32.246Z"
+ }
+}
+```
diff --git a/docs/overview/Server specification guide.md b/docs/overview/Server specification guide.md
new file mode 100644
index 0000000..548f30f
--- /dev/null
+++ b/docs/overview/Server specification guide.md
@@ -0,0 +1,4 @@
+
+
+
+# Server specification guide
diff --git a/docs/overview/_index.md b/docs/overview/_index.md
new file mode 100644
index 0000000..17dfcbb
--- /dev/null
+++ b/docs/overview/_index.md
@@ -0,0 +1,11 @@
+
+```{toctree}
+:maxdepth: 2
+CogStack Documentation.md
+CogStack ecosystem (v1).md
+CogStack Product Documentation.md
+Data pipelines.md
+Elasticsearch.md
+Natural Language Processing.md
+Server specification guide.md
+```
\ No newline at end of file
diff --git a/docs/overview/attachments/09a8bb60-9864-41fa-be7b-cf9a9dc04498.png b/docs/overview/attachments/09a8bb60-9864-41fa-be7b-cf9a9dc04498.png
new file mode 100644
index 0000000000000000000000000000000000000000..b50841ed306cc0e9da94a69177c0767f0fb4940f
GIT binary patch
literal 105160
zcmYgXbyyYM*X3SXKtTE;3L=Pvl1hhwbT>$Yq;yFLS5QE@L%LHMq*3XXZjkOS$?sg$
z_xJsQ4-d|nIkV4>wbx$bFE1;Ga|?D02?+^DLR>@<2?;p|{0w2Bfxo1r5{4roVe^>@
z3(HFg3scJ5S-&>3G)6)a_m5ITS6AvFPSOew6*Proh-21cKByPROcl*j{`OKF>T}2N
zg?tHh+ItHjQB=#-Jijyxh*6>6v}nnRC_cnkd#L40odiVtIBF+x=X2b364ya8+e+^g
z53*P5<6!YfZ*yoULpMR&M>JO2huO^H+DH((erSAC(2pp;SQZw1q)xqa=eN$}n!?q;
zC>PF5u04sE?&*FJp20i+<{KB0SsqPcQofU{+p#p?f^{4EX$F_G!M^N`5Y!H!G3UHT9^8ZBbr-YSV1j$f_HX
zIgTk!bNyMGU#lY|m&B;`k&rZe?1645DQXFKb8z_PSDVb9vG>xdLn%S(Fou9x=)8IZ
zGrRn^kfrPZVS}h+n(FXxzYVn5P&esl_+w+p?q{{*j(lHgU+}g6_GRxww~x@h2BR0v
zbFW-3QuJD;N~{`~sbo72gd#~u^GO4gM7UTa-KGMQ3Frqu3vJSOgeV2K5FE_CSKeJ%
zORI}@5lwIrA~tyy_~4#9kslHx9tx@8Eh$(mTB%n`MO7*Z|6|t|Na%h-XmiNunXhd`
z!t2B^HaO*xuDtwk9||u(m+IX^agTI;%Rfy(GP>LjmZ(d=+56cGakj(z6o1qG3at{^
z#WqK|-tC2dz*^{mi;i6H9C=Udz-Wg==r{(1La>8`qzsr@{77G7Q%%gHeZ9Z!E!M=1
zL~JreZ~{wcb9Vb~|APG2<6p$7i8j`GDe}CGo#Oqse+x%ei=VTQd?i|R_65HwCqHuXxvbkr}B-Tvg1u%{Z
zEQ{e=OvpEA2=o28EPL0^k6Zcc2UAJr7}X}P6Rg&c;s*=~na7{QK&^OzmAAYmsY7iv
zrAqxR?|7)#F0QAywQ974zfz%6$RLTR?mf?}O>!LdL6NfN_krEKXaraIr`VOD8=Rkh
zZ7yy?y*97YPTlJ>yROMGE(e^oe^Dd3N1&sj1$&H&HeI@XCAYes+2P*MM9O)D^tCva
zfoO%n;cLNzrXnA-DYLUC(pY42&if{Fx7`JiFwhnR+5ONv^lk<66MV5}iG?hCeMljV
ze6ONMk%OewJ}oV$`mJ4gj))mhw6r=x0@|K82C6PoJ7gjPQFO+
zDb+mZwz-dHYPy14r2ohCy;UQ2`i6?>^M9x{fat$21
z3GJJBS%`^)GWFJCNk98W=`E>qsQPkzJ8?(0Xmc$I;l$7Wg*^rNGRMpdS(zW)dwXhE
z2b~QXU0^!Jxxk$9^`w@^{D|WA{yAJGRA6O#v148!D?&icbT>O1}pX&gV1
zw_A)1h;5(Qa@i8t3hWV<1dR!8J_-{*d*~Ma^l^MM)l%3e333THiANHn5{VhO^m+8O
z^u6>{^pELZM7@Zzi{hhyr2Hk{A=jPOBAlsXX3>;2gg2lryv}<{q(O4~p=XwVJXMDJV8hJI@&OD9*J^t&O7Bn)iNc+Tp7iPyh8cO
zOee{$qzNthD05Mqlq~s!9EKc@A-18mA>4I#M={4rZaI$z*G$*?Gshz}m=TT?PF5>n
z5H!dxNEoKZ;mXkwuNu!N6THmZBiWN4@63K)VXA3Zo>pO35pA*cvnFS_P-dWV;P%L}
z8Ht(oD1Z92&=1pPcH$r@Es;qf9;uBXs&(~^V#iVkNyp>0^7X?t^NpHy+V$R{!Xdsd
zld^5Ast(Wid>g{wg}(cIW#;n}V;SSh&zO4s<*WO9I@TFFUiWm1M64TUnCj)uurKv4
zEiZ@9aLz)oZIF4q_t4m|pOGhUtWxB%4VXN1HtJ~irrse>`{?wsa*QyZli#V*G?UXT>_?5>RDp=UghFh+g#hF#l?AI;1
zF<9h3%%@SsQJo%f9kJYiZfI`!K2s+5{Ji#T_}TL}{*_6U_;sikcpPhMc&m*)=r6J2m4+U&woy2HyB<
zl})NS<2skPCAx+9eh|wOi)y2gqv#{;TS_9S!_a~29MlKD^*D4o={?|Iz03~rmaFW$
zm%LpvV))z8IdE&2<6!C3>fp_Z;c4dCn
zL}&|K3_4p@r(v&={k}M*KP5b6L~m=(XYSKn8`WznGO7wHk5sGFGGVz7_}{<(Q1zYG
zCoieqggMP}hS=J-Rrut8X#1e%BM?*^fG5T-nijV3U{r)Zur%<_OAZllQ>VlDRWX(k
zmO;aJ6moa(vo+XV9E`D)*cT`lIed8?JFmjnJvs7m^av<8cE5EH3jk{)rJ&v_x_>eB-YB-5n&^q|zO6cJ6tt
z%DqFvxjsV~LwvcqoIexHWj$d$h4h6XUGra78WvG^NA_J$8!lMisnuA!YPdRov~GdEIU8J&@OhPGS)x-K6@+iR@bd-
z&B*ec-1Zz(A%(X2{+5cC^_Ka09x3-|ON~!Yi5TB#FPB;_lv>l&g-d11W-evwM%%~e
zo|$#ak-vkfhc%=*W}bKU(Yqelm3$jRRXhNUl%U=k_1LK*~c_$4mO_r`f@y7QmbXoYi@o_x~-uRFd}K;
zb}T#L_C~kAp_SXW=FR!qxfHG!@&NMFcM_LN$KQ6ndwh9uhbby~Upe|XWn|pTO;(v5
z4IS^FiJcmAa+vzLOq-lV-N=1avk|*i(z#I6rk0eFK*!BuQ#xmK{rG3@%ph4dPki<>
z0Zz7G-96EJOob*t`gAx+?6$k#F8_`oaesQZcGY8Vm8MS$CuaKTsIG0T-Qx4A+2Hb;
zsuA6zuM;jk8=6X!W0eG>mqp19_znwGGRHk#RcTfg)3RSZPI@zVwg5t{-C3G)^ANbc
zT0zIUcjsO-?|{4V)!44>(N1OKjT=?J6(j_@4h@9$7gJgnz9aWliY#>~uGr@K7(58hxOD?`aqBd$RIj(bG`_kv
z-ws*xym)dly>dcx|4?A_YW4TtMRtaqcCv{(mB;w*@Ug{U)vh%zx*a;2$Xyn(cZ5xP
zLW6@4mols*f^bO6w{tS%wE3$?BqFvZQPjK1#q+^*B+f|ddel6vWwH<(B;tJ3P;&mR
z;N3k4lA|pdy|**R?|MaA5f|Js7^QI4p$k?Mv%(aYr=Ob(mQleMJ(u&R6{c=>#o}}d
zpr7D0R+o4!BZEW_e#bz9_?jW1fZrhC2L^tSkf15he}6&FNkRVa_o18rbV%GrLJ~xh
z5D`*#fox8r#}WeCM!B8_9FmoEC;t{LIRT}*5zy>SQiefG&rCo^&O{40E0
zz1?vSebJ#9lwL?sVoX9JqTH>?DxUqR$~Ri88duIjLhv&CmEL{}8XB6^*^|xjh0TeI
zuAj;FPCGMOgv7+$EiEmnqlXwzBo
zqx`ep;PMIK$mrPH+b6yZf^p%HKXcgM-#@+>Mu-wUmxOYx8lzbLbOD|Rttzy3`;6kJ2-(^LpdRQd&&%|1vd2jYF}QF
z#d~#z$=?_-O*Tpa~?){-`A~v+#
zZy_=Gz-;8Gt9LCK9rpu~pcr2%`~$dW
zvzFe@Oub~VPiNUhPR_-vQX`4gXY_lrxaY!ig7DTLa-K&CHZN99^Y5B%jTC;iZ^jqn
zTw7ZUG`{UK?~J&a4Fu-+11ofq8W`&*M*CVd7ReKb*WIzdE_Q$5rY7PJQ}-4$Z=7
zzcerocik*$<8GsHPOt~N_I)>c;&1G3C`lDA3+|Ni9tp<<74J#}9Nl}`Vz(13jyDtR
zCTE9h=gD`8a5NuBB-=qeL^#+LqNod&{cNWD0{}><_d$g4~YBo
zm-BWS&U@onjU`vPEJhe*e+H?C;i5d3rHPP+ObBsaY$(Xl3FFxmoE2vSkz32?+_u#D$XZ{lrsL@>P4yvJ;mR>^dL!
zc05YHs~PE^UVx9k{~BQr0tjtRQgNvQ;&*b0hxwOyPTRDDp69bZ!NHyHU%J{-TRXL?
z;unjjfFn*-@-{A|m*X0U|NOa&vm=d^G9QC-4i^H`@r*>yMa0`}{7@A~V+eIzVCPST
zxY#dRRokH_d$=fgHoBBtTwLXIibXp0ci(pUM76|BIlm4-xTz@E0+Hw`Ik1d)Xj2lO
zTjZa69O0O`ye7Q~Yjl~sQ`DbdB0&T&
z7FSkyR+8MTOiSsr(MG>$e`blff9oSVSiFO3%IKjh@(>S#B27RiAj$o@n{?%%Pr&)`
z;cz))s1C56f}ko!wAMs|^UT}cr|OD40@E
zAT5)`J06C)=6nC$YI~us3u0qYm=9@aJ`k&iE5Xl?HdgLB4k-k-(0k8&Vo>T8A_b*Y
zh|0C%3sMrp-@k_*jhiHYpv_2rcb5CZytc%2Ujt>6$aJQz+P;G(hLhx#4cxx-akdS8
zaeb;_FTS8&GH~Y?h;)ddG?$(HPSGw>If;N)+UC=zPv0*dS|hyNoH$eo-p7Bw*>9vm
zTM$J4{B?pV8~F~xWp48HCVs4dXM^kRH}qkaw!72}iwjabGrIS=#Mn>fXDYV&_2Q^s7&o^!k%x^%
z-|i(g9&&4opq*Xm02V{8NwP;Yb-wD!YomLAcOOU;Y9Yzx5tFXZ?G^MnF!Xh2K@F+6
zoSfQOC5QRp>QD2N?ddzSyf<%p^UnocF{nTs4y*FR6&7l=G}7H**Oa>~p;1wpU#gd3
znbz=3Nhztgg0m9C2QuJILF%K_i)s3zUHby-)8YECREK#i_X#fxC7K^(!yv_MFw49@
zMaaB2fh*kk-rwuNqCLXX?b@9oYtM77sL!7*rUjLGB24~TXmzY49g*OMCMqnJ`2OGK
z>hRPnEj3na25wVuD|0aqo-c7AmUxl&vxG)R6W8cCPJOjafNqLrH$OvE3q>$Tm>VI-uhAhHt?Bg$tr>|$5L<*48AM8|k{1c1I;GS9d&~p;P$ie5#w%Bv0I$`)
zKj-ZSi7}YVh>%r$T7MWm(cn=VyZ^s)%aIlgj_#zd`~CYjwum;&&)kF&@&0g0LrOL_
zC7ipQ@;!+>YC0=$gt2ZcMhRtm-7Wuo+JQh!icCa}+i!&G`!!g@8w}CF^jK^U%gf2}
z>!8`Dz`LbdsE{yeKHT}=6Hv4Sw|_no
zlPW7K`vGG#!8V{e1*p3Mrkyr8DrxJdhze
zqyLMdIRUusLTfI+$63zeq7hm;1Qxh1o_^z6z_cmCzPD3RcfMxlU7r~#`uw}UoyVFV
zKJ}1o8-?21oM`&4=N}KjaKQ#BEqBtoQJYD-M!7Tozo+2o!U6Wl|K^R(pusD=6Zh9U
z@Q~>_I8=^yW_5cKxRmDM|6M;u(aR%ruf*{Kdf3|MO1);Qb{h#Z>S5X_zw`=<^
zrH+Vi!)$h+-@9>CJmj!uFUA~pkTF!0m77IWe*DWBa14}&t1}BnkoB1#8ym=in}Zc|
z=Gg4!L*jgAtLdMjJgHYB-!lB!QRS_6k1bjL-$rWa)Dz)b`iRYd>uuz*7nhgwz)>UqG_a1YdA&7TRD;25z2@3b9wPUE72RKh=trUAIOl{=l&PXepP}J5)!5*ep6FZ
z^gI@cv^qa-ObRh*iYFD9l)MFK2vB)C*#2AK+XQNO4!6UqUXPdX=Ww+@QAUaOJs46w
zCEELB0vxmZ$A8D{LdEQMY^l0z>_vQxB-2K@(}K8tK`{L6Xv23qwX@Kyjx?%R=H`_x
zP#4MPCar2^GPANY`TF}If>-}u*pCx!afJQ)Y_yS(;YyPy^1;GQI<>+8ecp$L-#r~2
z{$JTf&R5v}c`1ms<|c_pi5U&oS8go7{^j2=jKI5GiWSzgN$?g3GS-$a`ahpzY4Kvr
z7;5zNtS}#@AHV(Yb#r9(mb>HDyV?2za}S0mR}TL7fZ=9ARaMnh#?0^EU)aw7djk5c
z_Dks{?!m}NLNvl*Y`StX{(nop5+fICRjFFnA4OaK7YBY#7De@0psRbeVR=M5PW*2_
z&4MT_{beR{9EPpfEDL|`?v)6&U+z{Ipjw|gxWOVfB~aW3yIn&X8U42MWaXQP(z(Ca
zQb2i}HZdH%KzoY)@(wTQPkb>lz5m61x#`arLHGDHuiE|u7hDgk?(%pt542P0jy~LN
z7eRmh6J(V#QqJ?uvf(t*fQ(l+$PGY!M)*=!Og_la%%{8KbHZX|#_#_w5R7684GT*}
z!@XCazV%#vfz{3%q-b>pd1Yn7^)Yjh0F76&ZC!Bw1~2fmHkSS@8FJb43MY0kfcTK$
zUKsAbmtyDz1d<`XA?SCxhv;rF6vB0Yn{knww|pYnfA=@eW2uVY9=sj~M;8T*?&ONA~FR%NOn3DgNRj)>rXI4`=z-LJuA7$JBF!_J?4}c#Y9`7>Dh=$T;y|C%Z#k?0RHwMe(DlH3}XStXKIr
zHGFJCz&jYHP0B>&o6nIne=nbZ#B9)vFjqU&f$NJh?(2&K?X7l)PviIg=U`0+b6KCQ6t$|XqU@Hy%;jgMz3FUgD{!6cGJ|1r#lF`1p8m!yDz*zWuG}$Vg5e=WRw$snr#bZW9Iu1}?87W|utC`4`#t$M=29AGz8_
z^()~Tom|WEC_QPGL+K{&7gI_k(RKe>J@+1qG~}~(WX6m!gx;qs#j^Ja9MBngsKHl!>~E(VJlsqN7_MVFzFaUhT922ugkgTUC^+S{d9msJfCdvo{jm*zFHO@-SG%&ix2Rtek
zz_DajvoB^!jinwveQJH3!A?!>&Cl3+=VydES5N;>-AXRdEVeDSKk9QWK;OzSVVIqw##`r%b7r;-&L*z-+pv
z;)YP5;C8^^TRJ)3n&bhPCT7rdE!kc5i`|f_uEkD)Mp>&yg?UuE8Uya-)u5aJ*ZwsK
zUN-+DjkvJ8Whjew@Y##y=e-Ld0^37Hy2;P_3+AaSp4`H_cw$hRJBKA5$11AraWvdJ
z-xA=RtYPQpg$1>%&yp78aa>;UdGR%qcn+|db^U?t9yN>*3g~r_hS}LqW2zl`heEE)eN>w(--)Aq2km$M4S`%K_4kP5K9Wf0eAlnRrgk)!D`{XsC;_WIksZy$Fkib?Cgg)1Qr*k5BzF2T=tbw&^hdNNzUo!%ojIwk$C)H4oDsgA(D@7#3OMMjVj(8s*C^7|1MarI{Mp)R2E1(E
zY%>D}ioBp|C*Ln0f@6WD)tm-CEDuqnu8DHSwe!}zoyO~#ICisewzvC6D*zbdOuud`
zcLz;<8WHDC-NB2|to2FrpR{5D?JEe(Pk`DQOp$-c^yD-v$$B06KC+#IayW}07i4Y0>VMdgl{ndFn`xCm+6_i!K}6TGObCZ{8P3GJ+*Z`~W0Kc%p;
ze42U^w2pCJj6M#ag{G@#h9Dz#p(Al0B9kFIZj7kZyPc>a8V}fWtAucB#b_1#QgR!J
z#|HV)dVW#f#+O>zHMbSC(tGF?9uIWGj(9*f6%jr;gIXsU!H4MlbRc9yhnwRO-=qZ}
zz2+`0WYnsDS0k6qZ{8kCm1-fjBt`0G!NpajAowNj9=Aiz`e;#dIJI15CF&witcO>F
zV@&*W>w8-@K|$niUjixvtNn33f*zPNSbHcd=B(GLGi%R&C>n5=>Jscny_;@KhNL<`
zUXVC8OzFMxch_&IBy=8c9QD@Ug-)>S-_b~Zh(!me+dv6(pDl#Ka_D_i|lry@f;<
z!QJXHD=HbUIHG(fRIe~s$^ui?WP|K7O>%*EG=HOEwjg_|u?qQA`
z!H@)6gfVV@bwq;k=nYo6DtM#g-qseQ7rXLMiWA3xLWn}$E;}_aOYwR@h`zR*ObzfY
z*LqEveR2Cff5N*5DQ^hI0VCvv+0KM{&t(omQ#I1BvEUE4Hl(DcrY@h@R+8h(jAqpM
zE=aBS27jDIPVZ-$=sI8pu@m14-+ys!_MLP-rtuZzOxCsjZH}W*fUSmHX6*+x^W^}YlZe6F~0VvjjujHrEe%NRV
zHz5|KrlYWu?AahGCwHPvp57x7v4m##vKQ-V9i?s44YX*&h05{nq0HK7&2VjS9u6ZF
z0z|d$+<2aNcD7MOG#YW18byhN@s*k~TdCn}JwMNSwjmF&dkyB!4!0#jme5AEofGL9
z8I97`WgSfz0L&F!gbrZng8b{y9_`%DZRd`U43LEaG8#6<^k?NSAA)()expD!Vjogw
zuZ57Zyf|7L6zjP3cbs@@5V}jsxg2XaG>|E^<}Gb5Ee_g26k$C;xJ$zH6UmcEA2OmD
zDRSG)2_gVVO9ngX8?0(UN*EkOVJ@PWThP6+>*_`5%-2oD$D
zCvg1=KN;*kDd77WpbGZ3GPCu$tnOoedKEU~(UWl(raTWDe7Q%3)9ne99H#11=3x
z!XqMtb>lauYt{a?*IsJSeH;!3de+naJ)%)a?3CRL*@cMnULr!m{&6>zZ{ts(kUOFN
zaQ848UDM$rU4bueqF)<%lKL3TCD`{Wl=iE6ND+8O17it@Q~BS@}mHfuHuFl4|1
zDT7VtoULUiuTEY5Bn-WU5=a=zZwY#*)TcFH+vp=qD4K1zx&X^j2uOD!f!9VGLTUJd
zO)*dgwJ*vbg#}p{exVvm&P3DD&{#(xCXj5?*-nfD1k>=CwFF1xLzTR$IbfFs!HZvm
zI2QLK!>GjuisGi-LtO!}?%f2SOe)}42&>Rut;Bg~n1)71W&qD6TCdYco5kfwW~an+
zhlhuU%YUYR6Y}b5j(s-)vYesUhNAcEmr!AF3w1#&?jD(+WW}q@2L(T(TPn9}HlA=;
z&+v|;BQPN))eXjTor9yRt9Sf3)*&e{@$fgBY}oyd6*WcsnCe@vETTOmKwZ>Y0^CDf
zuutz$8R_cJblXuc<;C$=%JjfgZxW
zPPZKc>v!_8r1J9Wf`U#%31sQx0-=!(B!#HK*iBOwM?AL0o@yb66wn971}(Q}W>?oXcbl6kNZb4R)IdeJ
zo6Uxrkw{67F-A){+R}JBA8;6Q81UsNpyu}0Z1hyk4yb}*jejVtyL8OPorF;_F;$J<
zhKlxh&=lId7*X~DbT3{6QShkRM(iV7z#6H&ymFxf(LwhGbhK^0p)%%)T$4Ip=PWc1
z^mS&c*!f509(g+;sH!iw>h@a65dj(XEY?-*;=XsWAtetFkHhmZ|1jv7s=aZ)J8
zse~Z0Q^cfxMnrC5%q+v8YQr~^m4&YR
z9gkFmgdh|a7x^r1B1mu)O!3c;-pqoWNo>!PSJw2586#2hNz5x6x{Pr!UO)`oxPn9)
zE{7k_`3nuP^cQM9KLRD*PE&C{kJSz2!21}Hpx`Q`zsy|-=6SMytZd@lXMpz!QoXo-
zzS9^pdt)FcjCRR-J43rftt3*ByU3u~&qGu~Kv_8?IkA&1-hqH(5W1lZ%1$95h!*`O
zRqL_%y}wvc@s!BmD6~2SwF$V}#xZ
z*ZXmI0ID}1j*Olc#h^AIL7O&TDu;r{tSLyWygu952w1X!oUP%wa=R^kRJbbQEWOYPUIMf;7~BEtE=l2mt)G-S-NY9jH(Y(uc*48>)!hN@G&A
zYIK0uIbtMY@a=^+J(mO+;I@I238?{9#=>&0oM@+HOb|`jESaA5SK^5mcu6Z~
z%Jla1WLj5#wH{F*RsG!+(**`4Dc7==6~;TD7Yr8E*Vi}IaJ!r-hH=iABu5l6E*SA{surdTStWhTUGT2&O$|XGbE+
zipTy)&|$3hLcw4#1Cu0wdMR;bT>@tecLc+q98@ggez=NmkP8ubquoTWf}AH+7kMiA
z#2(cx9@V$I&AYC_z(LjRWIHqYL>q@z2t%D7F-;i;$lIL!iOi1;Vpzi4FK0iq$2zyC=-`O1Weo0k$ieBDlt8Ih&;(}Q%3z>pVOj2g
z_BKQmO}oZH0WqP99UFvRgyr^Zwt2SZtP})aW%B*#xQNQ~^{4
z6lFaV1H(qjM~Up@My6+`6Xm(C;F8Fx*XLBlYmlliq19Y-_{e-oel<~E>b
zx^D0|&zr7wX1ncIAh~A+;!b4_plf+DGP0;=(yo&iv#j3T-QE55(#~5GqP~O{OY;Zd
zUS2{_YO!Etkf}0es|sdEsWjijfrHW7nyQXqfeSgtWjxR;Z*tqI&o(l%O~g!!CU1YN
zQ_yYU;7GfNIHPW8W@e`OSg}5WCkn)3yic;KH*p`C&-GBg6z0$kX+=YX+&T(SE3`l{
z(b*d&%squICwB(+ijfo@D?W@O`iWYUMMhY)FMZ7Q7|*kQe9!)`;v*UARaO)c%C+%O
zy8yupl#jUgzbGmy-ZpnRocTS;>K)CbMbDKP5Op@Mb}~i)lA~UDlbpb124G~e7oQn&
zPxCT8UmePg&;*oeGX!D%CO-J}#fpHmEYptO;t14v+A#(UZ+H>|-BbdYsDM%7M6s;K
zpVnvUc?gud+Hkp>R5nHmqo(rcioeOWf}+|0MXdi#Jhb1tbaBw91_TRfhW^&WhSmr>
z?mrZsJF}k=hC`wWx-@##I
zZvGuC;i@iW|L)8@>AWBA_HP
z4ViP2!j%zk>UZN~tNp2n)q$dnopa>mjIKVwDOLc^(Z3${0$-Wa%HkTULWmi5^sD+O@B
zzqoMc0PSx>F8kNsa8S1dDchlTJIY+~nvL%~X!D4JZ<5J9PCwf|9&6Z*8_
z^g)D@6zm#|xM;*WfrdzU;lAwB975Ov57%$TNbs?iyROcqF}rf;csS;f7k8CJN#bE9gXU$0WM3g;LdKzr`tjD
zWLaCicUZqw04;0K+=QR1BzV$K!Dm
zHi-(o%`|Gh^1K5e#v!d8)86W+mw_6#1}XsI3Hv_8dXdZAT&a+@2ock}sEhp5c5lqL
zCMw8&ptxhFr)wkvU4}VeKcp4Cbt^hjx1flMppWa4uG8>hXM4KVZ0JqV?&5u5Z;TYL
zfr*YnA&nT8`Ur~afq4UHF(c6Uns90gyq<$b17^3*
z3q00KFa>q7Avc6~AH&24)kQiTnUno>lu~WLr%$AlC^au5xEN5gWD`5>K-b({RDY}q
z`dvX}D`T8TgNP7JyqTneRE8~MRE{KoY~Bz00-CD(rEHxY98d`1=`Y{=%1%ztf}8}&
z-)M~60Km^a0V$|8!UX#kOnD8dmM!tTz6!L5a`*nk$D^MFD1>z+x0-wRHp<0QX2A3e
z=O|Faw!EHAfO?mtS?k1vQ+b{L;4uQZ-hgs3r6L`^R$d6j!RoF8KuY%w?}cpOe->*}
zf&(;@2d1Ng^615>z3uH7g+_D?Fjts}M}24I8w
z#@bT2B^2?;o+3DHn&;dj*K=gd-k|C;aJ_N!)IY#N*bN-^CJEh>C#rVbrizMp3{$*<
z;0{y_)mq;`=5FIO^=t;$p<%RdiOTXFDZ`eKo^`5eJ4PY$Ur;IJDD)vhmWA-hvOfL=
z)@-EU4-U$YxgsntPWJ+R?`XA*@j!oJMn*>FU_JTj)nV2IGpgq6-~IK&%HS
z8^A-GJ`pht?X}(S`%0&`@Id=3Jp+SOhc-QiBQQ>NQ(@JNB=z0mmtR5JGM}k?%ihFa
z80>UO-T;5=oEzL4$}6yi{x3sh41fF@*lxoA80(o)kNwk)g
z!iNtZ*z1&SZVZQFK9TG*eEM5&n(AJ)w3C@rEIM(YBGP
z3v?6;=uwGxiLMtTX)^;1+tBd%4!#ky@PnMv{ft561p
zw+Ouq9`g%51c&~l?5F<{8Im_h_Y4|%U4C=aVHmMbz;q`=R^ZYB)`!HNWY;$_KW_k&
z8)TqayUA@Bflc7?t=}Ucq=su=%1oN&@<0@6kU$hWA@LH>!3+@yf>~M?$C{Ikm6dQ*
z?6mY#7~P)(PXG**^wQ!Y^9-wdU8b;x8Gip_sXJ*MI
z%L=b4Q0SNa36if=lvQp#Kt)I9Ovb-GP?GZQ;PWi=wq3enF%Am-tvbLG&_90c|8ZdM
zqoUP=dZ#T-SjVStJ+psSpUUe2QzAxxMw`aFV^Y2P)zXo--(dxKKq=9P<;^!k$cmc-^reaUzgqPp@ME|0ZnbDdNT?Y1hL
z0F_=X5c3Vk05Rd=cAanb(QtYmC#
z{8(d!W=>!77|%vb@4F8sJrh$9T3-{IH2_5BK$gJnw5^O<3HnGx4Jblgv?~BqT^P$}
zxZyJj_0;saS0U>g^e^WxD2t6c?x=2Z6o*Lx-4zh;+#ygBP<}9QV`4AC1k^<=^KBLD
z873sh*c_gnx`;ikgbl1(Hu02{6v3sHl>?>(eF9~T+!F*kv1QBo5{5u0AP%O8T^53#
zM^0HNS;u4xq3ySP2kNU<&fcwC-;TRU=olE30O7-e6EB1l?;t4i`I!oWE>d7?ycLf8
z=LQDEv4DIBD4J@4>qo0SkRq9b4l;1X;0wf(QXY!ScZe4hryr!@dz)ftf2qr?8>&Lk
zf&C}(mtZn#mWzWKSg>uP{z45X8Oe?!23Q{a6b~U>g+R|3_pv+WqjYri>{narh(Ssf
zk^R4>l7iZ?Z+~3~HncS9ACo1icipaDA)TyNMjs3O1_c6IrRwTxc0Du>y?vZXkmSso
zu)jDzr1+CKi%^Z;gt7HTBIv&s
zyTz+Qr3~ypO9e0qNl5a$p40|PE9-0_5v4243!wR*%5Nk5rw+@Jl*YNDC(Cd8<6kV2Xm?`P8^lfUp;@oEkgL(
z1PVs`SYK#~E(jKN=G+$-`zB2Y^pIyhoF__cEJz&{AD^e=ail_<4JnE+x+z3Ra2E_-
zFd3x>GDMaXh+z{V$L{I!(xaY>*Lf9OOysFBz-Ww5YP-tLGN)i+nLY}_gn+8;>>tN4W`gyGJZ*L^p
zz>Cs=KJP9Yh*E+x7il^Z9;=zUxDvf`q285lfYqHGB;TG*rRdbVf(b)InhT(REAF5Uz3*`tCMheMg}-l0oq?su0i-}O$^40}
zbOkxf{}g+80Zm|zkB|zG-9K}12ih;WR-Y0S&g7$_Ccw}tTUk8`3XvnfPr;R18fMM1
z(j6x(yf~XD()stb6PjuqH-<{u?sakg^j&BMrK-YyMYi=LJl`?e#1zzrJW%l2x%n*}
z989;L#sCbIk7&@5G<0-3`2YB@Ki(LaXCr{(Nr;pK>~#7OTC)2-=E4sVz~CKl=Ah03JPI0i{VnF&(AEUTmWIt^0I*6;qCB4
z_^7UD;>%W(pupf{@6HUsVw$7p{Ho33%3ygznEeX-4kfNJ^4o>v;3K(hU(j!@3=z)h0gz64;M<>TQu($bU^
zFP8Kja}3N+;&T82rm*Y@8Kz+s4%l&mQZ)>i3schvpUh_vN_Pa-+aq=Xgn%*_{$wtY
zB@$oVf8-5XD^{yO=iM@a6O@-=UR0%RYtEQv7Q3Wlm@u-TQ&&dw$5-%nRp+*xKK
z3F=9bFj-x8>Q7=*T*;R$ry1Zx45~Q^33p*3C>-}VIHsg!>p!_y2K;@f&aJxZt8;oV
zv}SqzzBLx0Zy15{Q{;pUSz&SD8
z_gY8*9?b7736_Nxy*1h$kb3IRgp1OB#|1P+ri8ragbojzjV2Loq062DjJPb1F!!c`
z1IuqgBOb}A0ucdAP{1MWZ+9OwIld#ph4xz|?aBNkp;+020|Pmm_^QV)?4hOXU#Irl
zR;Wbw|M(|ZUW@|1YRHUdH~apTEqI~#QIgC15+n7W9iQE)iapMqX!5_WH}4+Cf%C)}
z0+~eIdp;ok#e=`go0#BS_RBed8e%;T92`3Ub7PVPiK_Q8TP{y+24$ZAAUK|AjLHKk)LtRIC`JTCemViu&ma=u+m=Hm`WC-nk74pma
zS*Vg99nY)}#gQOn=@I+);Jc9OA~!$}kcGJN-it!b>-N8;XkOR^5{b%>k2q#{yjFM)
zUZO^fqtLE;(?T3+*5JQKrHW}e^;H4*I#b$SINJOrK52I%PfSUsN=0W=H)z(>j<%;i
zf1(g-2^JHM4G&KP+>9u)fnMT+j=%niSKkEM#G%L83E#(tyi3enU27)FOmG*vR)0ju
zwF>J2R)8Jp9y?OaW}1_Xq@?0`C(S*oCjNg0hv;H%0{RG6_gyPBLnX62nwQW
z9h3;8I#`R5GD$m?6&U)^ElA5fhzhECunV*z_wSTPp|W1{l-s!(+pT5B(Epxqih{nT
z{%Zuprzu93&4qZ=WFa77N7=qcS{I=#+Xaa`5A^%AIZ^Iq8CbkjPfF!gY;9SBUQ$}z
zjYEuG5$CRsVx-UqK}LIM6qq$g;dcqdLb1qHB`8$MN3w#d+uWe;LKS|#AJ9Xz{T-hi
zXQH^Z0D=D}NV`c$d0m(d$LJn)pUXx)6ToN}+C{knQa8nt^nx*N*sCfFFg^gx7EZ+A
zoC=5C4a@_1;T}f2vAJCva=lp+K4~B+%lo}7^u2akL&8`#liS(HFXhAPtxoOi?T6o^
zVwo};1X}R_^B5=0Ixrfd2VeoyJa%CMBmot5_4e4oFXr>tQ_<1Uc?7bY@K1MNi;mE&
z=SICkz5u+$p!{j$dgzOPc_p>U^XlM!6!;)&%|*t92XAua2|hozUiczs2;Z?fCA~Tx
z>=qZ(68LDt$WF55rej6~i2KDT3|DKp)QUFYDX8HGoQ
z4&k;@9nENz3GB1(2R-a}uD-Bl-2Q82Y=ToTJVEdQ3)7Oc{REF>jW*5HdC~c+0guQY
zRT18qhsD4B#3a!%I(+g1g@3i3@?ZYOGl7$_y{4-k&7NWE^FRZM!Jeg<2PKb0z1l9b
zv%5PZ{46DP9Z1&^6Y3z5BdRX&3CdrXIfRfstATz;Z!^EGp>(+;Ln4CI?Inebdp`mE
zpqD4)*1C6x8PF{af#PdQ$?I?T>`$Qr!F?g8*AY&W2O#7~2ppkGZ%w+!!g_b$-P9gN
zU04)bbN7xFP`_uahWyf-S-Na?O+gb^RlFL@`{RSR&{$Xb%Ss@(zDmrW*Y?-
zGa@1)_;B2d7*z2ppXO&tq?4}dQQQABlNSVv5EU@NG9qBBEc<{|C;~&tp3_0E*m7Eb
z@MT_}QnoDoiwi9~BlzBErOwmBoPz9cxquL$+^C4d!tlpzOQ#IPw&(O;XoS8DK)LsJ
zF|0|ITRZUOBFG_9K#3pI`Yp{>O!cN62RsD!O$!HFOH!7sp)~#MGC(-4g8`}jh1pBe
zi3rK+APGQ<{kXj-{yypCZp
z)z2_q0bzx-EcI!YM4Qis4uW8{Ee3!}>~H)qYwCeJ=b7{+eF;J3kbG73IARc-aQt5O
z&!43I%^_rLv|pmAW}^ChE<0G40q4$+2Prf(`a``yP~Ou}254OEg?O?%?PY*`&ccPG
zDvtK(IUq{bi+|iUd=Fc(E^t8EdTu?K6$Avi1R!%LGuZv<1dyQ780~z*pm(hDe3f0c
zbv}y-*$Oa-ZB2@9&aoY@17Ci*>-tOQtp3bW_;P*;cr;VWz=x@AMj48r=ot
zwMNacXTW`wYn`?XHYIk?l=SxITM*OJm&&wEr0os}1qj;rki`X%4_?wkGPw&{<3SH39k3O4qFnmICon>vsp_Fn=Erex4gs(~*po8V8&m
z6?ql{A(>RNa`1OKkWXT{9rMDKOpj>Y_abXWrfh!TNUpnLkI$!LxIAt8F7E$^y~bfJ
zZShQZM=G9=a<0DVbZ=o8kW+a;-zg*Q*4J|n&qhXYL|_%nAx-fvf$T)yQ#-;~xDu=V
z=McaSFFNR}CmvAA#l-?-r`F*!e!Ne4jfR0}YN&%bA5cZnC`1j(okwAUJSl#6={j6(zjA2^2jKqaQ<^$ualw8R
zz~5w}-M*W{%F22?%8@80=NZ%RRk!h-IUuZt)>2TFLk|v48n34ZKmBrSVe>doxW2zQ
zVXQl2FOX
zo26YtfMU!yBGUIS9~Yrah1&UdgML5tYS&kQj;o~sXm+BKZcTwt
zm-^GBNVFZo5Lzj~+op3$Jx--*>(wSY1;bYrJ3G4yWXXDAos%ZSK-Rr>$(+5cLP!q(6n>^aPGxmH9yS6@5<(-t2R4)1+J>{`?
z69fuA>_l*182JsIBzZuIIy8)Yaf%pQ3N|6bt7cpo3W6ne;!mnADNkY!QpCp}LNN(K
zwH_h_HS?7(REZer>C^Zh7A%gH1VQc2v-hJa9j|`mRU!J}qyMAp&Eui`!oTrMLo*~h
zCHq?Tgb*5)eH;6}RFWl;EM*^BL|Kz$n?xjALdY_e$`Z+vHB?Asi4ZE!b>{Q=e4pp{
zdp*zVd$|1R~OhuHO`|rU;FfC
z!@9|A>m$DxxAWE?I?-XpCW3l5V8L*$U@gTDSF-i=t;Z4>ywXR)
z+BeAYLo5;qWWXF#MuF|yGB7Z(m-m*jbk5E0@$2H*NtHBX*G!~p5~(n>t!609L{
zn;+kN@9n^qFw9u^W=XP_UO?yl@V2())z+j_R15l!cJ*V>!I@q9;)(CHPxykGO4{CO
zTgJHUz%|>Bk6d^cP+|lt`Vq2yDL=;
z8u8`EkG-Nz?W;xOOwSIKlZ@3HKXs0N77&mmwRxW!DQ<__?!Ct5d*27H@M6BaNw5x>
z={;W(-Pjfu+pn|k21L-;?Rr^g&fQU)j%UIrW{31`=>~rVUK*a+W5!*LJPe
zDGY`av92t_hssn+isGM0gb{_Vh6*g7DaZfE1pxQMGbe_y2hNWSE^Fp>a&IbA#!VtN
zQZ6nM1QIcujiJ}=vyRMF_T0)e(rQVQr&{xf%X5`ED
z#t~HAK~>VbEqrwkPuS1*sDUni_(80jt<&b(0{_}ZIF!W9%cSBCR_twz4D}Ex7@aX`
zo?8bmqvzcf=i~LL|CvC*x+eER*jE!^6`b~AK~h@Ur~}NWafZZh8`ST1F*wXVU`}_e
zF{}^TfeW2UH)Z5GZz2eQ!?SlD0V`#ny*B4bJVwdu)J$Du2?qSi$`v+k$JO(Szm{{h
z-i{A`pg*J6m;+FQnhy_S1AfIymJ(rW?>%Vn`Q}+GS%I}fJ`idhopFVnuwDJd0|AdW
zgg#qRb<2;&)&e|7G5ohmf9~RuvXN&=<{|CEi8-1ai!T-D5D+}W)
z;a3Fp6#SgeLd}<5Gbe2FUu95rBD3kwoDY7k(x1hqY6~!tiUBhgs-81WWYm9lc&yi}
z(+cNbm{iM+{ZQ)oXu`^E!y6w4P|F@%??Bo;~)?v){K31U-mcn4O1Pl`5SbAT(48OO>=v
zLY*!(Q~S}u@3Z1zxr%~%+TiVy7O}3DO#no94suczC+UG_@kc~fjTu)@IDh^zwCR!#
z1UyB(VSokceMixGz`N(x>?26C+$fBIO_gP(Grn8|a7&Sdix`Ix?xxlJ>wxAu6n#4S%exPG?H((e
z^U|IUAKTx(E9e~Lu9-kh{rk8QEnSW3Gz<%dYj!+sv?Mya5$_I#ngch*xN=s$Nh
zEHzkiO&3AD3!jh@dRxMIM2zVn_py|d)Nw$(wHBN86zkuSpQFZ~E=EYY!ZbynjyA99{kf4W5
zbnS1?*4J;3HKAUBfPz`)UI|PrQ0NUal%(b6+5ji`dhQHn@5AS<1L8TMxd4y3Q5Mwg
z4DoumGo83XD;^{ZAP^{5c!%mdxZri1Py5Dh%`Dya>r?8B)gYVQ*
z;;ZXiCaNe@f|ZdGhp`W>?!$3of98XFCn;Kw*7qboxc~*$7DC@suhQD9b#CGA)Ut$R_;J~sLj7f3*h4158=8Jk
z%5JwFtEi~xg(maq!_lmT69{8ns7Fw(gc8M$(qldAtB%=!f4w=<{rm%aVm+TSDNeR=
zASmE{$?84G;&?)fX74OTt0a9-@btZF82kPjh1YNIi1Z<$TcCWosmoyn#?Kk`tw)*s
z_U07QUuP0@DWt$Ya4S=VoWeg)Aa%DAD)BSb_YQF1a*Y5KF{DjY%2&PvB&Z;sR@9~y
zrFn@dkq-|oepr_;5)KC>`8NkIdTl4BObQIf-9r6lwWG?~$OTJV+dTnlzAR_8uR?&7
zj}XDrbz*C~#>!7@4|sbcQ6v?O>L*Hm?()C(;B;tG6N1lNys2Thp7$K16h@;2P(QkN
zbZ?3t>ZNJzg3csY=br&XT|NG4%Wn_%9x&gYO2x2#qDRqZcA%Il?+2eF`}gY^Why5b
zD~^yS!bmKTvp7vQQ7Im1)N|xN=(aOJT@FU1jS$6N8-oDFPu)1JZIg_O4Fam9_2sXU
zdx+mmmVb7QFSW}S9J?uVeErrZ3_?@~cpEr5@f8Si^F0+4-O36YeO$z!=5@Be*!EbC
zr&(gM6}km038D_0Ll=8B&UZX1Ufi#fB($GvG>$;T#;eX0)_gcLHx>71Wo|f4mH(E&
z>UoXZvd*Q@E*!?P{G&JoWoA~|-<;R$M*dYHZS~o~TuA?TIlg)D{PW$f&@i14uQ0Q3
zGFpt`ZKle>(g5kvfM*Z>%-Qp_O$dq1X>jh_zyI-6T~BPl&7ROOo;xA{Vg>jR<+b@j
zrM1J3w|@5N;1S7b-V`OS7eB^q&adz7SLIqzb^7=hDP6LtLE+YG?eZoz4WM)In&m85
z-#DzK2izP2%&Anv`Jp(yDl0=f&R`T${+H+qOttp$%R7<*qpGC+^dLl!xyizg57NZH
zt))>eK4bGffwhU=jPY;xpl2$S
zLRNUKJo#mcek6Fdq*8WsC=CG$&UEq&ZNKnx(0cz?Us<@;$L;_F<7LN&V8xX->-Tym
zk%afrqMmZqLrmfi>TE1v@qbgef5Sw>tuZolbU06sZ76;FP&y)0NKH+BFLQ@~6yNb2
z%2WCcs${3fcYTh&Ov*y#l6m~k+5UuG^O3uZ+v{co*HW|OPt$KVT|0VPdXJb~`0tC>
zv$uu=6ikP|-1UEn89dXPI-Cla{+zl1LXNca?_b4tba#P_BMEsJ0122uKE_
z{h3pHbAFwYh5JPoU?SGrou|ho{C&Ac6jQ+csd9fWL`TlnKCpM~No29jFf>*6&)mvb
z>0ufk3Zje4iA$_pC%TNi51O$Q{j+l6ow`oW?8`f%dT4Yu7%eTWB7k4}`=-JTyExLo
znd$exbwW$nhrWnXbN-9NLxXdDdPmNEMb*D7oG0y~fb&xR87LP$w6^@&^ELCru9ep4
zno}w0b`IE@svCz>h>kX?yVxNQaLYlMJ?(|7IPRCl`0Kqs#g*aH6H8lRbf|?GIx6!@
z7Cm-u?zgQd|InzlR(Qm+Qm{gQ6~$pD;q(sODAjXWQsB^y{)NeJNzW;y?cW4mGHQ=<
z>CzZ4FgAt#dCC8m5W>=8H-7Gca@C=F)fIRKF=vEPy&3^dF3K)KgX6&iEAA(Y3{0RX
z{}39Ox-^6N+rB@4gUJb7-7{x+XYPiS)gkCY7~0AI=0a}DDiot1L0^Mu!HYt3l)n$y
z|DLA(FLFP0X-gq}sah+isxrr&+M~WUa_sAF58~2a3f?!^$93)vwc(Ma#%|o{stn|&
z3pa$bFtZxsY?o}$yi^aXrl!2dA4WQ4m=+lG&ZpX7O6!mu$I$O_Ai0g7ZzfzAtGLw^&ra3~>*YdLl
zg0@a`=|}zpoVY0C`}4g{54zj8qxg0yaq(+?+tm|X0$rjg4Qr!&t+Mb>&kg=;1bzgI
z?-vD_S!7l`i)#u!2n^H5M3!d>~)&@1$hSA`>?+kO=
zq3aZi{Us!|v1(bG1I{k5w_fPczWxv(Xo^K8-?I3Mve83RKLYloD1+Ul1e2hx{C2!d
zTfFfOld8a#*?wz3iQ6lhbO84RSM*VJX|F}v#gC@_4i^}`uTLuK#sAHMbWCqP_r~bV
zP#kh*gIzDF3vB`<_EIrg87X4k^Y8y^XF;>-^`}iy^@YM^uDvus9AU4=OW6BYBuEzUn
z=zHO{getkqEvPW;a+T8P!}@LU!SN7i5-x!V!$a~PV#(RC$aZifCKjMQDYxn!wuJ_*vs?CpK
zA4VXvokAsLr?t5Nd@_vQ-(
zDFruwD4h+fT0tI{s>Qt=#)52%6+T;vFBs)sL1!(M>k$3U($X_9q$+fAM-{Zw0kG3y
z>|_|@cHkU?v`$ZF%}8gm9tjCDc<2kMMoq-@`;J
zWYYr8aRM%N2qB_-?W^gvLr}I=J=`OS`xazGnC~A%8{6K5p}meo{nAU$6|VTXcrVl0
z97dE7?B!*ejqlBYR*?9*FFA?gqHw22kvn$}S9$3aeAO%n0*GAK`$4WLmz5{#&8y5i_jDmRsDLh
zTKllIXKT
z29VeD=wxI;oQh`#boi2X$q1}mJ`0VEb4G4%ZoL5#w>R9soG~{u>;1jH>~U=bKX&=t
zB*Hh0Hh1ys*lqD&nqZkRIx3tEPC{fK1~R7)dX~vODS8nnP6+a5_Ep8bwPwGgd|qho
z=8n0Wfu-Fm$m8TK+8uNCPXnaQErCQ%qP?bW>1$QdtagABU@F8`UY7?S^@C=;!z9-Q
zCCByK&JllB+MLIm4&YI-DxQxh@~VXIE#EBbiCx}sP%U0q!Z
zA=%db*pffI-t!&>i0nAehs8eFwUiz`T!K85)t0UeG08QQHVJ0aa^~?mya;RB+-GOW
zArXi^M>t|;S$e^7Xgzd!ek!s=1;9gBdMZ84Aa6AG6{W%c3tVC`tdevj|O12`hLKl)enTF~|7TjO%(*0^E0SdK!cUE@TT1
zXzYSrEs533_@bF{KRQp_IzIQVbt>fDT7|BjXbx2V!QT;raC{qn%SF_t+7w#X)?nLD
zre8?~adc2lW#zrw$`M@|BDR5s=3u>e`n<>s8i1e}+?Fzh65XRk
z=f5|eMoPts$IUM;HbsuuUDf$atGq1y<1_(~U=&so#Nx?5Zo+CyS#fYEKc5k9zG2J5xg>IBBBAS2o=k6OJb!if7zIa@`b6h=kx{P>+3e7j~339
zy3#Jy&}}=6(qo}w%xS}K>%mXZXs=#xt%Z_(76i=~e)j&(71_auGrX(N8eLM+>W&4p
z=0yEco8&YH4GQvPTu=B>AgPy^A%cwY}W@^7BY*)=spU6ZUZf9&b
zbzNU$uRjU&?fq2E$kgqC`b<%{z2F5f?@QGC(QD;-=qEywD|&9pfs^~Q6DXWw3X
ze>53|3%_s|!x@W4${qK=7Cpy#1~Ri*fDwGzVN@ZF#R#LcUv1hcmnF8#H>8{!M=k;O
zC@L|PGO5|=+x=7t@6c%2$=rYMu0wDhpbT#?Lp$n@vA3^%Cp5X11j8dXhsW;x*vs-q
zM4kmTE~w;nT399g8oTEmmnH^9dd@j3A&KLRn|TTGKI*uF_;2k&g_4TR(z571O&MB*
zG=OMnC#Ph(E082P0D)4i_px4<)*ar=C>P6P`7yTIc&T=ANWQlB6qGD?)`wZ(5!TJ|
zdWGz2-DvxysRlhqGV-FEEh#-($)gclVP_z(b-shx6(klX{B84ag|b-}!`FO=Rd0^Ps3Rj`&Kf0VM<}_qURG?u*&)_WBVOLkIjBQR0*}TNqfsj
zo-FA%Ey$n(l`1mTDnnz6?;!8s$8b}3`_TQhG=O11akRhfLx=JS`}mDN3lS#H3#Q+n
z*uuSRT)-PasKw5Aubu+}e(sirkWs%r$h73_{Se0Z_KKwkUugt2nkQ9qQ*BqNb3o?
zDXqymUqyMFez0Mbb~wRwJU`7T_B=!A2qOtP{CaM7lrtt^^Q6BpcqI4^N9qS*tGya4>SF-t
zX=z#s*N>CSO12hn@6%Jruik#!Avg9lQZvDPd+(|>I3EG<8`y8
zUwQ?(Om4P!c3J^oX$qKa9W`trP(-vW
zv8!^BHJAO|yz1=)z_?zPL(w_j&_;a#Q=0Qx(x88K)1Q00%h98NQ8p`pa3gcn>*$H3
z*O&1v@9E~BWy<}H39LW!jt?<)+?+mGKgdgh?BTV8nIrdphDw6#yd28^9f64!??=uS
z{0fJiyA$lhpF7s4dh!x<_htmL#zRrC#!1qtd;a^Gwp;t>&&HG-7g>bNruNV9(M)9$
z81%L@Jdc)<155cCM0pxHt3#Yzl~)^KgFdY2p8GmX@!54cZMQKJl$8QE4yj3wt)*_A
z2@BYgKR2CP-JKe#A>3hG>27L~GkFZT_^p^yeobEW;L29MMuW{hYv;LV3P}Rk-}~eu
z{)QeAi&L-^lmoz*gwv-nC%hUsjqzqYiOX&MadX|Jm+rLzi6dnJQ_82A8WIR>U84(^
zl*GcIce#_p+TjzV1tSiKb%?N&j^n3S#Z8~NHJRe1?5p3dLj#rtqzpa>U)8m>O_$iW
z&v!!Arh%AZZeue&y&0tnb&H^hm_CS-b6akH0X_reZns&jIi3caG;?VC(iv+SdWd+Q
z@7|R-^5yQk*mS7JM0_r4(I?Lu85QPX)hkvVe_&~}$3nop}pZLXt
zZcrH`gP+#Bl6;+p=?V5^!^a!N=SszEJ7Hn39$7j5cChCBsc9cuCQYZ5t=499u?O-V
zhF!<3-UR?oD~pbi`*QYD2%!DewxqXYBN~82$Zx?*Tv+&Js>V3HTVSPiR7K~x`y4in
zp_eN8ClP)o@-e2=n0RFK`@vI!zwh{}1WUvj{{Z7WL#rHY*O1`s90tuZgbfVB^!aT1}#{R>d|ah@N^9;9if%6K?X_*E~z|shAvgR&k8g
z`HoqV-U2Ku&mZYJuhZ-yMFSYjU-sPxPF}8qo$61zvYBNG1xgq52(n=eT70Zvu#H7H
zJ@obwh*@mszIsQPnz-a1F%U291XkHxRTtx*5j`M;mYvC8*iH&l=7P*
zPw}|8eoJx(-K{~H7uQJ$74|^*VJ`&@iGyG;z>Mnm(SLV`fDfuGVuZ(s_BRGcaqnh7;(FY8;Z-k_s3x}|^EkURoBnl$
z*9HX65TJUpn%+|uR>ALsbv;l9Z8#xM&Q~M!)-MZ6)$m*2KMzAhr5HSZ1I>%SPxM(l
zDUv}>lkp-Akkm+Vj;mV4G2|2ryF84P)FH0qGU=D{fBqCtQTduF{8VE6E?bcDU@R@h
zkSM*+wIU`mA5%Qx%el8!q*o#LWPTrFQ*koTfi?K-bhLDqSIz)BY?uerv?|GD=7@
z9|r`}R&^L$1mPwtEJ;eSMMg$@Gt8WeS#0m}rY>h^Ha+FvGbWjuap80n;G3&UZV)jCx
zymJTcJ+np0#mRZPL2e8U7xeTxQZDEM**3)ug>XZeVM~BPa${=lYXv*nKT>0jnG}^Grxk
z6NXg*+`?&^gFGls^&9?(`joV^Hz28`3Q+_2x~HCIiV;kgOO)sNPbmRd
zDR$sNPdVBIq-LSXtjVNE6$D!Kglf-}$emkg(55)ZMPqIzP*=672@z81_ra2%Is5w0
zZC~Ss75nRnd~8^#^^H%59LPwt=tdFBap`j4N-aFnz5~J9da$|KWaCWb_m%Yg(lJ`M@C-4I7E0l
zr6)m?PK-mOd8qKAFKiI^mJ)iQALe=5wZoXO&DDT2$IjByv}0@j_EuoTpMgdQq#gXn
zJhJHC6uS>}2d3cc-k7={`XGt`W+%(sSS9~O#5(MzFIc+PPVV~ZUB3f%EjhbLe9`+?
zI-fxakCF=G$;R1g=~wiGE|<>CAv7k`iaJ*cENOm3V2fB>qU;!V$qGgiT(C8nf^u4V
z+K|B5Nh%a8%pBc&_3RxV72vOW5h@M@&!kw;8p+s2;CH~9qQ*62D0R}G9Bo1E<3v+|
zBD{p;FDus@^9zu(`U;SdoAWP2>1nV$Vue^5@MMG_@N+S+0%kXyjSTY-#lj7HwbZOE
zZ}9i3@=OA8$I)jL3%S(7Z|&P7zYDu05t`X7;BK<2cgS^TT5o>`UGY3qo8pB%
zi+(%xFy##PJA2HOIp
ztkNI%XPg13f`zehe1o0L6u1!C#@gC+psnt055BXFGgW23gB7j)eJ$HmJ9q1pa>R4E`Lb{a?T;zv|Dd5XuJ&lR-F+hJ2H8lVWmE
zQ=J$+#u8&pE-#m>V_Mpea%gfi#y=E`DY`O9N15MaQ)!cP12v|jZ*nX8K|V0FYwH)>
zU5IPoS&+{J|7TFK$Vd`~M^mx9OBZr_$3>Y}6$>HttS@Gzc9KgO+C{Q}47l{j&8%c;
zD&kbYY8h#>lsf_adgd`iRc{QDjY`9z
z&iU^$caW8|Eu8>8*~Kvc3^@0;CXT?s3EOC2z`BD8?vte5J
z(%}UJW4ytE^NNyS5NTB>UTT){g-Lwf$Wje!Ul7a^D-M=f91yZzm$pTPVV7Eh4J-W`~jQF5&H3Z3arK}n>lsITCJFI-~r2$U<}nb-`Fx~Q6mi&
z0=zsAP!O4XiRmaUW(F11I*_7=1#$9ditdETM
zvw0{MU1I_^r$h3f88pDW$M-60f+PC=xz%sfYrK&6;DMOs?;{a#(NCC*`%k|>@xHo;y>JzF)Ny+&tEs8K#Uq?LCM8mV^1M4>OFvI=
z^8r@M|PJ1Wp8o+rS6~Ogw$YM3q--%w;iKNjW(S)3Xyc0{c&@Xhae^
zFb>gnPgsCgpX37iV@WzLH_RTv0lOI8D%fEsCS^qq=Qf6(l%q?_Q|58My{}({RX*3FOEGa{Rk*hZ)Fml)*wp
z)3N$&`dSFnFFsezXdu288?O}!!HF1yAU?x650DE0b@mKx7zAoO^l8zxRp8z9MaMp1
z^!T`+cszqC9di6T!AFw;!yd92n&6;$hDHHu|DE)FrQq@23R-Lt7*xBgU1hM1C1Rn{
z7j=u5+N5c*pE!vP0O*!wcnsGIHf3P(ei_tnKCKno`Ur$l&rcI&}DD8QUV$k!nP
zib1>pz(Bc-KcSeFQ-|Oe3c7!Ul&Z~=e^|^(ZjH-<`eSSEI4(Gx+TAJq56LLSo>aB`KmOv
z?1Cz_-ELBKjQ{Kn1uzF;c5)){GzYFif7drGy#ra`=ksi8L!5xKfZS$*-iDQNU*k2Z
zW(pw9Vb)Jl1Ih`t;E1TIeVJ+a=9sZO$*NHG*j
zbce5q)nNxfkj=-y-u@uE@xzrnNXO=*>rTDd1%>d*Yn6L4t^yRM0PuOm<6dX+$-XH_
zX)WyXzy#)UjN?2j{Xzk3YRINMft!JbE~ED7h3?^d$99b6U&jhEThKHT89ZB)VUa2m
z1!QFx{?Th@TrowE4J9dQm7e@)+g-5s+TiXV@QT3%L+TMccHrRk<5oKR3wU&xE=tBe
z*;>etW7lLZC*yLPS&26o?G?E7PRjnUJazMR^ODJd)g`;!OU?#{hPnr?zh?F7buT`^
zZP05|9>>jbJb#~7a};hfXQ5H8|Afld(U8tT^)o^5d^B<<9RdThFJ&*h9ZVlfm)2r3
z|8YGM7ehGivWHZ}(K{4!)r#nKW*>u4mnnv|kXJPS%W(pBN#6xp7N@e_)dlP;W8BxI
zMZii336ShqO5=H@NJ9sVRrRsS0s^GFSgk>38kQD$lBJccX#0HYAr|-(cyO?uxyoDb
z1^~xxRxXhuB!J1sO)DPEFLcj=MSN<}O7J3Lv6
zk`TlQ5jki|$W~X3uE2Qwj=PjpeP~O1>Su|CKRt!ZZxH&9C3|jfE6arFz9&qm>V$;{
z%d{K`9HziuHoW^V@XSjhK)2GORwtbU<3CQ8z_jBm)I}aj#Ft#D3?7O-8WBTq#4Y+8
zh@wI7lc&M=3Oy}7$wtEx!)BvT4hO8zCrG}2elxwr!Ms}|^dha!ERltoWQW%!f6ymR
z!c8j-$@%%BiG&V62K4HrJiL@BvA`sUPs*uY`J3w9wrne6Mo}%tSvs69*^SIH5e4t-
ziM_gW59?3pMtHg_U)$y?x{tQYeo|3;h?fsv3Hd`Ok@Gm26=ox~tNSr}4`K45?Gq)h
zCd%OI66|f(!h>fzi~F2<()#H=dxB_a3J=2ARkvFQz?TC=%Yl@)w@SlO49Vc8SotkN
z7^H5w=S=2j;rsI$M4E{kFhQN%hV!wJIE&*hfLy|G0!Av7D2suN65h(`(qyQL
zv=4R8v_T4rn4fV5p%ZR_d+}E$aW@MnM49;{Rh5m8Im)yNZ&ymvW|GI@}CRhPlL_9!x
z6~|@mpiN7C111psa+m&+DZGsbrUaA9VUa(B-^r&|v++V=KddlC5@3ui9j$1QtpEF|
z&>~xsfpvd#a7pUSs4jV``1!=S6QIAG5B77!z(8(9hG^)XP53K`^yQU!mjrUxtbezfldOg3g*KXCP9x_v
zOPJ2|3BiaWFc3~ZipVd5F%z)dh6Ie_J-Xcr?!=?FU9~}%STS|YPg(6$t>BeRu%iI%
zRjZYBM#C3i0adx~vJ+E67Q>pk9VZ{fAo{s0qW(41K}1u4Q)T&6VLerRSbQaYFUl!t
zKIu5)IZh#Ua8(L%l6Eq8soU*w$JQcsq$febLY3p0yaaktTQPXi751^AyB@DNtcyD$
z_2b}Ow8rlzXcQG?(o=2f2fSgHs^T3mL3aXEBo&%kbuNl
z2@!b6cFc+0bikmbyGt!Kj=BnXNLHkx{*m
z_5XWK^L4gp==h)3=v7m=jn;|oWx^vu9}Ho+cYAWtnSx{?q9je$Gf&aNC8}J;n>`jG
z{60OXwN5oT*I5$@M%xNx7L2y#8paS(vHl@PQ^zd~VU7-AvjOuv@=HR8y1K1EDOUiG
z_OQ>Y=k@}mwR&EcQnbkLu~6O}cIUEaLhqQTkILw}eT_Fj;4y^TxZ{}Aki8dg)tUuh
zfyvw4Q8N|UoOD=$9k|m-6TX1n9~>q4nZWO+m?T2qjEA@3CEes?xcn3-veMOOo*Zxq
zKMBg>lZi(riu6DhB<9GaNt7*ZaFVOO1<$WqLOWK^jpD
ztZHC+JUo_}l*!gb?}=e7$8Wqttu<-h_Ab^4{hQ=g!TB}#*l_H4a0
zDMD1=y0p+ghq*!LbsE*+bv(;(^SBlKgR#bS1BxBKXxcXL+IPAIVhf~=}b~v=7
zz=?-m(qa~%{IDfz!h>qv#Z+J+CvGFT)2;wW&6r}be7DQX?e5b#j!UQTZ*z_uv4N!i
zsVw3gbqG6PjRZs%OThK=ngk|2eexb)mr0N0NJo#o6)Ce&a_de!ylIOhst+A3D{c3o
zjwlACt5u`VKLS<%?ma`W^b;lEbu50g!RjJh#i7F(_AF_a!hFRLg0VuRqBZgdI-CEk
z!IEx8q6L012-wW{Czd{(T(YKW9&2G=@^YIVIauyz0j@VGQtWKN<&q+__Vr!hNy3A4^}%>s=^MU*e@~=tv%ax7u~feyi(HlC
z!)*#}+NF9EiSSObSpQA~mQq7_n(I{%2FB=K2$3yvADa-7mZn6^g2qS-O^N~GYyF5)
z77sk4Fp?lbd`Wz&U_m*XehiL(s(!06hrA;y!B1kiXpts*u>4U(c(>=r@pJ#mt}^QG
zwqZa=i@Ruv!T%*h$$gjguYbFURzDk3)}`-_p>Tg@5*&<2m}7oW&6G^=&Pedn5|G9O
zGkMy%o(9nh#9@CD+oh^wLqSV*@1hYO7yaJ@CR_c_fI*AARaIm_L1|z{>0MF}TVSeq
z_RMjS{6WGG+O0o;=qj|p65G!S`cOp$V%%np|5xEPL5=C%CBS+o+Jk!izi$TX$bY@9
z4un~an=WA(^klju3>WPp>5^wITkmzi_YVDfSc$VRaCsg@+sA1M_6{bBm!{!^OpuY-
zH5f&a0GXp#g8V8@cl^!u=`A55KW1aT@7fdO3$)OY;5b9qmn@gScNDvrLurE
zJ6*5O*Wmla<0Heu~}I
zG=}SYN#Ir)ZCgUHjQ_DqRzykB2VdajAuxf>`ci;nIMpg>VJo8`DCyqeMO&r7HOE1!
z#6$O@_?(2RGj(lgf=Jmq1jIqSGX(gZriHceUxgq*3r*2~3ULGjMZ5N#o+TS}8HnB>
z^id?IY_37*m*YPpSPGd)iXUw5Yj8Z|M1ppggW0A#6j_8;`Cg^;S233PT-IDecmlB<&+T7738CJ
z&hZs&p)N?@_=+pqBvzfnz@v;I+`}Ko1VCegtbd}%4uI^|S3XJ%g9&HF)=ZR`7fdTy
z30Xgbksl}T#@1xr0|p=IS25bAAkG-VFvw^~DQDMYIGlvYt7^OhTmumUm)gnOUbfy<
zeaVUvUQ}H9HI$;N)k(5W_7$c42ls%(jDq3r7BtW&un#{LZ
zQ(y2pOrO!Ozh&j1_*9c9N`jKVrLEa3G$sLlESx`)!K5>pj}%A*nhFY`8`I+(bV6aK
z?)F^9dS0l0mfJ~3lCB;Q+8f`(fNrXbZmREc8hLstV9sOD1Sk8f%nARuA^x917}5z+
z$g3NCiMJ-TlYLFn*aGAfN~wm?U%K{o1ihto4CAWJoL6c!H0_sEb9|K(^DtB(A#xt%cle#?a
zQmTi~Wq52&Q2!J$LRyy#r#|WZyF3hB;3U+t>O$n9#Sq-^P~$w@#pIjr&8GrWpU4W{
zUmYAFQ(&R>qXS4_pZ(I5ILgu@M>=roH5R&Z+sd!`8KH4Vh?m20PdlLBwtsuFgiZk~
zytRrLjE(T+2m9C+2Cl34JIQFDl)(AVkJO$9mZg&1yjZGA1meF}_81Qa7-v%lp^vqr
z^@QbMR+Rh8?WNq#%2>PKfmW9X#meCrlhebRm&B1p
z@)z`1@I@@J29%=eX4pyZ@QVUTKy4h}cr1c??|6JM^hH1Sd{pwFJ>t
zB5o%+1`g(5?UtZ==7WOp)>+kw;xNb+G&{@-K=&cys^y~`rS2OQ7!ai>?#~k@miHUME#Ql0xrsim{juL
zm{edtCd0ehmcgXSg6c%7u@1OIGe*IJ@LEwwxG9bj7Od#CaIXcxnWjDhgWYxbdpWka
zyJ)o41pj~uzzW?4LC-k5y55Zna29Gr$R(23_#J(
z)yxzGW+YUy!3Wi@T#{z~{<*DCc_fKB`y3
zxzkoLDz~wcRM~bb`?|FAg?u;tYKNRx7>l+GyiJmF3FAE!6tPD_ydZiTw186}@AYLl
zFjpu_qTg#yb-QEOl$TnBzdQrG3d_7jfplz_ib&7jR_b_JUSY>5uV_Mty^H&Lgfl@{fxe3Nu_`3
zUuzb`VQl4Jzl#&>Ng4%CmP|WGTLG?)00z&3$hxAT8+CTH=kmq28=wr~C><~m2youO
zs1L6CARQ~rv-vtNxzJyWb{&QF=w0*l$$;K}&Z5JUnr8KE!`3Ar^lV!M(7!^
z*8n>;U-6Sp)w;Dxw`6$~c(B8A!&m1)=7stok;R6EFxhF?f}%L#!Jy2Z;*^Z0)b2v!m_bs$^wO!!c@)KZP{KFr8`aN~m;&(G4OyHizINxVZne?F3-_Pz3
zg6|zCKgQm+)8qx+I@PeBFo)=ZX>y4;A)*>avb5%8J6=4KSWjV30?EnXdHlOHpM!!|
z1>bG|kkSJW4-oAFkkcPkyO(A6QOo^557!-k$#i5Vtb)^7Up$rH)VgsTIY8tue9Q#d
zw?mmwD4k;1!y`U{0>dwOsj8^h!**IFC8nc55IMB7uo6D@#NGxJ>utdCA5`3wr}{{|
zg1+5);-LIAf~homB0xGe%^zi34w%MGc&1
zu>;7v~K0^_iY|&uyH<%@rPk$
zQm*bjH{jQ6s-rlduf7i_y@ic@_lrYg6m;=Ochd(ll8{NJ2&)QAIk$_nyLmI72p=wv~j|tc|77(a9
zW-U_bdXHaZCDr*;L+RcUaw+L)_9YM@X$j5zx4PSZW
z{6qMTmC3>3qkbsM!G--fo;bw!`vA~>sAC1W)E$juDPOU>)PEAyzvo9Yg`Dqg)<=Tt
z+7YiZwYy`7#*vO0S?co5rld9g6lGN7-F=bgQ*!2rY(95l(Ly+6>lg(o=3&t7(~&&p
z@ilQZjXhrnV|afQKDbj9EUPelu|N4ZwCd5X5`YknWDiTas}D-aDI!*
zio>}$!ZPdb!+~epuW&gH)Nf;lY#yNldolhE9ICXZhJRDk*z3W5+zVEgrPA)KqY>Vut!weTiP+Idj7OgNl^%BN>v}wgqDzMQ0
zA++h^IiSp5m{I(FtCZ*h}a{PVQpA{^iMXoRrbH_>pzJS7TvkG*5#K
zB8%rh~TBwU^`
zr9nP-vZ7svVMNm1tjvG|req?H60x-wu>&0*81T-c@vae^CV+Fz1p5)o_!BY>58NFe
zz&<;pMF#ANG_dyBm&4OOJksw&8`OCW^s364d{0&GxOli#9VYZQ+BP0{WCzbYWG`t)
z=2M-TZk}8n_F)?Nv%XSn6@a|3M2dCeQtJ4jrgbAa^%Mi@1iGL;e49`69OpYM`|rT!
z$r=s~d3A^KDPwF`K7?YkFMhsW4q6T465ySD)XY=%shk0_-#b79u}|B`{0p>9E8e_;iPM*t&=t5kW$4RxdILPM5#luWKmei={&W
z$@%g*$okg6F%FDpjaEOJ)^uo%LpHhgxaZBU`u(RAMq@OmHX`j0FoLnoJ5XP1{4Ewm
zU+q{BT-{qn&Uowj(9aKZY|ouRiC%C4;$-Uf1$`CcstV=YzCw}@qo`jK_Fp*I|I2an
zn<*!#<8c8Mbm~GbU8(%`wEH6`lpHX393Hix{niSf35%RpL$+qOfAQ`@Cf7=)Vu&X0
zg*$Z4q+21&q@YMbVT?oWjDY(i(sQ7JVmbmwjwB{P(Jz|U>$~%*uI_b5raW4O)7g}=
z^Uv^|{q(5VQGiHQOEjxrYX&yQuy9ZN4Q)+U<1CJiGe!J5Hc)%vOx9s9wIJ2ill$lb
z=C-pI^kx3A0B0C9-O#0V#@TTPj_c&TnNy0BV6242sLvDxl%Hl^oW?0_~;9q3}|
z+%_JM4k!Ht$%xs`7_jX&`ogGE)tI!i(!{;+~=BUMyD}1y{L+T1L9o5WLb&=qHgn
z6))Ht17eU7fs`4eRQ}4e1h5odK}`iOJCuftzpK0$w91Bi^*&}QhE3xWv{2=puf5Hd
z(MC;P+{c}*XcgmDVB4(#j30W8mv7EA7g=NF3Dl_IW5Yw$95G*wfR6p~Cy4?4GgwCUTGm)T+-AZTgG+w^srM3n?V1%0=3M!mLU7+P6D_klwA{t~)5y
zg~h_DSnNiz;B*cxCLY^`*MQhSEXGbSmY{^I33{f(bR3-<)$E~k_qY>GPYfXdn^|78
zAV7$mh`4QA8sj@zI$tj!=ZX_+kx$9j>}fvjB~f
z@z5D=t@>v2M-AU0kAf@pNdkSckEz8JY8Xk{!8b53Fkat%U{22F#pAz>g%I09hGZOa
zj(F&7)5_8rR!OM4$}W7s{V9_aB;Y^g{QW5&Z;m2Yh-!pL1~RpIAD>fRm7E$nQU03S
z%e`FcGuQD0*9k|laHQ%Av23;5=5t-j>mKgii`?m82kpLiAN?wtPOab?vR(u`uW0i@
z&ZbV=dvXo-aL=x{uCi(7LWzvj65hqP2i{C4J1^9KvwN_@Q`Gb-w?v~HCifZ~gWC9d
z@N8!1#1*t?@^m7(-oj}~mTZ@?VtP$~SIQK9AM{(EwuM~9IGmFgQZw;wOm$7ncRqmk
z7!Si+6v$B>luaXs3v?C&XdCLHLCs3<$FnKpjlg%JM-C)6ePafrBY>!vUxS&E#8ZxK3Ho@#c+
z5&obPq|^}=S->viah~sXCOj89T}Eoo2Q!=fF*){6xwL}XaM~4_-4%(5{|v}(k3s;y
z)51tfa8LmLJbba`*dDBG>L_!$~urpkGumobwO1;1|+N
zDAGdSsDy3_OSc4$x5jU1+gE6@>R$JUy^kV~z1Y0~%QL{qc)b4mcS}*~
zeR&CK8~3*kQ#;ALXfy&CnkFaJokOfHzL31~DDMkGA-Nl-{!nVa*W$~xgAa^$(!bvU
zxIZ2^mX!1f`hH3uS4=&*{7=q?gdc%5aAo%|2R22uc$oi9ZhwZ~j;8KHL>~;C;cj)Y
zOLNB+Xi4z=wchbchQFCyq!B3x(NWk-00Md3C|=V$zCv}$`0zl;e8_dtx6$iS(sS7C
z6@E?qFc8Smf=VOub%;+-x!>^ns9^oYKY>sE1pv>qB_HfL($oSz5m-|Z66AHhdUjo4
zJ~+DoMQBm8gM;mpw{R0V6zQiUtfgRd($%+AUMv~y%)KTnWC+~1MmMjmADP>SLD#$Q
zBtiDXE+zJ|7>B{A^zfal79}8?E8=hl+KWZx(dpdSeQ!DN=vVK4k7juqIzYAVf+I|i
ztN$)sJR?X;g~9{~_;x7vyZaiu_y!tr09j0F`9GN_3%r0u1e~gI*{k^R)y^?|R+D4&
z_0t?XH&*BN0>|Vx!7_dQs-AXg4Lydi%sj5iBV*@{mmBAD9hDtcYtTso8?TTYSyDLD
z?R@h@DgTE6o&{*7xcCAuei;%@rLXI?v#}OW(ehwVMIO$KYPm}Mm68R>Q+#l7?3IoE
z%nE)CDpOt@_I`Q=_2v(Bcbg3?KYCd%J3Hr)4-awlcbBnC)L(Kw78eP!;wFp~gikx@LQ@d2^X2ix?1A8Fb
z9tuz0gQsw;VV5s-5Bd_RS-7h#cT_I8UHo8s<_a{sd2B3Kcwr9|CTjxr{3YTF4TW=S
z6iXGq4;RORg+%))l>05CgHofP&dRixhrj`miiw9lt?3HJ5jgRoaQN)|?Ww?E^yGgL
z_1@uB|NsAZbgZ&ZM)o|CJtO0oDVwsg$=-?($KHgp2`Sl`9a`o=sAOgp4oWf)a*p|X
zJiXqZ@9(<$r^|I5=XoCEe!tysY=*)|@heG!{;8X=KXRhdiGlz{17$cp~c{hELyr2kNF_ReSMG6DJkqeb(_
zZ8QJTp)TBt&{Pq+gkWx1~Q_YqK0Y5B>sKa>#;aA%TvUC8X`aM&${q
zl(}13mRgZ!=V-~yis-<9cK~hV0X-CIU}KOz&$qzTj*lfhI0&>KhpI%9NZ@nCcQl-a
z;>*aLC(OyHiw5Bwp+MaqzW>&ySn8_q8x?2ss00;u@*0r*`j+_)d(!8_w_wEJ(NU*f
zY{CE@(;N8wvuwrMaf^`&K1z^azz79pvy{7^9()3vD(FgPg@%?#?81RUJ#vE@9
z=AXxNTmYFeuRGhr?p#*`-&iM1^xaA+G;pQ*2i!NFo?HJ>XWJfPTKNt-xS;RUpBT)&
zn@~yyTi+q0NibsmNo4}P^f3%*z!(8_!t(bCZ0Ptk!N2o#`m6c!|Qm1e*%%gw`>6sX@RktcY^)Y}1s-b(tj
z6GE9-W-j_dBh*NL(Go370EJr9JP5kg?tl0BY}N0pf))aD00P;6p5!L@VqJ0Bf^BgC#+>@T*&sV>uiYcFWxs
z!4Oj^h&Ul#okmF-zw#pO0%tYxnjFzXq`xm<;ym~e@ff1?K(J*9Jp^y>>I6o$-%De?
zrr)mpz3F_lDELVuOcaPSpUuG)+ZDdWF1#Jl7K#OS4e<@u%z;%AVl`{PDs@6fbVV>`kr#$;SAkUO&ohA$9v@_^v<6y
zM*`cfH@@fVJfh-ynnCIA(J?gjP-P%9hJhV{NpMGElO}QJxl*i%TReLbT)_t
zKv*Wn4O#&5&qYcKY@lfU`iG);)Eaq3coZ^YSv2|CwgOQv
zAgCZhKndV_FYBZ0Jlfy&1p=KRc>MvB)^?%_DFvHv2T=fWPM)$#s*f^Aa~jZsWSpJ0
z4ux~h_DLlL8w$UWZ^tLs$$b5RYb)?!qQdJP*BWm@SPZ1a|GG#~)Mx!yhH5BPcKXVL
zI_=S1lexMYchE9Jw^}lkFg7iHzG2ZY#~hkWQ2p}?xV{W_1K*7ZfkqlOxq8vxvcH>G
z1-YW{f0fsAGSh-;(f8W
zBc@17_@q;g^@BG3mC*Hk3t{$X(5%M;Gr5V$tcA^wR?u^ce8p1_@GOrAecvZh^Wk73
zEc5N!c+1VsB$Y67t4Hf^uGl=S97w{2m
znFmq~gTc_zDXMO9=sqkE^(Fz>cDiU}o|H@6-`DTG-(`IY8Kw6%c>aBIyt%fn1G@0I
z9AVjtod)eZ0(c$BHN0kj(5a?)ke%+6LS)##DXrgsU_+y?kqIs-ssQir0_s;c2ANHP
ziv$1&L+`%TBZe|MAK+O6g1X>OfeW-zbSPaLTaqg11?~C?FJIk%a#4M`2Q(^BdGE0{
z(DBel^z3XOh06hlyczapHa_;-MCUhtyB$2{KL>uP3_KU8IOTx7+p};Xxzp<_Sd;V7
z;P2O8H2X4Vbs0Jp0J4(U0eM?@eu(Rw?X-=v1)}FJFe9*z4%Jh-9Sc4gwcLD!(^s*_
zN&ga6-NWp_LB@?tS(!N-dxAHi;;#n>Sh?)v+m8H^e}IfuLDcsAdsDL{1A-aZ{i*$wUE$Gj
zyOE&Yc@~oO->TFok$@Eed)YY32+?V^?~lMF!6U*)H^;P=C*6ZMo+HHd`B3U>ze~2g
zmnm6gg$t44ZN2qY#kZEuMpH|L9pIvtw!azFRsSP!#?5z#u&=g}tn!g!HsHIpJrMPP
z^1nFES|Q0Tma^^e$EG`F^*)8lS&bV(9;!bd1K0mHZ@nQ`
zgNH8TSBT&8)h~q(-vOwbVbZm3N?;esfCAMLOP_!6jSOgf!((`km{LQO(u+cJ1x#W;
zRox_d7q14syPFvuV7~W4=Mh|S|J|z*^K9B^&Qp9JOSkdS281yFck_Rh|IJ3VLP51c
zeP3u0pi(!ZAF&?mTkw2ag8`Xwbb9=V95pBj?}wFudFBFils%R?Ow`^!Ba!fue*g)~
zd92Lr@w120fH4l0geO7D<%drtAgU%fMa0~N2aobJsn0I-
zPIAaq6vVbPAvh=u6wSHwKq49Gzo;T_g0oxrnpilfaTxx}#jY12XHFD6t8Cc!vT4Fu>Vrp7ZaOZ&AQA%|){T%4{n)
zlTVvvQU4vjpRPnAj}~ZH=5I64=KxxgFQ{)=8
z1#|;)AgMLgY45sy1;>9|gDdFtc)uH*yYA@*_UTBV4V0<)tAilc)1L>?uj2%n*q!RX
zrr5gzqzW6YFM1mh$TY#wv%Rbk35@M*&xc(&e+-azb&eF{eNvNH@OkpMwt%N+JR}D=
zd%1_5UoCGm5~M7!3`+W$X27A34T^10^l(t^3R3L?`1M=KPrfypgkb}D#qb-OF>v@ac;4gEE^lpyasi`Idw)vomh_Vt`Vl-~;SkEmAv
z1lU?IM(Up7u@Ch177ABcEUj2Eb^uZWi?+WhwGeuGkx}$=e_lS7UMZJenFG^oma&Tm
zAC1g;43j#5xUE|`>|muZe?)#H$YUstEeB-M5hu`k$bE25%hjFGK3=jSYzb
z^@ReIjL#`lwBZq;37=#6cJbf`_{`@beZacA9{%dV$%CLCS#?U_c1s6pig=dM2dn=T
z34kgIz{~PmD%wvYz=@_89eiMIE(6hJXTwjAxrKCI`+GTjyA(Dbk34$b+Z33=OqYbfZlFhvcID@QGMw(`K1DgiO%+zP2TwTmrGv@UjI(;xN#ZKW8}xO
zRC|=TUW=hRzp;(Ms2kHpMd&K)p%LI?B(jd_4%Ovp=>-GB8L;ZR^t3e66f
zK*oC+44oDXfL9l0
zG0M~0eq2L(C+DxdwM7(!nWFC~lUx~;C^LTKG&4}%=8rNmvvfK>@<)w3ysvE>BfBsA
zaC}H|ykKtdUMo9$;@jGH{oSa_dtMf=*=MTW*D9{M4+V-yw3t1#lvtbr9URljKZcuE
z&QKN!icF5ZRkpt+s?m1?=fd`{f1g$yw+>#;iZnGUDF4Xd=0|a~YSw;%Bm8Ll=F;1&
z>YExd_RRH!L`7L+#kBr*%T7-Qr7~RDOq+EKiBrFri5R+nvFVO-u&J!*F0G=e>_!U(
z%MR;v=KUGZzCqk+tL^r?REoV!T*0v?-(kwh;z_5^QDg2RdImR`mKU<<^hNA3uNX(u
zn^?lq?*gyI_1_Ecr(OvMquP2jEO3h`3uW0)$-i$?&wWNWU`LNig#~RUjNmcPx?<7qMRUit=%do~SO{)#lu=_9-%*fhV&{c{)9@$jqJ=e-y!MVdhm0
z;S0+1F!5jP`IDSRy=R$yeL!)Pp>`M-lY(w-I4
zE?*$vx&VTH-jD_xuDR#kY1Jtu?vs=9vhlBFAz17BJE7C3GnYmmY50EL7>>J1Nm
z-B~?0F3L~)u^djcB5YdnxUg+^CyA9JdbUKG!E(wjVj_E|Fr#jiM&gun>>#~bkLT?;
z#W}Hod8QNlf-fyzP7TqvZ7a`fmRlH_wyXG@zvkKEyO^RtL3GU=tgYyi<3p`&kSuf!
zBK1dsF+YD0sH)GOr1|hI_MF-iH~CBO;=Mgh
zn$Y_O1jM>pHHj4}pOp~jU?-a_^^`CyX;C%+*UJ|`eO^rDlk}VT`~h%ivp6HZNE1Z@
zh9=^{X3As4ehe#9FnM09T>UM@KB>0?oPHgcIVSf^CuA3_!Ja4GpASc;NKOvdXmjmE
zFW+XI$-d&z)vb}d$rRN+&{*7hbPp~6^(g5g4_2~$V5+y=Sb{gVUaKgp>?=rDAz}4u
zHmdLAcmxB4Gj(VZP6}p0Nmh%KfHR~e6a)x;9=>3Qk^rrahsb6N3CX+{n$XTErIwm2
zg1}XBw#$8uVL80zT#&nndTMYPH!1AwAv7@ZbrJzWqs68Nf{a_TmV-PlDt{5%nb}Wv
zOq^mWUn*E{mE)&r7jfQURp1jElo)dfc+!`49{d@?;aC3yNiKmY8!DhsIV?mDAa}05
zLbQvYW4bU{VAM%D>k%e7zL7`7r=`Ia4V&dtWCM5e76>2Ed>Wt;-M$(-n4l<&*hDM|
zUqav$3~+ReF+00vygfrp3`_
zB(NMdQ&{JjHLQ`GRfYn){SUzLtg3_$uOx>F{hdMQZVw*G&YUNuBnQ65#q%Z6)E8#o
zJ6npm^w`q((eWHMRxuXG35*?&3^yne7B>KBAnk{2MN1DcG(ny_0A#
z=H*oR9k(4H+8%B(3zE6D>H&D~W+laSaHe-Egn#<1RN)H%0pCG@|K;6(ITcV$k#B0$
zG^32u1%&{_#CXAQ9kCu7KXpW**md5ov(31R*uF!8oI^G|%EyV0Sofs=+6+EwQdQi@
z#cIp27jvoWMWGiwl5KIO*F|=~=vsieq>+P~$OaSYc1zD%P7i4?oBFdd&)anrGIJmf
z>|->z!$lzSUo`NkCk0x+L>PU;U98Ul&m^$f