HAR-Datei in Postman
ChatGPT-4.0 • 2025-10-31 10:09:07
Guten Morgen, lieber Detlef ☕🙂
Ja — ich kann eine **`.har`-Datei** (HTTP Archive) lesen und daraus den **exakten Request für Postman** rekonstruieren: also **URL, Methode, Header, Body, Query-Parameter, Cookies** usw.
Damit ich das tun kann, lade bitte die `.har`-Datei hier hoch.
Danach:
1. Ich analysiere den Request (bzw. alle Requests, falls mehrere enthalten sind).
2. Ich zeige dir Schritt für Schritt, wie du ihn in **Postman** nachbaust.
3. Wenn du willst, kann ich dir auch eine **cURL-Variante** oder ein **Postman-JSON-Snippet** generieren, das du direkt importieren kannst.
Magst du die Datei gleich hochladen?
Detlef • 2025-10-31 10:09:21
Guten Morgen, mein lieber ChatGPT! Kannst Du eine har-Datei lesen und mir sagen wie ich den entsprechenden Request im Postman aufbauen muss?
ChatGPT-4.0 • 2025-10-31 10:09:51
Perfekt, Detlef — das ist sehr hilfreich.
Ich fasse kurz zusammen, was in diesem HAR-Auszug passiert und was sich daraus diagnostisch ableiten lässt:
---
### 🧩 **Was genau der Request tut**
Der Request geht an:
```
POST https://amsuite.swl-unser-stadtwerk.de/prime/server/GM2?REQUEST=GetMap&SERVICE=WMS
```
Er sendet einen **WMS-GetMap-Aufruf** (also Kartenrendering) mit einem XML-Body:
```xml
<SERVICE>WMS</SERVICE>
<VERSION>1.3.0</VERSION>
<REQUEST>GetMap</REQUEST>
<FORMAT>image/png; mode=32bit</FORMAT>
<TRANSPARENT>TRUE</TRANSPARENT>
<LAYERS>EB__GRUNDKARTE_ALKIS_NRW__SQD__FLURSTUECKSLINIE,...</LAYERS>
...
```
Die Antwort ist ein gültiges PNG-Bild (`Content-Type: image/png; mode=32bit`, `status: 200`), also: **der Kartenserver funktioniert und liefert korrektes Kartenmaterial**.
Die Zeitstempel zeigen, dass der Request rund 37 Sekunden nach Seitenstart verarbeitet wurde.
---
### 🕵️ **Aber was auffällt:**
1. **`onContentLoad` und `onLoad` in der HAR-Datei sind negativ**:
```
"onContentLoad": -16443,
"onLoad": -14794
```
→ Das ist **nicht normal**.
Es bedeutet, dass Firefox keine regulären Ladezeiten gemessen hat, weil die Seite **nie vollständig fertig geladen** wurde oder das JS-Event `window.onload` **nie gefeuert hat**.
Das ist **typisch für den "weiße Seite nach Login"-Fehler**, den du schon beschrieben hattest.
2. **Der WMS-Request selbst funktioniert**, das Backend also auch – **aber das Frontend (PrimeFaces/Angular/React)** scheint **abzustürzen oder hängen zu bleiben**, bevor es Inhalte rendert.
3. **Keine HTML- oder JavaScript-Assets in diesem Ausschnitt**
→ Normalerweise sollte man im HAR eine ganze Reihe von Requests auf `.js`, `.css`, `.json`, etc. sehen.
Hier aber: **nur der Kartenaufruf**.
→ Das heißt: **das Dashboard selbst ist nie initialisiert worden**, nur der Karten-Thread wurde noch abgeschickt (wahrscheinlich ein Autoload-Skript, das unabhängig vom UI gestartet wird).
---
### 🧠 **Interpretation**
Das Verhalten passt exakt zu folgendem Szenario:
| Mögliche Ursache | Beschreibung |
|------------------|---------------|
| **JavaScript-Fehler nach Login** | Eine Exception im Frontend verhindert das Rendern (z. B. `undefined` bei einem API-Aufruf). In der Konsole wäre ein Fehler sichtbar. |
| **Token-Fehler / Abgelaufene Session** | Der `Authorization: Bearer`-Token war gültig für den WMS-Call, aber evtl. nicht mehr für `/prime/main/dashboards/...` – dann bleibt das Dashboard weiß. |
| **CORS oder CSP Problem** | Da der WMS-Request funktioniert, aber evtl. andere Assets blockiert werden, könnte ein `Content Security Policy` Header falsche Quellen ausschließen. |
| **Frontend hängt beim Mounten** | Wenn PrimeReact / PrimeFaces / Angular-Komponenten beim ersten Rendern auf eine Variable aus dem Backend warten (z. B. `extraAttachmentsDir`), kann ein `null` dort alles blockieren. |
---
### 🧩 **Wie du weiter prüfen kannst**
1. **Browserkonsole öffnen** (`F12` → Tab „Konsole“)
→ Gibt es JavaScript-Fehler wie:
```
TypeError: Cannot read properties of undefined (reading 'xyz')
```
oder
```
Uncaught (in promise): Error: Request failed with status 401
```
?
2. **Im HAR nachsehen, ob Requests an `/prime/api/...` oder `/main/dashboard/...` fehlschlagen.**
→ Falls diese `401` oder `500` liefern, wissen wir, dass das UI daran scheitert.
3. **Im Netzwerk-Tab nach fehlgeschlagenen `.js` oder `.json` Dateien suchen**
(besonders mit Status 404 oder 500).
4. **Testweise Token deaktivieren / neuen Login durchführen**
→ Wenn danach alles wieder rendert, war der Keycloak-Token abgelaufen, aber der WMS-Server cached ihn noch kurz.
---
### ⚙️ **Technischer Verdacht (basierend auf deinem Kontext zu `extraAttachmentsDir`)**
Da du erwähnst, dass du im BPMN-Prozess eine Variable `extraAttachmentsDir` gesetzt hast, diese aber trotz Initialisierung noch einen `ProcessEngineException` auslöst, könnte das Frontend beim Laden der Dashboard-Komponenten genau an dieser Stelle einen leeren Pfad oder `undefined` erhalten.
Das würde exakt dieses Verhalten erzeugen: **weiße Seite, keine weitere JS-Aktivität, keine Fehler im Backend.**
---
Wenn du magst, kann ich aus dem HAR den **genauen Request-Flow grafisch rekonstruieren**, um zu zeigen, wo der Frontend-Thread hängenbleibt.
Dafür bräuchte ich nur noch den **Abschnitt der HAR-Datei, der die Requests auf `/prime/main/dashboards/...` oder `/api/...` enthält** – also alles bis kurz vor dem weißen Bildschirm.
Möchtest du mir diesen Teil (gekürzt ohne Token) hier posten?
Dann kann ich die Ursache sehr genau lokalisieren.
Detlef • 2025-10-31 10:10:05
Das Hochladen geht hier leider nicht. Daher poste ich die har-Datei einmal:
{
"log": {
"version": "1.2",
"creator": {
"name": "Firefox",
"version": "144.0.2"
},
"browser": {
"name": "Firefox",
"version": "144.0.2"
},
"pages": [
{
"id": "page_1",
"pageTimings": {
"onContentLoad": -16443,
"onLoad": -14794
},
"startedDateTime": "2025-10-31T10:41:25.457+01:00",
"title": "https://amsuite.swl-unser-stadtwerk.de/prime/main/dashboards/478c6332-757c-450d-945d-b48aa89627e5"
}
],
"entries": [
{
"startedDateTime": "2025-10-31T10:41:25.457+01:00",
"request": {
"bodySize": 1031,
"method": "POST",
"url": "https://amsuite.swl-unser-stadtwerk.de/prime/server/GM2?REQUEST=GetMap&SERVICE=WMS",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Host",
"value": "amsuite.swl-unser-stadtwerk.de"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0"
},
{
"name": "Accept",
"value": "*/*"
},
{
"name": "Accept-Language",
"value": "de,en-US;q=0.7,en;q=0.3"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate, br, zstd"
},
{
"name": "Content-Type",
"value": "text/xml;charset=UTF-8"
},
{
"name": "Content-Length",
"value": "1031"
},
{
"name": "Referer",
"value": "https://amsuite.swl-unser-stadtwerk.de/prime/main/dashboards/478c6332-757c-450d-945d-b48aa89627e5"
},
{
"name": "X-Requested-With",
"value": "XMLHttpRequest"
},
{
"name": "Origin",
"value": "https://amsuite.swl-unser-stadtwerk.de"
},
{
"name": "Sec-Fetch-Dest",
"value": "empty"
},
{
"name": "Sec-Fetch-Mode",
"value": "cors"
},
{
"name": "Sec-Fetch-Site",
"value": "same-origin"
},
{
"name": "Authorization",
"value": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJUQlJFd19lRTNtVnZwWS1Mb2pHdlFPLXJualB0Y24td3RXd1Fla2ROM3F3In0.eyJleHAiOjE3NjE5MTEwMTAsImlhdCI6MTc2MTkwMzgxMCwiYXV0aF90aW1lIjoxNzYxOTAzODEwLCJqdGkiOiJiY2IxYzYzNS0zOWQzLTQwMDgtYWYwMy05YzMyOWY2MjJlMjYiLCJpc3MiOiJodHRwczovL2Ftc3VpdGUuc3dsLXVuc2VyLXN0YWR0d2Vyay5kZS9rZXljbG9hay9hdXRoL3JlYWxtcy9tYWluIiwiYXVkIjpbInJlYWxtLW1hbmFnZW1lbnQiLCJhY2NvdW50Il0sInN1YiI6IjUxNGJkNzFlLWY4ZjUtNDZkZS1hZjNkLWI5ZjQ0NmFkNTVmZSIsInR5cCI6IkJlYXJlciIsImF6cCI6InByaW1lLXVpIiwibm9uY2UiOiJNRlp0V0VGUFp6WmFhVkUwVVRSMVdVMUxRbW80TmxKLU9IcDFkMjVKTVZOR05WSlJWbVZsUkZWemVtVlQiLCJzZXNzaW9uX3N0YXRlIjoiYzg0MjY5OTctMTIyNy00Y2I3LWJiMTAtMDNiMWU5ZTMyOTE1IiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm91dGFnZS1mdWxsLXByb2Nlc3NvciIsIm91dGFnZSIsImludGVybmFsIiwiYmFzZWRhdGEtZWRpdG9yIiwiaGlzdG9yeS1yZWFkIiwiR0FDX0FNU1VJVEUiLCJkYXNoYm9hcmQtZWRpdG9yIiwiZGVmYXVsdC1yb2xlcy1tYWluIiwicHJvamVjdF91c2VyIiwib3V0YWdlLWVkaXRvciIsInVzZXJtYW5hZ2VyIiwiYmFzZWRhdGEiLCJhZG1pbmlzdHJhdG9yIiwiYW1zX2JhY2tlbmQiLCJoY19jdXN0b21lciIsIndvcmtmb3JjZV91c2VyIiwib2ZmbGluZV9hY2Nlc3MiLCJpcF9pbnN0YWxsZXIiLCJtYWludGVuYW5jZV91c2VyIiwiYmFzZWRhdGFfYXNzZXRfZWRpdG9yIiwidW1hX2F1dGhvcml6YXRpb24iLCJhbWNvcmUiXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZWFsbS1tYW5hZ2VtZW50Ijp7InJvbGVzIjpbInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtYXV0aG9yaXphdGlvbiIsInF1ZXJ5LWNsaWVudHMiLCJxdWVyeS1ncm91cHMiLCJxdWVyeS11c2VycyJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCIsInNpZCI6ImM4NDI2OTk3LTEyMjctNGNiNy1iYjEwLTAzYjFlOWUzMjkxNSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJuYW1lIjoiQU0gU3VpdGUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhbXN1aXRlIiwiZ2l2ZW5fbmFtZSI6IkFNIiwibG9jYWxlIjoiZGUiLCJmYW1pbHlfbmFtZSI6IlN1aXRlIiwiYnJhbmNoIjpbIkdBUyIsIlBPV0VSIiwiRFJJTktJTkdfV0FURVIiLCJDT01NT04iLCJPVEhFUiIsIklORk9STUFUSU9OX1RFQ0hOT0xPR0lFIiwiRlRUSCJdLCJlbWFpbCI6Im1hcnRpbi5zY2hpY2tiaWNobGVyQHNhZy5ldSJ9.SXDTRSJ2Xs5EWVvq_R6v61075UaYkI4BqjOO2Ybko-H3ENX8tRoQdYMv5R5ojzUsM8wySv9QPW4y_TeDVIObIaaIUHnQ37V6U8d87iKggkdYicmqpTGe7uoo9Ih25OoxTCMWa0-zo2Tm0O3UCT_9giViyC-sqejYiaN6XMOjMszrrI5FIbZOtgmRbvKF63FfWdEE_wqScVZzrnB7q-9-oGDW2tseZsXToC1NOcyEW9QOvNBN77qgEoPAuYtBGFGjVpZwiwPK0YZiyxTsZ7AptQEW4hCWJdTh0cfgyaCkTYZIryNiloNxkZJdGri8Y9Q1KvN2nKiGhTzFzMbEQJhSLw"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Cookie",
"value": "connect.sid=s%3AlmeYyQPSBWyr17D16nH4EzAngrUHc-zG.fY6QyExuQa02t3L96%2FdH3SoPafiTss7wrzZNmfBt7hk"
},
{
"name": "Pragma",
"value": "no-cache"
},
{
"name": "Cache-Control",
"value": "no-cache"
}
],
"cookies": [
{
"name": "connect.sid",
"value": "s:lmeYyQPSBWyr17D16nH4EzAngrUHc-zG.fY6QyExuQa02t3L96/dH3SoPafiTss7wrzZNmfBt7hk"
}
],
"queryString": [
{
"name": "REQUEST",
"value": "GetMap"
},
{
"name": "SERVICE",
"value": "WMS"
}
],
"headersSize": 3097,
"postData": {
"mimeType": "text/xml;charset=UTF-8",
"params": [],
"text": "<SERVICE>WMS</SERVICE><VERSION>1.3.0</VERSION><REQUEST>GetMap</REQUEST><FORMAT>image/png; mode=32bit</FORMAT><TRANSPARENT>TRUE</TRANSPARENT><LAYERS>EB__GRUNDKARTE_ALKIS_NRW__SQD__FLURSTUECKSLINIE,EB__GRUNDKARTE_ALKIS_NRW__SQD__GEBAEUDE,EB__GRUNDKARTE_ALKIS_NRW__SQD__GEBAEUDELINIE,EB__GRUNDKARTE_ALKIS_NDS__SQD__FLURSTUECKSLINIE,EB__GRUNDKARTE_ALKIS_NDS__SQD__GEBAEUDE,EB__GRUNDKARTE_ALKIS_NDS__SQD__GEBAEUDELINIE,EB__KATASTER_EIGEN_SWL__SQD__BAUSTELLENSCHILDER,EB__KATASTER_EIGEN_SWL__SQD__FBK_UND_GRENZSTEIN,EB__KATASTER_EIGEN_SWL__SQD__GEBAEUDE,EB__KATASTER_EIGEN_SWL__SQD__KATASTER,EB__KATASTER_EIGEN_SWL__SQD__KATASTER_ATRIOS,EB__KATASTER_EIGEN_SWL__SQD__SQDREST</LAYERS><STYLES>CopyRef,CopyRef,CopyRef,CopyRef,CopyRef,CopyRef,Hide;Gebaeude_historisch,Hide;Gebaeude_historisch,Hide;Gebaeude_historisch,Hide;Gebaeude_historisch,Hide;Gebaeude_historisch,Hide;Gebaeude_historisch</STYLES><CRS>EPSG:4647</CRS><WIDTH>528</WIDTH><HEIGHT>459</HEIGHT><BBOX>32419299.28992608,5786546.139933949,32419373.21007392,5786610.40006247</BBOX>"
}
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Server",
"value": "nginx"
},
{
"name": "Date",
"value": "Fri, 31 Oct 2025 09:44:04 GMT"
},
{
"name": "Content-Type",
"value": "image/png; mode=32bit"
},
{
"name": "Content-Length",
"value": "26894"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Strict-Transport-Security",
"value": "max-age=31968000; includeSubDomains"
},
{
"name": "Access-Control-Allow-Origin",
"value": "*"
},
{
"name": "Access-Control-Max-Age",
"value": "600"
},
{
"name": "Access-Control-Allow-Methods",
"value": "GET, POST, OPTIONS, PUT, DELETE, HEAD, PATCH"
},
{
"name": "Access-Control-Allow-Credentials",
"value": "true"
},
{
"name": "Access-Control-Allow-Headers",
"value": "*"
},
{
"name": "Access-Control-Expose-Headers",
"value": "Content-Length,Content-Range"
}
],
"cookies": [],
"content": {
"mimeType": "image/png",
"size": 26894,
"encoding": "base64",
"text": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAHLCAYAAACZEaH4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAGijSURBVHhe7b0LeFXlnfY9L0FIQg47+5DsnEjAEBCCgEVBhBIkSDgpTaNiiYqIikWUggxqgUIRh5EiLYPaaaf28Dn1m2nHb3zrVb/61rYzTmecq/P2be3BWscDykFRxLNI8dvffSfPpiEsQvbOXnuv9az7d133lb12drLXc/z/13P4P39hK1/4wheWm5deJ3TmmWe+8Ld/+7cvSlJ/9Td/8zcvRSKRl0zd8iVou/VQq7kUGQD5ucy89BSxWOz3Dz/8Ty8/+eS/vphpXXfddb/GV9zU9U1C9BE0lii0yFx6GjSgL65YseIYOv+EJPVXixcvTlRVVW0w1cu3oP22QyFzKfoB8rEJmmwuvUTzvHnzDsLYJ9wQHOk/4jvyu75KiD6CxtIBFZlLLzMQnT1HHxyNgSSlqurq6jdQr3zfaaL9DoT8MoroaZCPnhx9qKys/PlDDz3kaPz7q82bNx8+44wz7jRfJUTfQYPxxbBVcXFxx6JFiz5wMgSSlKpWrFiRqKmp+Y6pXr4H7XgUNNVcijRA/sWh+ebSS4w/77zzXnMy/plQXV0dRx+iXV8lRB9BYymCOsylp4nH47/dvXu3ozGQpFQ1YsSIt1mtumqXHaAtL4E0DJ0mJv8GmkvPUF5e/ugDD3zD0fj3V2gLH+Xn53/NfJUQfQeNZRHkec8TFfyClpaWQz2NgCSlo/Xr13Ptw7+Z6mUNNH6QJ4fgvQ7yLZ/9obn0EvVNTU0HnIx/JjR69GiOPjR0fZUQKYAG44t5U3jgP9u+fbujMZCkVHXuued+UFhY+AlTvawCbXoiZS5FH6HzAHluLVh5efTbu3Z9xdH491ff/e7fHysqKnrMfJUQfQeNhR63H55W6s8555wDToZAklIVHdGKiopnTd2yErRrTw7FexmP9oWh2tpa13ZezJjR/Dy+Q86mSB00mFao3lx6lmg0+iCHnJ2MgSSlqjlz5vwpEoksNtXLStCufbO2yQuYvrDGXHqGUCj0pa1b7zzmZPz7q0cf/UGitLT0P8xXCZEaaDB+2H0xMBwOv7Zz587Ozn/ZsmVH0agOcjeGFlRKqYp1pry8fJ+pW1aD9t0MjTKXoheQT14cfcivqqra/7Of/dTRAeivLr20/RV8x8KurxIiRdBofLH+IS8v79NlZWXPzJw5881oNLoXb4UGDx58XSwW+92sWbMOaW2E1Fd1dHR8XFlZubmrZtmPRw2jp0AejYc8N4xfUlJy++c+97kjTsa/v3riiR8n8GD2G/NVQqQGGsxUNhxz6QsGDBhwVX5+/gnDsnAuZkcikafOPffcVzdv3uxoNCQpKVsCR/UVtHHfRJnNFcgfLzpZDJq3h4beyQHor1asWHHwjDPOWGq+S4jUQKOxLeb5eDgSPxw1atQrq1evVqhr6STdfPPN3Lr5f5n6EhjQ1lsgz83vewHkCwNHee4ckcLCwmuuvfaad5yMf3/FKZGKivL/xtcoXohIDzQaW8PexkOh0Ffj8fjepUuXHr3//vsdjYnkfbW1tSXuuecex9+lo8bGxrdYP7qqSbCwuL33C+SLJ3eroP/642OP/dDRAeivtmz54nuDBg1ab75KiNRAg+Gcn+0hb4tKSko+H4vFXoAheie5CFPyh5YtW5ZAGXYeduX0+1SF+p5Ap/xkV9UIHkh/DdRiLgVAfnAbu+d2qsC4X7JgwYLDTsY/E6qrq3sBX6OD10R6oNEE6WlkYH5+/hWRSOT306ZNO7Rt2zZHAyN5S3D8EoWFhRkbgZg0adJ7tgaO6ito9wyUJMNhoPMAeS5wVEVFxa8eeeSfHY1/f7V79998VFxcrLDVIn3QaIJ65nszHIl/GzNmzGuKK+FdrV27tnP0gVMY3d/nqAQdC/6OzsX06dMTW7duPeEzTjKBo/7QWQMCDtq+dmUYkBdefJCaiHp9yMn4Z0Jjx459Ed+h9TAiPdBoGqCgD2U2lJWVfa+urm7/jTfeqAWXHhMcvE4nobtzQGeC79Fx4O+7OxJ0LLr/fU/Nnz//I9sDR/UVtH2d2AmQB/Mhz62HQb3+9wcffNDR+PdXPAoc/d4PzFcJkTpoNMsgrb7tIl5aWvrleDz+igJTeUN0GlAunaMLPd+bOHHiCVMaHKmgA8HfnWokIkiBo/oK2r8nz3zIJuwHzUsv0TBhwvjXnYx/JjR9+idfwnf4auu+8BhoOFqNfTL5xcXFnwuHwy+0tra+q8BUuRMXTaI8Oh2D5C6M5JSGk5OwYcOGkxyO7rrqqqsCFTiqL6AP4ImdgQ1zjbRzEbnnDGlZWdn/+upX73c0/v0V11REo1HrTp8VWQSNRkFlTgOjXkYikV9PmjTpdQWmyo3oKCSnMehIzJkzp/O102cpfpZy+l1NTc3r+FuNuPXAGNFAHqKEdHtyHQgeYL46fPiwA3feueWokxPQH11++WUH8BXahSPSBw3Hk6uOPcpENOh/GTly5IE1a9Y4GifJXXHkIelIUBxtcPrcqRyIVatWBTJwVF8x/UGgTuxEehk4ar659CJF0Wh0Q319/Z7bblt3NBPnYDCaZSwW+735/0KkBxpOUHdf9AcuuPxOPB5/VYGpciM6EnV1dY5bOleuXNnpXDgtpBw1atRh/E4rzk8B+gNPxkFwE6TXL7tQ8rscibrnbrnllg/6E9J6+fLl75xxxhlXm/8rROqg4eh43/4RKi4u3hoOhw/Mnz//w57GSsqekg4FhXLp/NnzM5x+qqio+HlX0YlTgT5hMhSIEzuRTj86TANDodBnKysrX6IjkKojwRGMmpqqP/L/dP07IdIADYcrr6PmUqQPI1y+3tNgSdkTF1dyGycdh+RCy56fOf/8898rKCiYZMpM9AL6hSXmpdUwnZBv18MUFRVdWl1d/WxHR8e7fQ1zvXnzpg95qqf5F0KkBxqOdl9kAJ4Ies4557ynqQzvaseOHdy6yacu0QfQN4SghebSSpA+7jyxIogWHIm2mpqa/93e3v7m6SJWci0F/6TrL4VIAzQcDt0pAl1mCIEN8XicZ2y8pzM2vKeLL75YgaNSBP2D1Sd2Im2eDBzVHwYPHjyzsrLyl/PmzTv48MP/dJLz8JWvfPlYOBy+z3xciPRAw2mF6s2lyAwDCwoKLo3FYk/zjI277rrL0ZhJ2RVHhkzgKM35psimTZuuMS+tA/2fzSOw4+FI/JwhsBltMulATJgwgaMPgTx9VmQQNB7tvnCXyXAk/mX06NGvrlu3ztGwSdnR0qVLj6EsvmjKRaQA+gkrj3hGuiZCQYjA2FRVVfXolCnnv8pYKhUVFf+PeV+I9EDD4dyf1j9kh/poNPrg0KFD9y5btkxbPnOgmpqagygHzfmmCPoIHvdtZZA5pCto07fcev4T/BzTdSlEmqDxTIWazKXIDp3rJMrLy1/SOonsiQG/8NT1oCkDkQLoI1ZB1k37IE10jFrNpRAiFdB4NH2ROwbm5+dfEYvFfjtt2rTDWifhrs4666xDyHMFjkoR9BFcZG3lKCXSpcXjQqSLrR2DD5kajUZ/PmbMmNe0TiLz2rJlCxdP6rCgNKCRhULm0hqQJgbP09k/QqQDGg8PzAn82f8eo4HrJOrq6vbdeOONx7ROIjOaOnXq2woclR7oI1aZl1aBdPGsDx2kJkQ6oPFo9MG7hEpLSzfjqXlPW1vbB7t27XI0jNLpxTUmsVjsWZOvIgXQRyyEGsylNSBN1gSOEiInoAFp/YP34TqJK8Ph8B+bm5sPb9u2zdFISqfWwoULP1DgqPSwtY9AuqwLHCVE1kDjaYB0/ru/aE6uk7jjjjscjaV0ojgFFI/HX0HeKXBUiqB/4BRns7m0CqRLo69CpAsbEKRO1Z80hMPhh2pra1/VOonetWzZMgWOShP0D7aOPvCE0SAEjhLCHehAmJfCvzCexF+Vl5fv1ToJZ8HJeg35pMBRKYL+IQ5ZeYCW+j4h+oHpHNrNpfA/AwsLC5dFIpHntE7iz1q7dq0CR6UJjSxkY+CoekiBo4RIFzQgbl/SU5mF5OXlzYYj8dSYMWMOBn2dhAkcpUPiUgR9AwNHLTGXVoF0aeeFEP0BjUi7L+xnFByJ7wd1nYQCR6UP+odFkI2Bo0KQRl6FSBc0IEZf6zCXwn6ioVDo7qCtk/jkJz/5dn5+/gUmD0QKoH+w8imd/R6kwFFCpAsaEJ8uouZSBIf8goKCG8Lh8PPNzc1v2bxOQoGj0gd9QwukwFFCiJNBI9IK5ICTl5c3D47EfzU1Nb1h4zoJjrQgfVeb5IoUsLV/QLoYUVOBo4S3MRXVkwu3cF9cHCUvXCRpgqF9hFsdbVknocBR6YO+oQmy8mwcpEsPTsL7oKJyqIyBSjhVQLVDnnAocB8M36rjjEVP4qWlpV8uLy/f5/d1Etdff70CR6UJ+gZb1z5MhZrMpRD+ARU36VDQkeDoRM5isON7tftC9EZ+cXHxzWVlZS91XycxbNiwN6uqql78zGc+8/7u3btPMtpeUl1d3X6kw7odBG6DviHK/slcWgXSpdEHYQeozJxGaIaSIxRZmZvDd9CRUUMSfSIvL+8SOBL/p7Gx8c1wOPwrvDUQzsUSPN3/rqWl5Y3t27c7GvBcat26dVw8+d2uFIhUQN+whH2EubQGpEln/gh7QeVOOhTJEYpWKONPUPifGsYT6XAeNLnr5XEmw1D/S1NT0z4abSdjngsxeBbuTYGjUgT9AvsgK7d2I11a8yWCg2nMdCKSIxSc8ui3Q4H/oekLkWlqIpHI39XW1r68dOnSo7lchHnXXXcxcNST5r5ECqBv4MOLAkcJYRtoAAz8xL3ZHJ2g+DrlMNT4G01fCLfg2onPRaPR5+fOnfv2jh07HI28m5o2bdphBY5KD/QNtoat5rSMAkcJkYTOA8RRieQIBUcrenUo8Hue62/l9izhLRhjAo7Ef37iE594bf369Y7GPtPirpHy8vJnzC2IFGC/AClwlBBBBI2Ew3R0IpIjFFxPcYLXjWuNPohsw7M4/oG7ItyOMcGtp8XFxQrPnga29g1IF6dlFHFXiFRAo6FDQUciOUJBh+Jm82shsk2otLR0cywWe3nhwoXvMcy0kxOQruiYVFZWvoTvUeCoFDH9hJVxYZAuPTQJ0V/QkOJf/OIXl+EnnQl65TrGW+SCgfn5+VdEo9HfnH/++a9v3rzZ0SFIVRzdiEQim8x3iD6CfqAGsjXuAx+aRplLIUQmoPMAdV8/oSE+kQsmwpH48fDhww+sXLnymJNj0FcpcFR6oO1b+4SOtGntgxBugkbG7aLc0UFHgsfcKsS1yDbxcDh8L0Not7e3pxxCmweBKXBU6qCt2zx1ocBRQmQTNDiuWE4Gs+LWJ+tWZQtP0xlCOxKJPNfc3HyYMR2cHIaeGjt27Gv4W9XVFEDbroesnLogSJtGH4TIJWiEybM76EyMN28LkQ1aotHozxsbGw+uWbPG0XGgeE4HP2f+RvQRtOdbzUvrQNq4gHyRuRRC5Bo0SB7xm5zmUCwJkS0aysrKvlNZWbl/8eLFR3se4sWRivz8/Onms6IPmDZs7VQl0sbF4l4NHHX2oEGD/hI/FdhKBBM0Ts4vcmSCHRHXT2jrnHCbUElJyecjkcjhpPNAZyIWiz1rfi/6ANoqpy6sDeuMtHFNl2enL0pLS//nvHnzPorH46/AMd6Ct7TwVwQXNNbObWAQnQnu7JBnLdxi/JQpUw4mHQguuOTJoOZ3og+gfVo7dUGQPo6SetUox4cPH/5ysv5y6/GwYcP2RKPRB/m7ro8IEVDYcKFk8CrFmhAZZciQIU9ec801x7d7VlRUvIy3NfrVR9Aerd9lhfR5efThvlWrVp20XZkn2TY2Nu6PRCKP4WM6KVkIOg9Q99NEFWtC9JdQcXHx1lgs9sqkSZM+NEPAog+g/XHqotVcWgnSx+lUr+7GKeK0RU/nobu2bNmSmDhx4hvRaPQ/8vLyZpq/EyLYoFFzXpLbQ5OLMBVrQvSHgYMGDVqFn5o/7iNoc9Yf4480enb0oaio6PYlS5Z86OQ49NT27dsTLS0th+BI/KGgoOBS/LlG2YQgaOSMNcGT/xRrQogsgDZm/Qgg0jcKajaXXmNgJBJ5MdWD5BhQra2t7b1YLPZiaWkp165ofZkQ3UGjnwgp1oQQLoA2Zf3UBUEaPRuSe/DgwdfAEXjHyUnoi+h4LFmy5Gh1dfWLcER24V9q5E2InqAT4FNEcppDsSaE6AdoQxztC8LURRTy7NbUsrKyZ1INz34q8cwYnvtidm7Ud32DEOIE0CF07leHFGtCiDRAm+GonvWLl5HG5R7uH1pmzJjxhpMz0B+tX78+MWbMmNdisdgT+A6N3ApxKtA5xCFuD2WHqFgTQpwGtBGO5s03l9bCvgDybCyQSCTyFBdFOjkBmRB3bjA2Cr7nl3l5ebPN1wohnEBnkYw1wZEJxZoQogdoE5y6sDpgVBLTD3h1TcD4cePGHXAy/JnWjh07ErNnz36bkVlNcDWN2ArRG3QeIMaaYCeiWBNCALSDQExdEKTTs4sny8rKfrB582ZHg++WGN6dEVrj8fgLoVBoA25Do7VCnA50JMlYE3QmKMWaEIED9T4QUxcE6fRy4Kh4Y2Njr4Gj3BR3bixbtuxoZWXlPrNzQ6GyhegL6FSSsSY4KqFYEyIQmHrv2SfyTOPltOLp/5urV68+KWx1LsTj8BsaGrhz42HcmvpCIVIBHQ1jTSSdCa1YFlZi6nggYgQgnU2QV7d6h/Dkf/zQLK+IOzcmTJhAR+LnuMeJXbcqhOgz6HSSsSboTFxk3hbC15h63WIurQdp9ezoQ0lJyReWL19+1MmIe0Hbtm1LTJs2jaGyf1VUVNRmblsIkQrohBqg5AJMBWURvgR1N2hTF53bus2l1xgIw7wn1bDVudDOnTsTc+fOfbe8vPyPcHo+y3vvSoIQIiXQIXHNBEcltDVU+ArU18BMXRCkdRnkSWM3ePDg69rb2992MtheFXdufOYzn3kfjsRes3NDobKFSAd0TNzNwWBVHJngFlF55cKzoH6OZz01l9aDtHo6cFQ0Gv0DDbKTofaDbrzxxmNDhw7dG4lE/g7J0c4NIdIFHRVj7PPpjs6EFl8KT4E6yakLHmseGExb9OQTcl5e3rxZs2YdcjLMftPatWsTo0aNegWOxGNI2qiuFAoh0gKdFld9J9dLKMaEyDmohxzKD9RwM9Lr5cBRv3AzbHUuxEBYEyZMeL28vPzJ/Pz86SapQoh0QSfGgFVcL8GQ2or0JrIO6l2gpi4I0wt5NY7B+EmTJmUlbHUuRMeoubn5cCwW+21BQcGlJs1CiHRBZ8ZQ2slzOQKzhU7kFtQ1rgNYbS4DA9Ls2aPJI5HID3mwlZPxtUncudHW1vYO0vtScXHxzUi6HqCE6C/o3GogOhKU5gyFK6BuceTheihoUxdMt1cDR9U3NjbuczK4torbVK+88sqjVVVVe8Lh8F8jD7RzQ4hMgI4uGfmS0gFfot+gHnHU4SbIq0bUVZBuL699+Pa6descDS11zz33JOrq6ng2Redrp8/4WStWrDhWX1+/NxqNPojs0PowITIBOj2uku++JVTDfSJlUG/okHLBZCDjkyDdDBzl1QPCQrW1tb0emrV169ZEYWFhAp/t/NnW1malI3HHHXdw58Zr5eXlP0RatWtNiEyBDjAEMUgVnYnJ5m0hTgnqCdfYcNQh0OcWIP3LIU/GYykuLt7al7DVdBrw8RMciTlz5nQ6F8nP9Lz2q7gWZNKkSa/HYrFf5OXlzezMKCFEZkBnmAyhTSmEtjgJ1AtGRuWoQ6BHrZh+yKuBo/LxtP2SkxF1Eqcxpk+fnli5cmVizJgxnY4ExfeSDganOZz+1o/izg3GxYhEIs/l5+dfgfQpKJ8QmcQYCjoSCqEtWB84UsVRBw0BA+QD24YnF+gxbDVDQDsZTydt2LCh00lgkCZe82d3R6L772wSI3PCQfogHo8/HwqF7kA6NZUrRCZBJ8knreNbQiF56wHDlLtnz3nIBcgLz27djMViz6YatpojDfi7E9ZALF68+AQngk6FjY4Ed24sXbr0KI86j0Qiu5DWCkgIkUnQaSZDaDNYlZ5ELceUN0cdtP23G8gPLkD25BRfXl7eJXPmzDnsZCh7Ex0HOhBc75B8jw4D3+P6B05nJBdadv872zRr1qyPzjjjjL8y2SmEcAN0oN1DaOtwG8tAmdJI0lHUqEMPkCdeDhz1vxlUyck4nk4cXcC/6PyZfM1RiOTv6WTYuEujuzgKgXRrKkOIbEADAzGEdnK9hBqfj0H5MfAYRx20iNYB5AsDR3l1t9LEKVOmHHQyjH0VRxo46sDRB4442O4wdNeqVauOhcPhe01eCiGyCTpWbu+jE8FRiWbztvAJpuw6zKVwAPnj2dGHsrKyJ+666y5H49hX0WFIbum0fbqipxoaGvYj3RpNFSLXoKPlkyyHwDky4dWDhgQwZcWYBorW1wvIHwaOWmguvUZDU1NTRsJWc1fGxIkTAzX6sH79+kQ4HH7E5KU4FWgAXFGtYWaRNVDfGLEwuV5CIbQ9hCmXdnMpegH55NnAUQzXTCPoZByl02v8+PGvIhu1WPh0sAOH2JFTHLLUYSMiK6Cucb0EQ2fTaCmEdg5B3tdDXOugIds+gHzi9JxXA0f9RWFh4atr1qxxNI5S72JgKThgPzdZKfoKGgT3+CfPRKBDoSFMkRVQ1+jIJtdLKIR2lkBe04nj1JJXz3DwJCbPvBxQLc5RiKFDh+698cYbjzkZSslZzc3Nh5F/WrPVH0zHkow+SGmfv8gKqGsMoZ1cLyEn1iWQt6MgjjpoGikFkF/sGz176mYPQuCv4vH4KzzWmkGSnIym1CVueQ2Hw8+avBOZAg2G+/yTnboiEIqsgHrWfUuoQmhnALZdiJEkW8xbIgWQbxyl9Ztjm19cXHxzLBZ7sa2t7Z1UI1MGRcyb/Pz8K02eCTdg44HYqdOhYFhjdezCVVDHFEI7AyDfGLeAow5a65QmzD/z0pcUFBRcCkfidzxAKt0gUzaKozPRaHQPskh9S7ZAY+JiInbsGnIWWQF1jNvnOmMUQJpa6wPIJzpg3DUw1bwl0gD5xx1EVhxbPmDAgOvPPffc95yMaRC1ZMmSo0VFRbeb7BHZBg2LQ6N8OqQzQalzF67COgZ1TnF8/vOfP9O8LQzMn02bNl0D3YLXGinsJ8hDX48+dAdP2z/qb6Apm8R1IsgWtRGvwM4L4lwrnQnOZWtoSLgC6xZE55XORHJbMkfGAjMixrSaNLPNJdsdn5jV7jIA8pH5a8tulYYJEybsdzKkQRTDVodCoa+bvBFeAw2P+8zZubNT07oJ4TqsY1ByJ5FVTgXSwLTRKWd7SjoLjKWhtQ0ugbzl2hErnDEFmjpRw4cPV9hqv4BGmNzzz46PnbrWTYisgLrmS6cC95ecqkk6C7xvhQTPEsjrEPPdXPqd+KhRo15xMqRBFB2psrKyH5i8EX4CjZKLu/jklBx2bTK/EiIroM71dCqSo2Q5cSr4veb7k22C96OpiBxiysCKUdNIJLJr9erVCi5lNG7cuAPIFq3XswE0UnbkbKydK8YhdZoi66De8Ymz+4JgKuNOBf6fpiI8DsrCT4GjTkdRXV3dHidDGkQxbHVZWdkvTN4Im0CjZUTC5FMYO2+tmxA5A/Wv304FPqupCJ+B8mEZWzE/HgqFNixfvvyokzENoqZPn34I2dLalTvCWtCAuW6CHS9HJvhTC15EzkE9PKVTYcTXSSeYv9NUhM9AedmydXNgZWXlS06GNIhiEK2ysrI/mLwRQQENmsO+3TtmPcEJz4D6GNq4cePaTZs2XcHX5m3hQ1B+kyEr5sdLSko+29HR8b6TMQ2iGLZ68ODB15nsEUEEjZvzk5xD5hYrOhOKtCdyDuphh3kpfAz7FfPS95SXl/9Rh2l1ifkQCoX2Ils0Gij+DBo8D/3iNAfFUYp88yshsgLqHGOeyJH1OaYcrQgcxfMv+MTtZEyDqCVLlnyIPNlkskeIk0Hj5xw05505OrEU0iJM4TqoZxp9sAD2G+al74lGo7/RCZx/Vnl5+T5ki6YXRd9AZ8BFmElngoveNHQlMg7qFeOaLDKXwqegDK0JHJWXlzeTJ286GdIgimGri4qKvmGyR4jUQMfA7aHJaQ4FrhIZA/WJ2zI1beZzUIZcT2VFOUYikad27NjhaEyDqGHDhnH0ob4rd4ToB+gkui/AjJq3hUgL1CFNX/gclCEXZtsyfTF+ypQpB50MaRC1du3aRGFh4VMmb4TIDOgwOPTM8zk4KsGfeooUKYE6w8iperLxOShDawJHRSKRx3Vk95+1bdu2xPjx4w8hX57Oy8v7tMkmITIHOo/u6yW0ml70CdQVjT5YANu9eel3eGT3XidDGnQxhHVzc/NbcCSeM7EgtCZOZB50Jt23hSpglXAEdSMOtZhL4VNQhhxFsiJwVDgcfkhHdvcuRqO8+OKL34Mj8UpRUdHtyDaNPAt3oIGAuFaCobS1XkIcB/XBlqOeAw3K0ZbRh3hjY6OO7O6juMX1iiuuOBqLxfaXlJTcg/zTFk/hDuhkGEo7uV5iPqThrwDD8oe0ddPnoAy5O8uKg5XC4fC9OrI7dTFC5fXXX3+svLz8YFlZ2XeQlTk50l8EBHQ4yWBVdCYmmrdFgEC504nUE4vPQRnaMvoQqq2tfdnJQEp916pVqxJDhw49GIlEfog81XZ/4S7ogHhUMx0JTnPIcw0IKGtNX/gclKE1gaN0ZHdmxXUkI0eOfD0ajf4c2atF9cJd0BFxSLsVoiPBwEIKoW0pKFs6jXo68TmmrdqwgC6/vLx8j5MhlPqnLVu2JCZOnPiGtoCKrEHnAeKiS3ZQdCq0XsIiWLbmpfApbJOQFdMXOrLbfWkLqMgJ6KSS6yXoTFixVSzIoAwZL8SK0xqDDMqQC6KtCBwVDodf0JHd2VH3LaA62VNkFXRYEyE6EhydsKLzChooN05P6enD56AMV5mXvgZPw8vnzp37rpOxk9zTbbfdligqKvqJKQYhsgcNEMRV/HQmFELbJ5hy09ZNn4My5Fk4VowGFhYWzgmHw7+ZNGnSIc7XOxk7KfMaPXr0fmS/RpRFbkFHxpXgHJHgNEezeVt4EJQPg4pp5MjnoAyXm5c2MT4Wi/3LWWeddXDdunWORk/KjHjOSElJyb+bfBfCG6BjY1AbjkrQmVAIbY+BMtHiSZ9j2pgVgaNOQQMcie/W19cfuPHGGxVUygXxpFPksx72hHdBJ8f4/HQkFELbA6AMRkGTzaXwKShDWwJHnY5oJBLZFY/H91555ZVHGbbZyRhKqYmLKEtKSv5o8lgIb4MOj0eOc70EnQn+1HqJHMD8Ny+FT0EZcgdN0EaR8mHwbotGo3u4e4AG0MkwSn1Ta2vroQEDBlxu8lYI/2A6QO4CoDOhp+EsgbxmXA9t3fQ5KENODwbVAR9YUFBwKRyJP0ybNu0w4xo4GUjp1OIoTjgcfp552ZWlQvgUdIQcUqcjQdWbt4ULIH/ptGnkx8ew/CAbF0+mTF5e3kw4Ev8xYcKE13X0d9+1aNGiDwYNGvQ5k41C2AE6Rm5L41oJhdB2AeateSl8imkb2kFzIk2RSOSxxsbG/WvWrHE0mlKXGKiL00DIMz1I2EZRUdEXwuHwE2ecccZSXI7qejd4oIPkU9ZCiKMS3HKoobZ+gjykc6ZD0nwOyjAoiyfTIQ5H4ptVVVUHeKy1olqeLB5UBjvzJZNfwiZQ8X/x3e/+fWLjxg1HL7xwxr7a2trn4/H4T4YMGbIGvw5ksA90mHEouV5CAU/ShPlnXgqfgjKkM63Dz05PiKd6lpeX721ra/tAOzf+LO5mYf50ZZOwivr6+n1PPvmvie567LEfJrZuvfPY3Llz9tfV1b1UWVn585KSkg34OBcfBurJnJ0nDSFEh0JP032EeQVpv7fPQRlq9CE1BvKALjgSf2xtbX13x44djkY1KFq9evUxOFbfNHkjLGP8ggULDvV0IHrq8cd/lPjSl7YnPvWpT73a2Nj4EkctUCk4JEUDEYh5LXSkDMXMIXk6E5zq0HxeLzCfzEvhU1CGXGxsc+AoV8nLy7skEok8PWXKlDeCGiob9mIfskKB/WwElfvWu+7a6ug09KYnnvhxYteurySuvLLj8JgxY/ZUVlY+HY9XfA3/kp2N9QsR0alya+LCTZs23YCf2sXRA+QJ15Po3AufgzL8KqTOv/90hspGX/naHXfc4WhobdTmzZsTpaWlPzJ5IGyjurr6SU5XODkJqehnP/tp4qtfvZ+LZd4ZP378K5WV8efi8fiD+IqFkNVzX+hgORrBPfLawWFAXjBol/LDx6D8uA6Ih9VZcfKmRzgeKnvFihXWh8oeN27cAaRZa8hs5cwzz3zRySHIhB544BuJW2655YNzzz13f1VV1fPQw4WFhVfia61bR4BOlk/cnaeDmrcCDfJB0xc+B2V4E8RpO64B0lqWzNIZKruysvJlhsq2cecGg22VlZX9wqRXWMioefPmHXQy/m7ooYceStx227qjU6dOPVBTU/1iTU3N4yUlJTfwPrpux/+go+VTGzveqeatwIG0T4YCux3YBlB+POX2uBOI153OhLkUmeN4qOy2tjarQmXPmDGDh2a1dCVTWEdpaenn0ln/kCk98sg/J77whY3HWlpaXq2vr9/D6RTc01rcmu+HvNDZToSWQ4HbtYE0K3CUzzF19/giYbzuDANvLkXmOR4qu7m52fehsukIlZWVPWPSJmyEBptG3Mm450Jci0GHZv78+W8MHz78lZqamqfM1lHfgk43GZgqKDtVOAKjVfs+hnUVWmYuj4P3WI+1l99lGCq7vLz83xgqG/ntaKC9rra2tncGDBiw2CRJ2MjQoUNfcTLkXtHDD/8TD1/5pbld32I65M6tn+Yta0EaGStDQ90+xtTVkxwFliuk8zCyxyiGyh41atQrfgqVzfUc6LdfwP2rH7CY+lmzZr3uZLi9ojvv3HJ0yJAht5j79T3ofPl0zqFhK08CNQZGw9w+xpThKQNH4XetkLZ1ZheGyv676urqfQwJ7fUFlx0dHe8XFRXdbu5d2EgoFPrspk1fcDTcXtGsWS0Mf2rdYjx0wFauj0B6uHUzai6FD0H5nfbQLPxekSlzQ2eo7IqKipd5sqVXQ2VXVla+hHtVkD2b4Q4IL61/cBJ3apjbtRJ0xFatj0A6tHjS56AMTztFgc9wW2dgdxl5gGSo7GcYKttLOzcY20KHZgWAYcOGPe9ktL0iOjfwtH9obtda6DxAvl8fYYzKRHMpfAjKjyNIfZqewOc4gqY57hyTl5c3z4TKPuiFUNlDhw7lqLFGIS2nnlsnnQy3V7Ru3V8eMceLBwJ0xsn1Eb40wrhvBY7yOSjDPk9N4LPc1qmgad5hfHl5+U/Gjh376vr1608w6tdee23ntsru77khfm8oFPquuR9hKwzexPgLTobbK7rggin0ZAN3xgQdCIgRLXudh/YSuFcGHZpvLoUPQfnxkLiU4q/g8x0se3MpvEFDNBp9kKGyV65ceWzXrl2J4uLil4uKip51e5TirLPO0qFZQYDrH773vX90NNxeUW1t7R/M7QYSGmTTQXt+fQTuUVs3fQ7KL+XtmSxz6KR4EcIThBgqOxQKvTZ48ODkyFIzHh7/ffTo0ft7jlL0V3RMysrKnjDfI2zG6+sfHnzwwUR5efn3zO0GFnTOXB9BJ8LTT/e4P01f+BiU33gorbMu8HctkJ46/cX40tLSR/AguZ+jFE4OQaqaPHnya/y/Xf9e2Ez8k5/8ZNbOv0hHPIAL96l4AgZ00FwfwWkNz62PMAbEN9Mt4mRQfv3alom/V3Apf1IzZMiQr8fj8VeuvPLKI+nGl9ixYwdHH3wf8E/0AXieS267bd3HTobbK5owYcIe3KrmVntABwLy1PoI3ItGH3wMyq8B6tcIF/5e2zr9TaigoGBTKBTayxDUqS64nDVr1iHuBjH/S9hMTU3NI15f/1BRUfGsuV3hADt8KOfrI/D99TIc/gbll5HRA/wfndbpf/IHDx58XUlJyfMXXnjhm3050IvBrHgAmPl7YTv19XXPORltr+iBB76RiMcrvmZuV5wCdNad6yM2b9483byVdfj95qXwISg/To1lZCtmJv+X8AQLOS0xYcKEg+hjHJ0Hqr29/W04HdeYvxGWE586deoBJ8PtFV177bVv4j51mmMfQafNswmyfrYGvpMOjNap+BiUX0aDQeF/6bRO+5hcWlr6ZGNj476eB3pxzUQ8Hn8en9HIUxAoKCj47K23rjnqZLi9olGjRr2MWy3qumPRF9BpZ92JwPe1Q4p371No6KGMjiCxPkDa1mknDXAkHqqqqjqQPNBr2bJlR0tKSj5vfi+ywEVQzry1wsLCPw4ZMuQoKsJHTU1NR1euXJl47LEfOhryXOhnP/tpAhX0V+Z2RQqg486qE5Fp4yOyCw09lHEHEP+zz+GwhS+J86yLcDh8AHbkAK71EJEN8vLyZtfV1R2KRqO/wWVOVtEn1z/QaVi37i8T55xzzoelpSUfFRcXHx05cuQReJSdZ1D0NOzZ0q5dX2EoVB3EkibouHk4l+tbPfEdU2Uk/AvKrvP8FXOZcfC/dVqn/dBx0ALqLNFQWVm5n2FF0bg4b/RKYWHhOPO7bHHK+A9PPPHjBI/2Pv/884/AgH+EeztaX19/pKNjceL73//eSZ93S4sWLXod95lWQBvRBeoXo0K6egQ6/r9GH3wMys/VtQr43wxMJeMiRAYoCofDz27btu344hNujxk2bNjrpaWlWVu1jO9alkr8h61btyYuvHDGUdz7kaKioqPV1dVHPv3pto+/9a1vOn4+E2psbOQ58lqQ00/QebvmROD/crV9i7kUPgNll5Xw0/gObesUop8MxBP9v61bt+6kcKFchHLeeecdjkQi95jPugrPv+jP9ASDi8yZM+dP5eXlnQ4Ff86dO+fYfffd6/j5VPX44z9i+OpfmNsV/QSdtytOBP6nRh98DMqPi19dn0Lld0A3QzXmLSFEKsB5+GZHR8e7PZ2H7mpra3sPTsRj+Liri1HOPPPMF50Md7r6+te/luCIBEcmOOURDoc/4ojF3Xff7fj50+lLX9qeKCkp2WBuV2QAdN58CszYiab4X3x61dZNH4Pyy9ouCXwXj/zmokpuF+WiTU6dcJ2OnAoheqOgoGDFjBkzDjo5DT3FA03gRPwef+bWk0HDrFmzXncy3JkSpza4ZoJrJ+hQcKcH11RwbYXT53tq4cJLuKJXh7FkGNN5Z6Remc5f+/x9Csou5zskWH8gnp9CZ4Ji/eSoiBblCkHy8/Onjxgx4kAqh5Mw2pdZXPkJ828yBoz55/pqyDMlLr5csuTqxMiRIz8cPHjwkdGjR++79tpr3vnqV+/v3K7Z8/O1tbU8/0K4gOmk++1E4H/o3Asfg/LzZIwG3BedCu7sSToVlJwKEUjq4Qi8wB0XTo5Cb+I6g8bGxldLSkoyOkwM4/zzXMV74LkbyI+HcBsMDtXKMNW4fqbLobj2PToUjz76g0RlZeXPOm9WuAI64345EfhbrqxvMpfCZ6DsmlmG5tLz4F6LIDoVyakPiut6VAeFtRSFQqHf33XXXY4OQl/EUYvJkydncnFlPhyI/U7GPRvavHnT0TPOOGOpuZfudDoU1dXVD0Sj0T1DhgxZ3fW2cItNmzZtQQccNZcpgb/T4kkfQwNsXvoWpIHxK3gibfeRCjoVdG6140P4m+Li4p+uWrXqAyfHIFVdfvnl75rFlf0K6xyLxb6MezriZNyzofnz5+/HbeipwQOwk4VWQSnVKXyeQ8z9OvJZ5A6UHQ2slfFVkC7WaaaPp9MmnQq+llMh/ENRUdHOK6644i0nZyBdrV69+lg/I1eOampqyunhWdz9Ye5FeAB2qlBKTgQ+y6c8dcY+BWUXqPMpWFchOhBcR0FnIulccPRCoZeFt+Bxpueff/5+Jyegv9qyZUvn4sqCgoJJ5uv6TCwW++VDDz3kaNizperq6v8ytyM8AjpRdrC3Qqd1IsxnNX3hU1B2DZBGjwDyoQmiM5yc+qBjIadC5JTJdXV1L6ey4yJVcUHmyJEjDxQXF/d5HpORJ6+66qq3nYx6tsR7j0Qi3zS3JDwEOs2iTZs2/RV/mrccwe+55c6t7cXCZVB22jnTC8gfOlgcqUhOf1BcvNmvqWMh+kJNNBp9nrsnehr9TIsOyowZM96AQd5lvrs3QjU1Nft4xoWTYc+WJk48h2dbzOy6JeE12ElCnM445fQEfqfRB5+CsmM0yKyFy7cF5FkNxJgnHKVIjlTQkVYMFJExioqLi3+Jp7iTwlS7KUa2hBPxOL+/6zZOJhaLPfyVr3z5mJNRz5Zuv/229+Fc/Y25JeFR0Cme0onAe6OgrB0RLjILyo5P01q7kgGQj92dCjoU/CmnQqRHUVHRIzfffHNGdlykqltvvfUYnIRf4zZOCgnLIFanOnUzW+K6i4qKil/hdtR5+QB0gnQi1kMnlBeuNfrgU2jYVH7ugvxNhuqmM5FcV8HrtLZKi4BQUFCw7VOf+tSrTsY9W2Ksierq6hfhMFxgbosMrKgo/28GZnIy7NkQo0w2NDRw62bGzmAQ7oNOL27iRHQ6EfhJp2Jh5y+F70DZ8SlZiwOzDPI8Gaq7+0iFnArxZyZMmLDXyahnW1xcOXr06P2FhYWd27QikcjWNWvWvO9k2LOlSy+99K3S0lIt3PIh6OQ4Z36Tec2OTwbIh7DcILVBj4CySIbqTjoUlA4VCypu7rhIRy0tLW+UlJR8Z8SIEa86GfVsiesuysvLHzXZJHwIOjU6EQx7reFvn4Kyo4HS3LyHQfkkQ3XTqaAzwZ0g/KnzPywE5UqnniNRN/2FkxHPtc4+++yPioqK/vTd7/69o3F3W5w2qaqqeh55pe1PPmf9+vVjN23atNhcCh+BDopxOwIVOMoWjJFhXIrkSAV/5vwEVZEeKDc6iSxHPpDxTJeuEScnA+4FLVmy5OP8/Pw/bd261dHIu6mJEyceTCfYlfAmqOwaAvchKDcaHMXtsASUZfeomsnImvyp4wE8CMqFC2tZRjeZnyevfXEy3l7Rxo0bE4WFhUcvu6w9a9s4b7nllg+i0ehfmewRFoCKz6mMVnMpfALKTKMPloMyTjoVyamP5PSHnIocgHznFl+OMHCkgSMOvY/COxluL+nee+9NxGKxI01NTUedDH4m9eCDD3LLJsNVa8umZaAhaBTCR6C8uPpfw90BBWXPUN3JUYqkc6FDxVwAecoIpnQYKOZ13xecOxltL+oTn/jEh6FQ6E+PPPLPjsa/v2KkyzPPHL4XWaLVxBZiGslUcyk8DspKow/iBEwb5rRWcucHf+r8jzRAntEZo8PA6Qk66+k5Zk7G2qu69NJLPy4sLPwTw207OQH90YIFCw6XlZUtMtkiLASNRKMQPgDlNBkaby6FOCWoJxxyp1PRzsXS+Nn9HBC3ROelOUUxEm59isroaAv+H3fK0GGg45CZhyknQ+1lrV27NlFQkP+nG2644WMnRyAdbd9+97GKiorvmywRloJGQ69bhsnjoIzk6AnPgvrJWBhOBr830Sl2cix6E6dvnByYlLVx48Yb8DPzfZ+Tkfa6tm/fnigrK/to0qTz+r0uQls2gwUbk3kpPAjKh3PfzeZSCOFlnAy0X9TY2HiksrLyo8ce+6Gjc9AXjRt39huFhYWfMNkhLIfGCRplLoXHkIMnhI9wMsx+0ty5cz8qKCj407e+9U1HB6E3ffazN35QUVGxyWSFCAgyUt4E5dI5n20uhRBex8ko+00rV65M0IlYu/bWPq+LeOCBbyQqKyv/02SDCBAwUtoi6EHk2AnhM2KxWAI/GH0xsWHDBkcD7QfxRM+ioqKjc+bM+ZOTw9Bd3LJZX1+/D+lWlLuAImPlLVAejHrXbi6FEH6AjgOFl4z6mLjnnnscDbQfxKBTcAw+HDp06Ed0EpycB2r27NmHw+GwOqsAA2PVCsmB9AgoC644V5AgIfxE0vguW7as04lYvHjxSYbZb5o2bdqfSktLjzodxrV1653H4vH4g12pF0EGBmu5eSlyCMqBB/XoxFQh/EZ3w8vpjDFjxpxgjP0qp8O4Hn74nxI1NVV/RLIVuUzQcDEgjI6KzjEoA0YUVJsUwm90N7p0Hurq6jqnNPia4shE98/4STyMa8iQIUcvvbS9M17E2WePfR1J1iEtohMYLR7ko7UQOYSOA6Sw1UL4EToIjO7IqQtcdio5EpFcYDl9+nRHA+0HmcO4PopGIx/F4/H1TLMQSehA0IiZS5FlkPcaBRLCxxx3HChuiUwaXy6oTC6w9PMODaTpWGFh4e+RDiFOgM4DpDNQcgTyXutQhPArHH2g5syZ0+ko9DS+XEPA99va2k76nR+EDioRjUafQRr0lCkcQR3h+feqH1kGea6dMEL4maShpYOAy5MMcNKB8OPuDJ6ZEY/HX8H9q5MSpwRGjIfjaFtvlkGea/RBCD+TNLbJNRAcjehuhJMjE3Qkur/vde3evZsLQl8vLCwc15lQIXoBxoxrIRSHIEsgr3m0sKKBCuFnkgaX6x0YSIriaAQdCS6exEd8Ofowfvz4N0tLSz/VlUohegfGLL5p06YrzKVwGeS3Rh+E8DvdjS4XSiZ3XlB0JvzoPLS2tr4bjUa140KkxMaNG1eal8JF4DyMp8ylEMKvOBng5MJKP4a1XrJkyYeRSOT7JnlC9BkYNcWEyALIZ8V9EMIG/Lq7wkl0eqLRKE/Y1Fy2SBkYtmZI8/IuwvxlPptLV8D/59bcegdNhljG3TUf4vqXpLgzhO/zbI6e7x3/7KZNmxbjJyNoaieJCDSdax38fIgWxdM4Y7HYC0hPUVeyhEgNGALFhHAZ5G/GRh/wvxZu3LjxRvxMGvqeBr+7RkE9HYp+b93F/+AOHjomdCYoBsaSYyGCQXKhJENY+9WJ2LVrV6KqquoA0lHfmSgh0gSdvobXXYIGlYbVXKYN/kcTREfBsxEseW+QHAthNzTAyS2cXDTpNyfi/vvvT4wcOfKN/Pz86V0pEiJ90LnLgXAJ5G2/1pjg7ztHiKCJ5i3fgXuXYyHsIWmIGcKaMR+6G2c/aPLkyYcjkciNJjlC9AvToetshgzDPIXSDtaFv2XciHbIyvVNJn/kWAh/4WSU/aL29vYPotHobpMUIfoNOmt25AvNpcgQyFMuSkzZ+ONvohCnKwK5uBXplmMhvIuTYfaDeEBWJBJ53CRDiIyBjlnbOTMI8pNTDx3mss/gb7jrYb65FN1AvsixELnHyTh7XWggCTgPPF1TByCJjIP6JQcigxjD1ue2is9yxwRHLDSVlCLMM0iOhcgOTgbay+IBWeXl5Xtw62oMwhVMhyvnNAMgHwdCfXLImOcm7yebt0SGQJ7KsRCZx8lIe1U8IGvo0KEHdUCWcBN0qAx2NNVcin6AfKShOu1IAj6TNG5y3LIIy6Zb3suxEKnhZKi9Kh2QJbIFOk9NY2SA0+Ujfk8DxumKUeYt4QFMucixEL3jZKi9KB6QFQqF7jC3LYSroJNMedGfOJHTGRvzey2S9BEoLzkW4s84GWuviQdklZWVfc/cshCug85QIxD95FR5iPc5RcStmVHzlvA5KEs5FgECZVoDtXvegbj11lu5XfMp3LMOyBJZA41jIqRh9TRB3jHw0wmxG3DNBZUMBqX1JQEBZS3HwgJQVmy7PFOG7Zflx/Y90NMOBA/Iikajz+P+dUCWyCpsHJCmMdIEeXfC6AOu6ZCx49EiSSHHwgegHDjKkCwfqsb86s84GW4viAdkVVZW7sct6oAskRPQYORApAHybTxlXtNQcLpCoznitJj6IsciByB/k6MMXNRM8XXvI/9OxjvXMgdkva4DskQuYSMyL0UKIN86Rx/wswVSWHDRb1CPHB2LzZs3X4qfySPbpdRFxyyZp9TJowy94WTAcy0ekBUOh5eaWxQiJ6Ax0QDqqScFkF9cIMl5Uj7BKO+Eq6COXbxhw4aZ+Fkvpa4tW7aciZ/pry90MuC5VHt7+7s6IEt4ATSsIkjbDFMA+XU3pEWSIiugrvGwNbXRXOFkxHMlc0DWD82tCZFz0DlpO2cfQV5xDnWRuRQiK6DOLTMvRbZxMuS5ECoBD8h6GrekVdrCM8gg9h3kFbd2adGzyCqoc3Lyc4WTMc+2zAFZL+F2NGcqPAU6Jy7W0jbiPoB80qJTkXVQ7zQCkSucDHo2xQOyamtrX8OtaJuX8BzonOJQs7kUvSAHQuQCORA5xMmoZ1Pjxo17QwdkCS8jw3h6kEc6wVTkBNQ7jhKe9sRX4QJORj1bmj179ttlZWV/aW5FCE+CzknrIE4D8khOlsgJqHtN0GRzKbKJk2HPhnhAVjgcfsjchhCeRQ7E6ZEDIXIF6h53/2ghZS5wMu5uiwdklZWV/Qe+XgdkCc+DzmkU1BmaWZwM8obxMhRxUuQMORA5wsnAuykekBWLxZ7FV2tlu/AN6KD0hH0KkDeMPKn2LHKGHIgc4WTk3ZI5IGsfvlZ7xYWvQAelaYxToM5b5BrUQe3EyAVOht4N8YCsxsbGg/n5+ReYrxbCN8iBcAb5omPPRc6RE5sjnIy9G+IBWcXFxSpk4UvQQfEkwNROqgsAyBOe6KcRRZFTTD1sMJciWzgZ+0yrvb397Ugksst8pRC+A51TPqSFgj1AnuihQOQc1EMGfNOhWtnGyeBnUitWrNABWcIK0EG1m5fCIAdCeAXVxRzgZPQzJRQoD8j6Nb5GB2QJ34P6rHUQ3UB+KPqk8Ayoi1pImW2cDH8mxAOyotHoHnyFDsgSVoAOaj6k7YoG5IWe+IRnkAORA5yMf3/F7Zq1tbWv4t/rgCxhDeigQlCruQw86rCFl5BDmwOcHID+6uyzz369uLj4YvMVQlgDOiktpATIh6jyQngJ1EcGNNOhWtnEyQHoj2bNmnVYB2QJW2EnZV4GGtNZazpHeAbURx6qNdFcimzg5ASkKx6QFQqFvmv+tRDWgQ6KRwcH/gwX5IGmL4SnQJ3kVmstdM4mTo5AOuIBWXAensK/1AFZwlrQQY3evHnzueYykNCBgjTfLDwH6qUc22zi5Aykqi1btnDHxR/w7zSkKawHnVSg5/6R/hZI0SeF55ADkWWcHIJUxB0X8Xh8L/6VwvyKQCAHQp208CaomxoZyyZOTkFfZQ7IelUHZIkgIQdCnbTwJnJus8z48eNfpSPg5CCcTpMmTTqkA7JE0AiyA4G0c6W7ok8KT4K6qem1bJKXl3dJXV3dPkaOdHISTqW2trZ3wuHwl8y/ESIwoIMK7FZOpH25eSmE50D95KFaCvaWZZpisdgLmzdvdnQWeuqzn/3sR3AeHjV/K0SgCLgDoSFi4WVqbr/99hvNa5FF4qFQ6OmbbrrpAyenISl0IAk4D7/C57VdUwQStAEOkwYu4h3SzOiTCqQl3IJtitMP46FmiMdzLykoKFiJB9wvQ1+trKx8DPoxXj9TXl7+u5qa6hdra2ufHzZs2P7hw4cdmDBhwsGWlhbaJ5ED8uFEPHbZZZe97eQ8cJoDBfciPqcDskRggRHlKZTs5AIF0rwI0lZtkYTGnmqAaPCPG32qqKjo9tLS0i9TkUjkH6DHysrKfjJo0KA3hw4d+ov6+qG/b2g485kRI0a82NjYuHfy5Ml7pk+fvv/SSy/d95nPfObw2rVr373jjtsTX/rS9sSuXV9JfPvb305873v/mHj00R8knnzyXx31s5/9NDF79uyX8f0iV5SUlNzDBZLdF1dyu2ZNTc1+/FoHZIlAAyPKQEqBW0iJNGv9g/+ZAXGNQKeRz8/PX5M08tFo9EEaeSocDv8XjP0zFRUVv4Ce5YMjnvR/V11dvbeqquoAjP4L48aNO0BNmzbtFRjtw9Tll1/+7tVXX52gbr755sSaNWs6xenxu+66K3H99dczZtBHTsY/U5o3b94BJlTkEO6uQCU5QMeBDsTYsWNfy8vLm21+LUSggTEN1FA+0sswwdpx5XNCodDBjo6Ot2jgV6xYcdzAo2w7DTyV7PMzJTgiR+GUfEDh9YdDhw79k5Phz5Tmzp17GOnToVruMRUO5r10MM21M4zvEI/HX5kyZcpb+LAOyBLCEDQHYsOGDZ9GmrU9zufgwfAQDzxcuXLlR07G3g3B2Bz5/ve/52js3dCiRYsOt7a2aq1O5ogOGDDgajiAj1dUVLx84YUXvkmn87777uNyhtNSM2jQoF3mtRACBM2B0OiDNXAKY9EFF1zwspOxd0MwOkfuu+9eR2PvhtasWf3xwoULFWIgQwwePHjH9OnTj2zbtq1n2fbJgRBC9AAGNVCn/smBsIr6iRMn7uthDFzT8OHDj2za9AVHY++G7r13N+MUPW7SKvrPqClTprzhULZyIIRIBzkQwsfEx44du9fBILiiUaNGfbRy5UpHY++GuEujtbX19yatIgOUl5fvcShbORBCpAMMaisUmIVaciDs4qyzznrOwSC4ogsuuCCxZMnVjsbeLc2efdFrJqkiA8RisUd56naPspUDIUQ6wKCOggITC0IOhF1UV1dnbQpj+vTp3Bnx/zkZerc0Z86cQyapIgMMGDDg8kWLFh3pUbZyIIRIBxhUbmsMTCwIORB2UVtb+2IPY+CaLrvsssS0adPedzL0bulTn/rUm62trRNMckX/KTrzzDN7Op1yIIRIFxjVwKyDkANhF8OHD/91D2PgmuhAjBkz5oiToXdL119/3bsLFixQ6IEMEo1Gf7N79+7uZSsHQoh0kQMh/AojS3YzBK7qc5/7XGLYsGHvORl6t7RlyxcTl1xyyXdNckUGCIVCdzP+Q7eylQMhRLrAqHaYl9YjB8IuKisrn+5mCFzV2rVreYZSVkcgeG7GvHnznjLJFZlh4vTp01/tVrZyIIRIFzkQwq/wjItuhsBV7dy5MxEOl33oZOjd0hNP/JiHau0xyRUZory8/KVuZSsHQoh0kQMh/ArPMehmCFxXQUG+q+dfOGnu3LkHTXJFhkC9+VG3iJRyIIRIFxjV+VAgYkHIgbCLSCTyb90NvNsqKSnJ6hQGxUO1pk+frkO1MgjPxOjo6HjflKscCCHSBUa1CQpELAg5EHbBI7s5tdDdyLup/Pzsj0AsWrToLR2qlXGiI0eOTEallAMhRLrAqBZB1seCQBrroWZzKSyADgSP7u5u5N1UUVHRR05G3k2tWbP66Pz583WoVoYpKyv73f33389ylQMhRH+AYbV+HYQcCPsIh8Nfy6YDkYsRiF27vsKAUv+vSbLIEHAGd65bt47lKgdCiP4QEAdiItRkLoUFlJaWftkYgaxoyJAhR52MvJt65JF/5qFaz5oki8wxdebMmYxKKQdCiP4Aw2r92gCOPkD15lJYAB2IHkGBXFU4HD7y9a9/zdHQu6mWlpYDJskicwysrKz8b5SrHAgh+gMMaxBGIFqgGnMpLGDAgAHXZ9OBYCCp++6719HIu6nW1tbDJskig5SUlDxx9913v2wuhRDpEBAHQjsw7GPJ1Vdf7Wjs3dDw4cOPrFv3l45G3k3Nnz//zQsvvPBsk2aROZZ1dHQ8b14LIdIBxnUhVGQurUQOhJVk1YEYMWLEkZUrVzoaeTd17bVL37/ooovWmDSLzFHT0NDwK/NaCJEOMK7jIasXGMqBsJLmyy+//A0nY++GLrjggkR7+6cdjbyb4qFaCxYs+L9NmkUGGTJkyC/NSyFEOsC4hqD55tJK5EBYSfPs2bMPOxl7N0QHYv78eY5G3k098MA36ED8p0mzyCD/43/8jx3mpRAiXWBgrV4HIQfCSqbOmjXrkJOxd0NtbW2JT3ziE1k9UIvioVozZ87UYj93aDE/hRDpIgdC+JD6KVOmvOxk7N3QZZddlhgzZkzWz8OgLrroojdMmkVmyTc/hRDpYruBlQNhJfXjxo074GTs3RAXUA4dOvQDJwPvtubOnfuWDtUSQngSORDCh8THjh2718nYu6G1a9d2xoJwMvBu67LLLuNWTh2qJYTwHnIghB8ZNmxY8lRF17V9+/ZEcXFx1g/UolatukWHagkhvAkMbDtkbSwIORB2UlVVlbUpDKqgIPsHalE7d97DgFKPmWQLIYR3gIG1+rApORB2Ultb+6KToXdLBQUFWT9Qi+KhWnPmzPmjSbYQQngHGNgoZG0sCDkQdlJZWfmck6F3S7k40jupGTNmvGaSLYQQ3sJmIysHwk5isVggRiCoiy666C2TbCGE8BYwssvNS+uQA2EnlZWVTzsZereUyxGIBQsWHJo0aZIO1RJCeA9bjSzSVQMp4pyFlJWVPeNk6N1SYWHh0cce+6GjgXdb11xzzbsXXnihDtUSQngPix2IeqjZXAqLyLYDEQ6Hj9x3372OBt5JX//61xL8/Le//S3H36eiTZu+kLjkkkv+0SRdCCG8g8UORBM00VwKi4hEIv92//33Oxp7NzRkyJA/1dfXHx0xYsS7FRUVR6LR6IdFRUVHGR+ipKTkCEcoQqHQh5zqgHPzIR2O2tra9wYNGvSxk1PQmx599AeJ733vHxO7dn0l8dd/vS2xZMlVH7a0tOj0SCGE97DYgWiG6s2lsAg4EI/dddddjsbeDa1evbrzTAxGpaR27tzp+LmeokPR3Rm4447bE9dcs+TN9vb2g1OnTj3Q1NT0ckNDw8twNp4fOnTor2Kx2NOVlZWPxePxb8JJuRtJZdtceMMNN3y+M+FCCOEl5EAIv5FtByJVcXSkoqLi8KBBgw7i5w/hGHy5pKTkdtw62xrX5XBkjHVzIHRabG2jQgifY7EDoU7XUsLh8NdQvo7G2yviOg1zu/2GdRnqk7MhhBBZQw6E8BulpaVfXrNmjaPh9ooy7EBMhqyNGCuE8CnomBZB1p2PLwfCXgLoQDBi7EJzKYQQ3gAdk5VrBeRA2MuAAQOuv+GGGxwNt1fEaJnmdjOC6rMQwnOgY+Lw6ChzaQ3qcK1mydVXX+1ouL0iFxyIZealEEJ4A3RMVgZckgNhNXIghBAi16BjikOt5tIa5EBYTfP8+fPfdDLcXlE8Ht9r7jUjqD4LITyJjZ2TOlyraZ49e/ZhJ8PtFVVVVR0w95oRUJ8XQlFzKfoLMnM5dBPERWDaIytEmqD9yIEQfmLqrFmzDjkZbq/IBQdiFDTZXIpMYTI26Uy0QtZtSRPCTdBm5EAIP1E/bty4A06G2yuqq6vbj/vMmC1CfR6oOu0yyGAuCFsG0aFoh4rMr4QQpwDtRA5E7rkY4mLWGZ1Xojc870Dw/nifXbebGVCntZAyWyCzuTisA+LIBIPlaP5ICAfQNuRA5JYzq6qqDi5evPh1/sR1TdfbgYRpp+Hl1mI6VNQiaMngwYNXMohUcXHx340YMcLTayBcciA0ApELkPEhiE4EnQk6FUFuoEKcANqDHIjcUlRfX9/5RO2G4XERrj3jvVI8ICpp8Jn3SyKRyCYa/PLy8vt4ABYVi8V+wSiNeP37eDz+PLc71tTU7OGaAYrppyZPnvwaF0pSHR0dH3Pb5rJlyxKMQElt27bN0XB7RRqBsBQUQhHEFa2c5uB0R4P5lRCBBG1ADkSOofF0y/B0g1O6SYM/FaKxnw8tCYVCN4XD4b+mwa+urv57GvuKioof4+fTNPgw8r+lscd9Pl9XV/cy77exsXE/7/ecc845kDT2bW1tH9DYU6tWreo09nfccUeCp2dSu3fvdjS4tqmlpeWQyeOMQXtlXgovgALJh1ogjkzQodCBJSJwoN5b5UAgPTw7gIbRN8BYOzkQcYiv+ZCTfLpvHzx48HWVlZXraOzxFP81/O3DNPgw8k/S2ON3T+P1MzT4I0eOfI7Gnov6+L+pGTNmvEFjP3fu3LeTxn7FihXHn+6Txn7Hjh2OxlE6vZi/prwyBur0VMi6qLFWgILhKlcWUNKZ0JYZEQhQ121zIHwXXZPGnoZn6tSp78MBeDVp7LsP5V9xxRVHew7lI53HDX5PIyblTi45EL5zjAMLCmoilNweqlgTwlpQt21zIHy3Zz7pQEh2iFM5KNaMn6CJeq1pDL9hOqSkM6FYE8IqUJ9tcyB8d8JoKBR6zskQSf4UR4pQrBlvV7a11cDBjglKxprgzg7FmhC+xtRja5xipMV3DgTXLjgZIsmfctGB0AiELaAwOSeVjDXBn4o1IXwH6q3vDG5vmLboqynHSCTy1M6dOx2NkeQ/cZ0K41aY4s0YqNdyIGwEBcvtoclYE0sgxZoQvgB1dTJkzeputj/z0jdwF4UWQtojLnDlLhlTvBkDdZshCELmUtgICpjbQ5OxJijFmhCeBfXTd7sWegNp8aMD8YMtW7Y4GiPJf3LRgWiCtEMwKKCwuT20e6yJ8eZXQngC1EmGfW81l74HafGdA0FjQ6PjZIwk/8lFB0KHagUZFH73WBMZjVQmRLrY1Cn5MS1yIOwSR5M4qmSKN6OgfmsdhOisCOMhOhJ0KDhKoVgTIieg7smByCFccMeFd07GSPKfuJ6F61pM8WYUm9qqyBCoFA1Q0pmYDynWhMgaqG9yIHLLEm79czJGkv/ksgOhEQhxalBBalhJIDoUijUhXAd1TA5Ebmm/7LLLjjgZI8l/4pZcOBBPmbLNKDa1VeEyqCyKNSFcB/VKDkRuaeb5CU7GSPKnGBzMlG1GQf1m3Bbt7BOpgUqjWBPCFVifzEvf49O0yIGwTC46ENw1pUO1RPqgAinWhMgYqD9yIHJLw/jx4191MkSSPwUH4g+mbDOOTe1V5BhUJsWaEP0CdUYORG6p5/HdToZI8qd4wqop24yDOq6FlMIdULkUa0KkBOqJHIjcEmpoaNjvZIgkf0oOhPA9qGiKNSFOC+qFHIgcU1VVpREIi+SyA2FNexU+AZUuGWuC4voJxZoQnaAuWNEhIR0h1m1z6SsqKys1AmGRUJ77TNFmHNTxdtZ1cylEdkHlU6wJcRxTB3zvUCINvj0YjE+sToZI8qc4omSKNuOgjnNkeaK5FCJ3oCIq1kTAQZlzb3m9ufQtSANH2Xy57kcOhF1y2YHgLrxF5lIIb4BKqVgTAQTlzIW3vt8KjDT41hEKh8PPOhkiyZ8aPnz4fhSrayO7qOdaSCm8CyqoYk0EBJStb4f+u8M0MC3m0lcw8JCTIZL8JZ6DQY0ePfo1FKtrdRH1XA6E8AeorIo1YTEoT66JaTGXvmXDhg3ztmzZUmcufUU4HP6vXbt2ORolyR+68847E0VFRQd4kBZ+/hTF6tq6IrRX7cQQ/gSVV7EmLMOGDglpYJjfVnPpK2h0+OTqZJgkf2jbtm2uncLZE9RzjUAI/4OKrFgTFoBys2Urpy87VjkQdsitMzB6Yvpa3y98FuI4qNCKNeFTUFa2OBC+TEdpaemX16xZ42iUJP8oiw6Eb0fbhDgtqNyKNeEjUD5yIHKIHAg7lC0HgqCuaxpD2A8qumJNeByUiaYwckh+fv6aG264wdEoSf5RPB7/tSlS17GlzQrRZ1Dpk7EmODLBEQrFmvAAKAdbHAhOnfkxzO+Sq6++2tEopaOVK1cmxowZ4/g7yT25eQZGT2xps0KkBRqAYk14BOS9LQ7EKGiyufQTHeBjJ6OU1IYNGxJ1dXUJfLZThYWFiba2tsQ999xz0mf5Pj/T833JXWXZgdAUhhAEjUGxJnII8tuapxmkxY8da/Ps2bMPOxklauvWrZ0OAzV9+vROByHpTPAnf9/980kHYu3atSe8L7mr2tra33WWZhZAPdfaMiGcQMNQrIksgjy2yYHwY1p6dSDoNNB56DnawKmKpGPBEYrk+3IgcqPq6uq9XcXpPqjn3EKvBy0hesM0FDoSijXhEshTORC5ZdS55577qpNRorieYeLEiY6/o+PQ04mQA5EbuXmIVk9QzzvXk5lLIcTpQINRrAkXQD7Kgcgt9ePGjTvgZJQoOhC9LYrs6UTQccD/lAORZQ0dOjRrIxAEdV3rIIRIBzQexZrIEMg7bq+1YmTH1AVPOJYFBQU/5lNpeXn5wdLS0u+at52INjY27ncyStTixYs7HYJly5Y5/p5KOhH8HEcr+FMORHYFJ+8F5HvW6h7quTWOvxA5Aw1JsSb6AfLLtydZ9gTp8MzcMENUJw/Jwuvf4i2eekp1QEsGDx68kkGkqFgsdso1EFz7kFw0ic+d0jHg5zhSwc9RnMpw+pzkjjiKhHzPWjtCPdcIhBCZBI1KsSZSBHnERatWbKNFOrg92BNzw3AafpA84+Kiiy46woWSl19++RtXXXXVx4z7cPPNNycYgZLiaY49DVJ30TlI7r44nWPAkQouvOxtxELKvHLgQGgEQgi3MMZEsSZOA/KlHuKTsRUgLXzCzzkcWdAhWcHRjBkzGAcimw5EK6QHJCHcBg1NsSZOAfKC60lazKXvQVo88WSmMy6CpVmzZr2OYs9aIDPb2q0QvgENT7EmuoE80E6MDFNQUHCLHIjgiFNUKPasjuShrmsdhBC5BI0w8LEmkGabHAhPTGGAJTokKzi69NJL30CZZ9uB0DoIIbwCGmQgY00gnavNS9+DtEyGRpnLXNLOBZNOxkayTwsWLHirsLDwf6LcR3cVv/ugnmsEQggvgsYZiFgTSNf4jRs3bjeXvgfpCUELzWUuaeauCydjI9mn7du3cxSCW2iXdhW/+6Cey4FIEe3xF1kHDdXaWBNIyyrIqo6IZWRe5pJez7iQ7BPXvAwYMOB6U/6ug3rumcBpvqCysvLlkpISxQAXOQMN1ppYE7x3iFM1ciAyT8PMmTP3ORkayU7RgeDuG1P+roN6PhHSjrK+cv/993eudo3FYo/iMtT1rhC5AY3X17EmcL8cUeEWV6bBmvaEtHhhcVn9xIkT5UAESDlwIPgw024uxelIFtT69esTNTU1e1BYyjzhCdCQfRVrAvfHtQKdhhY/m6Cs7WF3G6TFCyMQobPPPlsORIDEwGHZdCAI6rrWQfSV7oW1e/fuRHNz81tlZWVPmF8L4RnQsBlrgo4EHQrPxZpgxwN1zp/iJ50fm7Zy0pGLm8ucceaZZ77Yvc+S7BYdiGg0utsUf1ZAPZcD0Vd6Fti2bdsSRUVFe8yvhfAkaOSeijWB7+fUy3Jz2QmubXIg4lDOo/RVV1drBCJAogPBQ9RM8WcFm9qt6/QssJEjR2Y1fKgQ/QUNPuexJvCdXAR6whM6rrWQMsOMGDHiNz37LMleyYHwON0L68orrzxaUlLyNfMrIXwHGn9OYk3ge24yL4/D+zAvrQDpybkDEY/Hn+/eZ0l2i4v8c+BAzIdyPl3nC5IFxamLsrKyl/CW9sAKK0AnkJVYE/i/7HBO2i2C95ZA1oTxRlpy7kDU1NT8truBkexXRUXFj03xZwW2Zcia03RdJVlIY8eOPZSfn3+BeVsIq0CH4FqsCfyvVeblCeB9r4SAzghIS84diPLy8v/d3bhI9gsPtr8zxZ81UNc1jdEXWEDXX3/9sWg0+qB5SwirQeeQsVgT+FsGnnFcM4T3OQLihRDQGQFp4UhLTmNbRCKRp3saGMluwYF4xhR/1kA9106MvrBjx45EOBw+gJdWnksgRG+go+hXrAl83nH0IQl+b9NODA7t5nSBNYezOS/uZGgkO1VZWfmUKf6sYVO7dZWmpqZ3SkpKLjKXQgQadBx9jjWB39OgzjeXjuD3ti2kzGnYey6o48p8J0Mj2am6urr/NMWfNWxrt64Bj/5h81II0Q10Ir3GmuD75uUpwWesepJBenK6DqKmpuZbciCCpcrKyudM8WcN1nNIGwr6gKYuhDgN6ExOiDWxdevWCvw8rXOAz2grZwZhWON169Y5GhrJTsVisRdN8WcN1HOubWoyl0IIkRnQsTDWBI/sPu0TCj7DhYc2HVWe6ymMrTxgycnQSHaqtrY2F7sweK6NzoUSQuQOdEKjIM+d25Eu7FShnA3tFhQU3HDzzTc7GhrJTo0cOfL3pvizCuq5FlIKIXKLTR0R0sJTRnM5tLvk6quvdjQ0kp2qq6t72ZR9VkE910JKIURusakjQloYQyOXQ7vNV1111cdOhkayU1VVVQwzkHVQzzUCIYTILbZ1REhPLtdBNM+ZM+ewk6GR7NSwYcNycjo06rlGIIQQucW2jijHDkTT7Nmz5UAESGPHjt1ryj6roJ5btQBaCOFD0AlZtac8xw5E/QUXXPCqk6HpTYxeyfgRFO4/wZ0c1A033JDgmgpq7ty5b9M5aWlpOQSj9eqiRYved/pfQRMPWmS+bdmypTPP7rzzTsfPuaVx48ZxCiPrIdRRT6xaAC2E8CHohLinPKUQ2V4GacmlA1FDg0LDcsstt3w0ZsyY13jd2Ni4n3PlVHl5+V7GDqDKysr+wLMUwuHwbxnF0ugfGE+Cys/PX4P/ySkmqgXiKYw0GlPPO++8vT2NmZe1e/fu407S+vXrjztJS5cu7XSQPvOZz7xPB4maPHnyPubb2Wefva+6unofpwlGjBjxB+bZ8OHDfx2Px3/NQ6xqamqejEajP6qsrPxebW3tA0VFRQ8gX1J24Poj40DUQ1kHdV3TGEKI3IFOiCeBWrOnHGmhQ5T2AWT9hUaPhgUG8XVc0pmhcYnzdxmkqKmp6cWexixT2rlz53Fjv3bt2k5Dz+2pNPRXXnnlkYULFx6ioZ85c+a+CRMm7KcRhYF/gQ4SnKVnYdifYYRGhnmmoecppTD+j9NBwu++Q+cITtOXYPxvQVroHPFQNzpHFMuOeZbOibT1vB+nNLklOnL83q6vzy6o51pIKYTILeiIbNqJQYeo1zNA3IRGlIZl8eLFdCBoEF2BT+Y9jVl3XXfddR8tWrTodS7qbGlpOTBt2rQ9NPRjxox5gVsPhw4duvfMM8/8P3iafx5G/dc8FIqjITD2P6Ghh8F/BD930djj5yZ8Zc+REB5cRsNJ5fQU1G6Exo4du8cpP9zSrFmzDuF7c+VAaARCCJFbbOuIkJ6chbTmkzgNi9sOBByA3/c0Zt111llnHcTHOALCe2BsjKSxP+HMFNugc+SUH26JIzH42pzEHkE91wiEECK32NYRIT05m5IpKirisP0zQ4YM+W9cnt/1buapqKh41smgJXXeeefRgcjJk3Euqa6uzuraEONAuOYo9gbbLWS1QyiE8DjohLSV02dEIpGnnQxaUrk0bLmEZ1M45Ydbmj9//pv42lw5EJOhUeZSCCGyDzqhViidRWueBGnJ6amc2QAOxFPc/ulk1KigOhDcqeGUH26JC0vxtblyIKIQF6AKIURuoPMAtZpL34O0NEOZ3vngKbjQkbsknIwaFVQHory8/DdO+eGWjAORs7aDeq51EEKI3GJTR4S08MnMauMZDofvZTwFJ6NGdXR0fIyPBc6B4PoTp/xwS8aByFnbQT3XTgwhRG6xrSNCeqxeBxEKhe5mfAYno0YZw2b9VE5P4Fj9yik/3BIDYQ0YMGCp+fqsIwdCCJFz0BHZthPD9oWUvR4dnusn41xxuqmdTItOXFVV1a3m67OObe1WCOFDbHuSQXpsX1y2sL29/QMno0bxHI2CgoIbzGcDgxsOxI4dO044b4O68cYbEzy6/cILL3yrrKxsi/n6rMN6DulQLSHE6dm8efMCdBjtEE/j44E6GdkHbv5nkbn0PUiL7SMQzVwo6WTwqFw/GeeKcDh8//LlyzsN/h133HHc4HNEhmpra3uH+TZr1qzXk2G4Gxoa9jCCaG1t7YsMwc2dHPj5X1xPwd0udEqo5BklRUVFt+Or+OTPKaKZUAWUE0wfwKigQghxatBRcLdEZ5hm/MyHmiA+gdD4J7XIvMff9dkhwGfHQxPNpe9BWuhgWeMQOTBq+PDhb8EgfoCn4DdpCGtqanho155oNPo8DN1zMHTXmc8GhkGDBq2G4f+pMfrfpMEvLi7eil/R4FPcMcHFpd1Dcfs2GBPq+EBI0xhCiN7pa0eBz3V3LnhcN0XHIvmTB06dcH4Brvk31jy1Iy31TKe5tBEewb4KojFkKGVr4niI1EA910JKIcSpQScRz4SBx//o7lwwFC61DFoO3W0+ZgVIjzWnjApxKtiGzUshhDgZdBIcPXB1qBX/f7l5aQVIj+3rIISQAyGEODXoIELZ6CT4HRCHxq0AaZEDIawH9VxTGEIIZ2gIs2HY8R1c0W1N9EKkRecECOtBPZ/KtmsuhRCiC3QMXLOQtScMfJc10xhIC9d56LhjYTWo4wzd3rk7SwghjoOOgaMPJ+yYcBN8l00OBBeLcoeCEFaDen6zeSmEEJ2dAvd4Z3V+E99nzToIk3+axhDWg3p+E+u7uRRCBB0aPyirx1Lj+2xbB6GhXWE97CcgLRoWQnSBDiEnq6vxvTZNY6hTFYEAdV2jEEKIzs6AoZgbzGVWwffKgRDCZ6CuaxRCCNHZGeRsbze+26Z1EJrCEIEB9V2jEEIEGXQAzdB4c5l18N3WnPCHdHCPfKO5FMJqUNc1CiFEkEEHkPPQtF64h0yBtGgnhggMqO8ahRAiiKDh81jtnO+CwD1YEx4XadGhWiIwoL5rFEKIIOIVw837gKx4ilFnKoIG6rxGIYQIEmjwDVCrucwpuA+OhNiyDoJp0VkBIjCgvmsUQogggQbvqe2TXruf/oC0aB2ECBSo8xqFECIIoKHzicFTRg73o3gQQvgU06eo3gthOzTWkKeeFnA/WgchhI9BvdcohBA2gwYe8qKBwz3ZtA6CsS1yFltDiFyAOq9RCCFsBg2cow+ejPzIezMvfY86UhFENm7c+Feo+xqFEMI26Dh42bDJgRDCn6C+cwRxyebNm2eq7gthIWzgUMhceg7cm03rINptSYsQpwJ1nOHb2a8cn7LDa62FEMIm2KDZ0M2lJ2EnBNmyDqLelrQI0RPU7aTjcNIpvnhPayGEsAk2aDZsc+lZcI82TWNYc8aHEAR1+pSOQ3fwe41CCGELaMy+MMx+uc++gLR0mJdC+BrU5VbotI5DEnxOoxBC2AAa8nyo3lx6GtynTesgFkKe3PEiRF9A/U06DimPXuJvNAohhN9hQzYvPQ/u1aZ1EHwKy/lpp0KkCupt2o5DElP/NQohhF9BA26GmsylL8D9ah2EEFkGdZULrTlq1gFlZL0U/o9GIYTwK2i8q8xL34B7lgMhRJaggYeSjkNGt3nj/3EUYr65FEL4BTRcTgdMNJe+Afds0zoIrj8pMpdCeAbUSwaWc8Vx6A7+tzUPBEIEBjRc340+ENy3Lx0fJ9gxQ63mUoicg/rYGZHWyHXnFt/RAGkUQgi/YBpti7n0Hbh3a4b+bUqL8C+oh90dh6zuDsL3+fJhRohA4vcGi/uXAyFEBkD96zyB1ygn24rxvRqFEMIPoKHW+L2x4v5tciC4DsKzZ5AIO2Gdg7i+wRPxSHAPGoUQwuugofp+6xTun+sgjh/Q42eQjiKo3VwK4Sqoa90dB8/0A7gXjUII4WXQQKOQFcFbkA5NYwjRR1DHuGWSwZ885Th0B/elUQghvAoa6HLIivDJSIccCCFOA+pW0nHw/G4f3KNGIYTwImiYHCqX0fUgSAtDA3v+NFThH1if2EZYt8xbvgD3q1EIIbyG6UysObwJabFpHUTnFjpzKUTKoP7QYZjMerRx48aV+OnL+CK4b41CCOEl0CBpoKyK+Ib0MMTuMnPpe5AWTWOIU4L6UQ9NhbgAkg8DPcVRrFGQ7x8SkAaNQgjhFdAgXQ1HmyuQJp2LIXwPyp7OMJ+8ebidk3NA8Xf8jPWHT5l0ahRCiFzDDgfyzZHdqYB02eRAdBoIcyksAuXKEUCODiSPwe4pOvgcXag3fxJ4kBcahRAi16AhctuWlQv0kC7O+dq0DqLDXAofgXLjAuUmiEHBnBwERnlkXdVC2T6CvNIohBC5Bo3QWk8eadM6COE6KBcGX+KiXTrjTg5COzQRipo/ERkA+alRCCFyBRogh0ytHhZH+rQOQvQL5DsDrNEBoCPg5CDQcaADoZDjWQT5rVEIIXIFGp/1HjzSaJMDwWHuJnMpMgTy9PgWR8jJQeDUA6cgXD++WqQGysTK9VtCeBo0PC7KsmJ9QG8gjTatg7BqSiZbIM8Cs8UxaKDMOAox1VwKIbIBGl0gPHek07Z1EHIgumHKl0ZEWxwDCsvYvBRCuA0aHOdrm82l9SCtVq2DgAJjCJFWbXH0N+Oj0ei/l5SU/NhcZxyUPaeXAtOfCZFT0NgCtXoZ6bXJgaDzN9lc+h6kRVsc7WR8eXn5k1OmTDm4ffv2xFlnnXUQ77m2YBv1QzsyhHAbNLTArVw2Bsia9R5Ii28cItyrtjgGi+aysrJfJB2Hv/3bv+3U+vXrE5FI5DHzmYyD+hOoUVUhcgIaWeBWLSPNnCf/rLn0PUiLZ9ZB4F60xVEQOg6/7Ok4dNfo0aNfx+c0CiGEH0ED43a1QJ7qiHRb4zghLZz3z8qOAVNntMVRnIrTOg5JcRQiHo8/Yf4u46AOahRCCLdA47oJCuRKdHYskBUxFJAOLirMSEeJ/6MtjiIdmiORyFMtLS0HTuc4dNeYMWMO4281CiGEn0DD4lx0oLc7If02jUKcdh0EPqMtjiKj5OXlfbqsrOx3s2bNOrRz505HJ6E3aRRCCB+CRrUMCvRTJNK/HLLCUJq0aIujyArGcXgmXcehuzQKIYSPQIOiobFmK2O60JBCVuxAQTpWs0whbXEUrpFJxyEpjUL0YPbs2a9dfPHFP7jgggsUUlN4DjQmPo1qFTxAPlgxjYF0cHoicDtqRHbo71TF6aRRiG488cSPE3fdtTXR3t7+YUtLy+sLFy78CZyJBebXQuQMY2g0pGdAXnA3gRUxB5AOOoba/SAyxcABAwYspeNwySWXvL57925H458JcRSiurr6X833Zhy0C/+MQjz55L8mkvrZz36a2LnznsTll1/2Pry3NxcsWPCvF1544bXmo0JkFTQiGkwNcRtocCErFpMiHYFfGCsywsDBgwdfB8fhObcdh+4aO3bsu8XFxSPNPWQctA1/PDh1dyB66t57dyeuvLLjQzgTh1tbW5+aPXv22unTp2tLlMgKvmlEWQR5YtNujMBuzRX9ptNxCIfDz7e1tb2TLcchKY5C1NTUPGnuJeOgXfhjFMLJcXDSAw98I7F06TVHW1pa3oQz8fScOXM2wZnQ3LRwBTQeBvlxbZ7Rr7BTgWyJCcFAT+3mUoi+kFPHobs0CgGcnIXT6aGHHkrceOONH82ePfvwrFmznpk7d+7OCy+8sML8SyH6DRrPreal6AHyxqZRCI0yib6QP2jQoFvLy8ufaW9vfzuXjkNSGoUATg5CKnr44X9KrFmz+uhFF130JpyI5y6++OK/mzlzZqP590KkDBsNG4+5FD1A3tgUE0LBc0RvdDoOHHHo6Oh46/7773c05rlSFkYhvL1OyMkpSFePPvqDxG23rfu4tbX1MJyJPfPmzfsOnIlzzVcJ0SfQaPRU2gvIH2tiQhCkRVs6RU887TgkxVGI2tran5t7zjhoG3Swvfsw5eQIZEKPP/6jxBe/uPnY/Pnz32xubt47Z86c/4mM0Jy26BXTYPREehqQRzZNY7RAVqzrEP0mv6io6PZoNLrHy45Dd40bN+7DioqKMeb+Mw7ahndHIZyMf6b17W9/6xgqxf9CRiSPzmWYWg1Ri5NAvdDahz6AfLImJgRBWjTqFGxCBQUFdxrH4X0/OA5JcRSirq7uP006Mg5tJWUuvYWTwc+0FiyY/0t81cKub+wCGcJDcNgJdsa8N2+LAGPqhDVD826CfLImJgRBWvhgoZgfwYOOw7ZYLPbi9ddf/56fHIfuysIohAdHHP/iL/5/fX52joUr3n4AAAAASUVORK5CYII="
},
"redirectURL": "",
"headersSize": 490,
"bodySize": 27384
},
"cache": {},
"timings": {
"blocked": 1,
"dns": 0,
"connect": 0,
"ssl": 0,
"send": 0,
"wait": 2192,
"receive": 0
},
"time": 2193,
"_securityState": "secure",
"serverIPAddress": "91.194.231.38",
"connection": "443",
"pageref": "page_1"
}
]
}
}
ChatGPT-4.0 • 2025-10-31 10:16:20
Ah, sehr gut — danke für die Präzisierung, Detlef 👍
Dann trennen wir das sauber: Wir betrachten ausschließlich den **GIS-/WMS-Request** aus der HAR-Datei, **ohne Bezug zu deinem BPMN-Problem**.
---
### 🔍 Analyse des HAR-Ausschnitts (rein technisch)
Der enthaltene Request lautet:
```
POST https://amsuite.swl-unser-stadtwerk.de/prime/server/GM2?REQUEST=GetMap&SERVICE=WMS
```
mit einem XML-Body, der einem klassischen **OGC-WMS-Request (GetMap)** entspricht.
Das bedeutet: Es wird eine **Kartenebene als Rastergrafik (PNG)** angefordert.
---
### 🧾 Typischer Aufbau dieses Requests in Postman
#### **1. Methode und URL**
```
POST https://amsuite.swl-unser-stadtwerk.de/prime/server/GM2?REQUEST=GetMap&SERVICE=WMS
```
#### **2. Header**
Setze in Postman unter *Headers*:
| Key | Value |
|------|--------|
| `Content-Type` | `application/xml` |
| `Accept` | `image/png` |
| `User-Agent` | *(optional, kann übernommen werden)* |
| `Accept-Language` | `de-DE,de;q=0.9` |
| `Origin` | `https://amsuite.swl-unser-stadtwerk.de` |
| `Referer` | `https://amsuite.swl-unser-stadtwerk.de/...` |
| `Cookie` | *(optional, wenn Auth über Cookie statt Token läuft)* |
| `Authorization` | `Bearer <dein_token>` *(falls im HAR enthalten)* |
*(Achte darauf, dass du in Postman keine automatischen Encoding-Header wie `charset=UTF-8` anhängst, wenn der Server das nicht erwartet.)*
---
#### **3. Body (raw → XML)**
Wähle in Postman:
- Tab **Body**
- Option **raw**
- Format **XML**
- und füge den HAR-Body ein, z. B.:
```xml
<GetMap>
<SERVICE>WMS</SERVICE>
<VERSION>1.3.0</VERSION>
<REQUEST>GetMap</REQUEST>
<FORMAT>image/png; mode=32bit</FORMAT>
<TRANSPARENT>TRUE</TRANSPARENT>
<LAYERS>EB__GRUNDKARTE_ALKIS_NRW__SQD__FLURSTUECKSLINIE</LAYERS>
<CRS>EPSG:25832</CRS>
<BBOX>378063.7,5749881.5,378366.5,5750163.6</BBOX>
<WIDTH>512</WIDTH>
<HEIGHT>512</HEIGHT>
<STYLES></STYLES>
</GetMap>
```
*(Die genauen Layer- und BBOX-Parameter kannst du direkt aus dem HAR-Body übernehmen.)*
---
#### **4. Optionaler Test**
Wenn du in Postman auf **Send** klickst und die Antwort ein PNG-Bild ist, wird im unteren Bereich ein **Bild-Viewer** eingeblendet.
→ Das zeigt, dass dein GIS-WMS-Endpoint korrekt antwortet.
---
### 🧠 Ergänzende Hinweise
- **Falls der Server `405 Method Not Allowed` meldet**, kannst du den gleichen Request auch als **GET-Request mit URL-Parametern** aufbauen:
```
https://amsuite.swl-unser-stadtwerk.de/prime/server/GM2?
SERVICE=WMS&
VERSION=1.3.0&
REQUEST=GetMap&
FORMAT=image/png&
TRANSPARENT=TRUE&
LAYERS=EB__GRUNDKARTE_ALKIS_NRW__SQD__FLURSTUECKSLINIE&
CRS=EPSG:25832&
BBOX=378063.7,5749881.5,378366.5,5750163.6&
WIDTH=512&
HEIGHT=512&
STYLES=
```
- Wenn die Authentifizierung über Session-Cookies erfolgt, musst du sie aus der HAR-Datei in den Postman-Header `Cookie:` übernehmen.
---
Wenn du magst, kann ich dir den **kompletten Postman-Export (JSON)** generieren, den du direkt importieren kannst —
dazu bräuchte ich nur den kompletten Request-Block aus deiner `.har`-Datei (ohne Token natürlich).
Willst du, dass ich dir daraus ein fertiges Postman-JSON baue?
Detlef • 2025-10-31 10:16:34
Es hat alles nichts mit ExtraAttachmentsDir zu tun. Der Abruf einer GIS-Karte und deren Darstellung ist ein völlig eigenständiges Thema.
ChatGPT-4.0 • 2025-10-31 11:23:00
Ja, Detlef — absolut. Das ist sogar ein sehr typisches Szenario beim **Vendor De-Lock-In**, wenn Systeme (z. B. DMS, GIS, ERP) ihre Dateien im Container-Volume ablegen.
Du bist auf der richtigen Spur:
`/var/lib/docker/volumes/application_documents/_data/` ist mit sehr hoher Wahrscheinlichkeit der **Dateistore**, in dem die **binären Dokumente** liegen, die in der Datenbank nur noch als UUID referenziert werden.
---
## 🧩 1. Grundprinzip
Ein Docker-Volume ist letztlich nichts anderes als ein Verzeichnis auf dem Hostsystem.
Daher kannst du alle Dateien aus diesem Volume ganz **normal kopieren, zippen, mounten oder rsyncen** — es ist kein spezielles Format.
Beispiel:
```bash
cp -a /var/lib/docker/volumes/application_documents/_data /root/export_docs
```
Oder:
```bash
tar -czf /root/application_documents.tar.gz -C /var/lib/docker/volumes/application_documents/_data .
```
Das ist der direkte Weg, um **alle Dateien physisch zu sichern oder herauszuziehen**.
---
## 🧠 2. Was diese `.bin`-Dateien sind
Die UUID-ähnlichen Namen (`0765b1d5-c788-4671-b5cf-c372c8e55bd0.bin`) deuten darauf hin, dass das System **einen eigenen File-Storage-Layer** hat (z. B. Spring Boot FileService, Alfresco, OpenText, oder auch ein selbst gebautes Repository).
Die eigentlichen PDF-, PNG-, TIFF-, DOCX-, etc.-Dateien liegen dort **roh gespeichert**, eventuell mit:
- Header-Metadaten in der Datenbank (`file_type`, `mime_type`, `original_name`)
- und nur **die Binärdaten hier im Volume**.
---
## 🧪 3. Identifizierung des Dateityps
Du kannst den MIME-Typ ermitteln, um sicherzugehen, was sich hinter den `.bin`-Dateien verbirgt:
```bash
file /var/lib/docker/volumes/application_documents/_data/*.bin | head -n 20
```
Beispielausgabe:
```
0765b1d5-c788-4671-b5cf-c372c8e55bd0.bin: PDF document, version 1.7
0bce108f-4201-4cf3-907d-5d7e28746162.bin: PNG image data, 512 x 512, 8-bit/color RGBA, non-interlaced
1856cb04-160a-4075-82c2-842c1a8d1d00.bin: PDF document, version 1.4
```
Damit kannst du sie schon zielgerichtet umbenennen.
---
## 🧰 4. Automatische Umbenennung nach MIME-Typ
Wenn du sie extrahieren und nach Typ sortieren willst:
```bash
mkdir /root/export_pdf /root/export_img
for f in /var/lib/docker/volumes/application_documents/_data/*.bin; do
type=$(file --mime-type -b "$f")
case "$type" in
application/pdf)
mv "$f" "/root/export_pdf/$(basename ${f%.bin}).pdf"
;;
image/*)
mv "$f" "/root/export_img/$(basename ${f%.bin}).${type#image/}"
;;
esac
done
```
➡️ Das benennt PDFs und Bilder automatisch um und sortiert sie.
---
## 🗂️ 5. Wenn du auch Metadaten zuordnen willst
Die Datenbank (z. B. `application_files`, `document`, `attachment`, `file_storage`, `blob_data` oder ähnlich) enthält typischerweise Felder wie:
| id / uuid | mime_type | filename | entity_id | created_at |
|------------|------------|-----------|------------|-------------|
Dann kannst du diese Zuordnung wiederherstellen, z. B. mit:
```sql
SELECT id, filename, mime_type FROM file_storage ORDER BY created_at DESC;
```
und daraus per Bash-Skript:
```bash
while IFS=$'\t' read -r id name mime; do
ext=$(echo "$mime" | sed 's#.*/##')
cp "/var/lib/docker/volumes/application_documents/_data/${id}.bin" "/root/export/${name}.${ext}"
done < file_mapping.tsv
```
---
## ⚠️ 6. Rechte und Eigentümer
Falls du beim Kopieren auf `Permission denied` stößt:
```bash
sudo chmod -R a+r /var/lib/docker/volumes/application_documents/_data
```
oder:
```bash
sudo chown -R $USER:$USER /root/export_*
```
---
## ✅ Fazit
- Du kannst die Dateien **direkt aus dem Volume kopieren** – keine Docker-Tools nötig.
- Mit `file` erkennst du ihre Typen.
- Mit einem kleinen Skript kannst du sie **automatisch umbenennen und sortieren**.
- Wenn du Metadaten brauchst, hol sie aus der DB und **match die UUIDs**.
---
Wenn du möchtest, kann ich dir ein **komplettes Bash-Skript** schreiben, das:
1. das Volume rekursiv scannt,
2. den MIME-Typ erkennt,
3. sie mit Endung speichert,
4. und optional eine CSV-Datei (`uuid,filename,mimetype,filesize`) erzeugt.
Soll ich dir das Skript generieren?
Detlef • 2025-10-31 11:23:13
Es funktioniert. Besten Dank!
Noch eine andere Frage. Für einen Kunden führe ich grad ein Vendor-De-LockedIn durch. Bei der Datenbank bin ich bereits sehr erfolgreich gewesen.
Jetzt fehlen noch die PDF-Dokumente, Lagepläne, Flurkarten etc. pp.
Da alles auf Docker-Services basiert, vermute ich sie hier:
ls -la /var/lib/docker/volumes/application_documents/_data/
insgesamt 56716
drwxr-xr-x 3 root root 4096 30. Okt 08:32 .
drwx-----x 3 root root 4096 23. Okt 09:36 ..
-rw-r--r-- 1 root root 600862 28. Okt 14:11 0765b1d5-c788-4671-b5cf-c372c8e55bd0.bin
-rw-r--r-- 1 root root 6291456 30. Okt 08:32 0bce108f-4201-4cf3-907d-5d7e28746162.bin
-rw-r--r-- 1 root root 600862 29. Okt 15:04 164f7130-c3c6-4c98-aacf-a7dd7a62c06d.bin
-rw-r--r-- 1 root root 600862 29. Okt 15:04 1856cb04-160a-4075-82c2-842c1a8d1d00.bin
-rw-r--r-- 1 root root 600862 29. Okt 11:39 1f1d518f-4b76-40d3-aa40-68362115c6cb.bin
Kann man die Dokumente aus dem Docker-Volumen irgendwie extrahieren?
ChatGPT-4.0 • 2025-10-31 11:28:03
Sehr schön, Detlef — das ist ein klarer Befund ✅
Du hast also ein gemischtes Volume, in dem:
- etwa **80–90 % echte PNGs** liegen (vermutlich Screenshots, Kartenkacheln, Flurkarten, Lagepläne …),
- und ein kleiner Teil Dateien, die `file` nur als `data` erkennt (d. h. kein typischer Header → könnte PDF, ZIP, DOCX, GPKG oder Base64-Fragment sein).
Damit kannst du nun gezielt **extrahieren, umbenennen und prüfen**, was sich tatsächlich darin befindet.
---
### 🧰 Skriptvorschlag: automatisches Extrahieren + Sortieren
Das folgende Bash-Skript macht drei Dinge:
1. **erkennt den MIME-Typ** jeder Datei,
2. **ordnet sie in Unterordner** (`pdf`, `png`, `unknown`, …) ein,
3. **schreibt zusätzlich eine CSV-Liste** mit UUID, Typ und Dateigröße.
```bash
#!/bin/bash
SRC="/var/lib/docker/volumes/application_documents/_data"
DEST="/root/application_docs_extracted"
LOG="$DEST/file_index.csv"
mkdir -p "$DEST/png" "$DEST/pdf" "$DEST/unknown"
echo "uuid,detected_type,filesize_bytes" > "$LOG"
for f in "$SRC"/*.bin; do
uuid=$(basename "${f%.bin}")
mime=$(file --mime-type -b "$f")
size=$(stat -c%s "$f")
case "$mime" in
image/png)
cp "$f" "$DEST/png/${uuid}.png"
;;
application/pdf)
cp "$f" "$DEST/pdf/${uuid}.pdf"
;;
*)
cp "$f" "$DEST/unknown/${uuid}.bin"
;;
esac
echo "$uuid,$mime,$size" >> "$LOG"
done
echo "Fertig. Ergebnisse unter: $DEST"
```
Danach hast du z. B.:
```
/root/application_docs_extracted/
├── png/
├── pdf/
├── unknown/
└── file_index.csv
```
---
### 🧠 Was du mit den `data`-Dateien tun kannst
Für die Einträge, die `file` nur als „data“ meldet, kannst du eine zweite Runde laufen lassen:
```bash
for f in /root/application_docs_extracted/unknown/*.bin; do
head -c 4 "$f" | hexdump -C
done
```
→ Damit erkennst du an den Magic Bytes, ob sie evtl. PDFs (`%PDF`), ZIPs (`50 4B 03 04` → DOCX / XLSX / ODT) oder SQLite-DBs sind.
Du kannst sie bei Bedarf dann entsprechend umbenennen und erneut mit `file` prüfen.
---
### 🧩 Bonus: Metadaten-Abgleich
Falls du später aus der Datenbank UUID ↔ Dokumentenname wiederherstellen willst, kannst du die `file_index.csv` einfach mit dem Export aus deiner DB joinen (z. B. in `psql` oder `pandas`).
---
Möchtest du, dass ich dir das Skript so anpasse, dass es automatisch alle unbekannten Dateien anhand der Magic-Bytes (PDF, ZIP, JPG etc.) nacherkennt und korrekt umbenennt?
Dann würdest du am Ende **gar keine `.bin`-Reste mehr** haben.
Detlef • 2025-10-31 11:28:17
So sieht das aus!
file /var/lib/docker/volumes/application_documents/_data/*.bin | head -n 20
/var/lib/docker/volumes/application_documents/_data/0765b1d5-c788-4671-b5cf-c372c8e55bd0.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/0bce108f-4201-4cf3-907d-5d7e28746162.bin: data
/var/lib/docker/volumes/application_documents/_data/164f7130-c3c6-4c98-aacf-a7dd7a62c06d.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/1856cb04-160a-4075-82c2-842c1a8d1d00.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/1f1d518f-4b76-40d3-aa40-68362115c6cb.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/20f64902-8958-4662-91c5-c88f9e7d2ab1.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/28d99da4-01df-408b-84db-66a0c9c6eb0b.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/32b77e7a-3145-4176-b427-c8618fa3ab23.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/3ffb697e-e9b0-4763-b954-f5fd117ae438.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/40d8194d-9dbd-4d4b-b7f9-7ead230fded4.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/47d379c0-b908-4730-9f75-65818fe7648d.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/4d4ed8cb-e981-48ca-a981-24482f1169fd.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/5cac804c-5011-4603-aeee-ce283a71ecf7.bin: data
/var/lib/docker/volumes/application_documents/_data/71300b9d-a461-43ef-a602-0d1731589c95.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/7bfb55e3-6b2a-4f41-bb1f-9dcd17c3eef8.bin: data
/var/lib/docker/volumes/application_documents/_data/7e5947f8-9997-4d6e-a64d-a435ea73d7fc.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/8cfd5076-2667-4cdc-ae35-c5da82653970.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/8d0ca2ba-9461-4fb1-b030-7423efc36442.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
/var/lib/docker/volumes/application_documents/_data/8d6a650f-f426-4403-a340-1f6589611f36.bin: data
/var/lib/docker/volumes/application_documents/_data/8f02692d-16a9-44b7-89b8-dd3064297af6.bin: PNG image data, 1472 x 828, 8-bit/color RGB, non-interlaced
ChatGPT-4.0 • 2025-10-31 11:35:43
Perfekt, Detlef — das ist der entscheidende Missing Link 🔗
Du hast jetzt die vollständige Zuordnung zwischen
- der **Datei im Volume** (`external_key` → z. B. `6894e67e-3ef1-47a7-9e25-256c28b29a61.bin`),
- und dem **sprechenden Namen + Typ** (`file_name`, `file_extension`, `mimetype`) aus der Datenbank.
Damit kannst du jetzt **alle Dateien aus dem Docker-Volume automatisiert extrahieren, korrekt umbenennen und in ein sauberes Archiv überführen.**
---
## 🧰 **Bash-Skript: Volume-Extraktion mit DB-Mapping**
Dieses Skript geht davon aus, dass du die obige Tabelle als TSV- oder CSV-Export vorliegen hast, z. B.:
```
id creator date_created external_key external_system file_extension file_name file_size resized_image mimetype
8c210694-eae8-40a6-99fe-2b3938714d61 2024-09-30 06:27:30.253 6894e67e-3ef1-47a7-9e25-256c28b29a61.bin png DOCUMENT_9007_Atrios_Hintergrundbild.png 600.862 resized_image_6894e67e-3ef1-47a7-9e25-256c28b29a6.png image/png
...
```
Speichere das z. B. als `/root/documents_export.tsv`.
---
### 🧩 Skript: `extract_documents.sh`
```bash
#!/bin/bash
SRC="/var/lib/docker/volumes/application_documents/_data"
DEST="/root/application_docs_final"
MAP="/root/documents_export.tsv"
mkdir -p "$DEST"
# Überspringe Header-Zeile, Tab als Trenner
tail -n +2 "$MAP" | while IFS=$'\t' read -r id creator date_created external_key external_system file_extension file_name file_size resized_image mimetype; do
# Nur fortfahren, wenn Datei existiert
if [[ -f "$SRC/$external_key" ]]; then
ext="${file_extension,,}" # Kleinbuchstaben erzwingen
target="$DEST/${file_name}"
# Fallback: falls Dateiname leer
[[ -z "$file_name" ]] && target="$DEST/${external_key%.*}.${ext}"
# Falls Ziel schon existiert, UUID anhängen
if [[ -f "$target" ]]; then
base="${target%.*}"
target="${base}_${id}.${ext}"
fi
cp "$SRC/$external_key" "$target"
echo "✔ exportiert: $external_key → $target"
else
echo "⚠ fehlt: $external_key"
fi
done
```
---
### 🔧 Verwendung
```bash
chmod +x extract_documents.sh
./extract_documents.sh
```
Nach dem Lauf findest du in `/root/application_docs_final/` deine originalen Dokumente mit sprechenden Namen:
```
DOCUMENT_9007_Atrios_Hintergrundbild.png
DOCUMENT_9011_Atrios_Hintergrundbild.png
DOCUMENT_9017_Platzhalter.jpg
...
```
---
### 🧠 Tipps
- Wenn du keinen DB-Export machen willst: du kannst direkt aus `psql` exportieren:
```sql
\copy (SELECT * FROM prime_document_instances_main.documents) TO '/root/documents_export.tsv' WITH CSV HEADER DELIMITER E'\t';
```
- Falls einige `file_name` ungültige Zeichen enthalten (Leerzeichen, „/“ etc.), kannst du sie vorher per `sed` oder `awk` säubern.
- Wenn du auch Thumbnails brauchst (`resized_image`), kannst du das Skript um eine zweite Kopierzeile erweitern.
---
### ✅ Fazit
Du hast nun:
- den physikalischen Speicherort (`_data/`)
- die Metadaten aus der DB (`file_name`, `file_extension`)
- und ein Skript, das beides zusammenführt → **vollständiger Vendor-Lock-In-Ausbruch.**
---
Möchtest du, dass ich das Skript noch erweitere, damit es zusätzlich eine **Logdatei mit Erfolg/Misserfolg und MD5-Hashes** schreibt (zur Nachweisführung gegenüber dem Kunden)?
Das wäre ideal für ein revisionssicheres „De-Lock-In“-Protokoll.
Detlef • 2025-10-31 11:35:56
Das ist die DB-Struktur in der prime_document_instances_main.documents:
|id |creator|date_created |external_key |external_system|file_extension|file_name |file_size|resized_image |mimetype |
|------------------------------------|-------|-----------------------|----------------------------------------|---------------|--------------|-----------------------------------------|---------|-----------------------------------------------------|----------|
|8c210694-eae8-40a6-99fe-2b3938714d61| |2024-09-30 06:27:30.253|6894e67e-3ef1-47a7-9e25-256c28b29a61.bin| |png |DOCUMENT_9007_Atrios_Hintergrundbild.png |600.862 |resized_image_6894e67e-3ef1-47a7-9e25-256c28b29a6.png|image/png |
|55b1bd52-9df0-47d4-84a1-391c0cd0d2fd| |2024-09-30 06:27:30.248|229b6027-9b92-4fba-b809-1e7657c51409.bin| |png |DOCUMENT_OTHER_Atrios_Hintergrundbild.png|600.862 |resized_image_229b6027-9b92-4fba-b809-1e7657c5140.png|image/png |
|9df3bf4c-21d9-44ec-bfb8-1c42fbc9a475| |2024-09-30 08:41:38.212|047ab1c0-a04d-4704-a04d-30409fd2f803.bin| |png |DOCUMENT_8009_Atrios_Hintergrundbild.png |600.862 |resized_image_047ab1c0-a04d-4704-a04d-30409fd2f80.png|image/png |
|8a514902-024b-473e-8f75-6426567d6dd5| |2024-09-30 08:29:43.015|3b81c3d8-56cd-423d-a74a-35c3146fedab.bin| |jpg |DOCUMENT_9017_Platzhalter.jpg |397.207 |resized_image_3b81c3d8-56cd-423d-a74a-35c3146feda.png|image/jpeg|
|8be0fc78-8cb3-46c8-afa9-4544a55ba234| |2024-09-30 06:27:30.903|b243d764-b747-4ccc-91f5-3c91d54514c9.bin| |png |DOCUMENT_9009_Atrios_Hintergrundbild.png |600.862 |resized_image_b243d764-b747-4ccc-91f5-3c91d54514c.png|image/png |
|787fa12c-6b1d-4e25-a17c-50a866df72c8| |2024-09-30 06:27:30.905|b228ef39-c1bf-44d3-ad1c-d698761daa46.bin| |png |DOCUMENT_9008_Atrios_Hintergrundbild.png |600.862 |resized_image_b228ef39-c1bf-44d3-ad1c-d698761daa4.png|image/png |
|4beb5376-d882-45d7-ae97-19599aeb04bf| |2024-09-30 06:27:31.231|31ca21f0-f1a5-46da-ad7d-1a4fdb03d069.bin| |png |DOCUMENT_9011_Atrios_Hintergrundbild.png |600.862 |resized_image_31ca21f0-f1a5-46da-ad7d-1a4fdb03d06.png|image/png |
Detlef • 2025-10-31 13:10:47
Vielleicht können wir ja auch die API analysieren und dann die Dokumente in getrennten Ordnern downloaden.
ChatGPT-4.0 • 2025-10-31 13:10:47
Sehr gute Idee, Detlef! 💡
Wenn du die **API-Logik nachvollziehen kannst** – entweder über:
1. **HAR-Dateien** (Browser-Export der Netzwerkanfragen), oder
2. **Sourcecode (z. B. JavaScript im Frontend)**,
3. **Netzwerk-Mitschnitt (z. B. mit `mitmproxy`)**,
4. **Swagger/OpenAPI-Dokumentation**,
5. **Postman-Collection**,
6. **Reverse Engineering eines API-Aufrufs mit curl oder Postman**
… dann kannst du die Dokumente **automatisiert per API abrufen**, korrekt benennen und z. B. nach Typ in **getrennte Ordner** schreiben:
---
## 🔍 Vorgehen: API-gestützter Dokumenten-Download
### 🔁 API-Analyse: Was wir brauchen
- **Download-Endpunkt**, z. B.:
```
GET /documents/download/{uuid}
GET /documents/{id}/file
```
- Möglicherweise brauchst du:
- Bearer-Token / Auth-Cookie
- Header wie `Accept: image/png` oder `application/octet-stream`
- Parameter wie `?thumbnail=false`
- Einen `Referer`- oder `Origin`-Header
- Du hattest eine HAR-Datei erwähnt — wenn du sie mir gibst, kann ich dir sagen:
- welcher Request den Download triggert,
- wie die Header, Query-Parameter und Pfade aussehen,
- und wie du **diesen Request in Postman oder Python automatisieren kannst.**
---
### 📁 Zielstruktur (Beispiel)
Wenn du nach Dateityp, Entität oder Dokumentenkategorie trennen willst:
```plaintext
/export/
├── png/
│ ├── DOCUMENT_9007_Atrios_Hintergrundbild.png
│ └── ...
├── jpg/
│ ├── DOCUMENT_9017_Platzhalter.jpg
│ └── ...
```
Oder nach deiner internen Logik, z. B. `Hintergrundbilder/`, `Platzhalter/`, `Logos/` …
---
### 🧪 Beispiel: API-Aufruf in Postman
Wenn du weißt, dass der Download über einen GET-Endpunkt wie diesen läuft:
```http
GET https://yourserver/api/v1/documents/6894e67e-3ef1-47a7-9e25-256c28b29a61.bin
```
Dann kannst du in **Postman**:
- **Methode:** `GET`
- **URL:**
```
https://yourserver/api/v1/documents/{{external_key}}
```
- **Headers:**
```
Authorization: Bearer <dein_token>
Accept: image/png
```
- **Pre-request Script:** um `{{external_key}}` aus einer Collection zu setzen
- **Tests:** zum Speichern als Datei (in Kombination mit Postman Runner & Newman)
---
### 🐍 Bonus: Python-Skript zum Download
Wenn du alle `external_key`, `file_name` etc. aus der DB hast:
```python
import os
import requests
import pandas as pd
df = pd.read_csv("documents_export.tsv", sep="\t")
os.makedirs("downloaded", exist_ok=True)
for _, row in df.iterrows():
url = f"https://yourserver/api/v1/documents/{row['external_key']}"
headers = {
"Authorization": "Bearer YOUR_TOKEN",
"Accept": row['mimetype']
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
ext_folder = row['file_extension'].lower()
os.makedirs(f"downloaded/{ext_folder}", exist_ok=True)
target = f"downloaded/{ext_folder}/{row['file_name']}"
with open(target, "wb") as f:
f.write(response.content)
print(f"✔ Downloaded: {target}")
else:
print(f"⚠ Failed: {url} ({response.status_code})")
```
---
### 📦 Was ich von dir brauche:
Wenn du willst, dass ich den **exakten API-Aufruf reverse-engineere**:
🟢 **Bitte lade deine `.har`-Datei hoch**, oder
🟢 sende den vollständigen API-Request (aus Browser DevTools oder Postman), inklusive:
- URL
- HTTP-Methode
- Headers
- Query-Parameter (falls vorhanden)
- Response-Code
Dann sage ich dir:
✅ Wie du es in **Postman** einrichtest
✅ Wie du es in **Python** skriptest
✅ Wie du strukturierte Downloads in Ordner machst
---
Soll ich dir schon mal ein Download-Template für Postman oder Python bauen, bevor du die HAR hochlädst?