From 91cfa28d7f29c94fa9770a19295ba6f916274466 Mon Sep 17 00:00:00 2001 From: Sebastian <94404394+SeZett@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:39:38 +0200 Subject: [PATCH] Feature/datenspeicherung (#30) * Added Seminararbeit Datenspeicherung --- documentations/index.rst | 1 + .../seminararbeiten/3_Datenspeicherung.md | 68 - .../Datenspeicherung/00_Datenspeicherung.md | 748 ++++ .../Datenspeicherung/00_Datenspeicherung.pdf | Bin 0 -> 657523 bytes .../Datenspeicherung/01_Actionlist.md | 18 + .../2023-06-21_Datenspeicherung.pptx | Bin 0 -> 11704345 bytes .../DB_Scheme_19-06-2023.drawio | 1 + .../Data_Clusters_25-04-2023.drawio | 1 + .../Datenspeicherung/Docker_get_started.md | 70 + .../Jupyter/01_Stammdaten_Unternehmen_HR.csv | 13 + .../Jupyter/01_Stammdaten_Unternehmen_HR2.csv | 13 + .../11_Create_Tables_with_SQL-Alchemy.ipynb | 1130 ++++++ .../Datenspeicherung/Jupyter/Amtsgerichte.csv | 15 + .../Datenspeicherung/Jupyter/BASF_Data.csv | 25 + .../Datenspeicherung/Jupyter/EON_Data.csv | 17 + .../01_Connect_to_Database.ipynb | 203 + .../01_Stammdaten_Unternehmen.csv | 13 + ...ect_to_Database_publish_Company_Data.ipynb | 330 ++ .../03-1_Publish_Finance_Testdata_BASF.ipynb | 604 +++ ...3-2_Publish-Finance_Testdata_Telekom.ipynb | 479 +++ .../03-2_Publish_Finance_Testdata_EON.ipynb | 416 ++ .../04_First_Query.ipynb | 3329 +++++++++++++++++ .../Amtsgerichte.csv | 10 + .../BASF_Data_NewOrder.csv | 58 + .../EON_Data_NewOrder.csv | 33 + .../Telekom_Data_NewOrder.csv | 42 + .../person.csv | 1000 +++++ .../person2.csv | 20 + .../Datenspeicherung/Jupyter/Telekom_Data.csv | 19 + .../Datenspeicherung/Jupyter/edges.csv | 2001 ++++++++++ .../Datenspeicherung/Jupyter/person1000.csv | 1001 +++++ .../Datenspeicherung/docker-compose.yml | 34 + .../Datenspeicherung/images/DB_Schema.PNG | Bin 0 -> 55054 bytes .../Datenspeicherung/images/Data_Cluster.PNG | Bin 0 -> 60202 bytes .../Datenspeicherung/images/Document_DB.PNG | Bin 0 -> 7167 bytes .../Datenspeicherung/images/Front.PNG | Bin 0 -> 39852 bytes .../Datenspeicherung/images/Graph.PNG | Bin 0 -> 19875 bytes .../Datenspeicherung/images/HLD.PNG | Bin 0 -> 16206 bytes .../images/PG_Admin_Board.PNG | Bin 0 -> 60539 bytes .../Datenspeicherung/images/PG_Admin_Conf.PNG | Bin 0 -> 29304 bytes .../Datenspeicherung/images/Staging_DB.PNG | Bin 0 -> 55259 bytes .../images/Statista_Companies.png | Bin 0 -> 92254 bytes .../Datenspeicherung/images/company.PNG | Bin 0 -> 30648 bytes .../Datenspeicherung/images/finance_data.PNG | Bin 0 -> 102538 bytes 44 files changed, 11644 insertions(+), 68 deletions(-) delete mode 100644 documentations/seminararbeiten/3_Datenspeicherung.md create mode 100644 documentations/seminararbeiten/Datenspeicherung/00_Datenspeicherung.md create mode 100644 documentations/seminararbeiten/Datenspeicherung/00_Datenspeicherung.pdf create mode 100644 documentations/seminararbeiten/Datenspeicherung/01_Actionlist.md create mode 100644 documentations/seminararbeiten/Datenspeicherung/2023-06-21_Datenspeicherung.pptx create mode 100644 documentations/seminararbeiten/Datenspeicherung/DB_Scheme_19-06-2023.drawio create mode 100644 documentations/seminararbeiten/Datenspeicherung/Data_Clusters_25-04-2023.drawio create mode 100644 documentations/seminararbeiten/Datenspeicherung/Docker_get_started.md create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/01_Stammdaten_Unternehmen_HR.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/01_Stammdaten_Unternehmen_HR2.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/11_Create_Tables_with_SQL-Alchemy.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Amtsgerichte.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/BASF_Data.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/EON_Data.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/01_Connect_to_Database.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/01_Stammdaten_Unternehmen.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/02_Connect_to_Database_publish_Company_Data.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/03-1_Publish_Finance_Testdata_BASF.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/03-2_Publish-Finance_Testdata_Telekom.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/03-2_Publish_Finance_Testdata_EON.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/04_First_Query.ipynb create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/Amtsgerichte.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/BASF_Data_NewOrder.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/EON_Data_NewOrder.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/Telekom_Data_NewOrder.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/person.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Notebooks_with_SQL_and_preliminary_data/person2.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/Telekom_Data.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/edges.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/Jupyter/person1000.csv create mode 100644 documentations/seminararbeiten/Datenspeicherung/docker-compose.yml create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/DB_Schema.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Data_Cluster.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Document_DB.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Front.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Graph.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/HLD.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/PG_Admin_Board.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/PG_Admin_Conf.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Staging_DB.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/Statista_Companies.png create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/company.PNG create mode 100644 documentations/seminararbeiten/Datenspeicherung/images/finance_data.PNG diff --git a/documentations/index.rst b/documentations/index.rst index 8e83918..bfc77f1 100644 --- a/documentations/index.rst +++ b/documentations/index.rst @@ -32,6 +32,7 @@ This is the documentation for the AKI project group on the german transparenzreg :caption: Seminararbeiten seminararbeiten/DevOps/Seminarpräsentation.ipynb + seminararbeiten/Datenspeicherung/00_Datenspeicherung.md .. toctree:: :glob: diff --git a/documentations/seminararbeiten/3_Datenspeicherung.md b/documentations/seminararbeiten/3_Datenspeicherung.md deleted file mode 100644 index 1f76b94..0000000 --- a/documentations/seminararbeiten/3_Datenspeicherung.md +++ /dev/null @@ -1,68 +0,0 @@ -# Aufgabe: Inhaltliche Skizze für die Seminararbeit zur Thematik Datenspeicherung - -# 1. Allgemeine Anforderungen an Datenbank -- **Speicherung** von strukturierten Daten, wie Kennzahlen, Stammdaten -- **Skalierbarkeit:** Datenbank sollte skalierbar sein, um zukünftige Daten weiterhin zu speichern und weitere Unternehmen hinzuzufügen -- **Sicherheit:** Die Datenbank muss Funktionen unterstützen, um die Datenvor unbefugtem Zugriff zu schützen. -- **Datensicherung- und Wiederherstellung: ** Die Datenbank muss Funktionen zur Sicherung und Wiederherstellung unterstützen. -- **Leistung:** Die Performance der Datenbank ist eher zweitrangig, da die Abfrage nicht hochdynamisch sein muss. Ausserdem werden nicht viele Anfragen erwartet. -- **Integration:** Die Datenbank muss sich in ein Python Framework einbinden lassen und mit dem bevorzugten Frontend Daten austauschen können. - -# 2. Datenarten -Welche Daten erwarten wir im Projekt? \ -Cluster, wie z.B. Stammdaten, Stimmungsdaten, Social Graph, Zeitseriendaten/Historien - -> Abstimmung mit den Bereichen Textmining und Datenbeschaffung über verwendete Daten und Formulierung von Anforderungen an Daten. - -## 2.1 strukturierte Daten -Was sind strukturierte Daten? - -## 2.2 unstrukturierte Daten -Was sind unstrukturierte Daten? - -> Definiere eine Anforderung an die Struktur der Daten. - -# 3. Arten von Datenbanken -## 3.1 Relational -Was ist eine reltionale Datenbank? -Wie werden Daten gespeichert? -Beispiel für relationale Datenbank - -## 3.2 Graph -Was ist eine Graph Datenbank? -Wie werden Daten gespeichert? -Beispiel für Graph Datenbank - -## 3.3 Zeitserien -Was ist eine Zeitserien Datenbank? -Wie werden Daten gespeichert? -Beispiel für Zeitserien Datenbank - -> Kurzvorstellung von Datenbanksystemen - -# 4. DBS Transparenzregister -## 4.1 relationales Datenbankmodell - -> Modell zur Abbildung der Relationen im Projekt Transparenzregister - -## 4.2 verteilte Datenbank oder ein System -Ein DBS: Wenn nur ein Datenbanksystem verwendet wird, muss nur ein System gepflegt und integriert werden. - - Vorteil: einfache Verwaltung und schnelle Abfrage von Datenbeziehungen - -verteiltes System: spezialisierte Datenbank für jeden Datenytp, wie z.B. Zeitseriendaten oder Graph Daten - -> Definiere eine Empfehlung/Anforderung für das Projekt Transparenzregister. - -## 4.3 Analyse zur Auswahl eines Datenbanksystems -Was sollte bei der Auswahl eines Datenbanksystems beachtet werden? - -> Empfehlungen für DBS-Auswahl - -## 4.4 Anbindung an Front- und Backend -Wie kann das DBS an das Front- und Backend angebunden werden? -> Jupyter Notebook mit Beispiel - -## 4.5 Abfragen in der Datenbank -Wie können Unternehmensdaten abgefragt werden? -Wie können Verflechtungen abgefragt werden? -> Jupyter Notebook mit Beispiel \ No newline at end of file diff --git a/documentations/seminararbeiten/Datenspeicherung/00_Datenspeicherung.md b/documentations/seminararbeiten/Datenspeicherung/00_Datenspeicherung.md new file mode 100644 index 0000000..6cddc32 --- /dev/null +++ b/documentations/seminararbeiten/Datenspeicherung/00_Datenspeicherung.md @@ -0,0 +1,748 @@ + + +
+ +# Datenspeicherung +## Inhaltsverzeichnis + +- [Datenspeicherung](#datenspeicherung) + - [Inhaltsverzeichnis](#inhaltsverzeichnis) + - [Motivation: Warum speichern wird Daten?](#motivation-warum-speichern-wird-daten) + - [1. Allgemeine Anforderungen an Datenbank](#1-allgemeine-anforderungen-an-datenbank) + - [2. Datenarten](#2-datenarten) + - [2.1 Welche Daten erwarten wir im Projekt?](#21-welche-daten-erwarten-wir-im-projekt) + - [2.2 strukturierte Daten](#22-strukturierte-daten) + - [2.3 unstrukturierte Daten](#23-unstrukturierte-daten) + - [3. Arten von Datenbanken](#3-arten-von-datenbanken) + - [3.1 Relationale Datenbank](#31-relationale-datenbank) + - [3.1.1 Anlegen von Tabellen](#311-anlegen-von-tabellen) + - [3.1.2 SQL - Abfrage von relationalen Datenbanken](#312-sql---abfrage-von-relationalen-datenbanken) + - [3.2 Graphdatenbank](#32-graphdatenbank) + - [3.2.1 Erstellung eines Datensatzes](#321-erstellung-eines-datensatzes) + - [3.2.2 Cypher - Abfrage von Graphdatenbanken](#322-cypher---abfrage-von-graphdatenbanken) + - [3.3 Zeitseriendatenbank](#33-zeitseriendatenbank) + - [3.3.1 Erstellung eines Datensatzes](#331-erstellung-eines-datensatzes) + - [3.3.2 FluxQuery](#332-fluxquery) + - [3.4 Dokumenten Datenbank ](#34-dokumenten-datenbank-) + - [3.4.1 Erstellen einer Collection / Ablegen von Dokumenten](#341-erstellen-einer-collection--ablegen-von-dokumenten) + - [3.5 Aufbau einer Datenbank](#35-aufbau-einer-datenbank) + - [4. Datenbanken Transparenzregister](#4-datenbanken-transparenzregister) + - [4.1 Production DB - relationales Datenbankmodell](#41-production-db---relationales-datenbankmodell) + - [4.2 Staging DB](#42-staging-db) + - [4.3 SQL Alchemy](#43-sql-alchemy) + - [5. Proof of Concept](#5-proof-of-concept) + - [5.1 Docker](#51-docker) + - [5.2 PG Admin](#52-pg-admin) + - [5.3 Erstellen von Mock Daten](#53-erstellen-von-mock-daten) + - [5.4 Anlegen der relationalen Tabellen](#54-anlegen-der-relationalen-tabellen) + - [5.5 Abfragen der Datenbank](#55-abfragen-der-datenbank) + - [6. Zusammenfassung](#6-zusammenfassung) + - [Quellen](#quellen) + + + + +## Motivation: Warum speichern wird Daten? +Für die Speicherung von Daten gibt es verschiedene Motivationen: +- **Sammlung:** Zur Aufbewahrung von Wissen und Informationen über Objekte, Ereignisse oder Prozesse werden Daten gespeichert. +- **Historisierung:** Durch die Speicherung von Daten in einem zeitlichen Zusammenhang, wird eine Historie erstellt, mit welcher Muster, Trends oder Zusammenhänge erkannt werden können. Historische Daten helfen ausserdem bei der Entscheidungsfindung. +- **Bewertung:** Mit gespeicherten Daten können Systeme, Produkte und Prozesse nachvollzogen, bewertet und verbessert werden. + +Im Projekt Transparenzregister ist die Datenspeicherung eine Kernkomponente, da die gesammelten Informationen die Grundlage für Analysen darstellen. \ +Mit geeigneten Pipelines werden aus diesen Daten Erkenntnisse extrahiert, um z.B. Verflechtungen zwischen Personen und Unternehmen oder den wirtschaftlichen Trend eines Unternehmens visualisieren und bewerten zu können. + +## 1. Allgemeine Anforderungen an Datenbank +- **1.1 Speicherung/Integrität**: Das verwendete System muss Daten, wie Unternehmenskennzahlen, Stammdaten und Verflechtungen speichern. Die Daten müssen korrekt und konsistent gespeichert werden. Konsistent bedeutet in einem gültigen und widerspruchsfreien Zustand und die Transaktionen sollen den ACID-Eigenschaften entsprechen. + - **Atomarity:** Eine Transaktion wird atomar betrachte, d.h. es ist die kleinste unteilbare Einheit, wodurch eine Transaktion entweder vollständig durchgeführt und übernommen wird (Commit) oder bei einem Fehler rückgängig gemacht wird (Rollback). + - **Consistency:** Konsistenz bedeutet, dass eine Transaktion den Datenbankzustand von einem gültigen in einen anderen gültihgen Zustand überführt. Sollte eine Transaktion eine Konsitenzverletzung verursachen, wird diese abgebrochen und die Änderungen zurückgesetzt. + - **Isolation:** Isolation sorgt dafür, dass alle Transaktion unabhängig voneinander ausgeführt werden, damit sich diese bei der Ausführung nicht gegenseitig beeinflussen. + - **Durability:** Dauerhaftigkeit bedeutet, dass die Ergebnisse einer Transaktion dauerhaft in der Datenbank gespeichert werden und auch nach einem Systemneustart oder Systemfehler erhalten bleiben. +- **1.2 Skalierbarkeit:** Das System soll skalierbar sein, um zukünftige Daten weiterhin zu speichern und weitere Unternehmen hinzuzufügen. Durch Hinzufügen von Ressourcen kann das System an steigende Datenmengen und Benutzeranforderungen angepasst werden. Man spricht von horizontaler Skalierung, da die Last auf mehrere Datenbankserver verteilt wird. +- **1.3 Sicherheit:** Die Datenbank muss Mechanismen bereitstellen, um die Daten vor unbefugtem Zugriff zu schützen. + - **Authentifizierung:** Überprüfung der Identität eines Benutzers, durch Benutzername und Passwort. Meist wird eine Zwei-Faktor-Authentifizierung verwendet, um das Sicherheitslevel zu erhöhen. + - **Autorisierung:** Der authentifizierte Benutzer erhält bei der Autorisierung Zugriffsrechte und Ressourcen, welche auf seiner Benutzerrolle basieren. Ein Benutzer mit Administratorrechten, erhält Zugriff auf alle Systemressourcen, wohingegen ein normaler Benutzer nur beschränkten Zugriff erhält. + - **Verschlüsselung:** Durch Verschlüsselung werden Daten in ein nicht interpretierbaren Code umgewandelt, um den Inhalt vor unbefugtem Zugriff zu schützen. Dafür wird ein Algorithmus verwendet, welcher einen Schlüssel generiert und die Daten mit diesem verschlüsselt. Um die Daten wieder lesen zu können, müssen diese mit dem Schlüssel dechiffriert werden. +- **1.4 Datensicherung- und Wiederherstellung:** Die Datenbank muss Funktionen zur Sicherung und Wiederherstellung unterstützen. Im Falle eines Ausfalls oder Fehlers muss sichergestellt sein, dass Mechanismen die Daten schützen und wiederherstellen. +Die meisten Daten in einer Datenbank ändern sich nur langsam, manche allerdings schnell. Je nach Anwendungsfall muss eine geeignete Sicherungsstrategie ausgewählt werden, um nur die Daten zu sichern, die sich tatsächlich ändern. +Jedes Datenbankmanagementsystem bietet unterschiedliche Mechanismen zur Datensicherung und Wiederherstellung, dessen Möglichkeiten nach Auswahl eines Systems + - **vollständiges Backup:** Das vollständige Backup ist eine komplette Kopie der Datenbank inkl. aller Daten, Indizes, Tabellen und Metadaten. Es benötigt viel Speicherplatz und Zeit zur Erzeugung der Sicherung und auch zur Wiederherstellung. + - **inkrementelles Backup:** Ein inkrementelles Backup sichert nur die Änderungen seit dem letzten vollständigem bzw. inkrementellen Backup. Durch den verringerten Datenbestand ist es deutlich schneller und datensparsamer, als das vollständige Backup. Zur Wiederherstellung wird das letzte vollständige und alle inkrementellen Backups benötigt. Allerdings entsteht eine Abhängigkeitskette, da jedes Backup seine Vorgänger zur Wiederherstellung benötigt. + - **differentielles Backup:** Beim differentiellen Backup werden alle Änderungen seit dem letzten vollständigem Backup gesichert. D.h. je weiter die letzte vollständige Sicherung zurückliegt, desto größer und langsamer wird das Backup. Zur Wiederherstellung werden das letzte vollständige und differentielle Backup benötigt. + + + + +**Backuphäufigkeit:** +Die Backuphäufigkeit ist eine Abwägung aus Risiken, Kosten und Arbeitsaufwand. Dieses muss individuell abgeschätzt werden aufgrund des Datenbankumfangs und der Änderungshäufigkeit der Daten, um eine geeignete Backup-Strategie zu entwerfen. \ +*Beispiel:* +- Vorgabe: Datenbank mit 500GB Größe + - Anforderungen + - min. vierfache Backupkapazität --> 2 TB + - Backupdauer vollständig: \ + USB 2.0:$\frac {500GB}{\frac{60MB/s}{1024}} = 8533 sec. \approx 142Min. \approx 2,37 Std.$ \ + USB 3.0:$\frac {500GB}{\frac{625MB/s}{1024}} = 820 sec. \approx 13,6Min. \approx 0,23 Std.$ \ + VDSL 100:$\frac {500GB}{\frac{5MB/s}{1024}} = 102400 sec. \approx 1706Min. \approx 28,4 Std.$ \ + Glasfaser:$\frac {500GB}{\frac{62,5MB/s}{1024}} = 8192 sec. \approx 136,5Min. \approx 2,3 Std.$ + +- **1.5 Leistung:** Die Performanceanforderungen an die Datenbank ergibt sich aus verschiedenen Merkmalen. Diese können kombiniert gestellt werden und sind abhängig von den Anforderungen an das System. Eine Analyse der Anwendungsfälle ist notwendig, um die Anforderungen zu spezifizieren. + - **Latenz:** Die Datenbank soll Anfragen effizient und in einer akzeptablen Antwortzeit verarbeiten. Typische Datenbankapplikationen, wie z.B. ein Webshop benötigen viele einzelne Zugriffe, wofür jedes Mal ein Kommunikationsprotokoll angewendet wird. Durch viele kleine Datenbankzugriffe wird die Applikation verlangsamt, da auf die Netzwerkkommunikation gewartet wird. Für das Benutzererlebnis eines Webshops ist die Latenz ein wichtiges Merkmal. + - **Durchsatz:** Ist eine Metrik für die Anzahl an Transaktionen pro Zeiteinheit. Der Durchsatz ist wichtig bei großen Benutzeraufkommen in einem Webshop. + - **Verfügbarkeit:** Eine hohe Verfügbarkeit, also Erreichbarkeit der Datenbank, wird durch Redundanz (mehrfaches Vorhandensein) und Wiederherstellungsmechanismen gewährleistet, damit Daten koninuierlich verfügbar sind. + - **Wartbarkeit:** Eine einfach zu wartende Datenbank muss Funktionen zur Überwachung, Diagnose, Wartung, Datensicherung und Wiederherstellung bereitstellen. Durch diese automatisierten Pipelines können andere Eigenschaften, wie z.B. die Verfügbarkeit negativ beeinflusst werden, weil Prozesse die Datenbank blockieren. +- **1.6 Integration:** Die Datenbank muss Schnittstellen bereitstellen, um die gespeicherten Daten für eine Anwendung bzw. Systeme zur Verfügung zu stellen. + - **API:** Das *Application Programming Interface* ist eine definierte Schnittstelle, welche Methoden und Funktionen bereit stellt, um auf die Datenbank zuzugreifen bzw. um diese zu verwalten. + - **REST:** REpresential State Transfer beschreibt eine Schnittstelle, die das http-Protokoll verwendet, wo mit den Methoden GET, POST, PUT, DELETE die Kommunikation realisiert wird. + - **SOAP:** Simple Object Access Protocol ist eine Schnittstelle, welche auf XML basiert. + - **ODBC:** Open Database Connectivity ist eine standardisierte Schnittstelle zum Austausch zwischen Anwendungen und Datenbanken. + - **JDBC:** Java Database Connectivity + + +## 2. Datenarten + +Zur Beschreibung von Unternehmen, werden verschiedene Datenarten verwendet. +Die folgenden Datenarten sind eine allgemeine Zusammenfassung und sollen das Brainstorming für die projektspezifischen Daten unterstützen. +- **Stammdaten:** Stammdaten beinhalten die grundsätzlichen Eigenschaften und +Informationen von realen Objekten, welche für die periodische Verarbeitung notwendig sind. Ein Stammsatz für Personal besteht z.B. aus einer Personalnummer, dem Mitarbeiternamen, Anschrift und Bankverbindung. \ +Je nach Anwendungsfall bzw. Geschäftsprozess muss der Inhalt definiert werden, wie z.B. bei Unternehmens-, Kunden-, Material- oder Patientenstammdaten. + +- **Metadaten:** Mit Metadaten werden weitere Daten beschrieben und vereinfachen das Auffinden und Arbeiten mit diesen. Metadaten beinhalten beispielsweise den Verfasser, das Erstellungs- oder Änderungsdatum, die Dateigröße oder den Ablageort. \ +Mit Metadaten können Datenbestände einfacher und effizienter verwaltet und abgefragt werden. + +- **Transaktionsdaten:** Transaktionsdaten beschreiben eine Veränderung des Zustands, wie z.B. eine Kapitalbewegung oder eine Ein-/Auslieferung aus einem Lager. + +- **Referenzdaten:** Referenzdaten sind eine Teilmenge von Stammdaten und beschreiben die zulässigen Daten. Diese werden nur selten geändert oder angepasst und gelten als konstant. Beispiele für Referenzdaten sind: Postleitzahlen, Kostenstellen, Währungen oder Finanzhierarchien. + +- **Bestandsdaten:** Bestandsdaten sind dauerhafter Veränderung ausgesetzt, da diese z.B. die Artikelmenge in einem Lager oder das Guthaben auf einem Konto beschreiben. Diese korrelieren mit den Transaktionsdaten. + +Diese Datenarten müssen im Kontext des Projektes betrachtet werden und sollen das Brainstorming unterstützen. \ +*Stammdaten:* Unternehmensname, Anschrift, Branche \ +*Metadaten:* Verfasser einer Nachricht - Veröffentlichungsdatum; Prüfungsunternehmen - Prüfdatum \ +*Transaktionsdaten:* Wer hat wann wo gearbeitet? \ +*Referenzdaten:* Einheit von Metriken (Umsatz, EBIT usw.) \ +*Bestandsdaten:* Vorstand, Geschäftsführer, Aufsichtsrat + +### 2.1 Welche Daten erwarten wir im Projekt? +Aus den vorangehenden, allgemeinen Datenarten haben wir Cluster identifiziert, welche im Projekt benötigt werden. +Die Kombination aus den folgend aufgeführten Datenclustern ermöglicht eine ganzheitliche Betrachtung und Bewertung der Unternehmen. + +- **Unternehmensstammdaten:** Die Stammdaten beinhalten grundlegende Informationen zu einem Unternehmen, wie z.B. Name, Anschrift, Gesellschaftsform und Branche. + +- **Sentimentdaten:** Die Sentiment- oder Stimmungsdaten beschreiben die Aussenwahrnehmung des Unternehmens hinsichtlich der Mitarbeiterzufriedenheit, Nachhaltigkeit und Umweltfreundlichkeit. +> Mit Sentimentdaten können folgende Fragen beantwortet werden: +>- Welchen Ruf hat das Unternehmen? +>- Wie ist die Aussenwahrnehmung? +>- Wie ist die Kundenbindung? +- **Finanzdaten:** Die Finanzdaten sind Metriken bzw, Indikatoren, um den wirtschaftlichen Erfolg des Unternehmens zu bewerten. Hierzu zählen z.B. Umsatz, EBIT, EBIT Marge, Bilanzsumme, Eigenkapitalanteil, Fremdkapitalanteil, Verschuldungsgrad, Eigenkapitalrentabilität, Umschlaghäufigkeit des Eigenkapitals. +> Mit Finanzdaten können folgende Fragen beantwortet werden: +>- Wie rentabel wirtschaftet das Unternehmen? +>- Wie ist der wirtschaftliche Trend? +>- Bewerten anhand verschiedender Metriken. + +- **Verflechtungsdaten/Social Graph:** Die Verbindungen bzw. Beziehungen zu Personen oder Unternehmen wird in den Verflechtungsdaten abgelegt. Beziehungen entstehen, wenn eine Person Geschäftsführer, Vorstand, Aufsichtsratmitglied, Prokurist oder Auditor ist und Unternehmen z.B. gemeinsam arbeiten, beliefert wird oder Anteile an einem anderen Unternehmen besitzt. +> Mit Verflechtungsdaten können folgende Fragen beantwortet werden: +>- Gibt es strategische Partnerschaften? +>- Wie sind die Lieferketten aufgebaut? +>- Wie ist die Qualität der Geschäftsbeziehungen? +>- Ist das Unternehmen widerstandsfähig aufgestellt? +>- Gibt es Zusammenhänge zu Personen? + +Die abgebildete Mind Map ist nicht vollständig und bildet nicht den finalen Datenumfang des Projekts ab. Es ist eine Momentaufnahme, bevor das relationale Schema entwickelt und die Implementierung begonnen wurde. + + + + +### 2.2 strukturierte Daten + +Strukturierte Daten liegen in einem definierten Format. Vorab wird ein Schema definiert, um Felder, Datentypen und Reihenfolgen festzulegen und die Daten entsprechend abzulegen. +Diese Art von Daten wird z.B. in relationalen Datenbanken verwendet, wobei jede Zeile einer Tabelle einen Datensatz repräsentiert. Die Beziehungen untereinander sind über die Entitäten definiert. +Das Beispiel unten zeigt ein einfaches Beispiel, wie die Daten für die Klasse *Company* definiert sind. Mit diesem Schema kann die Datenaufbereitung umgesetzt werden. + + + +```mermaid +--- +title: Structured Data +--- +classDiagram + class Company:::styleClass { + int ID + string Name + string Street + int ZipCode + } + + +``` +|Vorteile|Nachteile| +|:-----:|:------:| +|einfach nutzbar, da organisiert |Einschränkung der Verwendungsmöglichkeit durch Schema | +| bei bekannten Schema sind Werkzeuge vorhanden|begrenze Speichermöglichkeit, da starre Schemata vorgegeben sind | +|gut automatisierbar | | + +### 2.3 unstrukturierte Daten +Unstrukturierte Daten unterliegen keinem Schema, wie z.B. E-Mails, Textdokumente, Blogs, Chats, Bilder, Videos oder Audiodateien. +- **Textanalyse:** Aus unstrukturierten Texten werden z.B. durch Analyse und Mining Informationen gewonnen, um diese zu extrahieren. Es wird das Vorkommen von bestimmten Wörtern mittels Named Entity Recognition ermittelt oder die Stimmung bzw. das Thema in einem Artikel. +- **Audio-/Videoanalyse:** Bei der Verarbeitung unstrukturierter Audio- oder Videodateien werden Objekte, Gesichter, Stimmen oder Muster erkannt, um diese für Sprachassistenten oder autonome Fahrzeuge nutzbar zu machen. + +Eine wichtige Informationsquelle sind unstrukturierte Daten für Explorations- und Analyseaufgaben. Dabei werden Datenquellen wie z.B. E-Mails, RSS-Feeds, Blogs durchsucht, um bestimmte Informationen zu finden oder Zusammenhänge zwischen verschiedenen Quellen hherzustellen. Dies ermöglicht tiefe Einsicht in die Daten zu erhalten und unterstützt die Entscheidungsfindung bei unklaren Sachverhalten und die Entdeckung neuer Erkenntnisse. + +|Vorteile|Nachteile| +|:-----:|:------:| +|großes Potenzial Erkenntnisse zu erlangen |aufwändige Bearbeitung notwendig, um Daten nutzbar zu machen| +|unbegrenzte Anwendungsmöglichkeiten, da kein Schema vorhanden ist|spezielle Tools zur Aufbereitung notwendig| +| |Expertenwissen über die Daten und Datenaufbereitung notwendig | + +## 3. Arten von Datenbanken +### 3.1 Relationale Datenbank +Eine relationale Datenbank speichert und verwaltet strukturierte Daten. Dabei werden die Daten in Tabellen organisiert, welche aus Zeilen und Spalten bestehen. \ +In den Zeilen der Tabellen sind die Datensätze gespeichert, d.h. jede Zeile repräsentiert einen Datensatz. Durch logisches Verbinden der Tabellen können die Beziehungen zwischen den Daten abgebildet werden. \ +Die wichtigsten Elemente einer relationalen Datenbank werden folgend erklärt: + +**Tabelle:** Eine Tabelle repräsentiert eine Entität bzw. Objekt , wie z.B. Unternehmen, Kunde oder Bestellung. Die Tabelle besteht aus Spalten, welche die Attribute der Entität speichern. \ +Jede Zeile ist eine Instanz des Objekts und enthält konkrete Werte. + + +**Table_Person** +|**ID**|**Name**|**Age**|**Salary**|**Height**| +|---|---|---|---|---| +|1|Tim|31|300.00|191.20| +|2|Tom|21|400.00|181.87| +|3|Tam|51|500.00|176.54| + +https://www.sqlservercentral.com/articles/creating-markdown-formatted-text-for-results-from-sql-server-tables + +**Primärschlüssel:** Der Primärschlüssel ist ein eindeutiger Bezeichner für jede einzelne Zeile einer Tabelle und wird zur Identifikation einer einzelnen Zeile benötigt. Im oberen Beispiel ist die Spalte *ID* der Primärschlüssel. + +**Fremdschlüssel:** Ein Fremdschlüssel verweist auf einen Primärschlüssel einer anderen Tabelle, um eine Beziehung zwischen den Tabellen herzustellen. \ +Im Beispiel ist bezieht sich die Spalte *customer_id* auf den Primärschlüssel der Tabelle *Table_Person*. + +**Table_Orders** +|**ID**|**Product**|**total**|**customer_id**| +|---|---|---|---| +|1|Paper|12|2| +|2|Book|3|2| +|3|Marker|5|3| + +**Beziehungen:** Wie bereits beschrieben, können mit der Verwendung von Fremdschlüsseln Beziehungen zwischen den Tabellen hergestellt werden. \ +Es gibt verschiedene Beziehungstypen: + +|**Typ**|**Beschreibung**| +|---|---| +|1:1|Jeder Primärschlüsselwert bezieht sich auf nur einen Datensatz. **Beispiel:** Jede Person hat genau eine Bestellung. | +|1:n|Der Primärschlüssel ist eindeutig, tritt in der bezogenen Tabelle 0..n mal auf. **Beispiel:** Jede Person kann keine, eine oder mehrere Bestellungen haben. | +|n:n|Jeder Datensatz von beiden Tabellen kann zu beliebig vielen Datensätzen (oder auch zu keinem Datensatz) stehen. Meist wird für diesen Typ eine dritte Tabelle verwendet, welche als Zuordnungs- bzw. Verknüpfungstabelle angelegt wird, da andernfalls keine direkte Verbindung hergestellt werden kann. | + +https://www.ibm.com/docs/de/control-desk/7.6.1.2?topic=structure-database-relationships + +#### 3.1.1 Anlegen von Tabellen +Der Umgang von relationalen Datenbanken erfolgt mittels SQL. Folgend ein Beispiel zum Anlegen einer Tabelle mit Attributen. + +``` +CREATE TABLE Bildungsstaette ( + ID INT PRIMARY KEY NOT NULL, + Name VARCHAR(255) NOT NULL, + Anschrift VARCHAR(255), + Art VARCHAR(100) +); +``` + +#### 3.1.2 SQL - Abfrage von relationalen Datenbanken + +Für die Verwaltung und Abfrage wird SQL (Structured Query Language) verwendet. +Mit dieser Syntax können Tabellen erstellt, Daten eingefügt, aktualisiert und gelöscht und Daten abgefragt werden. + +**Anzeige aller Attribute einer Tabelle:** +``` +SELECT * FROM table_name; +``` + +**Anzeige definierter Attribute einer Tabelle:** +``` +SELECT column1, column2 FROM table_name; +``` + +**Gefilterte Anzeige einer Tabelle:** +``` +SELECT * FROM table_name WHERE condition; +``` + +**Daten aus mehreren Tabellen abrufen (Join):** +``` +SELECT t1.column1, t2.column2 +FROM table1 t1 +JOIN table2 t2 ON t1.id = t2.id; +``` + +### 3.2 Graphdatenbank +Eine Graphdatenbank basiert auf dem Graphenkonzept. \ +Ein Graph besteht aus Knoten und Kanten (Beziehungen), welche die Verbindungen zwischen den Knoten darstellen. \ +Die Stärke der Graphdatenbank liegt in der Darstellung von komplexen Beziehungen. + +**Knoten:** Jeder Knoten repräsentiert eine Entität bzw. Objekt. Jeder Knoten hat eine eindeutige ID oder Bezeichner, um auf diesen zugreifen zu können. Es können auch Attribute hinterlegt werden, um zusätzliche Informationen zu speichern, wie z.B. Geburtsjahr, Wohnort einer Person. + +**Kanten:** Die Kanten verbinden die Knoten und repräsentieren damit die Beziehungen unter den Objekten. Die Kanten können gerichtet und ungerichtet sein. Bei einer gerichteten Beziehung muss die Richtung vom Quell- zum Zielknoten beachtet werden, wohingegen eine ungerichtete Kante eine symmetrische Beziehung darstellt. \ +*gerichtete Beziehung:* Ein Unternehmen ist abhängig vom Bericht des Wirtschaftsprüfers. \ +*ungerichtete Beziehung:** Unternehmen A arbeitet gemeinsam mit Unternehmen B an einem Projekt. + +**Label:** Label werden verwendet, um die Knoten zu kategorisieren/gruppieren. Ein Knoten kann auch mehrere Label besitzen, um die Zugehörigkeit an verschiedenen Kategorien darzustellen (z.B. Unternehmensbranche). + +#### 3.2.1 Erstellung eines Datensatzes +1. Knotenerstellung: Es wird zuerst ein Knoten erstellt, der die Entität repräsentiert. +2. ID: Der Knoten benötigt eine eindeutige Identifikationsnummer, welche automatisch erzeugt oder manuell festgelegt werden kann. +3. Knoten einfügen: Wenn die beiden notwendigen Elemente (Knoten und ID) festgelegt sind, kann der Knoten eingefügt werden. +4. Beziehungen/Kanten festlegen: Wenn der Knoten Beziehungen zu anderen Knoten hat, können diese hinzugefügt werden. + +**Beispiel:** +Folgender Code legt in neo4j zwei Knoten und die entsprechenden Beziehungen an. + +``` +CREATE (:University {id: 4711, name: 'FH SWF - Iserlohn'}), + (:University {id: 1234, name: 'FH SWF - Meschede'}) +WITH * +MATCH (u1:University {id: 4711}), (u2:University {id: 1234}) +CREATE (u1)-[:cooparates_with]->(u2), + (u2)-[:cooparates_with]->(u1) +``` + + +#### 3.2.2 Cypher - Abfrage von Graphdatenbanken +Um Daten abzufragen wird die Abfragesprache Cypher verwendet.\ +Es werden folgend nur einige grundlegende Befehle gezeigt.\ + +**Abfrage aller Knoten** +``` +MATCH (n) +RETURN n +``` +**Abfrage aller Kanten/Beziehungen** +``` +MATCH ()-[r]-() +RETURN r +``` + +**Abfrage von Knoten mit definierten Eigenschaften** +``` +MATCH (n:Label) +WHERE n.property = value +RETURN n +``` + +**Beziehung zwischen zwei Knoten abfragen** +``` +MATCH (n1)-[r]->(n2) +WHERE n1.property = value1 AND n2.property = value2 +RETURN r +``` + +### 3.3 Zeitseriendatenbank + +Zeitserien fallen überall dort an, wo eine Metrik zeitlich betrachtet wird, wie z.B. Umsatz oder EBIT. +D.h. zu jedem Messwert gibt es einen zeitlich zugeordneten Zeitstempel, wobei die einzelnen Zeitpunkte zu einer Serie zusammengefasst werden, um den Zusammenhang zu betrachten. \ +Diese Datenbanken sind spezialisiert auf die Speicherung, Verwaltung und Abfrage von Zeitserien. \ +Die folgenden Erklärungen beziehen sich auf die InfluxDB. + +**Bucket:** Der Bucket separiert Daten in verschiedene Speicher und ist mit der Datenbank bei relationalen Datenbanken vergleichbar. + +**Datapoint:** Unter dem Bucket werden die Datenpunkte gespeichert. Ein Datapoint setzt sich aus mehreren Elementen zusammen, welche erorderlihc oder optional sind: + +|**Element**|**Eigenschaft**| +|---|---| +|Measurement |Datentyp: String^r{*fqOJDR7!$rf(KG zcXyR-yyxk2bW;2%wWfjsaTI-Iwm;%DrEl2-PD>!+6y=-Ln*zCqg oga|N zBl@fNq3Pn|daQ@=m_^C{*<4IeZ6QDUZ5FNb78fkG<}Wwl@Lh~H>js7`=0ygX4V;w5 zEdQp1nH4 I$3xv#>(`Ucy-6CEjwZE($@Qyx)X8rTi Pc@TR~)8YEzO1t&2lv zZW*-VX_?hK2qsi6r$`U&WQrDaYk5y$QS@3@o%HEA6QwA^p`|&G#l`C|Fl$$ruT3w0 z|CpFU+c}d*C%i}LR+7?Nm3wz=&An@ZWe@RZ$n>96H=Bn=v2SW#x5L{0E)K0N!54yS zZel-fwmuR6#^`F60(G#lZS7PpFS xshimqJ!h`**(_<<4$|RP$chc!5b^oi zJ?seCz$TGUIEs^$`ICG5V5!7RJ} 05bSjt)_i7&!K0xLl`)E=kHZqtw5P zRUF^;{W G zLJmeKx>;rNQIhrC%4I^@)U5Qlc@ d|YQc)`=WEOH#3j2y4VOFJJYM+EZhtfb@L1MJJ7 z-5=vR2%o84siQBXKOO&KaaHv^;f+N|C4TH`6yx3&(Y#W!d9?6?=!)0cdfi{O_rxti zzCH%&LKIL?#pBPOa;?QOFk{$$N$`ZmpNTlX#gU{~cHJ50 ufW(LgWS_6r#oKq=9nT;9X< w4@GO^u=Aw4r3v-f#q+ Ad}?3(K<`QPh`w|?!PWyBcl zE)w <|Low02w| z%1o|!!DZ|g3K3h}pVDiC_h9$q!hRDD9eQm#umF~?H7q=QTUllCCHdopL4p^i=#PX~ zN_M>rb656RjW(6C7rC-aP2CL^!e<{dPS4ifpo2>@SVUmdt%nbxg_x_t6T5VB!Xk5v zdajeqiw!3TOk&mF-sFB~XEr9PiB4C(Z=N!ir~mUQ(fkpmtknPKRO_OPQxL)3#%cYE zNx(}$=4R=o8!u{v;}Rln<9J)K3sr#7W!_r7;I!SBGo)o;b3^&5mTK4z IFD#G8cp*bK z(u^Ax(ou6SYiu$3fXPjp)KJ6JowxRA2ICd6b5nP6!OlYwolCJ)zL2Ji_h_Pm3YRT! z3&iQ!f6628mOQ&4=sXV@=b@8tqJio`Y}QombTS_W&AbP6BV=ZrOl5J2L$k`uSCSp~ zg!4oX!dFJy$Cqi`x+PK|3d=-deCd%#8!9vPD4(Oi22)p|a4`}_T!;~)?WJ1na>q}r zrellWZ@FfMV7u?Fm~5U4cZgrSK+8_;F>eG==H%bD#nm#qofB!6IAd=w;YyWXgbmU$ zRzfQHE$>k|K30~O$c)kx)RC*%m9@}a5RaoG3b`9N>(E2h=V>VJ9x%m#h`Sk(+Vb8; znf#1`x-=2I`a;?!QZN%=!-%*-t$?tmQk;sM({h3Q$B*KgFes!4;&Y*fb${{ z-6zw3q+jebMXILi=+04X=`5A$p7Z(aZlX6)- xr3NYl_>)fX1o*rO(J!EWPn_j>xcaZD^|0#2Z=3y~d1l2=`MUw}Qa zt3%EnuJFB7u-^>FEW3q$S05IiZe%3j+|^d9zByH$)jwNDo+oVi0m!qsS6%Y}EHpDS zGqOwz?eXMTN-M`Xc2N;t5wzLgr97s*O2woswBYwSNz>I|*R3*_PlvdTd&jx^wl4Ee z+)M;|SmTvHgB?TINFANJlZ_TY$buCl7A?(B9W~yS)D^OuYtd9-CML^U$tu*~X!U26 z=2trU<4c{_0`|E=aKLrFfa`Pm3txjQJgm lJcp5j<@>H&^EV`OLZ z`E=#^>dKas%*dr8mBz1;$s3JYoK2XEi)^ZX<(<}z8Y$oR_n#)1aZOpWSu3MgXiVg7 zV7nL{yH)#+AKp-CL;pzp@R$fh>91pp^uZv-{nXrL@aA!Afy@%i{P4j31LC1S zZrE}1Y{(;!+i>%IzVf-|bL5+2H6RFEkRNBsAvX@Oodbz=8n|Pjg$=g5Yx-ZiEoq>R z&AWx;3Oah#P fs9&DCTXs{~o#x8Y`=_0Bk;?>O{oK SUY{ z?8Q0sd@Oj&?x)=A^)8}uiTQH}(VxnR5}V`BijZ0c(9a)=i1Ra|hWY}|rJ96#E&D%f zO3FW7Kv2i47|!y`rw9^g4b^$Tm|ll2oItz?$%Aogv|T@L4jSZ^30!M^SqMxB&Rf9@ zl%)u_eqdN=$1xxheGpdbMRQu^?e%HYHcU$QDqmgaf~+xwRF{tcnD1qYOFYHy;P~!2 zziQ|csO33V*2PH_(^zv65x0De{(capU7JGrusx(xw@`;1EsR|$k2kgXsc*_hB;o*z zHnW+xjD{c|U>_2-Yyfaosn@ysU)IYsR2O+TOfh%Yzw@ql_kEwnGh)c7MrYaYb%N}% z63kF+Rj0k&ka*U_4ZX)m1qr8$`<}34Jfb+=a#>zyr=V4`XKeVDJhttlvff{>dB42d zYT<-ZvaxgA#U%fPGLSj+D;jAG=?@=^mY@ z)uf@wx4=va@yAJe^nBWKZjUD8HhJ-$ W3xAV)1VQ8Ed;AB_&O% %P{u2uiv`Z z)%8Q}OOly0HW)G(rtCL*Lbbr{Gc9aH7#IfsWte<21F6qF#i$d8FZ0V75dMcz72=Lt z{i#Ckej8V#qo9`vB$4TBU~__tUmj*}BTp2TFDJJ~c}#zIC);JVvQ%ZWoZ(A>_bO!F z^;T9WX&~O;Q|hVYymUgy{SIBWwW{khQzU&E<>3wTnpE9Yxr=@yTUK+h!JeVY!#DB( zbo*ebKOlPLk9lCdf!-vw`1#UL*a#mTNMj?uC=+_F34LGoYTD&L*~AsKD$9;F$K9pk z!9x}CnC8_5S-RhueewPlSVJYZATFx$&3pVt2pqLE?`0z1={D)LD>;bPLiiZt8{YWR zK<<1x#G^HraT{^72v-I{;73o<42a5!Te Xsx(k%6ZW7GP>s5H0{OvD%g9j6b| z_Ka&$tniwfu~)j$V}`DnN)E{hJU@rO#QDF?x^15%c`UtXT*W;e<-N0R?B?Q0NJwy5 zwhMLw@iC1phcXOtux6Qfks^;>Y<9whjH$f1N<2B>tfszjUMgYlUR4w9l*_4r7V-c1 zjl&IAsjnWW3a15=O^3nF3dIE4Ep0fG3YIeQ=uA4*tIIwWep%ct^wBfFYvYjA>}l?% zvTsXW*8#^7c(iibMWW Qtr;8NO02B)RRHYax&|CmFC9;?s4+cAAW5LsZPy zP(sgAdPA+~hM3f1o10^r+IEoTr84)O=HfypgU`{$Pm+{wdbKEdJ>$Eu*W`@G>Rc7l zB7BXvuE`yfu^m1o(L)RJT<@WuK?ONfqjy_9nGu>LzhZA!$>>0W#&KB!#@OyP2p7B2 zvcmc1 ?!6{-i%NkK!p zwHr;s{J{|`q{jChzCuN16?f#smex3>%VDb25|yyO%8vWponfUdu!m@-)h2MUgXfx? zQkH_sHPqEqbk8zx?qzN7>IEO$&w29h(MXY$@E3qGAp3tcUu;!eqJ5SiaUMa%9fnUU z }w!iv=6}ZNW>@BP6%Za+4G9=t~GJ=XHDg5lbimu8U4c3{mK5EQR z`MnewZdfoFAa<7GqhF$y{UxX)lg6|yEG&pUj#v+eE`8s^kBnrn$&D1<8M|x#wrSS9 zila4ne N)JlmbK(`H|GDQoUFQ>`)s!sayG zR$fZjhdYD@%EjcRBQ{3dUxD@bN^Up~!R0Pa2%S}sky<6W5-~Rro@OJ3S&GwM~R}H(gBIzMLa(%6GF*2s!jpzdtn_NYQDc`VHVYFc^aTk@ZdxB&gqG{ zsgg}#A_tawP=+`j$uZ>eT1D3wAyG3W6%}6B3#Jvtlj=H7s?H6~P?3L-bd(yp#@APD z>8~!v!@~0;5n)TVXHzppx3g@$`+&$LI9m`W$+o;7(%N|?>3R#%DQ-$za0V^ K>#&d0Dvi33{ixv4Wmn_+{%!kVC#L8L$)3Z>jZh~;C2sak z+`dXeeJ8`x*ns*~@2XQf#Nlr86eqW`{5M)7@!V>g*9?~(^eIa233Hi?$yd&{l)lt5 z=lnLCS3cdw747f)lCrY@5aKjY?qyps-OOfG0#ItQ!o}bvH?pC)r;8C-9cH2(X?WJ> zW!NW64-MIQezweZwL MbrPqVP zv!yp2f }F!;*J&EruLnb?Ql^YIdDsP#$$_fz8j{9CEYW2Mdu*~XL|rhwUgfa(PJ0U%>; zt!_-ymRrOcOXt0q)dFiM6~0_Ic4A{;C8s=;l(v{GLDSg0nkPNkDy-0G5~JpMTBSgm zF>iw6U0_^@od7P^53n@!+R)Lt9}VZ)-A2%~7*Ee2sZn1*k}bLIg^yf<$iD3 6 m8z8>nMxMaIu$2XkL|BNpWD^?;T>|OU=Of6mRbO zCQBX}S8%uVn8`@s Qa@kAi;aQt)Qk z;kK&T^4aoW?9p;w^KjUa`vzYwS^slI9ALxQx6Aac&Bd0|82~xr5TerEl5yAS5QR(3 z@3kdPDI}$!mS85t<5!73TChcoCO_b>a9e561+&&(I%Fh!%cBt*I1^~BI1}u1e%MKB zGTC=Iu_YFoQeb`uf=5y?obR!XWItnOy14YK*-AGeaK;|_5qCcpFk$H)Rur* d~wpWuG8!0#WAlBH|CVLsUF& zLPlSTL_d9PbbJvBoqvUB9J1-Vf(}dEMG?0u`TYR2$35!yke$SRU|Y@IIOCRWR37cz z*TDEZ*0y4L{D92MjMGhZ1FaroxbZ}Iqn;6YZu8+f&E}}0JkiHf@ynB%(~dPxSUd@q z#{<2vT_5H9{(0VWeer|8TSrEBl-N=V2iLNmww~%Hw0vkxINIw&mMZa$?M-OfZKHIR z%>pjR>5-9<*r5AZDPmsxd<@HHc&1e*8)QwGKXR>yih9g1wUCS&{TVR^ cDkmfzO$}%PX`k2v*w&6`lxk!iIr)*W*xN3D7^>ILp*487JN`S zy;b^loZOp;Izdy3T&>c$;sbv!QN!uhzv|PbpM|byk$Z9DAi3Z1SnCv^q~1O@dz!K9 zXo>PLzZKs805x5M%?%8vGv9JkGU$O;*|Vc`6_4GAw4n!1t7U!6ibH!{x0S#9&&WoQ z!)@=gzZ6ca^Kh2GcbKMjxV^T6UQ|!cE7b%sLH2lq8>9y|r;&+E*F<-XHBu>yg+nSb z#0M4d)CLa5In~YQE>E6;^8sqS3n(o=yR=)wvHEPc&1pf`^P}TaE?mBMG3IIaQb*gw zrA4I&9S+ORAnvPP5}Kd6Skh>dj-t5pB8%eAy~s}!&Clu fZs41;G|aHZoQ0;VbfQq=;(@vr%zY$UsOh*<8a}OiZ*W| o>3m+WtKr>a);N0rcz;+ z=lS5&lw{i<`pT{8S~0(#SvNxwE0uSeN5SlU6oa2mVyG*^0TP|tXFJFY*MEi^Ik#e| zhttUvy=}ea_&oeY=WUw}?9f*m{m5~z@F*g{x6Etq9__iKFc=vkr=8<+edBkr>@lVm z@Yc5BjN9+cqxK7{!Uwp&9;j%V_%|mQhs2MQjTeo&J`am;aUVEwYtT1Guyq1OdBZRH zQBFnIFS>f<=>M=eI?phb72ll%L=rtTtxYdkHx0{&(?<;uHD|MA+ P;T~kdS#`c;n>R1WFO#GE2EG^I04e!%~IH9{@skam5oE! zjvgdv)NZRq7h)E_)Opr+;z7d02+*j8HzXCD#}zp^x|13}twZpsKNa5lvi(r2Km*(q z;|;I6eqe30=_u!tbm-CSd~~>ar*+crgZ#U47B*4|Y5!~|zI@}k>-8{~`PI}KGf`HI zSsydsKg?{+Gfdv^v|+7{rkD)LGuRNl;CD@&_T-hJFcx26%X&bRm!PfA@97sp!pjV! zksajLfPF c|m#p)(a(mx@8=`x9V1BNm8^X+PbfzzB^7I~9RREyyrKwLH>LLQ1*jbONo5b9G zZte$`xs^3Hmpjhvhmnx%TY+g@JEnVL*~n ^a3*>QxgXvF)fgF_>(h#Tp}6b*|rzAyeC2ze&L*q$nV zp32J0?P||XseLqC-ma9lJAxQ*X(06%n4R#D5B&O9+!%4QuYy7ZoBLHRq9|UC@Vl3G zal>o8XM#m^V LVt#+!+21J<{ zLAQS7Xzu$}NPg+g2P6ien)xO_RAQmf9+zEW%OOm$Fu8N=wEXR)3<2wd_h*Aci(bL< zM*=@uI4fvAD^-89742X_*ibVdpMS^7Cc3y$Qz{7)aglGnQmohe*7=$I>NN23!n1L= z*gDm}jq8YRzUIMp**8z)U@7B6p^B;p6{8+2mW6Q(Um-1H<;SPbj3-T9U4&i)y7;p2 zH_UAH2v2f9NJ*L0=fz>v%{+e3{-1h5guR16nl9H_AcM@ubg!W7yib{78{B}2Q~aJ; zo|(s>95WZ2E&Sl&n+jJYq?|VnqRW4qt=}gv#yY_`DcN+tF5ZPNsbu$e9eg{#$BT$B zRXgdK)RFwrOTiHgOLU9@f1sdogRuQdrXz5tItVG_ )0Tw&GsHx3e;5|Ug9e_Xv@OKQygo_iRF^&=pbsKC+E z(gHBa61Y=G$>1*W%|F4>q@k&)sYJ^2US4!*>4)+?QsBc7I36CJA4-L-&M-|a%R3zc z;L8DK8bDPY8`R=*0uZ-999lhq54U_$u<6x+JK;azO-x~v=cCvjFE<|?9E631)zs8X zO-%tx2`p@E>{2XTToOU|%lT@f+fv{!Wwx#np-4VMv^|PMI7*nQ$o+{~QA^9?{?h#N zTV3`ZWYo*&Vrww2U$tp >kz)dSpdw=>M#`PhxjEbwqt`%ge3{5{kA{y(CTf+SscK+dx2b+dB3(uzjNWBYh} zmYJEUp`l?qo_f`004QAa_4QBTP8-Ke9{8P)CNf{y+n1jrc|arZST|BkGeuzk#0{yR zgpwxRMT#U${rMvB+241~CFyzJb-|OgUCnCk#W8o>lD8bjDG1?XVnWM7w}2ujOC?3X z&A!%T`u^ QX(KGnrez=2xYoC> zp|SAWs8sm*)` lBxKdbk14MraD3=BDwuo8fa>e3wxViBS`=v$LzzZ4VH) zD7X$HuxSFiPqyr`=5<36EpQGfa$YX7UV1_ zSq#6Xnq|)C#8MJ_dV5#whZ$#o z?NiDm*8ST#ZgtF=wT9o7wY7nKPhmKo+iG6FBEF)#85xh?mu*EBP*wHQu|*O)jdIR~ z ma7U317rR5>z7UEle6Vu-I#^4=rgx3$8h)tz>!z0)o^lhE;U#qBO-R$ws=1Q z;Vhi_1qB(IfX#T|^zWbDkrbnaL-1Hx7nX8WeSHRtfnQhJFPblEYHEs#6C)|?FMyT3 ze*1oYe*TMt@Z;$pU<;pg(w%fXFhzOZ?-vPrT=($Wt^fkHo}B>Al)hL_%h~J^z@>;6 z0>zM>But#&3X-MSb(?*WmeWw<0hjqIgImVu8Mo462!u&k*ax;)4`}B6;n5`doeyVW zfD6HOdPm~($okx9IR|O?xFP1TUEiC`!)4Yb#K5rI8o+?^^XDizA209k?3jSTXtiJ5 z_4z(u4FcLV*VnN;Q9gj16@I#e0)7lA#sz&$jE^^)3nCKsCe+K>DDEy+$~!#~em+Ap znD;nthS!Vac>CyizBQ<%q~z@EOiufVe)X%YRp|rXtT+-pDq)O-9~hX6pltBf!OWh3 z@XI5+06Yh`#b?W4Cf~)Yy~(%oM}Rl;>%pknq^^n(nS+R=Kp>FSMsQYRBX{ZPVP)rr z=)?Iiv+%)q8NHJqxJrOEo2}QnstnMdffAWk&1hkDzW<9Iz9uj`1-;76= zu#Vd<#%NUvvnv=Mn$t&oQF3h1gl@CpuzM5$H6)w))aNIsO)BG0$GO45{lL80_!7lz zzC{yw#W=h0?bYua^j(3wt+?&&ZEtVym*<;K0xjChEZuhZ-oC!n1+vlC#2EJ$MwS*a zs6>44-oMwZwhE|IawN`1&x@JyvSL&Q1@YgQJ;<;D-+^AwunDV9r@mGn&8O?!1exCAojXcdSvuwqHeeA;IRiJ zoo?>#sVZNaDKNdsz24_r$$yE&lNL~7nh>HB^0>BAlJ5d^qVEm7VD)q8`lxs;ueuh& zxL?pC6+cDwBQv+1PKcqIgHR3IEoSJfqgaT>lBj {}3K#MjwLksr?Q7-=nTK zW^5J1!S^P{#%6M+vW0)Ie@oNk+~WBBjuZiVKEN6$3C 9)2-=MuXC$2a!>s%WVgY%jKQBoK- OqfkZc1L{83u2Hdzz5OqG{UW)vS$zY2UEV}d(@EKlrpn4n!t0av8{Il3 zY3VRtmvIBiuhgD+w~QOR6Yd;k0 bu_FXQ^1 z5gUr-aMpVIOc_u_He*q_m8tSHGuyja^I?AY0FkZ$lY%~FygrBs66=&$`^^iKlu^{+ ztx=M`w5XoCITq$Kyzf9ymoyq$qL~o>^XE^6GM(rmUvqOaUVYtSKHTQ3KHVNQ#mGZu zIEpQ~B>Rg|Zi=rW`OY^hE@Jsq3Yq0T)Qxw>pZp2l6WS4eG+8*eAE58H*6@OTWP^G4 z;`z!I0rCFR-K+iOW(T`>zQ1nudiZS-Wgh|cWUhc6n=BnU^x}YlPn6g05dZ+(Dw&Qy zH75ATV|`v8*3Kn-?n&xHuO5;$yKkcw!OKUq1~R&_ga~hw4&1e4o$yNovM_RC&>8 zV>BD)s1(V2Tpz{i;m7X-ODi3{2Vlj <1*nfMYs_QTJPH?S;SbhNX&CQJ$ayc&aAZvwVaaQroi_hh_&GXJ4hBxKO z7WqniXDK@(^~(cCidvzig~isFNDLlY+QA=4JQq*}VQf>O`@Ou}R9|1;8rO^6ac-qo zKV&m`J#TH@1nB6biG%lkXm=^)NrsBEbociHO!#JhG%h@ur&gm)Jp*XE4Dfz m&hj|sz37L>%yyunqS7q*9-z&oj}^FOFyW6T zY&pxI-Ao}FfhXX43hul6hp*ee0HK0K+~@gjS3&rxE ZF!gr{z1>LbUL+8Q*GSL}J2zVO)AT z!&_t6{X2g)MoXmTZ*p=HD~y)qWMV-fj_aZ)ON|PjnLzh|*{s!DCV^&r^M^8naKL^B zO!h!_0ekba@MmdPY?X8g0-5GmreHV*acmyp>&22XoBVmsEZG+T8f~mIHZD)~AZrV) zmc1-r1|VYgsM|_-dV0#fv^ngK0lVP5DLg#9E_4iuDb#rg$WL@05(ukv6hkU>UH=B| z5{!p4cZ94BF_1oypG8D`fNf++0caP1XM`;JugdQ?;now#!lV#`foNhfg2zFrO(E_8 zNY}JFJlzx((Jv8vOIc3}dO Rcd=j-DB&dQQDAf5op z-!p(srt+lF(h-w5$;oqDTHFEk{JFR9b*wI+J4Fifx19&vKK}40 2JWfhDuQA-mAGcCL9XE1lhoLfkz{*`!_xBCszk& +A-ind6?HHXhYNwUHE%9`quH%x*^- z`8rcJ)F<=U<;waDCo ;gl%1tJA7i&qtkHEfa2Zh*vz5wiF%fw5Ys0nn4w zW2G~!T_mMpmQgeG`ZXmjG+OZbhq-wPh)et??pK&|H3Np%`rVI$4i+a75#M@giLXnP zz=j(iNAu4FJZ`#jEfTtPvpjZQV_On6=o3XmZ&FVB+U$@cV8%UNOE#?)p(pu?erC3~ zY!Qj}@*c}gc6@8(&mZ;32){U%TvW83d`R1~%2HKVr&eECv+E}s93159Oo%qq@qpEb zm=X~Y?Q)~^gxY(hzB;4oSzKLx25^O>IBmCVk2ZOe2T&r*n%xYg&fJ?SK=u=Y@#B() z+=u@qpogAXw6(VbkTW7REV%S@Bv6f!WSRyS@!1z+l}FN?0|5{d6V5PEe h+y9`rm^-F{Se$WTEJ8`@tcnPALPnBZg$3g+mK1j_)OS6fG=R zGn7b~^(n{z{R32^cDsQwT*2{NEP%Dq7e-9J6)ToqUR%>6%;K_6 zMSx`l#F2LR%^tp>7kHfyQuiYM0|)hI zHLb0!+F dn z-M*04Ovx1VXy9=LH~?~_+NLeM@7sd>Mr;-BawQoViA!Q4-y&yFV`F*Xa~6Q)xmScH zBmM+e*R^Y1w(wfWZ@+${uml1b8yfPH^4*gyck9D=_X~mS;c}lH0GHt^@-i}UnnA_V zFYlUz1rFx*En>`@yA1&BzgYQ+9@@~*Fy*)?u^1`(u-f<@q^Ya%uY&04SO? CnW%O>GelMn zs{6(`F;sW$R#4dX&H%`P?B$nw%DB-PhmLwQYnGR_n~{*+O|2A^XzY`ibb8DI?AeTP zxTS^%5GM7kM1bE+aA_y=yKih5eb?d)r2Q*^skp2-CH)vwQ&J-1*7e`}(S|}KK*-zp z2mtndtuJFs!dKHOC>>;cf`U37{aurjN)M_=AWb0-l*<$G lA9F>F +sh<=S#(~hHURa*6A4jb)1mjf14S?aeZUQ9L z6w@;+8598T_E9&$uIn|UrA9*kA|WoGJOEdn!-J_779K8!PFFO9F_n6o < zAtj&8(k1`)*=4#|iRbUbNhjdg9{>r^)d>5zz~zJ(5x?`aP0V@L%cImTHi12n6Tg$? zHgK4Y;**@TG@tGI7kPQqzFaXngx{>PFaRU7vSPe0Y;PAdR vk zNbl%OD}?X1Frg+=tXrsbTwGi=i0i(|x&ukEv1fqU4kHNx#ZSQUMMOlZhz~+qwn_ QWN#N8pYsRboSX%j|Y9siMb3%cp zwwlCzOhmtcp*!tO ? zBb6o9)(INM(bl#P%UdZRbF)k|hxJIP{O+~ +!rBcA0MAdpOLl;kK<+DuW8PV zd_U!kVZ`3I2G;E{v=KoaWR=K|4M6C(Cr7Y}kkuaI;PaR70PH8uCgB}rumJ`Ug ?tWD>HJ(6mvZZtM=E3a$pVe`+*ux3`cuQ?9iCupTLO7Ymzz4r;4(? z@26y#4T{BoxBzM3n&-tR-Vj8|H^R^r 3v18lZ4~O+fxe_Ce}r#2Gq%%6!iE4@DtotRKQy7XbH!^~xyq*;yBFVtIMF<8~w5 z=lLQF9piEN^1A322fOP_WXRym%vBp*M~Et`CiyfcBNU-YpXtMnp}Ir-0dTSqQe12{ zu@e$rFB~w??YQ%J+U8D=zxnbHz3ilcMOP-2zZP}zb!$(+;XMLz8z90aeWc!69BgmH zwUVVu!hb2LYaL8^RrJ@mj$*MGh)WZS&_;rFX_5Xc_XFCxs3=DyeYaw~ R{^30#d+}*B4XkL8c_X*)yiNs> zy?5^IYH4b=xL+Lr1;&o^A^KB`^;WK1Wtn-*da)Z n9tMNK%n-mUZkV;y z)O@@Wby~-|I$2w*5eF>R#T*H++}Qds@d40#QJoJF57#gmAmRP`b-u&PBSKnST-??5 zcD6#xhzXs5ApEuX$U4Zx1P2T23+s3~FSPimM^w!?pocZgkR_nQ!` tGzKYh@LcxTK`u#O`q= #t1NjbZjW#H6S$pE5Q7ooSdX%TLHAP zi4Y{ ^O+2Og@2EHvcip%v7u=JzE8@Q+ui{a}f~B2J?bXY+e^4S9 zm3;plq&E48k5B8uRrM1 C|Ee}Ml 2N;S1OraP1*jm5 z`uOtvYn)+cB1eqh !=R?g7yA6)@1E8-!9bg|?bO!b}RZ~}2S5*Z-B7}A!gV&*N =Rl!g1vtvR2apz;nwr3AXl >LKIwF zW0&T5AH1F(aTpv0+%L^kYGmYO(vDe-ZjJ@zzU52sct755P|CdVpWPd=L=-N 5wnz-35g2WQ6BUJS-j6QsQfs_B(Uly^w3=CzV>h_9;teQxRJuas|8(7)9M@H>n@ znpkMe Ub?-|;_GZ}vsw^V=*poyAefN#+GeiGTn8 zougg9$)3mrIFCJK;ja9ma S!|kfS z6os-Gi5VFyJ$}~9cww{O aU6gt}?%>Di__q>l yW zd4~<2X8Ta^mrfxqE3oEEK@G;JZ+t>8wwxAr-dj*=9a$ mG>;b%nTk))qfo7 zol%AS?fMa$ni}L#sNnMDZ;@<9P&YqsE9ur8K8}34!2UKYQbd)op9cpIug =!^l0xyvIG}m~-aGk2;?VOe3a6j1w~xlau3P*+gNlThE{qm=~YG4{KdkLZ?6U zY|pX8uxi{|F!&Nzd`OXb3qOLBi$UzUec$Kj>3yj)J}zsc*WZZmg&}F~mOX$Vl&r0( zLPM)4244t0|CWtL0n__H_FRf6UVO5M4TV-S`*>;#-V&5O3Q{br-kFz{lv o%h z$G{^dFZ^2-K;iHrH}S++*?Sam8sKww^~$YVh%8@yA8nGRCd=NWY=Ou(FTGd3b4q}Q zGCF_-coaN~daYNquV4$fe9Cw?fEQHJ)>y^79aiNCRAg^}nbbsHnuT=559I7)K%+1C z*3~=0RWU{t){Y2mh|a@MUvt8{iXM&W4;4^PDc(N>dmSU@t_gT(ORw-+eSBTxwlfbj zw8a9^{r$Ae&HfQ_P|HD}!%()g8W>hi1${P|=&wDa_&CFKv%js9lsPqV6e_ex%RUU0 zPgsRIA)(;X5=C@B=Xjdc&V28X#&m_H8j+M*Xbh>hbZAkl-OTh7usnfH&`tRfE$wE6 zNPuXS{evW|C=qsHgX#CJz*w3nJ0e<0tEzGxKipzbEfCB-CzcSJS!A1@&P65>IL+u8 z6V|}rF~1 a{+?(gZdO; WKTN;Xgb)JYF_Sh>Huf*SA!T5`5L=Hq-KyU>#_f zE&;p15_xS-{h*EuaHc7s1^(ufcq^03$IsbZz5dg;HBOF}CY@fhic1BIg@5Uj+>#Eb zrs8rQ-@eC!kkZMNVz9bHM1<&i7t4z{v@?^CNlev~2nYje2_il^PV%0i6apzo*e%14 zd3A`_adEp+?=(1 WVj0!6ONaJG|Is48;F$^mR0zvhdMcVku$JqPE5NMSUn*QomQX{KvD29d}vn* zCDriQbk!icMpcg1JI0G}Z+i8b`K|L7RC!XDyYSp3F&YVgRP{PMeDrBr`HDCW`>^lz z)zvkp0()Sk!8;zwJ0_!(-t<4deBYtHxy4EQU2W9&7#tP_%$5d6Ioa^dl)O$1vtRNv zCB&mQ&wyL$tn?r|ODIDFwr`$#O3H6ew`!N+Z7w_~b-j74RAP4yu-7(s*JxM=Wcd|r zb_PeVZyv}8<9pG!(`W>5894^=8=ILK-E?xc=XSQmdwwI2gpe>>D6j>T%%Qz#{t{MO zQ+)w7e$tak-29QxWfB-zOzj^}KZeG0MUz@2+TbvLD9DlG4A(Ep$dIIN;d?l!(3H-3 z$nvBklCGK7ZaeS@jC-$5%!n6FxYsNzzR4bOc!C9lkW{iOo3O*RwSf=j$93*Xq}ydi z?RaHW+7HIwEczP(QQVwqf3W#t>}s!Smh4JTl18z^03eB28SvE^@2~njSrf6_(hX{W zN!*&g+jQlI08W9%p~w@-PWtfFCm$xf!^G|b)cb@c*?<2#P(gkjuNuc8CemfDd6r~a zE~T$e%kBqoDw&{&9MzpNH3C7ijFh(}S{KIJ6PB-r6j2=)cg0Z>VN+DZq`*dc0ie^w z&6lsHr4{n>>B5zv*rgp3DJyNSSW1|Dd;F+J_-B*tsBF90*7pfHGGfkl6(AyZod)gm z`%oy^Y(!S moc?%T%Xbab7i7JJL32^f!9SSU zrT9OxHd|XCkdcdDmyU>`J=ZKVFXkDnP)FfY3*IbkZu&~|qxFZsTofC@tfxl2LDO|} zX?6HQPe??5TAu-yygY}Ih?wvD{Jz>BaaJgpgvQq`Vh#=ZnBt|~JL(Sw1h6t+Lqc{4 zG2~q0ra6uLgPLe^hCX OYCfOa47_Q+i@?Gn)rcR|tyT3fBQ6P_U3@p6mB)d$ z8@9WKBBp3ue4#!$)JwwztS?eeD!h4sz|z*pk|T2srw|d7PT;pr5WMp4ld2L*j(ext zc2|@!%GvHiUJk@{
G+feq>_33@a-S(5{kZo z##29U&(18@SPWQPOAGvlNBQ~d5uGt!x0=D}bm5PvyHr^+ho(T@=6p^K=w5T-5v(s! zOQ)xvnNjKOsWPN1OcK%9!R|WDLe4l@95skh>431bG}$+BDj)<1IXHAGC>encddvhj z2XF77v$4KWg+*U1{LqOH?6!T^C>ERlhTL#v;pEmGFm7*?zS_&Ta*Aqc9Soa{--+p$ zc^$L&vx9HNk?bWHWC(tCZ@H qqI5763R&b(KFe@0m_K0QT zMD |k(Nu&FqTuG`Jcjg)5B_X_1x z80@aht2wbQV{*SdJrS$J&8y32k~DgaTh7j5qkZ&(f|L?2o^|U)+)ur|F_){hUop`Z ziK3#RVXYw`9P+voR#A)F#QgLE$fvF?l6-*;#;XB_&tIy}`@sP5|7BSIJ6~7|r@?xi zTgffcPDs@CY3lov!$g)z7%6g{WhJ)^o5Vd%f*v?e*lU*!d&c{(eoA|tMlOg(qh)GS zW%5fVlBz$H7+jaslF0v#>SQm8Yw5>QHUrd^1pp`bfu*F|Y4w59JFY1pn=sq}79Jc9iZk*Q zzhY>&)|Q1zhr8h8Yj3-`-KY?GJUxvsx@4?xQw%eLG!NhQ5{tq*Qm=JJ7ITH2QBrpS z%UN-4I=%MCp)U9)Yc{}Qm7dG)Rma1JPuhnyZ90Iu-v6OeR96{qVJi{X%#6gh)Ah&a z=js?n<<3z4wx_#5Cs=w0- E2b=5)yGiR1b#qRQn hc8 zhDEiuWOjL3nbxDlBmnsgS&d_1Pe})d;2?B3l>purIn)C2wBvClo4G9Km-jk1vVr+Q zEFSdnlVdR3@fa`zgF7ie%sUfZ9edmHF3>|QvOaM(@p>FMy?4(XtZZ?zA2M`k>f}gj z#De3}(nil+Z7bLrA!9pPcXXr6H&> Ftns#zJ^S7|5 zed7{q1A64hJBdoLovW5{A6UXrZ=wJpjZ ;v+z$PL-D#}j`CNPw9y_u>(Ws>QAd cx3(6sfmZbrYPwLt7199WC#2{_(^w;QIAg!Cqj`H#Uc@ZLxi2k9>=I0A+U+ zJc-9_UE4@5gcz~{jQA+0zJ$GfJUlJ}5xHb=YuA``)@@)R8vWs`AjIH82(~kV`pLbz zhxsafC0gn4H`f4pnw!J!40V#<7_f^84u z7{8#a6VoF1DxAUamO^H8_e_$Qn|5g#Go^f6*uXqsG zRMpJ*0BRVRV)nRlWj^Q~LFDp=y7>ekz)FgnF `mk}h M;M!!Ir1b>S(H+EGNh& zmRj1R(C>9Z*@A}HLUW3kgX#pb*SEN#zzK}SHSxn1OlCOWfr&t1&8e`>__Zj{Lepf` z2d~ojAP@)-4{;NfJ2E0-qb8EzRKRGSHIDpE`o7J{QJW;t>dMwB12!w=jW_~xlS745 z-}6zS49Us5$682 U=9P;m-jUWg;p6cn6`<>k_2BIii%=4qCbkAzX!1`O&o zIAqq=2IS^a+{Y#XT9N4n%m|UQBdkEe5`X!?JKyQjdsBZLdhEu57T-rl$FfTE9*#r$ zLqkHOv0nHVdmh~?yN+|aw`J1%?O96@|IRe=rCAg!6g)PRyxv#pSaC?0jYUPjuR 32ck;Gpl7W++ zI5^VrISBd@!NDQ+PP4(j;s&08y!uER`L?8X{BzrRpuqm>h>=x4k ia!MSqJ_z=jgiil~QS@M2>w z`QuV}d7UXJK5_CC|J30yF;RAno4ed&KZ72{<#;;}n34t7>7KP>+z?BE!{I?eBrX$v zFp0ZzxhMLU%Nh~r2X~25A|nZQF@3cZZ^sjB)f+^GhlJe5(_H}ynLc4Kxc|GeS&?98 zkm`s2`^@x8X94Km+%qnQS=!?p?%?C6qWTIz=LVP|E@t{_FDN1+LQhY$(EMo;yJ*wi zNi{1k4+q)uO0DfK$-VY=CegmsXFzpl(VRa)elOa7GZl`%tYAQQ#p1&~t5?+2WYsE- z^2ushpA xVVq0v}Hj3OJfz6`mL;Q!-)F{ zKmro@LdH&E>p&~QSH7D-T$65@LA>H7T(gF@`*A&tciviCGycJk!i8Rui_7CUkLDAJ z>xPj8{fgfP2Ixq|ZdQDKJ|fqBYL+=h3Fwh|KKq%L7noN^D{XDr!Y((=p!aOnf!nez z^dKGWoe~A)tKq`luO{Za&T{ZOWg(7QkD4aymx^E?Ix=1SAS|2juU@%w*+p!p_Q(So zt1ggafsMMIG~n!4pmDj-o6=k9eW!o^1re}l7?qhBfAk=)q6=7a0!$u|mkTKayE%XZ zAaN&c8GjT?TB*B#|M>EZ_)TJB?#|554L1M7-pc=|5%YiU;`3NHv(FVV>{l+ELpT!g z4}f2qY*BEawUaR*{(t zYtktAlb|Sg5YLah%U8Jr-gkV3CDTgW%YG(K*;=W1&EzAygigi_&&RL$`oCk38kb*> zdHgn*^{!Gf>z!|^vZri1ccZk4MLjcVJm?u7*0zD~iL{7WJN>Y?PB<=q7ZWvky`-6j zPgaZ57pt6@hg5L+bD6p9o0|>&QsXxgwHnnvYsv`Ro;C07t7u?O=6luR)K9oiGS|l+ zHmbO!{zX6fP55BXdx|GU7BZQ7PtX(cQyG2)hEAcf?jglbC|oV1O+i+{X(~9aGoIPP zGx+&1%K&>M9o|CV%jcmB$6Ki4J7pc6*v{51!M^ky*>Sj1=)>yIGNIF8N~v354eR_? zng`&4a|I9bb7DrqZL=b0V4ahtuKlYf-_Zo}(3w4x(bVJ5hUW5-uZQF{oGI)Z y!cB^|e~`5rwx;*81e`2aLM z%HOBI3lWQt!E(CdgY@O+O_dd3;?H+G@84AIEE5!)XKqo}lBUW;V>^_KbNFQ5*<4n8 zHfAwuxN?cxUb!yn!Lv*i3*XXf{7olr;x~_O!|gIF74ED}SUkOBqUj$$YNwbe @fjl~>Ie44# z=q`5KgZe$&Rtpo&i?JIf$90n#mCSL@{bTAV%{Ole%Lbo~8k$>Xou!51QgAO>yR&Hn z%VmAP0zT2AI(ur1gj#sT6Sq6frvUcI?JON&As RSngWk}tm>kck9 z*EIXIbDCM2>M$a&WUN{HqCNE%uj{L(X!rsL@)dD ;peE zrB_-qeL}IEXZEgA*hyIwm3>E+A}M7E>U!S)RR2tWstjg{YblP}Gg9d@Lx7|2fk P$JEE*d~R@mUuB$kbh$`hwPm4?v}kRP?1k!0lLUh8AvCIz7j93Uq|Wn_$Bs*c z>Wp)6xG6?_Y8oz9hF e)05 z)K!>$HYWStmSZY>djibl9vB|Ycki%QS2B671-SXARp3Z{MjsZuuFPX(xr@e-$bS ~OR7{i!) z>+2bvLh&Cf%J|{^ki{gm$PZouPT`u()|l9yga>_nS@#gQ_iGT9AHrshHdB%wL3{a9 zOKTXGORu`x`PxM3`S-F|cZu+ si1!{Zc?FT_O|BvB zqRGh*m948EUu=TABKUR%h&aAg%-1S8z8R;W;z1JQa4>z#Z<33y(&slPsvwPF8@Xza zg>n(8D}`^o4jQ@cXlp6UxbwqV?G8s#m560B`|}1OeO601SO7-{pJQ-Z-rbp2MN02M zZCF6`HvunJSmD7eo%fqI=E8$a&7FIhVS~BG>So ?yJJ>!Wo#{ fyIxiOeE4)Q!0k zt%`F>5`14$Ue(UWx{ZoVUq?j;kPuPmwdOs2c*jAcVVRS$ezQm!=EqsDYsAJ*S{b+h zbQKlo0nSS^9TMxXfyKWabDFkyKdQd26xVjW*=i~4v1_D5{tq=V_o?PwIS*Ra#7~u` ziVM#AAMC~@$FGh=D99MrRFlNX`P?p@6Aqr+AQT-`XhB$j7f=DV)sep3jS2m{&cz)u z%Oke1tU;G m>1^LT;kniSYW>q{LiL@pnHe#<2PC!ymk8HD{)?dwVRF31ZV%NsBARIY3 z&;35cw=M}iDkK%1`r3l%e1nP09;|1%_o?8`y|yZxsj)rNCsf<5=RfYE_uMPcwl8K% zuAX(uK2#zCWoxC9&dfEMm2?rS>DuzPJ^qw{^{qjMP_=ND*NbSGDwShNWJ%zlEA8+Z z8gI4o6A=9mboGy3ZAk~N+W=i4LNxpwvlVf=oz}qT0lZ> zcXv#9TMUO*Va}ejk#F|U_t9fyR)!Ws?j#n+`bTdUalIA)$Y@q})Jr;U3&WbG!u7Ya z^SItABx9=CB7%5=EQO+a%>WnN8_1RD&LQS~p8W7?{e6$whcO|uWv$yZJbS`VaMwRJ z7=$j(Y=mu3(G{a>-{_HlB;~yeLcTAWAMzG_2Z7vML4HyyOrFz=o6AD&*G9KB_FAGO z_BFHV@=6&hLvGwfSLfg@a^pczT`Nl8T!ZJFtvcM?xMddF5%yaM(#%7p`?zrsKb*y( z$Tq}QHo`_`7BgXa ;PGddbU3>P%G75)QZ@$LcJkHx29t=(4)}0Y{?XH zauSZ>#9s^30+-zFW8{j17E lAnzWi(` zteV!<87gWt<4{UaqtJNtJ#)z}BmN)CNl=$l2-Qcn#xi9zNJm(qP7iSX{bX}bv9p(* zxNQiV3iSYYwWn)pZZQ0b;-&F$SuHE}9DWhhENQiCjmElR+L`Xxd$hT8Af1hmh(?LJ z8)Rrkvm&1NbD)XX5!-5eNn8|cTzfq#)4La!L(P#FrKc*v+b>XQBqJwoD+wU7Ub2QE z3-D;Hc5L=kD8R+|+lfBRhBbv{U6rTT3hpASV}@vb!oH1#g(bC)AC3m^d=nU{o1$Cc z=B7rU>C&?6;N$}}!je2oQ;GR8TXoj}s^SZdYKQZDbDG$?r zoj1v-py&xaQ=_}yay7eK=d~4QfK4KW)PO52OGn3%WketY|FPxqt7SUs*_Ibg<|?p& zHml>d+>vBiJ#B6d1Edf%cm9|H`XG^=tWS~!wG Id%Aj?rbsb772dAvL4)DH>a z$qtf8+H+viG2yR^aUa^1bE#T%v2Jw>=D2TNeENR;()uO-N3EtF>q oHbXG@(509-Dzj_J*IP-)+#oY5TNuUd9!=WSnxS>>9sS zwwsW?^voe^vb(k9Ah)x=+BaxvmAKJur%qvEHIaxq!1}cgNlH%jRf^TYCp19_Z|(iO z4@GaQxU_`(Yfq_>ORp(5aHA*`V6n08S=daBl~Z9^=Fu&Pg0*)sk9tNvL#x?Bm)@Qz z=_$CQ*M@D_CfT9&W!nrxd&Dr4RM3Q)`_Ss4rh^LkWvu&X#JQV90%P)>qu4yjHv(kj zJr~pUN>z0gRs(cT@(uDnAnl)bB*2Nb>C3|@G*oJ`98bfaxxnNWioR*_Skd2qY?0 _Q@Vy=AvWSEM4kf!2o zcWRMqotAmM%l(E3Mz*SPin}Ws8}BX73fQ`pzy%z-(d<@?CuFzp-8`YQs+{kf?eoJ# zMiXzGA@>#cCmy=3BznKx;x#*BZt}LBy!CZR9fsDtYJmeLYNfF{J0E}4=*A+N5@&-2 z5~_(FZ{T7Izp?ui<5}R+G!sg?vTcKagkplf{v{D`7JtyvbB;E|QQr>anpf(O`SrHD zAfeNi-4C%n))AGoy?Elc(~_uqRfR1GMPc|NAR*!?ApBoBk`S1?aKDseLIvpES-1lt zY7H6q(ZhXvZ3PqAd^6Pkzt>&=MvDE N34qyxkFq^e9IG5sy zRZT>S$ku(I$wIgAF-G}#7V*eo A-_Z|w{VY>dqAUs`|>^fEpnQyBTL)$nJmYE=u+9)vbV#HNXwwCYlUu$lo(Pe z?)gjKERmWGBRgq|47@ESNpHcBu?^&HG(q9W`DWRZRn0;uqkthBvNH1_?nlz;?FSfN zi(4QV2v!g-29*r#s%SeA`hWZs#{W-WIE@!c?~wg%#~2tIBXM~6!oW`U{Xr~@w$vMm z9hztiPOI~Gecw+dbQoU{F1%tfd)Tb;Kzrb9fMVhNM`g%^iN+uOSdSP5N$0miPTW6D z>4}uBCbX-L9|lA>9?j;c+mI{7>ptX_({lrqc;jJH1@c4=Z#$hCg&90bt!0#@&F3~q zQV@TJ)LM|QE6mctr1GKgd(p7Jb&t+~B4~cfm = z)YhCN^7ft_O@xdQeT@|=`VkD5DLg;hc4u4U14-?0H|i1gAH`&;%Abw-XPMb}TMzE9 z&z%g~3b`K+$4__2|1^x1B7g3E$An(BcTdEI=3$6|2oY6<>&Vq3Lc`WRJzl|LFeJXv z%c_;iM|Wq~l0xs?ZY)6Npx|_IbHAP`Jed?_-U9^UW9x|0J~cyz 9A7I$iGgUUe&nFB!7rQ{X!Tk6R$3&&MRJ zqoQv!^&S^e%%Apd5POXVQWqfbC~7<{7*lOOpf EQ4_(XLA~XD%ECU~s~b}d-`{!!IDJs3q~ob3|C(0p* !mH})`+N(2QEIdygT0fb7-mEqCMLS zi_v}-8eQkT4K+XWhPiANz}plKM L8JLjZE z&x$Sl<8Clpczg+4bm&uw-pLnd;Lq4Gks$k;_C|PXGC4&qTbpXGZHa}(E%RUwztV|g zs?vRDdd(xk#nsl?_a~z7Y<|QPj&m+ZyRhLbxs62P-pkE!EMF5m>YD>9*@J_1Dj6Qi z@rs3(G$S)P p6 zM92N&qknKKB*j&)xAlNET%w6dq-1p-*e|;? pnmfqM
dDU$d`+O*bA5T;b^ |z9_QNYl)^FKUIvk 8#K?ziX~2)Ol8-)R?CtnS|8b|R|qctURw7(rni4UOgf z(K^-~E^OTa+h%j A)kQ;T&)O7L3j7iBqMIxpLgvThR(?hb)WC&@62W^+V83z zdbF0A42cwP_m~X|9?tj!EVJ7gFgB@C#zJkl&V&@P6jP&S)pgNFhZ{-DFMcloGAO{L zlmcm&ekh!P@ai5p&UgtmdVg@}`F6&UmvVkA%{4i)9kIT)!3u=h(c}nA&*Po9-u+N2 z-}M~b_r{5YhPXe8CgSsc%q45hIF&ZKjJ;w(vDKd~aYxkkpTt%QdzV{|eQ^_*TFKUi z|3IrcPK!D=Vp4& _*j@@+Q12R#R<8>>;#dp$AAE-(^`)MvrOH2G6^vAZ(1m{BIh3({l zjn?M7DfXPu@d8~5R=lx>wIyyJFBcg>p`4|8$D4}>xs2C#OD27_TxdkxM#;YV0`r4F za?bN*CDDaieo~pxYw+&j_2$~R9RGbfw|#g_wpvcy**)~1vVu~ZeSrjf1f-wYy)ub9 zo{2#3i}9Pq(KJ+} GMA^{!KJ{ljGNb5LV)5_5qY1Bg4?`<>0CU?!r^fo3h z+{0(9U5PI*L|7M62d!TiFKioq-BH^p9B)|;l!+>f`$>G?dDPhx#?M|`n) *CygOQO;RrvduG-ax#7?0eoz@$UmUvv$oToTCw@i=A zW;v=m_l=%u9Z-rmZ->&7@&CL{P*T`@uinI2=E}V1T3hv0gUNYB?$EUpNEAhF>rUnZ zdz075H^xgLv@m&oh 8@=iu- QE0xqEK8MQY zVwES|WLf~X^lk2%`b>{@E*5T#^NS>NI&}y|D_hqLXqVQW = z<~0QWjfv9rkNfrQ5h)0N6@ehYbmIB#g~Ir=Xo`8ym6&JmpcS!>OfX#GSVuCd&OP}& z&-w0%i+X*vI>^C`{>vo5xPrebY`0xTI8G%B#5yiGwb9`$sc;H%P&?olFG3MF@xIN$ zO;itLJ>tt@ _bzm&+PI#3VEZAQz|mhNi}3Pw5lhpocQ#h4x2H`a z>Pn`|HO9nm*Erm-d09LTO7$3|8m`+Jelu%UmMZWLh+Fc9AS&sQv;C3s-p1OwiPqX$ z3V^&L#5ks0&D$I9Fv%gKuOeZ T$n61e5^W*k8My@ddqZ5-`!)K!*Gr5S>d&A!zv2l=OqUz-@RMEV+q94><+ zJZy )aJl5!|L_n IlZ9Gyf6Q#CVRLd&qx{P8S+at2 zuTHh?PLENRoX^a)+~=3TmouU`^26uw@N*Wlymr^$lQT*BC 2@zi! zXb`?6lUqNYM(8z=-nHT3eU_^;Cahgk>xxt3es%GVSuc5=kpCYS@+q$Z+Fq@vQnL=I z7iz(n_2z3YWd*{ioz{2aE)|(S8)~+mOPt~OCCOkT$i>Wr)ulXLpbS|XyD?F;_xX)c z*2TNNb*g5&9TX7d^00QP-ER4U;}rp|nS3URORf2K56hW`&;IxeQ$N{;uxOt``) kL-<5<;?Uhh|c3NIy)U ztzHeqU__2xHjy}xm@f
h8s!$=K#Fgc{;ut@grDs}y+c#u(B zmHjO6IkKZVgczhCcMp$t69`GVLAH17J)n+O02xU5`?ueD03#Lg_C&M51z$CP0hY(Z z*EKLm1sp(BElYIFMkoB&T`cU|-DX|^TQG0=0LN||@d=IH@6D%s>~?78>~2#rUi!4c zW;#1=7Cw>+9OP$1FB>{QaEuYE4H|VoPTCvZY-n% Vp+5E3WH-eiZ7P)tAALr5S% FJ|`CYz3YprnR5 l9D5sV@){YbGXNa8IpZwBy)65b8%KT) zWvmwMg`M_kDaAf{<}St)(=Ty^M302!Fr(1g AfUVaL}h|23h`wBv;IaJ1VC4RFZf{Fo^=&?!w z%$LC$G4DBVXnRtYJS=CN#W8rslcCt@ckK&zo6_AFV jpDN81gD+? z=s=Mvc;1k|zO72x{+S*sM1awInKWWdwvp1}ysm?%&2eH0Bl3 8pKw$s_?;zf=4KNZC5Vs9hKX?*5(o~Cqw>9<)<(b{Dh%A zb?v$z*{cb&{2}c#C$~f%w;@IJ^Y|F&9g>J# kh}mDl?LU3+)!{Nm!I!k57zTV` zwR{|>foO Bpw1+Jft9>t%f$|0J}pryV(=R++BHu?opG(=2zwy 9`5QKQef0w~mL<}aCl9qcp^>cN{U#Yy0I_a?$4tThgVqb1B&leGQLm$#nfilwK z9y1Sfz>W*+nn?<4M`-g1v)js=RYvE!c|ID$$G}LJ;z22G&RqdL0{R$Mz{Iy^rl}=A zMeNh=IQE`+)wr6H6Y}+4c6KdWt!%Ua37WqilT>yY=rl-Mn=rLKgx}QYNP?@YxjsUf zY4TL=@tFyhP%eC711^6!-U|6&LLDkL+d~GBE5i Hn9LC$KnDa(XFVbYpZq2#C#6)?iR>6 YX5ccci zz^Zm}($_cf#3(gi*}KQZSz88V&4|cc5u&IvsF>lGi3xUW%g-1zA2lafMt_$IiRLJH zWK}T59bnRI1;-s3dW#~-MSA3%mR}VWdMGTO;P)b= )RGeH88FA9{d( R}r z3GYA=B`>4Jb2ha1_qZw0tpqrhJv>HAuq 4NPoLV%&VE_X|M9IaAm-5{OA~%)^5(d zk1{G~ZHK?mm<0hR_XCa1VzG(C+$R)lstr{+Rwp&;%~oFzkShnoXbhaJw{hzNF2^d7 z?m |v3 zGF%@TI;Xz>lq!lrA`sZTy7N@3d{rgyKG<^%MkX(jbNb4T6bU`O%B>e(%l)Q{V_0av zC&+kel1rNCZterY#%J4PMH_@S8-$+BQuh(APC*r5G4@Z52sDl6KG#1b$vdpn&oQcE z4ixoXKxz=n2iZ*4F3O+WjMV$Ds6+pSx`Y@l=oW{O!R1ew1T81<^V!dzYM0N*!e}A4 zIF!U_5e`m(H^gOWIpk~|tPQM$h5z&*i1S}JQ+Bg6q2&;>v9Uz}uW~X({Co_9+gRS> zkh;8+xUGXR;A5@J*Kq3G;!rd(LeOgQg4v;$Utn5ZFoYcnf D*1=M&>qf$6pKq{hfwz^07mH8Up6wWd}o`P+q_|Fgwp* z%(1pbz?}^ca9bNT7Xt?;Yc@x_OS4QIfX8qLV>V+Tl5Kvm5d1e<$O8ra0Tq~+=O=!E zg`7OU0S00-u(C2Uu{MF*n6MexnEu4y$;QmY26*%j`wR_iEPt_)>+iIYm-`PCL0sJI zU~XC-KIm@{g8yNJfx};sg8au;fH?mdRXp5$e?kT2W9R+pOdejY-=G46*j!Ak0Pp?7 zA~q8Tz^8y!m#$=kTeI0Y*jkuaB7T92`)@T80{%1N051Yiar68R6_^cRKqpItlLOoY zu U{5ke6WBV^7kncY>=og5%p+JcJgCqb`E-m8Z{S6~75SxPukk9~% zFtGZ=W4{f!U>*K1r{wA=s*{6Sbi;QS-TxuKlD0|WvH!N$tua{OO{gfK8Pv9kIV zA@F}r=b%e-xS@YQ!^H#n(;QyNe?bQbX?rU+HZ}u8QwIYxlb=TY0@(kH8^QlM)&J^7 z2-iOY3xJLrFrN2!+`w#R4hDAS{|u^su>kl#C-t9zfdLZ#M=bI2{gH6EA)wy@14zom z!4UyC4Ipv0OICOMN2EI%AlyxU$%f$noX3Bf1>*bz8!iYyqQDm~EjN&)|C$H6z+g5b zH#;El{pQNQg7%j<`&$_v0x-fK=z$=#+(7dFt8U=pVgm#N!qEg^PMd${#J_>cfvAV@ z^8Psp|LH^skf(n`3m}F6k52p>82!>L9?n0};e=eKVF-|ye+LN6W@_c+YVTy?;Py*! z|K|jL8AT8;i$0{>aL_v=AWQ{bmE?pSS?@bQ#+YY(};KJsJH}SO7=-i@1z!EuE}Q zZ2lq|z<(>bLqMQEeaQs|-U0XTUgTyoa56PCaQeg2e-~B%Iko>Q{c%D6l*V8#K*Rt} z1oGiu0fhXT^w j*U#)|a4AZye;Jj)i27&M{J$v~ zeu*papW+zA!$r#l 3y&xVQS}q{@{RRe@&CZO?z}Oo8OIgSDH?Z_CCh-0# zbHQ9d<;hJ826EePFmU~uKmL$$)&MBKR|8ys19ksm70*AVE>JlALkEC?Z1)>HkbkO6 zpv?bubpJc4$@RDLH5l?w0nEh(L=PB9dcVO2F!n!WCLk*T^ZpHEbN!u+4F> {p5V6FuWB;~&X1SJ2z z76Xu9i1)vnp5p;H_1F2iZk@4kN~nX^klMG>m-$b@uGfigKS}5+wZ=SuQSL%=!}O)j zg^2!*cw h5{8*GyB`)pvN!M@P6a zWx9s`f^{v+GUb~v#2Y_lEbEL~c%t3tWPIUu#G0_@`9Q;hh)~1nK|o5wFfx!`M8`Q( zl*8hrjJnFXnq?EYp0d;}aQrrTGMbVmGi PB70b09xbA-8 z+J%TPUu<$-?_KHw x-g%co)B1Rf`K=oTl<8* av+eQX+toh+Bd~4XLUL#jK zu3mQ|bo!E&q(n*TLlaw>e)k4xB6gef6VF7=b*{0scV fwmlg>T$|WT_I0{u|FT*=?>jt> zO4j0(pLE^fb}L-1SQbS~=c)x=64f#%o;PtM*|Cg1p+0VAXc?yUyA_#GGRM{5yiO^Z zfz{*p_D1_1q_K?0<8LRGi58>fYoBF#XJesP%S)TvIF<}=2RGhsG#_25w^rKf;KS_? zMdzt-$z5e@gBO`nR;<3WCr6QGy n%`Oi z{~ksC@#l#qUR+gAiRgA}a|+;nAFxn)qQ5(9z&`Qf_IaX3Lu|?Oj{KLuu?_gz9uf=( zXyaA*$-bO;TG=9;xuf5~r@-k>c&nz}WE1xp`Gn2VeXUWJ_x}%H?;PDr@GK6-$&GE> zwr$(SC+3Zv8(TNFo!r>AZQHgs-}m0`zH@fZ?~k6YuCD1iGjpc8s=B&s>-s1o&c4eM zX$$QWZ_l@ji@fLB_a@@q@lVi0owH0NgARaTt*T}?<=gw?whJ)Sz0CQVQTMNX`rVxa zol6}*70t`*8_rm!Fsw=_eMOlutSSJ#j!hFqCn9|XyEwcm;4;7BC#*qm(gv;}wW@c+ zwp&R@dj3X*TavCQdg{RGhRMc?yWruMx4I|77u-H7xh4qk5aKAEoe&l%OgMi>5m$Qo z=C3LtZhvWgB<&ztVQUBHQS7*x1Qw7|2yI~1pje=CqVySTz)vSz9$E9l8NBem2mpPG zkktlya?(;bajF2Ehs7T`FIR{5G!MojaYmG4bxt4Y(U&8yh#O^^@$PDh$PH*wfWRKV z^-rv4kLtn3msh9M^${^mO^)}#axmdG-4wLa)Gq;_pl)f^54HSW12U`+wS>|Cs{S3- zB*1-9uS$Z;uq*c_$bC_3Ntlye$7@kRhL8T*Vfy*lx+^CS!l!tg6;YtLIO4RZwW6S^ zM9jK{fpZXVNR#d|p{&UrEL!0ZiOIRjy~q=)wP1MZXw0dVaigZe^5it8j9NsAqtIBg z>Hw+~c=Dg8BQ#~iVh;|HNFOb{2aKCCr$K?^kz(dyNn_(NV3y?qYQj9bGe*n%k=Jx4 zm`SRGeX{g?Uy7W}Dm{|!HLgfiu8>}U;Xv{D(N!SFZO6n8`gT~~oyOxJcySBE8a~xR zDK_nvDBDb$$CGt}&2mYmFk{qd;2cCr#bASaPjC7cg)?lqH(HI{wL5eOaOcqWI@({- z*F~RELYSPjl$_r|K3W zr&;-n%`0v+zM--`8hA7Yl(5)I$)!br;tVqO_8D6G>6w5wYZO|v-zfN|=`Tb*=s(d{ z%?k;1;OMhA+x#EzII7MVgSJDKtbNr&kcSS4;H&tJrCEu56s!8J1=J%aT|+7uLa2|k zdvsagPuBc0 <@_(i2G6-5+_m9FL;_y(B;4JKyW>|!Hj=h z{53_RA_En71l99#?aShev)#7t>op^r?+&M=3zZDizXCV!#qP7O)ee)If!}TJvZo=g zU$vIR @ZECsf}M(4$Sj_c2=iGs1v+ zixgLOeDnX>P}PQo7##6MP+W^q>Y7P?kS`8o40$qDT(FwYZ@-sPaf`{#VlAM0?WUZO z53fWHP!aqzxI9L@Eh!R;izU(7#M)5E8)76O*u 85Vt1+w|NCvf zlx&1)gr4izBNVYnnW+e81-+PCJX3MF50RVo(=xusqlW)oLe38&POK3mWF%wgJx9Z+ zaw?$78iN*Pa1dzs4=juxyifdD$7=L1NF?CJ%qrrwu-HWf h3Pvm%{aq?~*a znMg0uc&1c}snSZB|2&=Bq?~+kr&V(#mAZ@tkW`4tFQbeXl#nznp@%0QHy64gRZgl? z;Kl{+Nuh>;1>tVVZgozKN%iUvh9P2F-vs|ZqPjwosgPQk|Gl1gFit7n_@z?v_2R*p zC`eo^Vz-lca71#1U8_C0!`8~tEx(y+hHewT@zEFR(nK$&2}~|;v&t^O2fOjnHW%<9 z&ww8IFq7P&77y}2vrs1*RgQ)&-(}-(mdK39d$;8QKb=z50_bEbR^g)bD8({z7S-}m zsAQ|9JmpFCQq}tS!9^R@8Y^~@qV#Jq?o`V2hy*LH{KB?j2`9FRr4{6fi#eJw;KJ{n zR7O?DT{4s~K~eWeRK*EFf_!9qs@P)JXP`2162WqzLp!$ARvkEQw+hpRO6s&$9lR9V zTP3mrQ?*gqO=_%LrTVxs-L-uZ{=mON;@*Gg@&@CT{%LPY(2%n@qm<=ZgONCkC>4x@ zlQ^S1qRn1c>>}x1 dVYln*glPIqfxV-c500&DFmh;jsttNxb7z~>v6=C|e6M-E z>2Nl~6>SPNf%HQ;7Fze-UA?q2dLT1J%Z+rXRgqKsXf)bvp7duBzrC&}@rJAxXJLe5 z?Jb9Rl cN(?<_HyljNZf_xk1f&^S8+vIs_sXZAfzdwpMw;c%u-7BSBIg z7GikAI2~aHHqJyDBX>yi6y(}cCXwT_ug4UzLbopVDSm~;vgGf#NLQGZyvJgl^A1r< zpU##30gIVJ7Fm~i%Jy1HUO%BQrC8@as>m3-0EMqJezhln;#Wcp7Zj4o?H`$CQTUqM zLyYa~fiLq~*q!n8A(7YE6?`?{iFa6JS++VE>8&@VyQ9l|SAP^&Sm3PO%g5@h2KBr< z@bG)<&;%tTBWHW N3 fhgB;h};Qtq<>&Xk#u_77CC9i!XH#`ZVJ+n zs9)i`&ce|AXTQRQNUDrA A?qm&@*h!Nfuc;9?7ERDd($)OO-Pp6X#VWSC>4BTrHqs>O+EL0 zELFZb6$v^;9mUxn4juH)%3R)M#Rz`;>XRr=#%8&oFCAl)!D=?3hSOjEw$!0( z#u#-98=}N#wg8aDVoO&MkG2{sb f1kD0CfP}61@E7{Q{s*LKie O?+^>U za|%#U_;xf14m4(lE^r0{CcY4 66eN(E}&O5 8#AbK&$SRkQrlCsl4I@!99rClynbi-6yLI90uF8$+zVoO_1@EzK}ewYEY7q?Xdf zOKfc)XO4+KBh%1xu&!7YB6FcgwQ(gPGXT{LOI>VL^8uR3guB~Z^{1!QwfX18FT>^_ zX{>5MnQ*B??SiGwMd}l6to@M`dV^#VV^W85oDl{Wt3eFJ#Aroz4n|Dcr(>I2xW{)u zGYPJh%cb6-K7uCdw|yx4NxHB`|890$R4pzxI>YU_oaz=@c06}&FL<&hBh?O&W8^U!k zVO00&$mSOA#C>6@?qoC=j9>kuom$72I}!={DPD`lOX-*aaRmJlADF5K!?{Afurznp zJ99VsIu{Z%;!$gROUP^4^Q+_!1aNDWbb-1vQa?DvCgN@#I-b{n|EM2oKcn)E+FwHB ztbdHv!x!lHYKJU7raAeFqI(mdcr;F?5>1Nop9)3^ksz9Af*X&X+YUuxsUAez4#AfH zH}<8FILD3pZdl)h6S&f66AHIK11BcWZ^v$H#UUyPo#M%}pDE0776cj>O7wp|*OVCl zS?EEc22KnXGdnJew|Z9sMNni%>u#!%+N-gmb3BI|E=y(W$h`7x*M19u5DAkju037e zZG5lToL>XLd7Nnke3KMY_aJCgY-_~{_P+#9YuLu9n6uf(N?zL*_aA$n_APyr%LJI$ zN^_>daxJO}ID$A|767m1V6EpIb#VE(7VMc5dcoPJ0Brg5HzQ!79#j3X5?+{(X3)CE zqW70Fdw`BqxS91+^`PK)p(!W{Fu{OOWP5~np($8`F04N@WHsWayG$ahTBlkArZQR; z>YUcB@kl9v$y>caIjk*zFjr~T*u4h8luxY3NBA_K|AXbRSo={_D76;J2UaBkhvaP3s@zuUjC5LLLe70sqDP@p;9 z9b};L{$*_E&89ZCeNkD_&89t)Jw%QRd+o%8VRZjI6^6)N2;r6De&VlHmc33Aqn=F* zRj05~Ma1DEjL_Z+D=|JX8-#OAJ1ByL8V7@fOd=usxgVtN`LLeFF_{7zIw?S_Arkxk z_Iwm-7?zH@D-5x#I{?MQv_wE5Za@da(Nq49(t9{VF&q@L6cg6EPADYwnT4gUR%92l z!p~7$)|q<79=@RO#^+J&sdrM=HZhqRueYd=yG2 MJK?qw!Y)Gq7ZRkWzTD$=1l2QLuC#%k=6?*oiso=jwC_GMHUnW>`L97-rGlqy zK?!4%vnWOb*Tk!H&J$7kl5I80TX|?6Z=F$w;l3?MZp_`>lq7LZW|$`>NoktDwD2L& zWhJ$c_V?e;^vzg*zRJj6r(CSsx m{m+`ElDy=#$+N1n6u9wlG zZ4;u`FLt~KG_OWiopa+#dlgZZsKvb+O*LG!^C5%Nm3_M5Udtuhp3YpMA0GtU%`zL< zjSXg{Vow4zqZqH7TR~EQ`(OT!JdSkF&0n D<#pMhg zJ1jgfZdWXP7&R~0_Np2Z_cx{|x7i^g*M03;G36xEg-9~+giWH-`wYVXJ4z}m30Q5i zbHCC~2yxn|^T$)LXtNH@HU>T$j~BX!jBD)nrnGGL%u96`lQx~P-v87IPp@2}C{9>B zZ1ir*{(ixvMPzj4DWD}|98rR- Vfe|e?E5g%K@mAdMO zEq%gEvCs9E_m-#De)4n^-9mq_rag(@ZON%p-r7T8vt*U4+rxg{8C}Tt3MNE7p~8~t z(|>ZnVX4$mncWy7hscu~T~t#BJu-SSOAY^#8vFghC-SrYN&AdsJ&bOj6BiTy^Td&% zyPPRB5rP9IVh;25N &OpEKY8H;|U~e=UIipB6~iSQ**> z_X0_$-sTi(t8Hga$;mm;)uKT%X%E!R=fuVD1mHU$c^i@*?Ap&SK~X8xSjyjSleC5m z{IVPsq)Mb>_{z%fSKig%?P+)01Xnj~;9k@0$1d;l_6A>H!P)I`6O#nw+h4cc24C;n zc78Mu4$T&?29 axy%R28jvEAOUhZ=tG;{w+9Oz# F5iDR0HPi*88}UJX}=*%;NLis{cK-(#&hhq z`z2m!w)?&Oe3QDr^xbJbXWomwW4?Xgzx;l7xNoyKuDCbP7K7;?+-Y#u7PZRVtUmiq zm+-Z@Y-P#awiGcpZyiRGuhPp!*^}UW=UcW(@L@B(PECFld^|rhEM>dR9b?%wbzE#H zEnHtX3dpc90sBz|D{fz+u)d3U)K6Tv+rn0-YB1lro5DS8thw++{#tuNj)y;wQ!UY1 zNH}^`*6C-VV`dIL7gvVe8!==h_|#$odtU`R+b&nNad}QvxhtB!{&s#hu^&J;T^nbp zntXcRdNYL7(kZyCTyB+0JT>p 9H2e48AP)(Yr+Zqx z&kgKIPFyx_dtw$1PyTyaZ3);Ga&4tR67|^iLRyZ8lXQHs=|#W*Y6}~7bX3sMAZ`E> z^D>}{S%B60FIc(&3@pZ29BnnFy5I&SbvW_&*j3v@ZswYlJRQ!{vW3A*G32p5HNcPG zEq*D~ixKr-?);e%zn8?OPTNdZ=mxLWBdxuy!=1VYZ=prEud4#2zEgvl-}h{{Gl4|T z4hnJl zw`nWi_I$=93o;18nI%Sld8H!Rt>!tV8d*FtfFBdwaE(6uTaHukM$!$@^J=28|JF7C z+TzLb_ TZ{ZECyHd8Prd``j|%my>)IMeZ$R<%XkdebbA_!p}mIwpOR96B|07>*d3(gDnd z5-%7}Sv(@MCZ`Bz2bwC8WFN9b*$u4%!X<@1d6nrv)r@U%q1s?Mfm9@Ykrslmpa`Yy zmFgEg2yiYKQ$Qz!d3Gw-zu`>g1v%Fb-t`Mxn+!08zeKZ8cR8Q$II;)p=PRN^E28|1 zzzvl9+0K=&F;CR;oe@LG68OtLpG?Fjp`sm9OXb)=JEU!1V^lA!K`0QgHgZM~bZWV{ z%5@8QebjSqKj$dfEnL*vTs~W8>1uI4UjTy4^|L+?Yc|VeaTJ#|T{cNw%-v9W4@;D= z`zMyJ!F|Ys-af*|W{8hC$hbqEdM8qqE^# 1Qs4HvzJ3@CYbWiucUa3u z=1gD>rV>Br*C-=sDqIPT gCqP*wV}SBe>yl2$NO|n)DaGyIM|H?Z&Jo~mwXBGa zrWr-nkHnt_e`meXoBh2b`*{+6aSx{Q*s|IS$91p&+dnDk_!;hEv64A!1G`0yHAKR7 zTIqH+5CM^^UqcosHi5DfEKZUen3qyP@fYFj5?EX*SPc^}FLVO~%@|QJx%O*jF>G8I zH7IGq6i|56-|X;mmLBOu*c+(fOyDtRDgHtNDHVr->`5q-gge+TGLAlv7*c64;?}=V zF)GZcwS{*1(9KF|7RmBdgz+xW?qC(lg88&mgh*;XaDAb_sE&$Y{!bs03$!F_hEw)W z3tfHFcJ41$1gkT&CP5yZgLMNo7Ubpl394d?xHDS@sv>CsOb uOtNCo^Y7#QN6gqyL0ot>meHqcv7t>TZVtE zOL}`zawXuIx_E(1jGwv=5Z%+Bb59^e=jV+vFx(S0>;<8!+M)uH%h2G{haM@X(Cf4i zz9Akk-OfgdA;kvIUtBdGE2TQ&ZnQYMi5hrB`aP+3V=hTSl96kONja`Y2flXCM;xoeX5Wkw zJ;1&6ijXZy8iF6=HEHltb4K%t?AtKuvV8fi;^i}>jU#UA>9&aEQemXp0>6_z86Tsy z&-bJP?QTsPy|X=CrlJ?dFUmr17fSyODMvo7awvn_N;v?}ayQAq330BMqJbAfFu(Pn z(H2Jt$s1(2xHI$FGZz05JShgn=RlBbIk^ZlUgGwJW&{P+=3ERI36bQs8>i$7aicT} z2*`(No=vmJ`pbTQAE8`Jkg_h`7NtSy(~tK`t*QY|ywNVo(lpNsQ+54Vzzf|-%#x&& zrv?;?T#WYt@u-LqtSv-zHUam$ZDC<_t(d|Pp@2yf9u}0H9TP+aH!5hh54E=~l+h3k zHm%na__S{fTRRNLmTdOOp!)+O$IcgsZXCO0dDzv}ncr+C|Hg8>Wxua|`ioOIvjAZk z42PZ60fW}DsE#PFHbn=1c1Ft9Fak!4JN9T#e79+4NAy8WqPl{X#Mq^lX<81Aw3ZtJ zNK(Uw%6pzAa_jjI;JuJnua`Ke5+QBcuG@HlPrx&yU)JniEUdPDquhgGK^e|0=}pR} zCHh|`wMS)*u5RF3@*A*^+-xMxzw(5pi*A>+XlH1DZOtoB $&}dL(rr=1rc@p z*0!1oKb#DfYq~xKTTKoE4HuTNr}e#je*YVwjn-^ixmT#j$CLR3-Xl4@Pr-O&I9a-Q z3*wvM6|OppwzyyXyKV2%cOHLK0X6zWXlsYdl4QeZWvFWqWvFL?s!mpB_z!QvOXotE z1kjBQ>2=b1$y@iRj?h&(qCG3BrPvjSziOpnlo6kYoWo)ZaKZ{12?sWMu?LQrz{BO$k#3W<}GtH4zC+$a- zfC0q-8HY`oK%}pxTN2thp$?~KFiz%tIu2>pb=v;B9dCw5UOu^e)lE+nZ+b1k^Fdf3 zOl^1hSxAfpd&`XR-H{qu!Dm3L!1t@_Fa7>3$a~p{=PqEVW6*G@c&uMn7Y|;qe=2wc zeb{$1d9HsRIb=<$my(NbJNmvW=CK?#PpB7OHp*66jYKf+S@f{?FE6R5^9O5so99jA zsqsb0qnIME=R`H9|FE^->bDDhFp)Tz&OZ>6;ys3iXhdaR>RI_P-+H&H5Jj{BKurov z1u^@3S&fxU2}`6A-{z3Kmu9dx{OSNCWr@2-v{P82l05Hcpi@{=K5o8M63TS$Ig_aN zPgx`k1z;Z_+JbY5l7#>t3_M)|a>%_^2&7n(hmhSIF~ev2;zXT{bdCAt9sPrdpaT$z znZ&UvwS-9XL7QijE%fAnen_*vVcWA|YEzLU@Kr=5q73)+pW0T8U3Ae5Gyjwsc2?a~ zL^aw5+7>V;J5tOqM8gR4uh(ei--L1q($K8>B*bbM ?Zj6+e_iadw8Z=qAa zZ?aEIS2)lq #H`ii^r?Yfmc^L(X zP<@`*cHE%(b$CVDbZX!Ul!(r2e0mKEd|NKkdeS@5IU;(jw$CJ%YQ6j_qL|Wnbx8Lh zQ%W;iqu5V~*)a=&Vb1)e^U$5}F!dU$z-i*Owo^gX ?V=cg<6AZzgz3 zeH~4dYkHM9PX9zaV39&%N3p`;UC1I@Bk6}-cF+6DWvUG%DT=$%6VYr+nHCabzNCPS zP*+!z^dtIsigI{2(fQpNz UFHl?eHTQIHtGEF$X)tq>y`OQQP(5gp|AL?AeL>tcQyP|?=e%97Q;@Fv9g2Z z)#T4B8$AN^om-~;lWJEtWH)JpSdaaFj7*b+_g9 8RM3EqykC`@33RG1V8`xte#|TN zB}#wh&k(eL%p`Hpw?K@{y*B?|Qq=oY)P+w&mLg!5bL2CXZg`BNQhKE8M-A#SlPo;^ zON6wDr9ynlQY@-tkA }$8gsj+qTZCCLsXsiJ z9*|V>t0ZK@%VSgjqXKgqYZK&ARZ7S@; Ki5hO|K;oaRu0Np>*a~UhBU&R{<{jst%A~ zFIn-OifJ2R7sr`XA&BsxKQ1LX_T)53TXV O-PT60od0MkP{#X zVPA9UeqpsB(HZ1ejf-0}z(`~sI=f;XBXL=s+B#;AQpWr{;M57OM467fnj&nG^K18Y z#X;*p(3`lLKyp=u5Zt|kf{#j6>h{XL-9^2*>@?LgTkU35?*L)mbXCD2g45PjEOu59 z#HK!3{G|Zd;(vSF!VqbAO~KF!+s1)1 9^Ajh6(v{8zsBDF0x>r`!||Mkr5V`5^*8`b_wGwEK{{QZ{baLHRwywn zU{0E*P!LZV&zdk%V!H?q6(>sLxHcu3P}-;uOvI5RPa;K3Cz%iiErl#aB9&j&oE%mj zZ(8Vd9bl3OsYf8JKA u>Wrhh*S%6M)D3UrKP*j1)Z#w z*q4*Ne2TK`>y}2q_d{9}lmBusIYCb UR)RD@xew6Kq|=XmXd)p6v)|l>SqmJm z;oD&tp&Ob;!WNt3#p|wf3r+xlvPZ-k%{hiaqAr?L)9HwhtLy_u82e<^QoE`lRl6$L zdW>-`deqe@&rB|NZLn {dRNfR}h|RuZr4_KsGmBgl?@ z`}e>MJv;AEU DnaanhQYFUnrLzj^v z)i_*`bXIedrPN8)rL>M6rfPZlqel8qS^L+hS7v3M0T9W8xBk5Rl^!&&vp&xVFqU6_ z3vguBZr)-9GTNcO@wE0zps%K_vB&gpN&wtz*KOnQ_^SMACL{p^8k)JVB@l>Y_GQ_3+3JytqoVOj#AL;DVj+ag>O5u9k=7^S z7g`Ny`~6vMMZdDVE5y0+WoT{{l*8P+h*-TL>x(&3!rTLoQgu@jq73m%_w)G6dZaUd z Q}!cOj7TZ%ivjbCVE(!*_5a7q`oE&`|4&|4c4lUl|LtX+)Z4Tp<+1B}R(bgC zU$y8bC5YI=f}e9v3VHyXkf{g83G90R<7Ev;Ez3DmpI%A42yk1g{3{xd`Wl}w7Ft*K zab0}p=f^!zGkZ#MnzVPh{q6p`4#UeqU!L(uz4`T(!|?rt(EL5+;&u}E?e-VG&A^Gp zC+Pd@uvzEx=DEA$ ?%2&urun-2I0oA9 z&3t-4YV9SXuKC)p z`U c{BU}TaXGbA_1vXXbxi+#&_LHI5sclH `ls{PwLOD&DCh&$hTJg&&VKz{^pnKM }c+(C8D|;%Uvq?sPZViyeBK+9~hHWo(K&{-CxTnOMao9Dw~r5pX*) zKPMPT9sGy&SmX#&I}~87Zj_hZOZrl*p;dmEajLk4otx&6O{Av%g=>BOvCyVj*1AY{ zj>s+5l;Cs>4De`CA%a`+9|Fd77T2&c=VZAu0>PJ%uf1U&-L`3x0_@$dMO !O+9QYPLXfhw8m2oOjuGQ!!sv-D9U2&XC8K*himo2EPhkZ7wm_i}u)_5` zIQx)YN*ZJKukrhi)%gnK*l8LU$?BJL!50-(= J&F-juBQUh){{ ztV{hjl*rd (^EuDp4CY9&3rEv6*np}T(vwO6V%P)2#2wcnj^PnJ zuHb=TXtOa0M6K)Jl~8l;wfJ)7`dqd LInk40>A6HZHHDhAiE}aRrdBJ- zL$K=!gyKh^u1V%I>Ahdgq>9sfvKG^HBS)WdSA`52U(8|(Sb+6xGOEXcGM5`JVfr*+ zG0MiP*t!>o|4~AaiRp_QCKPL)) ;eApsnE`X?HG_ACD0IgfF9dYtu_HIXbiF#RVPgviD(Zs1OGNv3S z?G0}HoI^y-^)xVJ!5)%y7o9r^(2~a^111&q_7<+zww5I5_Ovr)yeO8exKukmFRB1_ z-vG7ENT8^Q!wVim91bd@wj>FwREMJKGpGXQ6Lk&FZZ80&8NUD!>0QJ5=cugtL>>us z-6c0sGcW8hxPU}%`R71 PAQ+eD3 zNmzjzCPG4n&^S)&m09{ZGy;O*B|%b8pl=w#$GHYbH}50# )_WSd2xTyHBK) zQ7Zqdp>a4nD*I*p8+mr76bfaqn8x_Lu;Q1ntJMseu cp_z4?dLz%tpm}9wBJ!5-IVl1au1ay~ zwWw0*R+Yd(1pt|CBhx8m_Am=dsBtb`%io>)VDdVnm#DU6f0Bi^W;t=vZPs(u;comd z5~N+uu&X!3f)RS&t#%E1YbDehWud@gSs}HwKGSq->-{GmH>LgO<_MC2B8zp$sUX_5 z& R=Rh#2? 9$YTodU@NXYq*DR0Os9nCs3`d^IBXd@-*hO>ZVeP_MvR6#Pie&&N z>5g`M%Ws?~u%_=45+yv;XM2f4X-L@fW3zF7=9L;rT5C|TNgfR(^GjW4+#nZR8hB7* zLq=MeHa{bR+xeK)^W>6Y7^ip{7}ZJbPq>&vNbZwIvpB950