From 9709573870c6ebe3f94b2412b8f100e908f569fc Mon Sep 17 00:00:00 2001 From: kang Date: Wed, 1 Apr 2026 09:04:04 +0800 Subject: [PATCH] auto-save 2026-04-01 09:03 (+8, ~2) --- .env.example | 10 + .gitignore | 4 + .memory/project-status.md | 77 ++++ RULES.md | 44 ++- .../.gradle/8.5/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.5/checksums/md5-checksums.bin | Bin 0 -> 29547 bytes .../.gradle/8.5/checksums/sha1-checksums.bin | Bin 0 -> 73355 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../8.5/dependencies-accessors/gc.properties | 0 .../.gradle/8.5/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.5/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes android-ocr-service/.gradle/8.5/gc.properties | 0 .../.gradle/8.7/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.7/checksums/md5-checksums.bin | Bin 0 -> 21647 bytes .../.gradle/8.7/checksums/sha1-checksums.bin | Bin 0 -> 27785 bytes .../8.7/dependencies-accessors/gc.properties | 0 .../8.7/executionHistory/executionHistory.bin | Bin 0 -> 574341 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/8.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.7/fileHashes/fileHashes.bin | Bin 0 -> 69015 bytes .../.gradle/8.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 0 -> 19007 bytes android-ocr-service/.gradle/8.7/gc.properties | 0 .../.gradle/9.4.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/9.4.1/checksums/md5-checksums.bin | Bin 0 -> 29847 bytes .../9.4.1/checksums/sha1-checksums.bin | Bin 0 -> 45065 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 19723 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/9.4.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/9.4.1/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .../.gradle/9.4.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../.gradle/9.4.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 22025 bytes android-ocr-service/.gradle/file-system.probe | Bin 0 -> 8 bytes .../.gradle/vcs-1/gc.properties | 0 android-ocr-service/app/build.gradle.kts | 43 +++ .../app/src/main/AndroidManifest.xml | 28 ++ .../java/com/guiagent/ocr/MainActivity.kt | 23 ++ .../main/java/com/guiagent/ocr/OcrEngine.kt | 79 ++++ .../java/com/guiagent/ocr/OcrHttpServer.kt | 88 +++++ .../main/java/com/guiagent/ocr/OcrService.kt | 49 +++ .../app/src/main/res/values/strings.xml | 4 + android-ocr-service/build.gradle.kts | 4 + android-ocr-service/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 48966 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + android-ocr-service/gradlew | 249 ++++++++++++ android-ocr-service/gradlew.bat | 92 +++++ android-ocr-service/settings.gradle.kts | 18 + config/__init__.py | 3 + config/settings.py | 30 ++ requirements.txt | 15 + scripts/test_device.py | 38 ++ scripts/test_ocr_grounding.py | 149 ++++++++ src/__init__.py | 0 src/capture/__init__.py | 3 + src/capture/adb_capture.py | 118 ++++++ src/executor/__init__.py | 3 + src/executor/adb_executor.py | 109 ++++++ src/grounding/__init__.py | 3 + src/grounding/ocr_grounding.py | 354 ++++++++++++++++++ src/main.py | 122 ++++++ src/planner/__init__.py | 3 + src/planner/agent_loop.py | 200 ++++++++++ src/verifier/__init__.py | 0 src/vision/__init__.py | 3 + src/vision/vlm_client.py | 171 +++++++++ web/templates/index.html | 192 ++++++++++ 70 files changed, 2331 insertions(+), 9 deletions(-) create mode 100644 .env.example create mode 100644 .memory/project-status.md create mode 100644 android-ocr-service/.gradle/8.5/checksums/checksums.lock create mode 100644 android-ocr-service/.gradle/8.5/checksums/md5-checksums.bin create mode 100644 android-ocr-service/.gradle/8.5/checksums/sha1-checksums.bin create mode 100644 android-ocr-service/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock create mode 100644 android-ocr-service/.gradle/8.5/dependencies-accessors/gc.properties create mode 100644 android-ocr-service/.gradle/8.5/fileChanges/last-build.bin create mode 100644 android-ocr-service/.gradle/8.5/fileHashes/fileHashes.lock create mode 100644 android-ocr-service/.gradle/8.5/gc.properties create mode 100644 android-ocr-service/.gradle/8.7/checksums/checksums.lock create mode 100644 android-ocr-service/.gradle/8.7/checksums/md5-checksums.bin create mode 100644 android-ocr-service/.gradle/8.7/checksums/sha1-checksums.bin create mode 100644 android-ocr-service/.gradle/8.7/dependencies-accessors/gc.properties create mode 100644 android-ocr-service/.gradle/8.7/executionHistory/executionHistory.bin create mode 100644 android-ocr-service/.gradle/8.7/executionHistory/executionHistory.lock create mode 100644 android-ocr-service/.gradle/8.7/fileChanges/last-build.bin create mode 100644 android-ocr-service/.gradle/8.7/fileHashes/fileHashes.bin create mode 100644 android-ocr-service/.gradle/8.7/fileHashes/fileHashes.lock create mode 100644 android-ocr-service/.gradle/8.7/fileHashes/resourceHashesCache.bin create mode 100644 android-ocr-service/.gradle/8.7/gc.properties create mode 100644 android-ocr-service/.gradle/9.4.1/checksums/checksums.lock create mode 100644 android-ocr-service/.gradle/9.4.1/checksums/md5-checksums.bin create mode 100644 android-ocr-service/.gradle/9.4.1/checksums/sha1-checksums.bin create mode 100644 android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.bin create mode 100644 android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.lock create mode 100644 android-ocr-service/.gradle/9.4.1/fileChanges/last-build.bin create mode 100644 android-ocr-service/.gradle/9.4.1/fileHashes/fileHashes.bin create mode 100644 android-ocr-service/.gradle/9.4.1/fileHashes/fileHashes.lock create mode 100644 android-ocr-service/.gradle/9.4.1/gc.properties create mode 100644 android-ocr-service/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 android-ocr-service/.gradle/buildOutputCleanup/cache.properties create mode 100644 android-ocr-service/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 android-ocr-service/.gradle/file-system.probe create mode 100644 android-ocr-service/.gradle/vcs-1/gc.properties create mode 100644 android-ocr-service/app/build.gradle.kts create mode 100644 android-ocr-service/app/src/main/AndroidManifest.xml create mode 100644 android-ocr-service/app/src/main/java/com/guiagent/ocr/MainActivity.kt create mode 100644 android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrEngine.kt create mode 100644 android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrHttpServer.kt create mode 100644 android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrService.kt create mode 100644 android-ocr-service/app/src/main/res/values/strings.xml create mode 100644 android-ocr-service/build.gradle.kts create mode 100644 android-ocr-service/gradle.properties create mode 100644 android-ocr-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 android-ocr-service/gradle/wrapper/gradle-wrapper.properties create mode 100755 android-ocr-service/gradlew create mode 100644 android-ocr-service/gradlew.bat create mode 100644 android-ocr-service/settings.gradle.kts create mode 100644 config/__init__.py create mode 100644 config/settings.py create mode 100644 requirements.txt create mode 100644 scripts/test_device.py create mode 100644 scripts/test_ocr_grounding.py create mode 100644 src/__init__.py create mode 100644 src/capture/__init__.py create mode 100644 src/capture/adb_capture.py create mode 100644 src/executor/__init__.py create mode 100644 src/executor/adb_executor.py create mode 100644 src/grounding/__init__.py create mode 100644 src/grounding/ocr_grounding.py create mode 100644 src/main.py create mode 100644 src/planner/__init__.py create mode 100644 src/planner/agent_loop.py create mode 100644 src/verifier/__init__.py create mode 100644 src/vision/__init__.py create mode 100644 src/vision/vlm_client.py create mode 100644 web/templates/index.html diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b3a9d10 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +# Device +DEVICE_SERIAL= # leave empty for auto-detect + +# VLM Provider: poe / openrouter / local +VLM_PROVIDER=poe +VLM_MODEL=Qwen/Qwen2.5-VL-7B-Instruct + +# API Keys (fill the one matching your provider) +POE_API_KEY= +OPENROUTER_API_KEY= diff --git a/.gitignore b/.gitignore index dd31b51..21a5631 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,7 @@ __pycache__/ .vscode/ .idea/ *.log +data/screenshots/ +*.egg-info/ +.venv/ +venv/ diff --git a/.memory/project-status.md b/.memory/project-status.md new file mode 100644 index 0000000..19a24f7 --- /dev/null +++ b/.memory/project-status.md @@ -0,0 +1,77 @@ +--- +name: GUI Agent 项目状态 +description: 手机GUI Agent项目当前进度、技术决策和待确认事项 +type: project +--- + +## 项目状态:端到端已跑通 + 手机端 OCR 已部署 + +### 设备信息 +- **华为 P40 Pro**(ELS-AN00) +- 序列号:UQG5T20416000119 +- 分辨率:1200x2640 +- 系统:HarmonyOS 4.x(兼容安卓层,ADB 可用) +- ADB 路径:`/opt/homebrew/bin/adb` +- 连接注意:华为手机需在开发者选项中额外打开"仅充电模式下允许ADB调试" +- **已开启「通过USB安装应用」权限**(2026-03-29) + +### 已完成 +- 七层管线骨架代码(L1-L7)全部就位 +- Web 控制台(FastAPI + 暗色主题 UI)已验证可运行 +- 端口 4380,VLM 默认走 Poe API +- 支持 8 种动作类型(tap/swipe/type/long_press/back/home/scroll/wait) +- Agent 主循环含历史记忆(最近 5 步)和连续错误自动停止 +- **ADB 截屏已验证通过**(2026-03-29) +- **Mac 端 OCR 元素定位已验证**(2026-03-29)— easyocr 中文识别,返回像素坐标 +- **中文文本输入已验证**(2026-03-29)— uiautomator2 send_keys +- **端到端发微信消息已跑通 3 次**(2026-03-29)— "你是大聪明"、"祝你生日快乐"、"生日快乐" +- **手机端 OCR Service APK 已部署**(2026-03-29)— ML Kit Chinese bundled,端口 18900 + +### 手机端 OCR Service(android-ocr-service/) +- **引擎**:Google ML Kit text-recognition-chinese(bundled 版,不依赖 GMS,华为可用) +- **架构**:Kotlin APK = OcrEngine + NanoHTTPD(18900) + ForegroundService +- **接口**: + - `GET /health` — 健康检查 + - `GET /ocr?path=/data/local/tmp/s.png` — 读文件 OCR + - `GET /ocr?path=...&text=微信` — 按文本过滤 + - `POST /snap` — POST 图片字节直接 OCR(NanoHTTPD 二进制处理有 bug,待修) +- **使用流程**: + ```bash + adb shell am start -n com.guiagent.ocr/.MainActivity + adb forward tcp:18900 tcp:18900 + adb shell "screencap -p /data/local/tmp/s.png" + curl http://localhost:18900/ocr?path=/data/local/tmp/s.png + ``` +- **性能**:首次 ~2.4s(模型加载),后续 ~1.8s/次 +- **构建**:`ANDROID_HOME=/opt/homebrew/share/android-commandlinetools JAVA_HOME=/opt/homebrew/Cellar/openjdk@21/21.0.10/libexec/openjdk.jdk/Contents/Home ./gradlew assembleDebug` + +### 关键技术决策 +| 能力 | 方案 | 备注 | +|------|------|------| +| 元素定位(Mac) | easyocr | pytesseract 中文分词差,uiautomator dump 在华为微信上返回空 | +| 元素定位(手机端) | ML Kit Chinese (bundled) | 不依赖 GMS/HMS,APK 自带模型 | +| 中文输入 | uiautomator2 send_keys | 需装辅助 APK,华为需开 USB 安装权限 | +| 截屏 | `adb shell screencap -p /data/local/tmp/s.png` | 不经 FUSE,比 /sdcard/ 快 | +| adb input text | 不支持中文 | NullPointerException,clipboard 也不可用 | +| 截屏显示 | 必须 sips -Z 1800 缩小 | 原始 1200x2640 超 Claude 2000px 限制 | + +### 已知问题 +1. OCR 偶尔误读("康"→"東")— ML Kit 和 easyocr 都有此问题 +2. POST /snap 端点 NanoHTTPD 二进制 body 解析 bug — 文件方式 workaround +3. 微信双开弹选择框 — 每次 am start 会弹"使用以下方式打开" +4. 发送按钮白字绿底 OCR 不稳定 — 用坐标 (1008, 2425) 或 OCR "(田发送" + +### 下一步(周一继续) +1. **速度优化**:发送按钮固定坐标不走 OCR(省2s),缩短 sleep(省2s),目标 5-6s/操作 +2. **OCR 推理优化**:缩图再识别 / NNAPI 加速,目标 <1s +3. **集成到 Agent 主循环**:device OCR 引擎接入 ocr_grounding.py +4. 配置 .env(Poe API Key) +5. 接入 VLM(Poe API 调 Qwen2.5-VL)— 复杂场景屏幕理解 +6. 端到端跑通复杂多步任务(滑动、长按、跨 App) +7. 完善验证纠错层 + +### 技术背景 +项目灵感来自对字节 UI-TARS / 豆包手机的深度调研。结论: +- UI-TARS 开源的是权重+推理壳,训练代码和系统级操控完全闭源 +- 核心壁垒不是模型,是"截屏→理解→定位→规划→执行→验证"的全链路 +- 本项目目标:用开源 VLM + ADB 复现这个全链路 diff --git a/RULES.md b/RULES.md index 5fca6dc..3acd2a4 100644 --- a/RULES.md +++ b/RULES.md @@ -1,17 +1,43 @@ # 手机 GUI Agent 自动操控 -## 启动 -- `待补充` — 端口 4380 +## 架构 -## 部署 -- 平台:待定 -- 域名:待定 +七层管线闭环:截屏 → 理解 → 定位 → 规划 → 执行 → 验证 → 循环 + +``` +src/ +├── capture/ # L1 - ADB/scrcpy 截屏 +├── vision/ # L2 - VLM 屏幕理解 +├── grounding/ # L3 - 元素定位(自然语言→坐标) +├── planner/ # L4 - 任务规划与分解 +├── executor/ # L5 - ADB 动作执行 +└── verifier/ # L6+L7 - 验证纠错 + 状态记忆 +``` + +## 启动 + +- `python -m src.main` — 主服务,端口 4380 +- `python scripts/test_device.py` — 测试 ADB 连接 + +## 技术栈 + +- Python 3.11+ +- ADB + scrcpy(截屏与操控) +- Qwen2.5-VL / UI-TARS-1.5(视觉理解) +- FastAPI(Web 控制台) +- Poe API / OpenRouter(LLM 调用,按用户偏好) ## 环境变量 -- 待补充 + +- `DEVICE_SERIAL` — Android 设备序列号(adb devices 查看) +- `VLM_PROVIDER` — vlm 提供者:`local` / `poe` / `openrouter` +- `VLM_MODEL` — 模型名,默认 `Qwen/Qwen2.5-VL-7B-Instruct` +- `POE_API_KEY` — Poe API Key(VLM_PROVIDER=poe 时必填) +- `OPENROUTER_API_KEY` — OpenRouter Key(备用) ## 规则 -- 待补充 -## 注意事项 -- 待补充 +- 截屏用 adb exec-out screencap,不用 scrcpy 录屏流(省资源) +- 动作执行后必须等待 + 重新截屏验证 +- 所有截屏保存到 `data/screenshots/` 供调试 +- 坐标系统统一为百分比 (0-1),执行时再转设备像素 diff --git a/android-ocr-service/.gradle/8.5/checksums/checksums.lock b/android-ocr-service/.gradle/8.5/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..16a1cc85114bbaa1df438d411b851a4b99d51254 GIT binary patch literal 17 VcmZQJWQx3B{Wo(90~j!i001t|1RDSV literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.5/checksums/md5-checksums.bin b/android-ocr-service/.gradle/8.5/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdaea172098a1d2edf55e2b45d383c22c41c6f63 GIT binary patch literal 29547 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 ul=582&`gO2V?rUR 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

  • !^Q^R46 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 literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock b/android-ocr-service/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..af9bf9c2715256425813679b596db08eff087d35 GIT binary patch literal 17 TcmZQRBpS+gNaBMl0~7!ND1ZY+ literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.5/dependencies-accessors/gc.properties b/android-ocr-service/.gradle/8.5/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android-ocr-service/.gradle/8.5/fileChanges/last-build.bin b/android-ocr-service/.gradle/8.5/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.5/fileHashes/fileHashes.lock b/android-ocr-service/.gradle/8.5/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..4010d3978d4fb85e69c7893489989701909235e7 GIT binary patch literal 17 ScmZSfxNTRXQ?}WT0SW*smjiSF literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.5/gc.properties b/android-ocr-service/.gradle/8.5/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android-ocr-service/.gradle/8.7/checksums/checksums.lock b/android-ocr-service/.gradle/8.7/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..9c43c0c4e5ef3a529df72740fc377e8026dab8d8 GIT binary patch literal 17 UcmZR6bX}G~ZSTuZ3=r@h067H(hX4Qo literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/checksums/md5-checksums.bin b/android-ocr-service/.gradle/8.7/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..5cb020e21a186fad31225929bc6a8304b50228f2 GIT binary patch literal 21647 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 K2qyVWS?xb>F&~lu literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/checksums/sha1-checksums.bin b/android-ocr-service/.gradle/8.7/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..e5d9d852b6b571c4cb3547a48f1911df20280c3b GIT binary patch literal 27785 zcmeI4c{Ei~!^W?9o=ZsPsDvaUsU-6}&-0WhWX@QWgpwhNRE7{GbBGcR3ME8juE>z7 z3>CfS+}T)i>~r=$w{ts!!EiADMhfP?W#fN;CH_WC zfS3R=0b&Bg1c(U`6Cfr)On{gGF#%!%!~}>55ECFKKumy`05Jh#0>lJ}3H*Oaz!(|` zEf@^PPEz<6rT`3P7d`Y#QIyH&OUbOUn&7YX#?XI1h^px85lFbB2)KhA%FmwAsd?D9 zvH_HUL z`3lM}@Qg)q9{+p=a4jX2$6gx_R^swL0=Vrk%HtGcNupebrU199!tsor>l8ag!T{G} zLV0}dY+kjsW+&k0jVMpZ^iX}`7mCDZ>4W19(Pkp0PhNof>Ss}&R7_4kcGPjaiRr*uB2i%Yh#~(99q?bx61Aa6b<#*2RIDPi< z#Z|yv+)-XQtd$fl_HhMiUjpTK545G5DZU&8-0?1sd+VQf$DHpo0DiJ;QBEruYS5uA>OJu3vlOVl-I;1zYpHqjLc_u z+0d9K`t^d-%-q6#Q3duod zJIdcsD~{4*+#^7J!#p;{^$F$ke!j~qi~IOM{iB;vzDP@9!A?hutW)OvC|`b&7A+Z?%?|3jr)MBF8Jn9AnlulqnwemTJYhuVg#KREf95TmdEUqe_1?^Zr#qrD-r)RPQ*?_y; zLOJJC_tCS3L0w4wpE%z0jrWoy>2`#hEKMRA$64sd%*luH)Qy2ZSlpak5|6UVEKq^e?Le*>g*^PLRX_?x={iBO_TqQuLuGA8>cvdMA^S;&A6&tBp7w;(u|I;9FKu-{v~X45?MB-PCC8gceH8yb!1hipn`s$o$Lcit7e{Ku zOdi*ho&oiZSWvFKwOM^omVK= zG`hxHC#H|IW4{&U+QJIryiv`QpuWj#l}&x-fo1K3c@ljjYQS&S-s;HY3Y)rc@PB-yjvo zJF*ujN*LMt#7I%5c2bTZZLbu?*n4$5C$6Sy=!5+&5%@?uN_Xw&g3Q z57QYgP~UD7THh{iL(_}%J0YpWZW9$NwK`U&NJ;y0G5mS)QVx6?+sf9J>KtX4bZdeMJ`@&L(L zXY+cNS)?5$lm`lvva0h6BKf=F_LG5LLX>OyM#wz3tH#wI(d*bv5{}&Gb#Xa_*xkx8 z((rl*+SkRc`yq*;5$Rc$=(yC;c0y+CmHk5nk^QsvC6tHWORTq|(m}Z8Aj;977!0!{ z@E{(E2@n$?CO}Mpm;f;WVgkejhzSrAASOUefS3R=0b&Bg1c(U`6Cfr)On{gGF#%!% z!~}>55ECFKKumy`05O68%OzTY;Z4iXh|zqe4x3p6@wwU zE}a*12&w=T3Oneq`%e{hMPORFc8t%OyJgWX3-0>l-~{NMQ&<&?yqiMDOQ@P(X!?F@ zccFA;lVw$n{4Hb85#i536*mCYhKkG@bing^*QE6({?ftpsc~jj_P)=?QqIqy_fKK3 zqzzaR*S;b`l|NV6{$*RT>@4M!;c8*I9`REtPC#`<6|0imAw;MWUer+wXh^&p$|pi$ z-xN9`qtOd}Cjj;ugCm0qH63)o>*4xTq|xU2=O!e4Ep}^(ncZ__PwZ`G0$vly`+{`v z`!;x93)YG$Wy*@+_KW>c5jX_$(Mv1p$>b{Kglam&${@vz4?W zt~8eCSnTD^OvA2pLhnaI8Qxq~11i=YLe=`bF1pq+?vi^LAu*Q3!PwSrK3Md~2=s6| z1$a@85qhmpwdbXe%n8wNgI4a(^ra={PNbS8L+>lWb7Q(1c>Qh8uTS-KI`5!OH(NCQ zg!i`4(4Zp^f+L}Kps-%Gz>DE8<656eB0$kezuGjdnA-IhUGlWV)^67~z-tzHFN#8z zFvIn!_}}Pt*h`;$zr#YUfhUAlVRdi558`D5#zpyy&`V7)aOm0iSFP=CZ{zH*JvzB5 zs?Z)$*&-?zLe;OFnJf*)Dn{)fLpTcYa%QlR(FuwJ?#4YCJ>X{=9m(AVFl-ZiE%_I2ry%b}co450?d zJe>0YUbIStUL;-LCk=$Q>X=_h%4n+^+L!l)26{si+e1V}eU?!5FTKKpa)N35Z=K}I ze#F;%@41>y#exLr;k+pr7yV!EQPqzV+&;(5#d!8`yDui@r?9K5^!}+LyGb~%2Pqs^ zS0#8S#V0}-E{UuxmD`?z&J&!*ygBe9%OO<#@AuH#BK3mqp2G|qHAB92ILeEAvX^xt z<8lP!qR=KB*ZNdhq?dnEvJKu1-7LbCu=sw-|I8FM;)Tp8@^C`0+gIk8swIWE>4O!b zFMX=qlolT~kEaSDRQ*dYksz9v3$}aW4@EpJkmvlQccqQG8}#toFvyTJi?E05Q>pVG z_hx^iR}<*{K`5VZA@!tufHmR;?ZV(f1;5XXcaK`1%ENl`Os)R=Z)0!2jDKXSSr*DT z4DHq6Iscs;YlR^{N$9mc6;H#e8%LiYy{7o3AAw6k!r_&>;}EYez>8uFq1XCUhm?hv zFYXKbK|a@<;5*nr`#Zt@EAU#{^?!S@VyLxcPtqS-+N{eLY+#-Jt{C+*qGVa|4IVHL1kn zF)!t1%Y3id#toNT!MIl7^8^*@8_)sI%e|LPkgPaD_{7p;&$v4k>yl^uwm(%&@D2h` z^)J0_m+74-PuA3YQ@*-4bz-KGS+l(u>7h70D(Fed3_9TTFfuMsuI2b*m#4Y*2R^+z znWfo=g+Eoa>V&F)=`|wtymyRQRL@!1VOr<>)QL}4K9Qh@KTgA=!eB_@_u=uzwLX

    C=W#-r!E^rSF{~Aa!jRBweJa5!yD^vZGNZ-WpJk}~zl^D7 z54QlXU&tPS@-J)3N&;(kA@i!8#yQD5`CVJ@92vCE#Z!3^_V8bNT{&|xx%L)k?<39M zX$OPme<(}y`~W>%Ma~!1N5UT7@$-NE^M!M)-vvz@rij5Nom0!mYK~LEs|4OzUhP|r zEVkM)dtPIoOaWI9i$ZV*w3mU;7f!`Xs9IkSy=A;ZZL9PbsK2Zf&0Fxs^rSw6&d(oS zp9sDF<+u(j3ka5VdN9h*KMNPIKhox8yct@7{^%j}*$RG!>l>HS@eQ*TWaTVMT=cS^ zWMXrsG^o|W=mp4luo)qmBcQ)me(`0`}o}|{!Lp_7a-+EYFa?94ltxv1z z0Oypr>*t>VdZc^6xNs^bNQyT%{-xI}88b<NW2l0?HD;PpEdP7uoQFP}NAPgNCbGvSq?c2Q=w^Ht35 z+6q5^b?EQ5EL3Zd#>dM&0c zNpB0VDb=0SzAS0Aol<4jVd!%xcwA&L*m03;6(j6nZKXAf-Io5h(LAG3)z)is`YG3- zr)pS5o{m+KZ-&1)h?ho@NA8QN+iR?QUaCiO2X4@KX3bXwR1_mv6{REe)Qzu_vL9J= z7raU}GS#b|F~)tE{fIr7^ZAs}XO>W*+*eJg+Ain4naSkn!E3FztzHEAQ&U(JkOD7C zXcq<*>W_B`RaCwbOJq$uE(U%qsZe`SI6F^D0?G?Z8s z#Y^}}5idiFgOXyq=1c~tO8VnjBP$fT-CqU*FB*TWYKuSo+>EE9JG7W}@3ij8_AxH& z#Sg5JkLkNmFZet`8$Cw>LX~}%)5;a{6BIYjr){8My2si zFn9P&*Mpj%yU-pKtAciXaIt(19q_#Ton$S-59*Dem&37y8lozP|-1BMVO*` zLe+)k%C^V7XP;2LIj}K`kxJmza~@An0^AHgu8DCD(VYynjCZ?P)cXOK6( zSNl7y=G`%z5^~QH3}ckTXD-YLgFALUBfR^E8VFM&R24OR7>U~;HuQ2(b>-mK)=K(T z6J6lN=#5oj*q8`amy6nbhG;ic2rasWd&nluJeb%6J$=GwnejJJ1(^`4f>-F<`^`^r zbB8!Y6sQ>1xniup0TmPcv<8(}*b^_qTq>9F4cK;n=CFW#jUkBwbmhZdOxjox z#@d)rMKv%fzj#fis32)TpUZ_q&$QzxlsHy(8L0e*2vrjzU&b=8G1U*|^wodwZjGm5?amcJKB_vD|VF#GyX(W$TN`;wEw_YIc<9C-(<$- zYx4feWi35(o^Xv8Aw&i5GoZo+J>lc48oa1l>G6nC_s7*R#Q8Vp9L z8#>_i@M(SKU`7F(g^IOc(v1_LjNB`9iiqkgR)pE;NT}i}**Vd#zH*3ic#1Lihkg|a zdj|9!YdAv|cAzSQW;4DQSIF0>@`DA^f}2S^DV6|K%l(4lvgQ(zH3zhA*&;f5;F3d{G&GbD_RxRFk+H7TRe%7Eib2!GdXb`LZQooQ zzf2WrXs%;b&=mt0h1<{puZJRg7Puq%$M=7(r0{B24frM1A`bn339yQ-4lBZNT_sfQ z31v}C$uIZ#WW#&SFIDSyblx)fv?qUi2UfLa0Ik#bUVRfI3?8Xfsuh{vf{(urpu2UO z3F;B-wF?;+8T3?uuOf9dv3_8<<(8UE;z(GDwfy0mPX&ne~XB-`+2M|uNLnGRxA7;^Z$ z;mxS^sfMk-8L^a0eu>UyF%aLUM;n^ZKl`X3xI z9l{rKOp$xM4AtDCvHruRQQ`n14KHJ>x8$O}~d(0&Row2 zZR5E`M1@=_o&1EV6>4vRkPmM>JJ()Od)_<{p6yqIWEcV6KcGUo_Ls9fmd30WN2_Ra zJySTHvn=f%tz=~$@QNtKswjT_Wn9P9LUbzV+d9gJ+~Xo5Sv5?1IJ6Me09Hj7;S2r5 zJ72?3WPj)-QD^xF&1}Bf%I~-;;*JBnSSprA%kL@Y7(f?cuq z-g}D$Y!U1od;BdNw>xu`gYU=eO#XlJdKqDTZg%E<&pgjF&&=-A(ax?K`8DT1JM({n z?7tju+_SS&&SZYBmvg=NuVMnl1d0h16DTH7OrV%RF@a(N#RQ586cZ>WP)wkhKrw-0 z0>uQ12^143CQwY^KTe=G)BiH&F;r`5pY?-Ngq@vhIp&83bFR{7FD{wpmi^Bqp9ER< z4;K7-Y1#BIf8Ec%Ucx`ga($6#=Yjo|(tgjr?$Bkm<@%BpyEC`6p=M`aFV*k4<@z$g z#pKx=&R)pAE_f=oT;KdxxZsUj*D>aHV&W~=cXV%8Pr2q;PJgH=mh1aZ*)P4{WfYMu zZ`bv#<@(twl}8ScFFTffok(kHxqeRKC}}n4=X2TDOY|tiUcV=`>+y2-qwMQ~jNX>( zx0X)RCUim+V2Q+wj`%Jp7dG`HjVp1r(9&n{5EB2+oR^|Cx5nFe^qPBv<8n#sm<*-53^i<(`jSk>syCQW?v`% z%CKDj=>6eTbW86~+1E>UuWY$qX3pe<(2&0$WM41UC&Y5SviS4&!>>GX&%W-^Inr{y zibG1Rwk`Lx%f4P>J*3UW|6e!LHL~SP{P?})dc?%%4|+Rm+nBF+xM;aP+-{!NoDojZ z=Ia3!EY~f6+u0HQvj464f5ilf2^143CQwYEm_RXsVgkhkiU|}GC?-%$pqM~0fnoy1 z1d0h16DTH7OrV%RF@a(N#RQ586cZ>WP)wkhKrw-00>uQ12^143CQwYEm_RXsVgkhk ziU|}G_!kLy*x3n~gV}oKhQ4sm7Nlu#+lMe4LYUNS!`0OrOpZiB~{CujTEh-o&9B6nSnCOddcWM zl-eYtMIB`lUDg#T=@|2}*G>A-$ZML7(-i&((*$k?$p4PpL`c9H0$G8cDOcW+k@cVFRyNpTP6?eOp2 zRoG4;(;8iJ1}fA^3_|Af;Yx|jh0^O?vIp+Mh-8md>SB=5S%1tUc9F`&CIw+f_PD(F zN?(r|6(*GO*x=P^`VnnCg1^Ip*O07|5&{FE0@1;YSOrmN>8M@1il$0`3AwPV zhxtmBIxR8Y&DnJZbJfy0@Om7j&|7|w_I37hc8h1mtXHaK!BUmwAL1-ul!x1VM%!e8 zO0j`5M0J$WCIw|sY89Qdlvpj3+RvAoF9k?dj7&$FUZ$1Gw2~-)1EmkMn=Mt+S#llN z8)Rdn?bmCl$X<*dYcyH%(qJPjmD3GoP$6MTx}8Grz|7|QGxci9C}#%BbhMpb87K>v zsk8o}P6F@`og$4gZ59MO`z$UN0-c%h(RMSl`lD9sB4pBbGy^UBq98$P(rBW3SgH7F z`+q~lv$aSglPZ}BOuH~06lro4NF>S9D6_7+WdGbTOYPfnW5{O)*#F~UCzv~&`9o*@ zDQE_aOWfi)qST{K&BxU|JS?#07kkqBirwCPCxF==b*J>fI+H;n3ziv!C}S9HQ}Mrb zi>0P9U!lb;N*TLYPCy{AM~SSp3eqZQR(pttJeWp3b4RnLOk;b&fMD!13K9uQt;8T> zX0nk|cb6FyGHF&vj_@#lfE(vb96cpbQ3_f1)M1EZYbrfklhrHsSMIwy$U`5q?=2M> znCYJF$6T^6z#U953;m)q=2*%sf_AZ5N+YA05y^<@S+i1MQZhr+8l4&MnPkW^oCaEA zQ0k4$$k;L2*~hER#+sd`^jU|`)=HTZWVlEu#?;U*Mgyg#vrH>3^mLJUx=~_J52@7G zUGDAX>Fpz@JjHHqV&+FrFR_OkCoPk@Fs3)k;>u~En4)DuH(zJQ|781ciB7FE2n5mD zf8VpF&1WZ=z(k|bX+;X1PN9~GXr)4{)QZGLt;i^gG>W8@LFF8&Q4{1%aWiAhccBA` zS2OmdpKZBIuqM0nh5Y<|jK`=}D#DEBL1y0S`?^H=rk^y?L|ltiX>$Z?3o}TzfmBRK z$#_@u`2L*QuJzpEtM2yQ)n#U-&W=?DD{PG~=c8W{O%$ntipYwA1cFJHA0HrsY`K5_ z8n2Wv6N#HK{T$c1F8eyT|GEmxE5xU!ml3QlViV8sAE`*LlbC3k)T~}{)m?h*_@T4Z zvFiSN-IQO~3APns#9&iT{{th}W-Tq$=7GD+|6T9+-4A<&i31{x=_!K+TZ=MquBAtq zkK4R#$@#W#sd`5bo;c@-bZG^xzUoG?U~^#y4K$OE_lQ~3PLLDZtv;u@dan9EdoGcY zKSy>IY$)V#**2d42gVA{LV_GPuv}Am?6Z{Se~jO~bkykjg6%~aGuRg9wk-QQ5^)oe zAV*D`mozax;B%WgA8HO+_fvYIZJBjb`1&iW2=B7D*%2QAsMC;VI^YShn#@mEk2 z_g9p~8;zW$2qE~wm1BG$}!^4fRWgz#3* zO3zNAh4EK;wS=#~GWQm6Gz8h^UXA4G{ccdn*Jiqoy>xJFVfDro2AFb2brf-wA`Fx2mBMgOfnd5N*sxss8-9_YE5SPJkrdp*0m3TB z&QnGxzh34}4zWw!oR~=@W)h4FgU+OtI{TR+e2LS(uQK?@bwjQix4E5Y^qb(6;2XAo z@V|iwoLqS@TK@ZmdA`l>-S+D~F?!r!yLW=qMP*dr4e-~aY~!1iGRa?${3WX<516%Z zl4evlUAd+UYZXb4Y_^ZT9s&Nz9Kz+HNAd;LefB+fIKQ|3VDWI$b9#~V$o37evAbqN zq!8uopGrm9=}QrlSNCW`0J5P*F=z?+Gorg zX*`zNbJB*Jv8#Jz7D{P){XhBnMOF7S8$L%qt7*F#$qv0zQbF7E4Q_A<^%}R3W3b`royK_>uJ;6Dq?|_d5w&m~Zj#~C5Ni=Z$j@_NB%sJ9JFAH2? z6ZnlZPk&92OMYA-ORsf3{L;?%6Vm6ukry=5JexR<+~r%WoIo&x^ZAyG=x3&-Cl;^& zfAWR)G4&^1JN84*xK=)!U!I9P3(d@LaEHUlonavdVZ$4i)3mw&Y|!u-iy~|Fs`$Q4 zH^EuJ8-9yh{1^1ern@4@eYg4srhFLEaZ||7nRacSITcZ#Y~JC&pij2_6+!ycNb@|~ zW|iN@lbLqwTOYqtM18V-3)DN_!bo;j6zI?hGW2cZijU%^s&9Ys-u|fLn^)Y9cVXMW zaIAT{G=g;TUcTb^+KPkjRtQ&~cz$Kn+j<0WAHl;ZKg8QlI(kC{wSJ z+la>;Ku``fKxSUE8mL7LPzwR{{mtb4t6gT-zq`6T9qUD$-~fVhr~v{VT8!F5i$Tvz zkX<$DnNbyIX~w^GY}ufn>>>vcltTp%81Jgn~41>3VySpZ>v2PbRcTLSl zw^)FX9BP1o21-zCpaj$`g8ZmWYMZJ${A$qdd&}(~x4+E+1mzF|lmZ$kMXiBSSOc$) zjGN={SuJ{FQt3&DZx4-T0YY-90Rmx+6m=NGygA7n@R`#z540Q8)6+)PukWZ^^hPU~ z#Q_B65CfE{IU6WbBesDuH3YEhoFUOmQk#UV^0%wJ|4#Y0EI>%^5Za}HOe-|_w-*Se z=EVBu-_PREDF|k2jm57_cV9l*XZ%v}xO#CnK@!wqKo+$|0!~GS+Nm(_RspAU<6$19 zducP)Uk^S>>*FVO<}?zNL#>gt(9k;=(8%oHQEOy&Cm@(U7lKL}0_;0{?H-%pR>$=s zr;*mOs5R0E*hnL48)<|fP8+1Y{^P*8Zb?t#pDb^An{i=0I|& z0V+8Slq(Typj-)QV3Q*Y){EbkxTzLi@3*tc!}+WRLUO190{ba))cYxNaG!)ArDK=Y zekmB(U3~gNd_bvl+*%ouL+q912BD!tJI*Vce@E<<&7FX>v4i7`7YXkZx-^>h`JLy6 zJ1tqSoJ$t5Mk;`nivsn^MFFo|&fRG0Z@2Vm`Cviand^yIZi^I>Lk$q{$_mt8Spj-m zf~->d)2A!+sqVo+RVsXa^!^}g6CpXo0K)*M5{BBTguzZFCAyLNnDgf-N3RNFk7sTp zSb&fmYJh-K2}A8v!eFPep;@a~&Ds5>mmWQO+$YAP0S6G2Lk$p^!eOYVa2Py=r}R%D z56-RS{<3G<=`$_#atcT`=cqs(LUvW;sAnj zhyf~rT|6b~T|6bYJ4cYF@Tc=1`L*~uR}$32?#=RzEI>#OH9#QUr9_?XQi5qLf=n2s zzrHTGWaNdElMOcYTwQ_#2+E-b2xMoJsIxOlFzdnqY~SqJDd(UH?xM}zO^LfRIDnuW zYJd@(4OB)Twt>nB$Oay4_2;SiU!pvZL|41mam)LG96(SGF~A`}c4i3b?9322JF}pF zRG8DXE9x-!dY2;xs@AdqAvweVRRBO0YJe&j;3mao-*G2SfA@OnxG9}gOSzK_kQ{1& zDsBp^REVdrN(D{fVO2Jls5N1M@A)=Ut3NCk>B4FtB!?OxaNb&l`n=vSrxXq|zcWSX32+5%a2&_cZ zs8=FtaD_pT)0(}h`l;4Cy5?`QyQJQ2@Qecp%Ap1r&e=e9IAR;94u@>uqUOGWk9ya6 zi`*99NSQKwF9#5mLkv&@#DN;rai9i{1K*bYyd>4Z@nTGsL*LokHGRhdgyc{I1U8j4 zs5g}~@TO9iQ}rX2SEf9<|6s&O2~lq+2N0A)4G@R}HK^l24H(}MWc<#ZlCj?%6s?)t zvqN?NF9SG$pd4y|z@CT(^`3|Z-0L97=5-VqbkM>{kI(OmsvSM#9tRMVLk$o}sA^Cr zR5f6tlps&eJ~Jz%Um|B-J2lwvTxQ<^J8!T6Avx3lfm8ij z)TjEj;Aws4eX!dn@0l%>51JZwGG_X~mJc|9pd4y|Kp3M%9mZ(E@Pv6VCpl2FtHl0{ z@gA?we~hR5aR5O%!~nCZURoYb)S>pmI?%fkWc#OO4|JP${LjFIA3LphDC3@fhvX0g z)B`DfJ?fOc9!}}U^iOkJJYZ|RuCoq3oW4>&oz*}{4mChv3hPl%VLdoCnRh@|D)aQt zPjrj&;{pzKu{Vt50D^Le4_xYvLPPsr+<{B;?}!gvnmYk`9=m?W#e()WiZ zO&78UE_2CZ05m8B1{xHC0nnfj2VZ)iCAP14kc2Kp|PgQ``U~Tn(rb zt_C>aS|j|~)E`pH+Gj|I>YweKYG9{0B!?OxaQw}H`uLjxJk~~#cX#dV=ecQNt?66K zZmBY^*>(;fD2Esz4V+-5QJ-L?;S;Pk2J3g#OH9#QYN~2D= z(s06c%&VSpm;0{?S~z}8qJ5Rubvb~b9BP0-m_wrub7(MpA;`YzcgMSB+ zW=C*ms3AGj0Ecob6?!P*WCJ}E^29F{cm2mJ4kr!y_+Vh_;JfoV4Fu&-0|b_OH0q@u z4KMYkkMMmfAv?(*3x7P)UR2GA0|?5Y1_R%O0OBl9sPjh5Cb#<$p$0pWP=e- zHn@IV(JbP7*Ac@jB)jbUNGGux2+5%a2qavMs1vS6Fp)}-HEvR$C8?{*YMdI*k&n8b z$^iuBPy-C(ys$A0u@^RmL0Q(XoTay z6+Z9V-oMwU@sLlw=MV3-Gk^mK%Ap1bgfT|cVT=(BPYANkkg00lCFc`8-<4f9d|JJ9 z4j?Fp7@!GQ%9&6vk6KV}Kfttk} ze>)_md&Ta|=n~p)&7jBQj`i;RR@J+x3`EFX~=wT;HBstwEy(402 ze-92ID2EteIFQZ?N1e_JhtpXTwrL-Ynwhzv?F(bOBTXK)X8}TTh*SK-!kCv-{KBR9 z&A%f~@tZpVg*4^-dYmY`X4C<3e98r%vuP$a#h*(S1E5{H!9cro!vJWPZV=FAo-yyI zJU0EA@=L83OGbZg1_6a+F#sA83Ih!Z#Q5OA*$1Deflyn*YwtBpyf9()i9))6xHl6c+E>%S7Yz97s?O2av$hkQ#;qNO0LlkTVny0b-2*%eQ*kS-!lP!j*OB4n`Y98hSDaH|VHpgx z6)rA=fwn@0V+hjwkC%U!N;+Ncx1jy^uC>_372ty8Z~zGvnZW@hSU`p#TZ9hXe`ECb zC+040IX$e>Bo#aD#h@GxAc4oy#9ACcf{&aLWc~J&dMs$J`o2y)y?1^&Bli|!F(`)v zNWi0uaq#F?g=Z>P>ioD-#WtT>?kej_H6FWz(@4xbI$V4P1C4|V%MfI>Enfmh_IFH; zy&9FMi@V>21qsPvppgqTrf#o&=ReB0ZcU@)6c!{Thk-^)fzuRH84e)9lM)1ZtIr@}WVO#Ox8IK5 z;a6+bSq>y9hXF{qI1L6Mp~5o+nOfa-N+5mPH6^+4(MApG8(EN$T+u2=|0}DWyo=Oa zM8DoKcMMwWg#PZ`sB(k8>*|&6S5|(1SUQ_I&n1h4h62tX_ITaazC^UIW7HoDo(EUdJ>@jiS{4Tl z1zt)dGvZ)F!50n@Dqcg7BI4r9UAJa9q@U5AYE3+LW4(ATSqwB3 zE_Q>#REG-L5aevbn;-4p9#)&P3*m}}e{0U$XXKmuM|frA%^3fd54&)AUlu`>sE zwcGNw;@&}_+|~pnhXF{q_zeac2^F?sb|lx%sQTzu%$=(T^?qK1HvYicOh^s~kbv_E z!@>Dj6~Y)iTN#1F)P|qi zzV|t5x!tOnM=H(BZ2tToVIK}8D2IVY!o_ni00|YwA;>WfuB94p_HO)ko72v%ty**C zOCUK6K*B|IFaQY^$RWr(zt;Dy=1F<3IU0O~x?3-S)ksJV2av#npehv(AmN8WH{UNA zAKmzK%}(*3oBmkB_a+Atl*0iea2{QS!+CV8!aBc~%DhnOx1ZX2rKXkcTI$|84kTvh z(N)0dH5Cr0*Q^Tc7#3A^f4A(|!4+l0H~Xp_y*QAVonBJ`Z`@PqaG2WgTle0Qi(FTB zuX|~2T$kET(jDCCH5Dj_!_)?rh$Kv}>n?kipZ00g1?&p$qxJOMOISfF; zMRzdJNT{F=L3X>;w~bTW`w8Psmyg`@-8Gz@+K?O$Ac2*Q8i$pQRRNyb$4)SM}n ztXIaZZ>b5aMnVOAZ~zI!ks2K0NUH)p_iraGOfBIsf9&*3L;pL~xWq0bhXY7p&qjm8 zo{d$Z9_iN4E%ZGy*VL9wp44+I&24@`ayWnl61y5461z|#9%f(r&BHjU*UMRrW1m!6 z{Jj1QZfb+)CvgA?1mqeV0&=UuJ#AhH+-^T~+?QHm}l+IQ`Gvv=cFPdBB- zJmx@R_7sE`2!FIVgg;gVeg1AZtbFUw@3)p~`c>aJ_%+Re1j8f@G!icAgTd5>3ic4> zQf=CRc@3%r&7~^TDD!IXF%~2whXF`E@V;F=g#k#Ya1TNDj~F!S>%x{Lrg+ae^KcWz z)n0()Z~zHRZ9NWC+p5sdy#))T3k4fqCI54%=9!l#xmU+Rau^&u&AZqS1_w`b74c!J zXbRF)C)ZF-PyM(zbKA=X7ukcSxnwZ`o4e=_CSajrJ_LDeXVbQyDpkI)_uP^VWXWC; z5LieSgQ*V}|G~h9LWO+@(sTQ=J1^G%d@^wT-b1A1MKbG*AUPaB0>}OgI2`-4Dg@NN zF8OKEvHSZ^rcC&GiqyU#2NJVme{eA%3^Wod^h1yxD$LJxEE9gnSCG;*^uRVwBOy5q zG?E4m5YRXrAh0S7RH^37^k*@z{7OZ?K0B9K~x%tgQ!qpAf{e+w>z;H_iYRvdFp9?0LtVTj|IDmwT3gMuUV8I}QTy|nYr3ERUyy9+t@lEVgFPH-f%HaSKh$D?S z#F177hMuLKoh>aRzjS~2s?0tFiKC=q;y9dw*{C zkvq}?$zh<8a1kO5rZ!Yyh#>6}w`M%scS3aZs@o#hsY%>P3`h=xt%tme5n-_PkgLcL zQ=sk6liyV>V+;;$uO_VM-{&g3^^i*z6R^395@7-sDmKJC>+SjKYo^_ZuhUyRTKiq4 zl}ZRKB#Q~y+{KA70Sgr!B1r$eSMLY!Rh6Qh>ittYDWe7i7Lvulrou&vFtDjm0V0CD z_OkoM5MhNT{qA2nZTg|@MApkga-Re)y_sr4w2O+;Dk3PYi?hN&N!2nJ2_*?*Ufjr* z9-@VwE zrbdyoYu+V_juhpkpWnC>(0e{p#!gK;D~sE?Z*6AfkBN z4_9wW>@M~6b(gt$Fx8!;eja{)9u$X{sq7@t8DtD2_Z&u20~JAu)lA}IlI6#uY5h02 zw~JP1RLYeS%Ba+7MPh~d1)hIht{5nueNMO~wq?a@fib5A^DQ0BOTK6}@L%Y(NUe)7 zcRYRZtESW?`#zh-FHU|{a&tGq!u&dJ`ONvEXy&*0wqb%wNfvfWqEZ-iCau&wiohCf zWinjr6!=!qpFx-cJ_1DYZU}}iVDlz zbaj4YpV;M3CdZaH2{u~y-ex1$u^OJ9scT2eq?Yj!v;5}Fsk(8z5>ZYUM)Fr!3zN-I+{(++TtW_znJPr(ZhBHA~1+mG^xBlBJ$+8-G2cludt2qZ}JN2 znbo|R{rt}2C1n$v{(eWdg;+$HTP~W8Z%AZz43>AOauIzyn=fLTPlLwy)u2q)-$@_5(VkYSJe+u117I14e@XCpx)UsR0MfC{)ctT z&UXs%7akg3cgps^0Fzgwmfr9l<%PSu2?SGE1I_$;m3RNb+!Qu*l*GK~vWoua?`pPw z7cskOy+`fWB)mKMNU$F4cOjbiz&qYZHj0jC`)awyztOea8Ag?79Q|=to3$Bzt2m_@ zOZj+xc-Igxx`l4#2Jf0wVArhN%Jj{*YP_peb-+~Jo5M~gV?PKs=lX{7KJ) zV1+NtcZjfKiE-%P=Jom(0fLBH3txVAog!Fgdvst6{F_`G1G9E5P8~moR-TZt<>s)C zU+48)eg`nQMQSMxv69+$E-y0cm0$d{v-}^mV8Oh1Ke!9FBqrLZ(}<)>O0CPu+qKo6)C`>T`NoS=C)9TzL^%nP@{=u6LiT@2d*yTh zT1S~3pE=j{XJp@n?`AY~zUeKw={EYx6~TgnKXHy{%6W8L#9$XQ?6orU5Yqe-{5Q3D z*Z<|E*xk)LigpQB=061Zvqjsa`5)|RUL7*ZGF zY|HgtZjS}4i|}zghLpWh&q}H4&0mqbpxkxQlQYj+do-*;-aiszV@UAFd0Q11h*?h= zj3P;xL8sMeWJa06Jh0vu{t4^9XY=3EZgpx7I5OT}u(8OETtGRaSS8FJo>8gEnN!hj ztH~`jQ{{hro>IE+m%!tKWZUDieEJo?4nP?0<}DD!nfsUZ3vWvc?v`)}$3nH9*?(3j z->v6i=>S9Av|0<7Oo|Y!FJcqCqs>~kv1r}hPVlR%!hF_j=D9bw^^~BszKK>`ZBR2W5FXvyjr* z0%ax2J1F3EGG*W$l;w!AkjjZs^VcXVQQkoT?}4Le-a%Pj<|d?Qvql~5xo<@C#iz(H zQKOWk;7zBvsb?k1J1F3oHZ_cQP{UZmGtAc1vl8WPb2Z0Cid)cz7J-zJdFADF>r1Ek z3jM5aY@x??E+2@?3iUz0bx#aD*e90pt$Sk2YuSY2oRw+5*34RzcTfs0kPs_)2c=-u zEGLbWKPW3v-a!E`q!nv<2W6>FAQWqDn0>L8DDR*E|0w3&KZ;qWC(iMY`D>JwDBqwY zz^myb6yF*pp)6BRLgi!HEit^cDDR*Ejgs)LQ4&^7B(^llT9j{4Qb41myla${)hMYg zjj|Ty9TX5ANO=zrq-=N~wG|#%i}DRh20V@~Q}b=3WR_>jg)+4b8)Yr}mgkg+Oe-|B z>n#vW%?XFizaQl}dN<$IV%W{U>0pBh2Q$FRJ_Fj^_b*xX?xHszu9hg5EC6j_ULWDz+X8{EjQ2p7d92go6Kn;# z)}p*?8Z9*R4hA$W`*+?oE&Hw8Oj@1YvjXh8F_0_-a!FIK8$xGAI2K_Fk436T9kKCz|;%l zed>j=Q!mWc)Uy`l9TZSrFf5Ai_$n;Q;sL{=^6`F_rH!>H-=LJhj<%Bb9c?AMO|8t? z(av|H)>@QzP(WHn$$MHx$);tLw$d`zqP&9wvI^wm?~n z@(v29c%)MCJ@r&7OL(AC*$5A;MR^AWoSawjesW&L9*0-iIyrAG$~!0^j#BX+N2%C2 zN@XjKvKHkXl#a`Ms&u?hJsmssbhf6Rl_>9^fF+EI_a%&qUBakrEn%!h`39v1G)m38 zMyXjfQQOieYf;`o0g<_y_sCq$M&@c;k-4=f@1THUU+QqaZIs$lu}i29w_&5KMfnD$ z0pchP?{SodjiWTS;wWoT-a!GI3mV=x7c}hVg2vVnN^4QxK>=};hW9v1!^Tk>TXB@N zDDR+voVkYgoVkY0nQL-#<{rm`|BSEFeqXZtkLBC9a;nO1S6Pel4hl%zX?RcEY1qV_ z##Z9aT9kKCK)|WtJ>b-^0jDM>;Otp5a!K#Hm+eCPC9UjQw(TuWqpU>v2Bj5qOBk(~ z@9;n?wk%<^VjJOswJ7hPfF~@pygy-~WuLIHylyLB8)YrZJ18JL(DEK0XxZ>UYb!jk z7Udh14)A(9-o2iV^?Ev6JH^(be1p;hsbD?tsbD>u3f9|71zU^q4hoohdfum=o}GGn zTT{w*vg1ni}DT%I8SBZ z{XCU{Jx^uGIZu`EnNMp`zCqEzQAV2gql`3rl##Y|l+jw0cThk^l;%AnO0yYJ+Ezx? zT9kKCK-@+19(U1f+(p}pyR1cd2Q`$-Hqb-)&Nk3PEgp~_nveIh9A&f?aY=e=_HW+PX8>~fn2L)tAjl5?>jci8LXzQIb)}p+F3gf(Xe*Ag7Udlj5FQwL4-brNcwn>@9$1U=4ax*8VNAR)VNC22 z#$;;=V=c-%C_tl3yla$+)hJVrMn&%MSTsCx_n=nBz0-zHJoF2@VQMYPJ1F2Kz$V^b z0&HU6>}#_15@2gl-ilV_ymQ4|4}|+=KhLiYWA1Npe9Vt#&v(P;>(rBPD^`lPU+Z-z z;JYb;Ib8p&gn7r6UE{;j9d|e0aWSPJxVxKiH9Msc1x$6iNIEPlRkvQl01j6!VZNtf zIFQ5(=RJuR&L;7~Z6)!nMfu)<7#7C7O96NZnE7|UHz3S+wJ4bRw|s(8%MMO{A3*`I zOE+!@C#zpwx}gBrr5gyaOSeJ*%-Xi z{V3+~U(k<_MVc=@QXhA@tJvMwgYx$Fb91NMJte-ByPuB-Gk3h)ZOj*qOlt(0Obtzu z8t4X{XN{O}fV_V~THF`2Eh*+=wy(wdlDFR}=JJ2z@}?-Z&d1NwLoW4mck}X;`+EDy zeB9(>%FD;k)x%Hj?du2II*CqakSev5QD?}h-^j!TIg!E6&+U@kz1EdYOxyHy){;2? z^rH0Qf2aUWW-MIz>Yp>M&rBJ(QCF?a#*4)_c5zl1D5+ZJBB3N<%nNwg@QxOGx)h`K z^mUiHc`zgVC-=Rt9NnDAGkGcWf8JLByeX6zl3Nq-1$RtLZu@FqD6?a#6Z&wd@U*UsEaS!J0 z@bBGK*iOO3{VtSNYS1aALY>55Sw*{0dc6y6kho|l=KW;MDmo`u!d9$(^zYxxg*F!>$|J>pa;~y)NAK5RQane;V!T5hq{z-%Y}|Y#>UQcpj|GkYIeqfS$(M6|`+}KrrCO$^jA7lGFN*=ynfX<4 z(|Tj&f7Ai7NvW2)D78jeR;EQs85vbD>zjy{8AVyQ7ilQHi@D>>PaU&H5S*=%!7^hI z^Y64vR!4=*zd0KtjdtW$zZ-)^lU^Ucx~5*UZrYn2j$i$A%|(yxn8nZ?X#%@{uWe!)GvCZp+Bq9*1-rCD45Xt>FVjk8T1gZ;hz>f9-o$)! z4J}vL@1?7j`G*3=H*h6q6qh(%l%vcC*x^H9V z3Sr>SSM2t%Cs-PhU6*-hx?=Hce$=j9qJF_^THupq6%eg>mk zRC}eCNfIbJX(_QkT?4fTLMe zu}{#`GLuvnm=)m3XiK+PTf|r&x`)X~E2XktI-M~`_nE8Z?c!N=wOIcOh4NJexQ_yK zf$b4(xtlY4e`L;!v&VUKiv30rI1|nT|QWjw~kxI`qWCbM#T4GS@jsBKUf>CrvS?!WpU1531 zBAJC7DA!r1&icIFirlj7S81Lm9duf`Qc<8Fb6;lKFriP@-IwHUQEeU$8z#|q%X159 zloErkonFN>#x#>nBg$@bZaMafc_QTY_jcP@5qA9S6=!yId3j5xvb?Mv`S%gO#s?jvhU<3@i1Au~_R+q-vQ~+;?cy|9af;Mg z%FN&x#!{JNv>?v>ch(6GJ972TzSs5~cs!wJg8d<-e8KQN*&oz1fC8=`oip(Aod&JcYGneAS_q;F!sCDX<@q7HbFMr_>%X~{YmM7P7mwzF6&C!(X z@U@_?;a`B56}y(%=3yteX=f+6@jmNML9y%X`HK(OcR9TBK=j(h32XKpy<$&VU;1_t z=l_3#*QB6cJvwv>4i@$4)FGrtFHy%{?LynN59}0-DyS6{2eoXJT=a}gaZoFfv2mHL z#b0qyD`Qp7Iag47*5R{t>bl_F*Kc(ckJ*P%XT9huI{WW?*0BhmonX46(de`yg-)kX z%S5zNp;c-{Vxv}MWR@TzDP_ocNav=wnX%@((1FCO8T-=Dw%jFHlim43em+~^?hBUeA7>wXd z!Tr}&SY9DMHNA{reG!{@hW|)Ka-D?9ib&1s6<6J*$BrL5OC783zt>Iqb)8^a5k?F) z_4Ge5axHV_n%OsF)>;JVGXHnI<99#o5hf0ZFs7#r7Hlobz`2$lVLompot+mp5Bip> zcl6+ibB;)tR?zCJZWIeP7k1D1cg%JZR7rxI z^sz~k7cCps)sJ{FFf&nGw=myvo=xHFuek1l%H1Sl&5S3neWy(bZ{@7?>=arUf0b8D z`1&hzZvjU`kZtbONS@yB29C2ger1U*&2BUw@U|Ro2%KW}GODzk=Jq*I#k{geSD;sUAU&r(BDr)Yv}b_1wkIW-+TL+qgB?g7=NLx*Dukp1naCvQg92o4)q}V3M{?M zog8A9x;ZhENX%@{DGWN3R_g3$hVUg$`@YKHAJ+}JYTV{_qS0@HQ-b^`{2$ssXnpPp zPekD4%7fAJ-!IJbZGP{zU-ya8;|ANk6Pzw8qXKV$zaC{9->j5L{(9suSv7gUtc8;_ zqq^zJHCZKt$2vaI=nXMZkSwhl5`-{1!L>yb^@M3A4_XUrRE zJeJyX(uSL{t9xV?Nsnx{kG~$-_DlqsDy{qXG5xB_pN^$BOS-VP3h4T5>XGdmAa@Ct zF%;;y2(rBKm&>c>{&A_r-&?4~;$;*Sh)5@X0-%B$SI>S2SI+d4vCe zF4=a*1i547r=D*kd`5GR*n3mR#jO&mw=@-0?QAeh1Ve9J}jGt<%& zi`V}@`9k}c`jf65`=MuCE1%6T&qSVuX684z!(rsku#khW;SI}a+T4FOX!wjpk+phN zd|#%U;4I(`zr`*73;JZ!T@mEITYUplJ`Cx&DP-qNyEf09il|RE@9v%5USzOuO~1k6$UGKH0tn>K$*P`GI0)$>dU?LnFx0w~Z@4ikqsw{l$CxqmFN0 zaXa3HZ3Dxx=IPRy6Nlc*R~%nkanRig;mQ-w?+z(&ta-Na1<~2}oM+VpIS;L&T9BK& zk@Gqq^MOWj^xY6aqmvy!=?raM0$Q{Y#OD&)hbWdXcSK0ZxuQ9g{3PnmK=hKm0?7cq zXM?Zlb4oarzTPeSg%!+GiA<*fIn)3(06-0DfEoY{L5jDX?Ju0zcHO6?bpp1X`e#1} z5R^j=5GaX48BhbXR7f$;-##C{wg~*-l2WBt?IwNBy!7P&f^w(<(trlir~z8uXJ!WY z{bT!KqxF?sw`Y_&I(|phN*q8?4mCia)(kZaH9$-088g7P!o>^!-gE8B;r+4cXNQlO z#{mT8P;I~FI1zCR+R!49GHRI30o(a_p4)%x6cLdX?NpJmvs`a;O0^^E%ctLA0m=Y9WBWznQ#$wae`KcUPCE zW4(wI96(SGH9){ai&1-MG3a>-va2RNGpgb&&G@&DEgSTcUE~0Qa)<#+fMT%{3b6)C zEVX0JHgL}A+2OmpCatk=7dUrK%}2LbfRG$&fPe-{P-~zB)GUJhs7-2{syh5?(C&N7 z?H{+l%>e}E5CfC~8Yo4rfl^olua1nHcX384|rDwMob- zf4j>2@05Sb0)*rap>*FVO<}?y?DyTJ*78-g70~(qA zJ8F&0?gXG^%#P57ppu3F`wm~b$0oSdalOcCq_r$+jWlvA6`2vWjWj|KrwvkH|8d}4 zx1=ZWPnI`axs=mLP!2Ufpa!DMgc_iwB%*mrUmj9z>0ar&8WYAptX$LQf*%JEltTd~& zE0=ROn)=%YST3Vo`3a8Q*BUmv|c z$l63m4l%$mz^R0xb}C`8Q%Q+#q(0{SIm*$i!r0@P+XxmQB!?Ox;8em;JC!ilscdN0 zDpqrLf9a)1j~@4l@o2yS1m#cz1g3Bp>M0xsPvI&3Q^<#mB22Z67?<~Q~C}}z?#CJ z&VS_B;_F;VP!GE|%QvzBAvx3lfpnJ=b-GIlrm+YzVUYg%y5N$L7gA0(*wk}%2@W7A zhZ-P|ol&CB&M3jG3j?ryvuCHAgDSX-Hg`8A?#|!<#hXC1`A*i!6L*VSpg8orqPS>ue!`$m#ju@y~%L0Vt z5Cc>J09B{~s$hVd6qkL+ojCp7>!stSbXG0pPBK7pr~#_DDXdZG=+y%*<7O5 zgay9m+f1$guw0}ItAUUlYJk9bYZdDA)++EEH9>A1vDTE>WwC7O>VKK)*aJ!6lJNM6x4*1b_h4j?Fp8lVoC!aCGbSO-nvWr>=nZ4L#W z-n!c1fHb7$6AmCKhZ-QTlvANz%BjF58bO-;%FR)%KUE=NO`xg%jLLupf^vufssRmD zqt-w*s96N58KXQo&7tfTqK~-EsAG3(u^I@;p#})7MAWEPB5H7jL6Fm$y{Y=C);qf9 zZ?n6k-fi%V0|?5Y1{luSKy^4`8>kM4Y~Z5izJiZ>*LjQF7T-vjGJ7uv5R^j=hyyjK<3J4<-w|Z|&YhC6-yIaKncK5Nb^k8|IDnuWYJk9=hz9kZ zhz8v2Ajsx*6d82T!by+M?~AG(J>(t-5R^j=5J;$MP$yJ1V4{>DPtHCwFM9Is2=}yS zV-m~EvB6}!nDSr{eBt5X&@+v7@$_ng)v$& z;xI-lhQb)f0|{RuXI?us*za6s-vK*sumB-B)Bu4~{aVzg`nBL`edc|z+b8dtEtC(M z8g?>f`oNYCIDnuWYJfl(qeUIYXu<#v#MTN z9!}Ju_QE>QyAovkr)3Xxn|A!qz=R(=t#~Noo_>eq5ChZ$DSbWal)fHL>Bsa>b6Y%M zYrU?s4n3T{Qa_#5Ku8WXKwt{%QBPq#I5nAfKvpXA^v+Loi}K?F4t23NjN|}WxA}`(E6EOY`rD4_ul%0eR$en~rWaW|WvDtH09shbB!IvIj16$zlLBCeoUf$ zmDhDSfS?>|fIyf-qYiUuFnl4%zUgjDB@%T zJrwf9FBNzF$14se4f*(BVCvwz^EnL!5l%L^eq7Nk;(ON-!z(1a?E6S3 zu^I@;p#}&fT#cv`u0}ACN{}^fQlBNMtIBGe8qSfAx}M4b1m#cz4CB18F$}R6Hiki7 z_`~-DkAGLbPT5Q8F{&~r&e!1pf^w(<0&$=bbsT7fX@@7vzL*QfE2Prc_4@3k|4 z0|?5Y1_*>PM$}=95e!cVvd)mHYTqU26FuLRT{e7Ly>t#BD2EuJ30TURP%q_7;1Z1> zBdS-K{A!l5qGN-}Us~_)$-T20l0yv;&_EMv4K#t8#TC+HTFD$K#H( z8VJdu1_-<{*o69x!6xuczy$ejTIT3sCrTta-6*{yVrhR54j?Fp7+^S%&I(7J&I*Uq zSrfKtAB~!sxuER}W4j|w9<^ryLUM>x{KLYSmsI@1rTERiBTn&~I{}3><@|b_D7$9V z0daiF1)sBNCN{;NOBMs5UAnC$6+$Z6+kQzew*|^pX0w%U#9pz8;jfx1XCk6e zND0p-uRc4Vq|5lX)#DxgYlq14C=^q)>HKfNvnm!-w5j|rbqJy;m{9e%8`4#0&g|@V zeg3bG-mDfv1!Hgk2|UC|X>b4uKA=dDXA+${w71`&KK5hj?akgc7ZOKFc_b1m$o537o~IXdFPo=drz$H}{HhikljB<5|dM zqVahSBq)aiNMLD54Z{H>xa=dy8HxviS2~@&w^C!b=F&}lWey}LSG2t7zhc|j$}M>m zmAQi4dkfj_K^{mPR^d^z+Uv;ha{ZJE&nwO;u&@jU+6ot!!9ZJ~!Z8Ht{m09{OC_By z_gm2Zd)Hd*;tFs zEq9f5r5caj!D%FB9vv<|gMmgug=Gk`+LkYYBl|n1#$Js|)WzNJ!h(e4FwjT|ppgoNB0S;67{_djqTG1Ex67!3v*2^E?lNXO02e^a;DzVjbtT(_oC zataF)lEXkFrNC(lsSF2@;7JLBywztAF|yicm)mbg@9?X&>MREml*0fdT$~02kWk?n zf=sRMIwg?4?V6I@_h_RA^^Gh@NUms=qyLpvPu@jpE}~!WOr!{(&TwFSycYfcyuNv|Kf_IZnmpQ3wk8VWie95gh~ zqBS^ZsC6+Kg6#3St$m4TU&p9F7CaBGsC&w3sI@E(8VbCWNM^*rhJr5~BFHCQK6wX^ z`ZQ@x&0jXeDmJHa8Vbtc020_JlbLV;32&Bp^bGx@zSFOwmTTU(Te9R~4GttIhXF{q zm<)a3w!3feP0U`IxBUB~=hko<3GVk`;KlPU za)W^v&sDsJAVtK*m%DDwa7aI+J=L0c?8bWWT(THwC|v9YgQ*S`vLVRXhBrUjzdc-` z?X3ay<}uf}Hv&L%IDiDaxB>?+4i&T^$eytw>tkmQ?rOK?YsI~TLbVcfEU1pMd2{D z!I!%cq;Q>guzu~pKTU)i}%9lWL7=VO}=wJX6Dv(2vcYdw! zTg{X5Tyr$|2z9q!0;`db91b9X2SHUT96-VkgKoZGGCsQT=bD}3KR5lcgzrrbBq)ai zNZ>rW3WxLPR)uwbFO_+r)Nenv^-4`E-L=%ca~w#_&ZDb<(`zamPOn)N*fA`s>i%xo zv4bnhhHv&&IeKv*F+07c0^Yc%(%~?*;kWL+B^SA_>|XcM+PE&YouoUs(`zbF4u`1? zED=>WED@~=?$kM4)i;G|mDtQ>Ox({U>u`^nKyny>gp2NAppj5P9fIt3sc##nxc3vr zn=T)@=euh-JGCJ>96$mq8#N9q8><35wU3>C+O*5E0R5H(*I@e$R}Lg*D;qWNIxlrN z4jKu*s*4~uJ0O4j{qz{t)D$*N^O+mDR_T+gPuRTi;R>SdD}V_}~B%h$A&P z#F177dhXv&SeRPEVgA_ZnTGy%s&R>3NDc>(z@Ci;hdmpsLOs&0pIhjAWUi?#nLMfI zR+`)Vg5+=j2_$wkI3#wVLOjgA_M3-sQm>b@8pl4VviN!Z8Qjzc&rjk25(vmOI0WQY zg?rk(5V+lb=(ziiV{a|JIDspl2gzXo5-#3@fwO@M^AKdI9fK!c{C>ugueZjvkxyy! ziq%L+4hN9HQxIAlo`SF{>n{`)YpYAOHA>ebLQbDimSZ<$>9JJnA&a?qGR{>pG=wX^AxFlLk=Wn z$Nu1AKp1EwROp8wJ5-pT=~yQGkgp)6Yv_S(oJK-&7-%F793Y@^I6z=k7^qUsnd#4B zUip=Zc+(_y_ZTjN4$0vF5(tlI9Ks{0@DD+5`)5!~42rFYenII`Y*0I)}<8x8Oixb`TXVB7}jBgbD;P1tqUN-f4ezhjVYY z6ZMqe@8AwuL2?+_NF$K=HR6!?wJIodwX!a5dD?0WmjY6&Cpv;m-hbL?jv`k1(L%+BjF-M7)))bzz{*& zC2q}lw(o@K=vB8xu2Yk^lNgX323rq#7bC)8>mgT>A*MjvohQGmTE-Y0+Fngq(ZA1C zcIzRREGA%c7bU_3EL3cWdDh$W)z?hB5nrdbc(nGrN-LERSV$HVu(^v9VFDH^Iz*8E zd#~OP-m5A_JJtKAc2Y(S2rMLvflY;r6k%Xfp#nq%dF^HQiy^`aP5RxxblUVo+lj1~ zhvYs9TzWIrglHEPrBy^wS{G-9fs(3aE)q%-#=N+ZEj>gFJzaeKJU!%6KX*4TPr0wR zpUlTiE~dPE{9HZ!9JecZEQa=wr zKM#t-%T#uf=nOK3k$Vm!sey{1#A+sSG0E~{(X{>>+}lN~Gb-gu31w93v?8&>`~uIv zE>{c`&ps#I65F!kwZNFug87yX<|SV=8~87DTBO!Rm^+@n_*GNtl6{{|;}<8tD!I9v zU}1h8w|wS&Q8e>geA_TVr6dbGB~d91I+Ipv9z|dcw=x;7|Hy`htXq=0eq;&3s=P;$ z$A^!j9gb0{ma$s&-RM%i1_u6o_V&_CKTV(yO%yE3dlQW);Z6lSq> z&T{E5zEN6k3~Pv3k)^64EmIthQak%O>$M7kJVk|NZn`=@vQO;tCzE5#n*sSp>&(yV}Wm3!dh*^Gf=2YD{-f>6iziai2nJCy)sPRFqT*hXA@ORg9>%qP)(>{d+ zlnGit>U&vV!CISR0~@%7*|0Bj zJ*AbYnP~^ON3*?En5W={2NCU?JMKJ6H~#SK;P16!1Y7eSr>&OwH+h=eCNJj_|0XZz z#x|`LK@K{8`NM|YZ<c~I|c87hK29sk3+W#>Bu_zMpWuRCS?Ux3LgQcG`m zkMhFZ-2{Rutbt~Jy~?|PVQvbWIZ9$)bXi6J^LI5{zl)gNwBDokYZBg_d?Z*8_PY>G zeBd2#BpXG?vwgK(KGmic^tIgVszEzykjHP_MKD=uP7~Mj*a)WnGDzIx- zZe{xBTQ%O*sybk*?#*GRld&HJn{$0bd2)i9DO!!nZ?M7_<~u~#vBWs^Z}WP6ivU4H zt%WZ?yG{|TvpqVn1^!L0je%La7N?G%Ln}|n*m84N$FK8xF24hq+#L%Xwgm4@gX-hpa1ILJhtU}FSo~n)kXL?9z)7rsb{5B z_2#e0T~O}2=*gL9tvwpnAnzXuu`wk0Typ(u)CPG<(=-!r{CGdsJ0ypxgh z_j@1rWT>vLuCA`GuI{P|)N0fkl}srCxp|Nn7C>Eq=&S+Trvh=z75$j?Di-YdoZ2+I-K3!JTE+|7kzEP zLoshpxxkb8o3FrY_WDj-JvU)*u&eY#rwP$pae@C%6eVY9=6jMY<8%5a?g&+x?pFhs zYTa!@hJVM<%u!HgCx?oZ1{p}XGztELGWP`R&g}ZX;?rBFw@s4ITXnDHLg~2~t*l)C zzoKgQfaE!f(TR$=n=8 zIw(=cdmR|na!EQP(7(yn*?ybT@uf!srJPZOXWF7j${7`jDW1r}mL3U|vddMYjuf}j zX&l$Om=Y&@CftIf!u zlrt&-HzdRXlrt&-6EmY5DSt+hKq+SwAt9|;O*x}X)d?KM>O$1Mm;_2WqX_$>nDYHm zjBR>i=@ zDAkOT5+q7WxkO1ZiINs3QDjic8AUJ;q?DTnQp`M%7G@rhL8)exj1Z14Q&O#?WTu#M zN13t^9YqFxN3lyprgqf2_NCL4jOH->{W!(eJM7h@*x_&aFm9n4p_Wa41_QgenlrGA z>(5|d7gr)Ty10G^1Fbdr84UF3Y|cQB&Od{J9-WB{^yvH@47AqdXE4yy$DDzlK0kwj zo<2kddis0^1Fbdr84MiI#hifyy8H|V4(LK;;D9cWfz@4xbjOgBvDBo=fhOUfqLl=Z~n)Zak3|%rP<&vgz)b{lwNE-S(<&uW>iZczNsj#J*PZP=| zjZlJ2rl;JlGu07ul6!nSpXfney&B$_#}uiUdkEqvV9Mr=0S$ zryM(b$_qPtl0hkFlmhp-$`w>glw4ubS8_!m5=923oKb`uNjc>=l5*^tQC`@MBpH zJn84>V}>%5+G1C_WKhZ(Mc54kDBleOuq`g2u-%XhN;RVb2}(YYawQ*#Dfz&{lsp-f zaz+u9d?4jYJ`hv#frTk~GAQMYA}qZ?%9masw)6rETY6+r${9r{FBlj>wS5&BVcG!$ zBl6k(Oh+3sDAkNo5N@;;l;3D8uxo0C@kTq}i&`=$<%}Y@WfYXVWfYiOMp2ksh73wM zqX=FF1?64^1?DPH6y{YRgHp~YLMD7g7}YvTVM=H3s4!;0%75vRK&fWb2!dB(1m#|Z z5tvtDL}6Y9GAPxI3L-Enh;l{+VT=kYj8SAz${9tdcoY;w_0kIpGMNWKL4}wHWKhZ( zMR++MMET44AnZAOP+>3U$)J=oieN_tQEo>CVRlqdVRjT5lyXLCaL;FuhVrGS!Iqw; zu%$-=rJPZOBTNwGN0=b&2oqG;5rzy(HKUXSiBeK7QA$iql!ZwY8I*EH5iD~h<(9b; zv&@x+S>|L=${9r{_N5G^T1P2O6}udjp@rxuGAPxIQW5MZ73Fr63bUhBh1pSLP|6ua zxLipyVzD$fd?Zs8I|0;QT!YB7F&2n#h9VPQ(Qm9LH>gHp~Yf_b2(+&oZY=7G8}^MDLWHKR0yT~9;#uBX9vJxyUZ z#bi*b85K-$1qV~^3J%6x!NG;Og2|wiGm5bEf+=5m!PwFZE^O(MK`Cbx!Fv!)x%VI# z^Bx2j<~<;TQvDJySnsIq+#7$F4u7ZmB_8b6WGcYl@-Y`oFY)qg@-rCd+sB-NzI}cM z1AY4t8R*;RI~ZuK3DrwgOYn$lDfftKF^{OWFpnr1lyXK9-cxBQe@~^w-cxCf@2T>A z^GOD!no&B!Q$`)-PZ@RCQ$}53PZ`OelrxIp5!F%d5!GQHQC(pkQ8Fmyj3U@wI?C-X z9cFjw3bVV&pp-Kz1ot-RLa6pO=t4|8pe`hz-Ou!tkqk;XqX=h19pz_39d983;!h1La2;19pTl6n2Cm zgHp~Yf-3`$wi3S-U{SPumMcRb4o)8l zm~wWZH9kz_uvwI|3zUMudxz|5ksjdRJ*mnihTZbAe>QB~9cPyXFxAU2l;Fe*rQC@Z ziaGH@3v=R;L8-oghzta|6bMPc;O|slK)_y20tSD}#~3x;;N;ijXE3mv7k-0-(ACZB zXE3mv7m=ptUAc>$*t7%}ylcH#?Eo z%}!)tk@95F`tOUDw3H_X?>zS>#jbGaNHyywE@n4XS zk40K9E>ah^oGE4tI3hk@$YP7wT!}!$7P@f2+TpPaSuZM?T2JIjQva<|t*%km8Ka^O zF>+2xf71eW$#1?u{rX#8tnWL&`SQQ<;j`@u=}&?8a8izg_*ZEKcBHQ-s53WsQ4EZpc#)A zEqeX+Y`e3GLpNz^b=-96cgN070a}q%DRY*HB!M6SFJ|899J$WFS3W-+Z8XVMHrgKwhWfHLKMbNfb!eL*Wq%yG~zzO0pHBrcPv>g}- zh8+9i6d+T}v?9GsYNg?349rSHl?dcRv*?WeguL?Wlg(#x*aF7~ zvGEU5cX{;nbaVwI=$%DssaB(qI%*_Z)A`?76ddfV(@LC?u8{M;(aYnk(`yy#0AsA; zT;Dq#TFuwbU$y3m&7!HNne?g9-A#m|Un@qc7#WSDc4Zru*PMFsc*oGj8`m+EI|a_i zs}6TR=y2d@FWTibrKXFOB9*L%CZMN54`#QkMk$qPX%^M8|0S!$28B}UtWX2#0j8S* zOsdXVCDR7Tr2c?;{wNLpaV#%w_sqY7dPKFb?DtSXhf}86!HWCGSUc{9KBB!kCm zPSvlF8DoN+VH^=&WD*W+Cnu|MpK~D<$5alHtPTj?4T*S#qXu;qA!PjP!}eEVD`dS5 z*?(4OCn-G^MNMFVIKT*b)^30MW_Kdpbxm$mTfDi{YRCctxuCKh#Mxt9nZs_IcHO&t z(q-+6xKGXFEO44wpnNdv7^7mtr|vhy;^w|<|H@(lKy5XMGvTSe``Q~1t4tX(!n?M? zt~10*=p7UngOCER;G2H#vAh*qSMWj%rD*Zw-a&OO2wAGtuJvu*Tl+m2(^PfndHj0_ zNx%upOF_tH2N;i2b5xJ#ioH{AJFhNT#U*M#s z*EB7EM`KYT2%XFHdb@(L?v!HmnX+Xgz9mBF8KumiK?NNMz5b!_%pU<+-Zis!z8Ic! zvvdMFG7>Z>7XzVNR+#GDt84jPgD)+(P$zM>7>@3?IVGSr3WPrY{LZk}JI85uhys?S z>Quw5;s%94AoS{wGw$Sm?q!#}Y+SjRgqY(HH<1#wPJYZwnwv0GuA!DH40i>X|t8UroR{dAkY<#8i>y{&> zP#%sEa2kw|_om+dt4WG<#;a7;J0D@A>#%o%goBLt5T{QNeQ;-u{5RMd*@H@YhZL5mAoU&%x#38-g#2}DsvjNPwc-$w4;Wv zKZMS~X$2Y5A>ODHJ#RgK$*$Wl$#+Tol?PoQ1*dRGkl`9a+D`7|o0r+}P^KuSp-(%1 zgN5<{DV`yu;en(4Q>(65tCr3>bFXXVniiY_IgTOZvzXzn?kB(M(<1Nd%68K>RlwAY zNpXTCzYwx@m#3^X-g8sz=G@?>ruUDrSUDieErh)EVW+F|{pEY=4Upfqfm~%nbPYs8&M!vhdkcDr-a)u0SpkRwGFC z2_ZRljhuIv&l_9gty_5JY5ploNRvEW?QE!%c4+_myuteC)mjhw140s{1f+U|IHM-6 zj9s5D^}MmA${_9>PsWcY)1!TK}kmDXNyS8OT)gb}9X0@HtV#XZ{jS14dLC7Q3eOH$H ze4x?N(KZWt4Y-Zq9zYlo$ae-IJ9YL8Te>HUeX{=%NvJD-AnctW_dyyXX+wk29Dn&+qLgb2aDMRDW4!@Xh^Q|nOm2% z+Znqb*g8iv#nzHZLO{+V2&r7OWeE3n?o1w|U)gYFzZw>^36lOm$T?$sT&O>`39m!I z@o7ojTYt8YWRUd+LJl2K-7~Lj^Sp|;PpoaYYV=MxB7!V|v@Z~HTCdcpBSUHBuFvb) z-la}94?+?o8RR{IkQ(}$dtaXHu5s(is^H#nlmD_95lH+2A=9%x^2*JMj%u<*SK9mC z_Jfd40_Q>I3kZ4KTVq?l?DjLZ#}iveEvPr&l1>xnKl&9_m`{TS6c3NQhv)oY(HRpne?(T zm=i+J+x~R;b4k+=Vj9=K$)%wWp%w%C5)m3iE<)%^seSI;9Jgm=z@?4PItDu`;K&HO z7>KTgkOMnKq@AtTe)?X$Va12Vvi@-0N0-8M9tiG(ko&iVJ}Y%(=IF{>9CoLQWXGBgE3)<)>YORJqFHTLQ_J2%jF6&} zn=akgd|g;5FJAwY-+#QF4C<;s^zNe;($3EVq-P~3eB{RCnhAmoNa z4t?vNK0Uq8x*PKSS2zC+`AMYHq?_HN?|gFi-8wP0%$l0ne;z*y$4-C*uiPQdk-l$a zM;zatYtW3hXH`=6G&uJ}NR#Z3n0>O}qvc2j!H&Pw>te;`}t97PnnA zcW|4PM?Q%TeuBq-5c2TQJ@)nE`qZi$!0`zi9DWn)eTwPr7I^9gL5E(e(J#VVUB<52 z;}O?*i%-Idk1a*VK-nxK=&fd4^<*EL9W9USz3=-r+zWE_T4`*3fLBfsY4?=8gxtFq zPO-0_s`J;O(~(f_0PjsJ)cCXqLbt6IMGqgXZ+%$I9o6DXbQ37gm&~ETI~E8%P@ERk z^J15{<0Hc+EVm8o38}bh4h$N5u+$UY9e&~)(P%%>xu4g$DMyA*h>03pL? z?>v9rG3|oGuyMCmcbJim?R*K4XGXBfykVgcSr1z{IcGdAW$$nV4((-ETN)#Wt!gHj z(JFiXfu(zBQ#Y>!pZNQnXFADxx3HbQEs!%dYlqzesYoyCtWblChkzcU2yi;~RLeEs z9B(|t-yuJLEQUioLV~{-(%=uTKKvDc3V(e>u*@Glp%;9h2LtPQW&hOyoT>IvWjPyp z?#YREGcnJPFYu*6#{}>i(H{R`R|)h=V4b0UoM6x+q}Uo|DGIejD?{$zL`ox1#30IGOZr*v@z}<6E;0uI$~t-?je(S8_qp}x}iQT z9{ORNq=3Pbpm@^bjba+EQqmY>UQLtp5}i_RPjNqz)j;qt3*As>#?t|V9y`xo_s{&X zw%aCG`dYO;Z#^x}s1!tUtc)*kwV-$g20sh_!fH1t%Ky>RT~)uZAE9`5H~=(Cw{iR9 zTLo#)g}(iI)YUY4zM!N^~YV}}z%ig#1g?;y{y;7c`Xzo-8Xnb=I zzLcK!+5hs5E46SmS{x1f+MCAMJe9X)%Fey>q)+dhl)vrz z_3Gg6cgt`aM-z#oL7!C97+)K=UbggW-^>~v{T56;)q3kI6wT$T08N|6Ti?yAQhs(w z-NBb5-)Z{Ll8r3J96t2v-gUq ztNJ#chNDsAXwZy;G{&UVfBvd(ILheNuvPaDYsw9QXr|T%Xetg$|JwMrB;?GzQtN~c zvQ9V}eBQ*yd8-u00Snq3QLZlLZ-b9Or~aeLx5G1wj*e{n^tIYXrQF)i(Qges+Ejjs~X& zIIK`Ka~vG5%)eSrrPQ5AnJd?sFGKa}%M)>2}zZ`E_P5o4z@8S<<90>SpdM+`J_b z$7BJ@7snd!F+&H+Lle=#%FJMu2KX&Yc6d*7`O9hM@h#js5ZzRS_2DxgzBu91L~~&8 zC{FD!VF707K(S;ZI#{RJlDhjib<;0-Pq@B#_TKZ+dsJToIk{%&K|sz1Ve_4De%pqVk!<3_B_($@Z?>kF2}3h*BAg5 z%0)ylCd_G4`;YrgtBiTU=(T$A=^Z##s232Y3OWT*bO8_UvulXrC;wx+Njl-|$-nf1maZbaXCXX8POQrS07{3-e2p`?%3Dr&zFBG4>kEM zg!Q88oqA1baB9Yq(vl-rwudQkGzJ_E`oxsR_*T0CJ8xEUwxNRmGHuN!42WhDLe1cR zrpB~uYV&;CpeOQ$x!LV8G@xLoNpfM$Od8{|VELAFJ!g6hsd3^`rO&}vp(f8jv}F(9 zGZ{1wZP@IDt^t?t_d188QQ&CM$Ne<5mwkb^@xoMaV8!r%vXYN{7a_ z7mRNjwuO1K0ybmNZ;8#A(T$1DnCIuLz(F1Teb)auATMvp{zZ?`8C!y&YgL7I=$M^- z-63t>2zI6(c#Kg63Im#W1Z(qwO>=|Yd$zAjRL%x&dryC_6L~0_IS8xuTRb|CtFxg= z#E~6b#)!OTI2wG$VC6a*x-99*) z2z*dz_D>ok$!@=-_Mng*)g=v%9a0ZsKs29`-L`4UkOvcFOCSF2wRZHFX?^fT0g73f zcmwN6(HLoVndM)EPCGZKf^V6WnUx2@3Ezth>fwBkw2s}ER_m$~)VkJg^f!ze1+F+? zwIv!Ob9Iu#$VU4wH}4(2I)*QdeTwr&J?dNSWx<~PGzb22obl+OFOCLZ>97_NjnTH= zs;Uo$9PZumdV{$Bt+T_R>30L6rpm&bYb&IWY+YwuP=h@chlS#3!tg<%c>rjPQ}@e% zJ5qh#pyT>KmY?^|{s`6Ba)iYf7FXVyFiTX+{?$F7?4Wzu7#dJS$HW_0$A-oz-*oZ_ z|H(5qAKLGCq59tIRiOGhi5Q|$hdNE@*=*#tl!|}YzZ;&@8AAg~%$U%?Dlas~^PB(p zRBBZ>%WcTP1-<&mOo2PcS44^(xZGtMR<9hs^X|;2f%U85=2cJ-js^|$q%l^Gt1&?^ zvz8};Q2A!yb8kQ2G-A@FheV&fK+~`X5^N{8ZzIj%RRcH29#<%vUtV&0BAuhu6AQsZ!@p zIbTXeZiHw)Ad2E5z3iQi(|2roJ+?vDvyKaH;b`#10BbMM7=Cr!-J5suUQ)4h@4+j! zu6_X(#d?G{ErN3&%^Emjrt4k$eXr&2TQD@BEP`pKU}XXtXDbT@8y(r>fNGwy+0jNY;ZKV6vMpzG)4f+qr#hJ%m03J&tX-$p`hlkM+&4)h#n#5jg zhp#6mHw)m?99E=hym2(R+`xR{V8b?a+_z{%_171;-R(B$rq_gL#G?o`jhD>~>`^Ox zgI%4g{1F3IXW?jYT@15n(-`+SHi>(a?~Z6%!D&Was}LbWx&K0wp42fJeH)3@iA^PK#kPqxDa z3=K$*Ur{ zgIo77i!Y7wG_6&R{lfTOW9PgPG;gwcB1H2Fk>d2rWu>*Yl%AB^qH0F^+B>gsH28$W z9Je&adZlE>`>unlhQuu2oysV+?=>nn3lQEc`#5UTl$XnzG+OqsK6~}D91IOeKWiEk z%m53ze8U-D)1_2kd~cTh4&IhSxlsHNY7Qm8n)rZmG5y=P;jbpwad5=YfaI(uG%!CZ zjd9qCE-Am=ZQQNnD@J}s(L6`=jq3CtUXAwG+WvmN&4u^t!3Jn@Q3T_Ig4si9 z46kc%vP;jL-~6+C`1NON(#AkEE094A=0$D(cJ1`#)1D^=4XE3DCyoYR;V`$RrS%RK z1$wr)q7I2&I>l|O`r5HqJ!rS?V^$ZumB6enJmVxdk9jP;_36ckh>6WU-CH*xHxHf; z;}NQ^Wb+rKyqj0?Y{N^V4%+XSY=#abfixWk5OgsAB8{;xYE$3Ro(ZSyQ%5c7*{kJ9 zXrZF|XXE-T9&@#ZNv9VD0J{() zZfX*(-U!XhRu$K^>*y4CLx@qM!?hvI_eNvPTT=C7d`b$l#A$8-&@22rufydCW<#Sf4)`ys(D_*AHbMQThn9rZZUNDtOLft=C3p8G zME2UI3Q)P8cpZsT6M_#4%@sytv|hCH`{a9>t23_OZ5(7eH~q0>Y=FX!sL{)K~*lZ zdOX0X!L2Wtg^9+<<+UAm!^?k9;-x1C6Q@1W!#zC@L9;PueZ@s@KI8;=Et{aU8-p8h zAVHF8!eNdgpvJO%4h)zwCCIZ)V(^PYCy&8B{TZ_2SI=Jiy5Z`hPi|!9HYk0v8E$Ut zacu}Q_|O>9n`0I}Eq5(rMY{iHI{$oaxVCO0ax-rDn@4YJ50STS@N&l#<`7(N^no}v zXnq^ut{2a~urtELeY^{;jYky+F;pDW5HuaywDKw6Zuh&0gq!O^l>bCyywT%w1GB%- z7zZn5KX^8_o1*pcGAT_5WS@d)vXBXPs+Z9^q@1|p&5xQP)h@2=kE6jS9Og!$F)BUT zkRDx8c5P6VL>hPYyz9_aG7mxH{p5A8z}YK#ucGYiHh#Y9hoJ#!OH3?=nL~hzHw?|V zK4!t^Nxb30gRTGh^8vc1P9U3cqWIgX#EbfrO#>Rfwky5*DUJrG2IkeEF~;k30jlBl zt0oKE)lIo|sxmYUjv#29AMYPGevQ+&bLURqdjHAbfTO`(q%i9Q@HJklIIhXVZ--8n9*a!uNfB9l5vaoZS5aM+8zOV2Hpa7J3>c=PH1{-;DAAQIPwL;oU-)y3f^Y zoMZcV^Al`fAc=s9%`lE19M#;DhO*v$d_3{slaoV63zkDP*O24LhY720Fl@T-d{dRv zYv&AQElj<`J1t?5( zYNsx}0e2n20CO{RFxDHKq|0Os>PO4VEth&BXLI6y4m`TeLfG#5sA>PJhX!%nUofX- z&j@ojqYi{$n>HT=JB)m$G1_}fTUM%RUgv%H;_hF$zveSUHvvJ{r2og|pKp!Ot%{=a zd(U93z<36Nkxe{<@xU}jKi%ZvZn@*XL>}DyY5Uo>-f)n~h=jMQRyw*y%|>fVpQ~Rd z#3Q;d_|)P0%gTddx*rOzUa@tB+<@0~c;{if31HOjInX5`z?~&~7E-p%x>D28OVhLC z>}iR}Yu?~s@BkTHjsQI5iz@JG{ng6N9&PL1b#%`|$_={RZ|vg0H5_4> ze?(ir#n620QpO+qmy<}VlQ_whB0boy#&tP5q2<~s3)+vLxTMLjHg8c5q}tQ5hAOO~ zirA1*u8o-MW0zkf3AD?u?%Z3 zBQ|uiuQGnj15t$RLd~Vq)-OqqLkT}$9d8(bH4Gp&T(91k^ysYM&k?trPjf`6sgUsV zHSmUNtf89NaN7W0_{4=%C+%f7sI7=Svtu0ED?~gOshi@KUaIWhs`=mq^!4w-a1YKN-2*8~Mfr5x; zSu-NG?&3D*#qU*Zrv zeTWFay#xWl?S^;e^lD^C%W#f6GhOg>^FJu_NJALVg@^#$L=X^+J07^XwN_mm{grikM*i2HeBx^cIeZ;_oOd=WivX|J01voJc7%% z%z!mC5F74Y6?C^r-R9G>AF~o<9t{)WqWA}ID9253 z-Dxa3&l$MJkSk0*f=9`OhU-1*ev5LfpQR8txftHk=K*X8)VXPXp-UfYtOe?jJv@5PiWXO%45l~-sL`@8+q#T zunV1{V8a+($pvCe0{(tNLz<7Y*4oQ|PE<~NSGDr-z-%Z8F|{#42*kz+Jp6=)7n==v zP=01LRjq+#$2Bi~avyA%hR6B;TeTpzqXDlfa*w4|4^X7`^!m6L-rCosY^ zC4mvdhLu)5KT@~pu&l6tr|aE3m)-&PI1%6T6xa>`{Pu(%2hUGhyC->93!i2^JWqm% zCAhCI#Yt6Qs|0xJ2@R#oJg*&CaJIppzNr^C?OAizVvGuGl>py7q2V9Bjy3QeQ!A^& z*rl-}>*vHpqcVGd&|{csjNmafq2Z@@VfE7Q-z%3=h1>7R-qU(0Ia6@vjKEe2@V^rp z{^hc>!d=ZNW@)DncPgt_)q(5s0B(W=VGV)DozO6PSIf+PZ`u#qLSw`&l+|J;p`=d4 zB_}AzL@IcBO=vjg%#qlxjpG{ZW-Md(eK;aE3T=1-Uzb6cwFJECgoaV$?lHR?hF5O! zxQsmZQs1~w=;}C92NSs<%Sa$J)L^7)hz+Za zd!wIwa(tf?eHRUDI%kyUWR%n#d|3ryA_sisgdTHWbb0&eM9kjl z6kVyjP}3N}6K_JpvO}NLt!@3`@YO;d}VT!qae@Ocv&uANfq zQ0C``l|=Oip77niSO`}~IzC1frmTRMo6s)JjD!DEbGAHH_Y>X;w z9)Vw*&~Q-J<1ehp$rZ;u+j%E?^6DvYSsftsi0K^Q$tE;x*>00A?56k1D+~8!^p9DX z39Zi0xCT&R3mN#X2@TI)-P^KN^HKM7V@BS-Q&;&6PR9Y9t13(YfVY~^aMItpO?Myp ztUNJI7W{t7gNl&U4fq(mJuUGiBqIcF-at?2~HDA_E?2 zLc_z2&!0~naI1O08)ZF@ZH~-<8el9gIcjV=fDf9`aAAu|tutoMKIatwHd)qu$U3+> z2qw7(<0|kv6B@dywpCBQS#5Ety&n#i>$M~sl6nVUR>7F+0Dfjd!)Mxv)b-EQOO|H2 zhjp0tX+6|(x%l1@jFAdF%Y=q~CT0)vJaVX#_=ES0z179aDd>8f;(+bU(CusDtkDTf zKrq9w;2&8${hU0^zU%C9<*GqLd5bv$-#$bH!0k&w;NPzCyJ_`lYv+Z3oHKItic}~` z({Mc-jIB@L%_cOg*SA)~YrKhzc0BviRl1^29<=!;+F(Mj#WVu&5EB~4b=j?~Z=W9E z$`6-x;Wc;z4?Yud5!7P)CGZIo8ZIk8yhd36{r*?V+f;q^u8Kc2oTlIhA04)}11~V4 zVc6~Y5u>x$P2FkZ!1ZZabpf;qj^LVIhiL@h_a!tuk~TPoS8m8xeJ5{ikJ{bCpkTIkGfEJ!58e zdgiHXOTSG-8(t>#h{-PS<`No4oeJyzILm(9wKXmGJWciO3lDcE@NG|rsY~F$B{XdE zsKTs}nz`Z5?T-h}7#q34xO?F{v<};$fyb86P=6%xglS%b}c#E$VJ*E+WSC-H)xRU)S(fijGXI}2u z>>mANC#bw~@Ojh+Vm$^D8}2&WZ}x|#n}_W38g6Kre0ZwyI7w)T%_H!<5_nU z3+u3l?byelHxx>tO+Yvm>apnnzE(m*#iK=z2@P6j){6{()yPX+0nQ^q$PJjt0q-iI z;e;nw%D&w8c-N42m#R1=uV=yOID&5p2CPTmPbD;bOP8myA{I7olK6*n_XP_|8#Ozj zA?64H9#lfZmKz52%GsWrlzUpcIi|0!`8#x@&9JANvS0#7sfn$K&y>(~OSGfI*$17n z;#w&7-gpqFhYEA74c?T^!kPjvDWU1SrHfPU7-G5vu&eB()&BSdl6$!VranTk#SHwS zgobC2jeNM|*qQsxabeH3ySB%|!_0}Qn978{PgA!>PbdL_muC0EFB-eQc6|_5^?DeU zZFGa+ry=P4Bq9L5PXdDDL1U!px2Jbs&fEQZqupnBxVV8$YdTIr|0WRu@OBaq7~EgH zY=1YWRcI5R*PYsKZuu4EIN`()iD^LK-y}3#wyw?JA-C#P9~`8rFS4Ds0qUb%dsAj= zW0%AxG0}T7*L5Cqwdujvr@71jX$svF8B-ANc1V}V{_UGjuVL_Q_O^Axjlb;ZH2Td_ z92(8`H267;{LBsHhigR!Fx~(Aob)1Hkj@E7)*#X=#7dbTct%2v3grlq*hZu25kL}YQr}K8wFt0PO1IKjZcr)-jTc!q zhED6QAZ`GKLs;X8cH|@q4w{!Ad>;_wQTB+HIVX;}ACb~78ns*zU;q;hSlSqJ4#6_X z&(p`FhdXe>kcSlt+22JYmD$l~G(=zI1A5730F}Y+AYTam1_c6wcj=GBh#93q zMq(Z+AI>{7BG3b9tCjllA=6gu<8 ziQQ%)RDggoy+Wky?TH6!bw-lU=xmVdNCj9`GK^rl4T$Fgmvz_&aBF9CmI7f27DNVZwh(f+#r0EKn z07SRQ!d(neiQmg#hK#>+*Uq6EZwiOZis}65ZBvWvSIHpjvmQwR?W)&nd-n;~)3eAy zhy~>oZYVfFbQtg2L9QFkK+(mv0(w}?c-&=wn!>Pxh8{#86xBgG05>|Q)*wL+j2?p)H7aRyMyM5F%h2@&JBKVlB#H1vwIB#y&Ts2ZQi;NG z3!G+YkjJTkNvs2_U1n*%Cu@QcBNN2wLK<|HY|8E++A^rQfWDv5I+-TH8_7wgWjFRz zhiZak+Q!DV@ow&&`+9h|cJAT+KjT>6&$WlAn`<9;fA;}>db@V%j ze*Rs1_w@F6bN6-kadY?S;_2=;#i+x20s~m9kXjjF0*LNKB7G6g+a&8nfO0*~E!znk zRxC)frtb-sjZFgCj5dA1jOH>6q_SX{S}IdZB8;O({^kmHQ=q=|I$E-EE={b`(Grp5 zccx$I7U?kmrC!If>$$@8d!~-yPE&44+t-e&S*4?0{%p6kLb8HB%?cQ$G%?5|S?ndV zRmLL$GN&L`9?_q^B7LBa7H9g4u6a6HpBA*eh@^74K*AGBSWF>LC=jIwn#Kk5Y1AdT*l|f_#&Q=Es^jP@LV922qa*emvYRv z_U{{qMx_GN!V=~`9qH9?2o`l3n&_+U-NV1CYZT0wk$H)Zz_pVaGN{4PU)At=rIWtE3mH z1eJ)%mPkQDZi!3=1fRnbaCmH~P{83z_%2MQOlC%Ur~>igV1&9jaX=ztt0F&h<_??c z&9%F?sKp)N74 z!^b?gUh3FEN~;uqD#{s4$dLk_D-<9qObqzS;S0nrE@A=rFApT@H{S&1T2TNjpOC+j z9Ugl&6-uzu@~1f=@$JBhSzQ}eq{%CX_T9|2 zN^@RO)VM=*I(0hc2da@j6SF_X*ZNw_?b3tPx_k@84tOBNOkd_)D( z$QiojRAQ5n@)=R(^Ln)^-NY)5772<9(pEpD>V;Jy{TzL*%%1cZdmHIRzn2|HUA9VV zkt$X5nKFr3Ea9_(4Jl@FxGrEH0NWT_#1{#KT&~27pHi(T47Iv}i@l&}*G{dvscq%w zQ+s~B`!zdl#d)h_7Kx=i0b=C3@Fgxxu9Pbi0^bjl=>qI7v53zRaK&b1>VS(9oQQ)( zYMEIf5vwfiP^Qu3mP1BWS6w^ne6Mwv%~omsQWOzoa->2&lPd>StW+eB@Ofe}7Z_Ip zVB`Wz#l>7iB?g^dqY72X!U|$&nCCwu-JlJAdUx5358LY5NDZ6w?J5+cJTS z&67#^LOxgOf>6s8%7rq%x#g`3Q-Bm$GPzc!3oM+Yt?Vn<#P!6 zB+Cj+HCH5%gBmg{7r;v{k1yqO0I^~TN5&SjnP#&u(nY8xkV=q54R{_4UjD0gMV3x- zmv(*7@QG`Va@L<#sr^ut`Tt*QpjZ{prX0#7q{8CwGx@ zcrvbw7>Fsbt0lnVXMzI^H~~wTB#R&39Ll7@B2c|RiMUCCoPsUM`X-t&VBvu;9<^0( z&WZ*LqdwNRO6`fF?D_&Z_@7k76w85`3JxlAV5G=7G8s7aibZU``C>vVNuV3P7`VlN zBgRo8(L1uiF@K(}hW}=GIt2Lqr5 zZ>1~&izRn)5wOK_mV_gcg9>zVDVO6Sl7Lc8q|!Awt>9uBrITfyPG7@|`9quSvVW5l z?VGbjN}&Q9KGda-VsHhV z50yvkKeXSN)Wjz;=*c?=5$}anDvNYR5eq~TzCgeO4s)J>F9pktE0MT}o&D+0v1WhN_c#}lqZm}1R{<^z~=!KhVYvUj8rC@CFh!P z7pE1m15|*)O0dB4rMAw9t{zi+czy}1TcyIRStIFIIa?$}z?Xt!iB!%Na`_wy+r>pH zk%(n-flMqG358<0`RPvMK{*e{_kE} zCALTlj1BB5;FpyN`9NNIQm%v};c>vR1uQQquw#XV5sRK#3lM`NrLWc8QD))AwevY? zE1l<8vPyB0&H`c{ODLDh!HHVT7qBEiX^A*I5f8jyWAemO9@)hPj?~|=ww!C)iO(iJ ziRkjYObowba+`loCXWr46Av6ufaMRY1BnY;!j%Fi0G}xlF=ayYwS`J*um+fcngUOO z)ta~7|HWUNJYZCnh9}#E-myw%krtJl1vtrMb2(s3U~{=lE*Fp}W%0Q(9$y5muFd9O zV$kZq(>sv6xIgI8Tef=E?&n zKR%x&?|2u!UTs_v*`~81+NM`QFE81wyw5p z>cz$9gGPU8I{Ty5X_pttJyqQIUKZD0CH{tsLB8NB>33NS@>SMNZT=$!*%Kw(PVtjgNq2GSyBSQxHjbVu*rsTYBWRRaW7RgOq+^-lJdHb^-*)qs) zY=0B-neXhJ-;5At}-$!QzY- zVUUAGep6OxgpCEyige~Iu2>odIh5u%Rr$sp{YQ9Jq?g&n5%THE7D_$;*DQqki!>$)An6) zpZ_Vo70K)?uIN(+Iry|l2eIOdGi8v&OiLAJ{U;#ShSe z4#pv%^$|+?5G+PuF-^9U(LB_hl_29XnpOQPITy~qOs0&M;&Db33V_GD3XoVz=WNP3 z?2q>CFGf1|M}p%`iPd4Max}HNHzCtA))15_L9%5#qAg*$7?58W$zcSut{-h2>V9xt zEGvrlP^a}@VW5%$X(tZAR8{8H&UAyTZq%`3fS~6tVOOW!uY#;E`1NkW^<^8;gA4B97LeDwwi*0|6o5yX$ zAb+8y=U*}ejni-f<41VxZBXhJKob=;^?mW;FSH6&K`G`Z8)v1P2+4x1wWl4l!V6+8 zB((k$kpT!#dK&bg28j`eMJ=dB=6#q-Nx?=xvgp+6!a5??pjuUE15-(=!cmhdRBb2} zH3UEw9Gb!2ykJ$@cQ*gw^{dtv+A%o~|97{*67}26LGo@{Euu!xqd<}3z5k0!SI&@8 z=7p|o8RSA&)(c|MbN(yCv?$MIvGY$wYbc<5lgUK;k8Fpw7TclK#4i7l(O3+|vii+J zm2n3%O;k@*af6ysG6~4g6hX6aQv8sepJcR|n=v}8wi+y{XmvU)jhN_LNG+U6^{uZp z8iRMON*UXcC&u%(#&!^`YutYl3O~*k6rYQh{dJsq<4vQFJ<1>Z<4VF?q@GUMfxx)1 zX$5{7AwLBf7rj`5y=6T5Y>t1cPMS1p{772{`3r3i&^AtBcSWw_tksk3E(#U-YC-iH zwCqfu!b;EmSakD6YPCj>mXR~sI2vsirAVhkbhWO6%_1v*H`P-?b}k)lPLM7bYij-{ zda9MyJwVwb)X02Bfd<6;_Ya0994MqsD7-YnjQ6Ms?Toj`0 zHGcdw29OliPo_5(1uU@o(vQYy6C(o2(%jXdwCRcfHOTMos?*8zI#3G+WKdJM(6XOV$M<$;$~}rs~k)z_EBDCG9|!!#KFd0{uj@2KhPXKuk61%fHT!Tsw`(C&pkO2(Hu55KnmJj13%}GpMs>I?b6fZ zY9Icm%)N&vtGd2;KEFPL{N>k@f|l3F>%E{H?msj;8c=6IG@W7TodAs{03^>t!~sq9 zsiV_pm))^Ek)9RdqMCyPrk=nUr(Ql;EA1M*w z4>N}QgH(aa2%SRbuMJlF2T0UTVuc#i=L{CxGS-i8xidDY#qN5_uW6D=Nj2!{^n!<9 zB>ZRp!@SZftgvhP<1Tj}dn9ezR=HmNGp}QB(a-%Gc3J7-W(i%-&H-R;)9Lf_6At9h zk4iG_=m7jp%4tvkjq@>eNRuoGg>ybrI|=9)v5vUAyqjr#BU>_UG{4X=q*Josh#F43q% z;U4NF2h5%|mih8yj5>kcao`f#Yn=#`RsG(5wUF%!)1xNU0M4U?u76z)D?w&&0*4<~ zum0?kKvQk8xBuH6jRa1`$zijuZ~baA>@Nv65Y9by246nwzJ2z!FPa(gHUE-%fg^~phLAmqZ z{7FA>OE0+VUzfvXmWwUJ$9I|G>dj}ZBcfll-+j4HpW@`OS=Yae(PR=NGZV&^(Xh_; zts(s?q)+L!`GDkbh0{OKXtLVl&0oa`)ytI%J>rg62Y~Bp_?siUO!}=KW`kPm@Lq{_&%&z;I(=z@W;lehcm!Kgu3%74Dx?t}a3xAm3ReaSAqDuu zqPYH=U~o6K|2qa*0D=;G1@(R7cSgPN*fRM1UO8+^g?^VBT-)*>Hg55*0$uedQQFq{R8`b_+Q~Ic&uQ~Pk5E-uL~AQWd3>$V05rP&_Bc=0(GV%kr)mme@zC~ zEZfv)m^Y>r&onEqejJyLOuoe+vqpTWPjBt|RElu*Sd-`1c zC8fXZ{gm-+#+VTLnL-#@v<@DYZ0)6!1t6s!5G}m2VD*JTo-En(kJ0IDoOYc=s|Y4& zE+!~1Z_-lAX)E$3irQbk-0YTJ^--*T^izdQei5*r`33ld`*&;^x#QNYiykz-3mdfgV|Q+nhfd~Js{%i!fX6HUYbTFN^r|#*2008$ z0>P^%oeaEilmhPxI6Ofc06yh3J%0o*9*wV{{AIuaqm~i4xu@Im*Z~j5-rt~WGIj9q zClBb43tq54u=A(CIG6qP3Ie0Oo7Jh-T;Hx!?M?0Lg^aF0m;S7{8BOf}*)Pj$dShDHy~>aF zPKrNJoce>*`LC-#;6RD%*OoD$1$WlFe)B##{=NOu&gm~37pMNP?4MqwtS7|~XTfl1 z4)H7hHGOogk;#V#MY1w10!DvGJdj1rn_`FuG6s&Ixe1){I3O76M9VL1gf__-pRv}s zxqnxH1I;49A$cki)i}+DzM&vIR$k`Q805$Q5Y-GD5VjQ9YsW1A*EPJZjC?=fGXL~Q zS`=cP&=QdU!slE%+Jb^#Xwza%?~!RS#<#Y#M6-9J351u9G>eyxDd@l^EVl#X)UX{` zC-=kKG38>0E1E@#w$qdFBLsN4N3(djHx+ICXrB!|2{)cmNb(D`*(l_l?R?P9x)VMx z-%FFXpY7eI*^tauTfwJZqX(UuRCd)s$EhDqXU$#1r_V5r%Iq$Y#vnhyf_RVF&|*zj zf#1gl^4oTpAV;5BgoraC}ThA%w?LF-Do6GMO&B_9wj`^PTs`z+fdC8eq zjq_Fx-a?xMed4sas4QB)ok}EL&(Ij;>zRdUm+5cI0Q{qew(eN1FMr-z*1?liU(Auy z=Ad}3`SR%`v}9-gA{6cUFQoz6#Igr77&_=cZ3y}JZ1v@xGbfaZZ;EfsXLjaQfvR)fv&0qA|!vG1%YT;q)v2zCSCc0U*z$;|T0@3OVM{v{9Fr--+rm(*h#42bK{O(HWhU=FOP3jR>HGcMU@QG~3A@R-aZi4vc z_Db+0MScp3Z;s;#29_Q(yX$=?w^F^r2DNF*Ab+79wUTNmKq~@yh@8-j5g-=S3CM7e z&Iw75palt-pyk!4up9}+gxDq-gyo}j0Ik+T7AjNP(Lk_&yjo+TuL3tH=Go$L&VPwnR?a=P7U!NH9`t;@ z#4ZqIe=j8J`F@Eeo){ubr+;_Y^N|v};*l944yuqqvL6`tY;pHiVitB0d4dJk6-VIn zm0v}2FfJ8G5Rb_zV#0m*m*rZqMe&eXXx7n-{~!D`5928bvCkF{_x|%r(zHa)BanY$ z@bfRsV%+b8#+Q?Q&p$Ab$3lCUb$#QPQy*r2XIl&J`wxudF>%(c$6v>GGCA^pr0rzF z`RmwDrV*KxXK@BV|2no4nQLYy4P_C~zmDxxAV1A*C-ODo&j^A3bvAYj#^YB)=*CXI zc>RGJd%<1*!Ynp3V18l{^si$(nMBFVlA%5d`uZ76 zE7pcj5*70EsUI2(eWS!m3i|k_uwZD5L>DDyrcv^-=;7~0Xqia#j2kdw^p zm}UBo7CwYwH%Q$>5ZjCv()Ma z%(;t}*Su;=-%=1RD}ewI9d{YcVMUv=H@aq=O!Al`jf3cJAyr@h{>#VZz##uev#P7U zP8c^vRV+c!QwTxOkfJ}v@1M9iw|^JUx7qvO_g;0xIKT}^{NC1Cv)T$DB6-O8?w0$CswUqe3?1>c63XxagZ%% zD+8K*qcSraFKMj~o4tC-gVn-*R=LvMBSjpt{L)2RNzFg2cAtM8(z5b{b*|V?jmh2k zFs*gP(`D)=$+tP(N4XMxpaSTwTJ0*8d~O_zZuoW==yR-IwnDBLBJHBi_l$j8%kXePlh1XVLP}QK(Pvw`P=sy9Ms3gj_%tmi;m8Tc zTl3Gj7^z=^1WKpocD=2e)mAZnw!D4o{&y3=C$E(YL#3?5Fn9Ywp@%Q~y#1~~>11M{ zH0+iYx9m#87rYIehsW5-{EK;l8`EDHXQmEvT`fY}ZrE!KV?mtKD3+yXpDb z^|D-U`7P`SK5ccYxovmGuB+3^x(8+6pFhSjU>XEA|BHl{kOl4I+3||zGaTzNPH|>N zgk(WFx0IqE{nt^`u!HqcV~5?-*hPk3s5ooiS|uNLaP<)qIbAC@YF(omAvIqy|MY9T zq?ew+H7|?xol{(@M{FS$ql#&vaX2^mIYt%P?~u#ML0R=B$Pl80${i z+Me_DtX~u2`c#U(`nw{iArjAdPW#*C-Ci@@aP5y%?Rp%8L*5TGR6$q>$_w2I&c19@ zZRU~s(*^~$?AyHIqec%<3Ho*f5zc^9bEIzXS{xC-8qwim#klwM?L|L@Ls}Cunj{Wd zkX?23*xd`ewX44p4tPAWL5w>YV{2G*dWA<~$gr-R_AmSq0mr1%Bcvg`XWv&9N_(rj zK6F@dR{ZfPO3`0Bkfz0!jAo2vApFV`KFj)NV> z+x-a6TH3a-&)T1NHSoHA%ok@UwrXYz<#&%2htIO`Uz~NJeGqc_`Tm?RH zt_^ltG-K-Q52>q``;|-a1E1n!t~-0OEFQD|Hs~U05(;1k0&i4+lPWE3dj-=+P*yi2YZ!0 zL_q4BZD^X5BrQXfDabCeWbYwE_Ff_z*;{0TERi9C2qORU(q_CQZSy2TzTdxoU$jl% zz3-fJ&pqedbI(YL=WR}_+;?$+eFF9*uda5czX+dG>L)Aqxx7AR>WL*EZMUzmSCLZF zni&wkZ-QUo^d9vN-sVV22FI9+RS4Nf|Llf{Zv-e%u9kht0LR|S*>c`)7~)LYSLq2o z=ZB;(zWQ6l^T?QW)|Hat?CF$J3v{cb%2;nt(WzD%O2%Y79;H4W?daw(sFK2XRh1OL z=f=O)PgYC4VM=P7gH5>WgWLDpn(G&=Vg%y*&Ht_T^M;TV9Xt3OPUIQ<&>1@Zf)H?R zd=DcuvY28`LOrWlQd_$Nvu3vM^8qu&m4VM2>L)8^I5Ae~Pw)7BP1O^3^5497WJE#4 z_Z!3Bpw&k01X)b1lL9RwpggSXl(a!8j{kOkgQ_o5fQA5(lmQZP(-_kR8Wz}N5~0~m zSKbnnRc{taqC|zESzclkNuU)JqdA&ocv6J_NF*2Iu<;hVVznj7QcR-N0b(Y~?vP*w zqwr`n8jVDbou08y*fsI3gcYM37u?uxqj7YA$G-Pvu&iJba6up`jHY>-V+4g_X$<8B zk|0?41J7U@nA9TbQ5n{m1GHgOMnT#rj8@@`0+YsJN|Gayx~JwO4H$8|#^f&#|9-yP zS;;sr$f4Kt(350X0uxXMrwN%=7=gqk8N~n@j*%Fi(9+YwTdWBVN3sO8B%-lMq{55sQNN7Xc@`8;x24=l1Ei9|K!_sFF|;D{ETN%eyd7wV zM`Nf8hh6%m;wQ)dzTNwkSiHj@qoR#Nz5aY%4-6DTv5Fu{3a4Nq#$h6~3KkiK^SgGezuP#{_Zh!xG+A*LBcmvVGc?D` zyh7tNB?uTL5(+0OsEkTliX=loU=(bmRFf#%qteUH2gx##Nc;2KhOaV~ZPDWJQNG95 zz3Uk_Ji~NH^z0s)1CvS-SO#TCTEGO7C3qgk6ow^LW)L;29vo2Cq$FStjMHwY8-1S0 zFK>#TQgmAo;8~UA35_Fg6}x5$R}9 zxgLcUdGCj-17-{z^>f?Pvw9Wk`@L~`#)@Y;=CK}VQAVIehQ(xxP%uuWB?^|D6Il?H zEJIV;Ro4;8pLWy0mJC5kHH*)nE`XiBf2p5eSh59WDS1^StC^L73%uUIdMqlALU{IY3U?^ip)COtwfhP#@WG)(`7$OKt+YZP_QF0Mh0y!;<89{B%|P%#B*BC z4fuA4$qf9fCGduYRqB5=2${cS)Af6M_nsJGoEPNK-}F!%Wh5C_1eBKr9IPa;o-mXn z7*fVD8YOT=BO}aK9u7;sfbMBG@UCTB!BNYHkMDkO-ruv0V*)*QM-No+dWvTy2><}7 zNR$;Zfe;88%qBr*MXjVwHOXDo($Ic@ebDpcwKYGlw0{~BQTpMELO&b7$>h<8dSGK1 zNf8*1r*H`af+-kgyhRR7 z&C%WK-P_RT$brhO|G4$mIj*~LS~f%O>Y=8{04aGIBt0*497V_yoVO@SAS8;U;83gC zE9uQYRfh9j@3!m$oM)8Dkki5>QT&X&lIjOFSG3 zQ3bcn~D^z6pyvZX{GS2$R7 zQV?;4LngXTWIna<$HRfe0864rT zdBEil0BWq!zFV8+ow~N~qwnLFmil0D)A7a`*$&cmGG{rO=NJrZdY~SIGYl)@5_nrs zk>lV@qCJ_5R9B}IsW>NX<;8JuV+oY+u75K)O`R2K`Q)ry{%XLzIlUObxi zz+2exaa5_}zZ5-~t62Fy^;@JFr)4wb4?X)uK;g7ZGZICSqQvs5EvKGCFd7VFI7Dl? z)AM3J+2n*1^T7G=(SQ%Eo{N~Tb7%3w0iP?F5yoTLCD zaUdzHU0Pk2ZT$XVoW& zFO(@&2HuKdWosD>U#UP!FYmu(HI%IYVSP z3I{m==CF^hG@BGz>@I?Q_w0Mk!R>6z^(htXv5Uuzu>8I8++V11S~f#;X(diQw&ALI zByqH?ki5i!N)km`mf=JvY4^S7#j2g;jIDy*uYq>@zNLi=4xq=A-)$(}xN++e#u?cT z(j})*kwC%QK~Z3J;xYy&PML-6rjT%g=W&tMti0R}n)Rt|K~)DyhAeRV`>}*FKNyED zp3r(|uHk3DEAhHeSCMwbkL{f-l|AgZ@I7%qe8htshD_Ay0*+9I_S z4e(~CS>(e73BxB{jKx2_dgJmZdCHyc+ut}RsDZk?B5>#+Brru})pf&z;|zX6K^$NT zjftdyYdFF4`V6;X#^n?tRw#aL_%A2QU9DcZR;|cl#&Ln4)OCuZI0@7dgMl={WeKcM z5jH)>pcugdr}6=8&rG&{)1Hmze0$@N6f?8zqn3Yc&10PCBzC~3Z|Kpa;OqeTNsAOI zs1}_Jb{$61EDryI4aRFdH7O7o<|gNY8uOq7*jCn*x6Sxe`RPPW3a!s>Uds4i6)Q*KD=K})mzI@8VJP{o81Zx9r)w`C!c>7%ou_fK5e@^ zdhWrW`;X~toRr1mx~K@7mf~0uWq|u|Q3An;!Wn~Lc^nRv@RbHe$tuFdu*IPUUHFQ| z?vI(Nh11TDX>R%O!-G905a2z?^l4pIyg-8omgQv<=M;hwd9d7Mg`#1pfshoYwcyNF zkv9uA@L`F(-I2sw0{M(O?{CuR@`E)`x1Ig7*YS4Ew-{#yF-+GDIK`<)UY3W0B!OYz zHDoXxPV2NRa|9;)dW~(sZ@%PQ_WR-SHQGklN>q*g=Et&CryEBn`#+}ZY$hr+Xgn6w zg($N!1y_0$$>TBu4mX;mQ0@Np+=v2TPP-?TxLn}0{hfE)UKOTXU($y0zBNsM=BgfP zA~0avIN#1-;0J=cQ-PKR@Ch>N;gQqwU1vU(?*@HNI>T`>3a*k{CRXX&;#x`jy_xYp z7hlr3pK*lt34Obir6d$q3WsB&LV<@L2V)#=%izkL6=^{$dEK_2hd@pf9PF7$7vW=7t#PO#5aCR*Ih)2 zqq7j-;H(^AGQ4m(lu=_314Zk5krWgs@<8;7myqBKNd)`)MEwJvgmGLjnc4W!l;O%;+jX~Z{7ItK(bSUiUc zDiw5jQ9>FRkNC#L>vBehHtHSm4SIi`5$%X?Kzq*1gDQaVjEMv}WOrv!B@mb4r7|=3PlZ7LLK6pPnQFQC$}(%79Lu>fK*DvH z-;CdIf<>2o5USK-#5c28m-joQ$-{_m?yxQ?7y8U##5XZm*QI|5GJX-?gkN3vh9OGq zMSSym!vcusm_Us9<`3&4K!}os5#Lq_x_)|_F)H)U9tAM=^AgAw24;OCVJ?3W3wZ!3f-^Vcu&*S}NU7%3$wse7{& zM{YTGqO=v1`W9~X3V!)heI~R_Z!2GpeyA! zk!|sEQ>f#eDnmv8?3=6nS2O1x;v{lwtJQ2T5)}Nk)J1VVU$>hqra08PYz-~I2XS>| zsDPnX*+=pWyxa1${l@1fla{5$*WY?>isvQKo*!Gv>BV@98T|$#;9|fS&kJH)FDUPRxO%Lih-;QsG8Cm#i*Gm#uf(d!`Y~o` zBoNce0Ywest9MI=b~9z+ruzRBHJ-(GvQeZgx7zWJq&aemN)Z-)u0 zP#?k+mC6Kx?1U7e*yQsUhoGx-4ZT_J=_%tvKsMOnSHl6_ZY-Vsnj*Px+^`>7wEgnQ zs}GmF`skr?RuIE(gb8|aP?k1Zu1&F0XL}R#8VKWV<=ajr)iTZn41*YH+!_X0B8P4l zt$6wR!-aF7?48yBR=G&Tyq1mG`Rb>2x4iQG_7;Yt3r1yhFS2>bKD=<4;~*zNlB3-5t)a!t*1(-x#(8ZI433Kh-1!>m}PpZU4cfFQtKHBgnR9 zO05(qR_m~<{rZq$_5|K0OU=R3N&@3_|Gz}0d@HYMvM^G=@qS%2m@_Hy>HP+M|IkgP zQukyz?;LNF&S}@mHW;Y>JsJp_@mN~ZnynkQtsB>*O>FCib?Ua8s(DWmZ?eF%u_n7C zy@6p7!}(AkTE28>bp`U|8?Qhj2#q2Nvg0Pk1Q+S)yG6mY^6_}_U?bmlP z-&ZgMwxr!K)_r=*XvF1g7-krw7GQJtn(PkbP&e?%c(YaD&8@my90{_+B-#ygoW1(s zEGO3kcnxcH4AKzT;N2MB&yoHgh&5QQjPtZpz{Q#bbxG6>Vd#qn z5L|}7SfFqFVF4fRhh_3K9(WQW@YiJEuc<&^_YF98-+(js4LEV%!1K}p-^K*|mJRqV z7vNj?YGgk9o=*3PHLH;=I|t{>Jy>n=nCErS4S83==R5V2m2TL1q|UDg+tl74d#v?c zA&i8Et1HhvRCQ zWoS==au`k-2RQ{82)A7SJU{Csc$-8$!#vYD{5xF}d>`pkpXfgjWf>Nlei{UO!j43I z&2Hn83@QXW#lx`Wg&>aLk%;dJ0h;~*8wD}+aX8~0#KAlg@jb*C7i6Fw#Ast!o@xCK zRetAuZ)3!-@Zx{4gYByJNtUGmXDjEQoVvhUA>8DS%<>Y&5=AUB(CSxut%xTE;I| zIJQrCFdlzU_q8j`x-at@5WjDJ2-*s*nVj4NdYGu)0kX9}|BG28hw|}~oMG4*hVb#p zE+cOM8%;%Hqu|EU1)%FM{lWIrbd@)rdk#wtfW#$bkSb$+yV^_+IAOz5dy!GSV~uh> z7@cghLVGQTNwymhA+E*L9gRZW9!%l{abKf(&1c=eOj@_%?e z?r5*Lt;O!&-};fQ_=U205#MhNhl5`J49-mVkz~-<{*j87En9YY9&gE$CR^02(6(3x zq!F$!@Qg2vt}h7RCrH;9-&j*+n+-fHb+vODeE;B@6L#Q`bT7H;Vle*o9JtG_ksomY zu-c`|)vMmaXc;(Z7c3@YG_*-jrB9S=bhO$=$AGjKw^q+T{9fAl!M)2=8Z!9iP$%Dg zs`6cg1Nbi29r#>RKUwizg?bgwZ=HS2vZH$A#bZ8GD)wuP_AM=GoPA`+oay!=w+XS@1RD+j&Le^>q^zKQ1|PjmMbj#om2t^^W6fEYp&dfh?KRngh98l_|fdYnMBc<3mq?fH^u zbwI>Wl-(hLQzpHkSWHIDpn6FciL|~nWy}3#)thcTe5L)Q2bXRehkE^audf`+Dkh4? zcxdQDq7eSX%Fz2=A)&)M#VdlW2qc4QyB_+*M2QIy*kp$eM6`DwIW4R$M@J32LT#J- z*``-Z{wB3a+M3D9&C^AO!(6L6-A<4p9tO*WBvIO)a zqA@K@m5X7w##g*Lu|=LL-M@eTvsD_HbQNaf1cjhkl%okAn#DoSCQ{^CjNmz35*41; z#+1dY9T#zMs{6tt4JjKNfAY!T;eQdWQr{l-y#^j#JrPjo;*7F9%5(4o^Z-?$O(h1s ziZN&di_#Fv>TKt!-iXQ)1P@xQ4yTO;t#gQIR7<4(XNvaSJhScj#$VOgocojgmaOTa+&X&O-;v6D^_#yw&}4IJLlT;?LZCqx|*E`9H)S=VK8WVrO41LQWBxbJEfp9 zw4Nt@I%)fnT1Zjvr=SUM2FO`#^#P-kV}3eWsd%H+hq{+rQnIQB&T^oq)5>ugy;rZVCM~}+6>g$=nHy4 z243Xoahp%C9a?QbjaLqhGv__9P6MQ_20SP)Leoc@;W(V)f%zm+?VXKLpt?Z^`LtEm z?t7<66NSNgN8^FPtWloNL=31H=N<6U`4vo=y(A|tEiO}hg zQlPy%^y=eKLE;&0KV2=DnbfD&uKJx$CtlrfHrM1d$z7RwrTo@HQw02wx0&H z-Fg@j@;eArfsTL#ElSW)8HFC3U|*0VbOA+yQ8f%{mg9L5v{Xv6vroCReP)U&D?kVJ zc<-@%yX%BC$LF1GS7+pY4WPO#HVk%vf)UV0ouPRiReR(KD5z2#y3mt?5(JpctJpZ9&&0<&`E z`u8Lh1&*eH-zb3;Iq0;B^I);@Ktvg2k4S3G2Rq!c!Q~qG73J(n_~3ecxdZJl_p`C9 zKC9dRetr#%x@wSfJPwU6QG$d9&J;9q2k{5L;Q%wE(4Yo2EGVYf9o8h35wlv~zWl`V zk1q^;?Zf2i-S55hQcDeRy41785h!#&=HSdgKsQ=hf!)h;1OfRom;y~{HNe@sLW+w` zR&268A$tn8Y}cn};ia|m745%t#wUGRP#Pe0Svs&eV59INSUAuFnWJb}a{ye1%>&z* z@;U3+yIbIptZosLMS-Z$tVK=r9zSAt$6p^*ZSyB%f9*Mr)j;{Do~6EEIL!$CSm<6MI+bNFbt@;rR%+f^L;d6=^`EqI+rDB z2~wXhPDUvVvZ6$w8i_%(Ym(Bck&Md@S%Ta#5q1gO76BiE3JGl5#CO!p!6E%D&TFqv-JAm7P^i84_&>a|K z=@!XNW}*9gzPhc)2QeC;cIgq&stf`7Ou{+>46q|)LV^v8(KJrN2|x>!^Ste}5(ID< z%N96DLF-)AC*dw>r-if2{cq22&ez_0>u5pCf=4ec(!i-pkqB_Y1B)L8lMrle)pSJ} zLR2`Gg|^oWt(7nyI6V!@@n|~m0+YXNUbm&w&iB?GS)S{QLIbqQPG6$|5$92L4?{O; zRK}pCG|4JBi}5%rfK{vYpLk$|`y-$sxKaYcXPuFk?3_=ib9mxp`|^+OEYZ+VR}~FH z2KNq&%DhZdvMf_L>=QUx5sLb&C~IkGN&+h(LqH2~jhzW}k4nCMXyBHg&aB=x$!glu zvAza6T?Z5#L@|m{6eDAdAfYk?wjd!80GdQ{B&Aiu?iR>!98I=bz_NCpqcYvahdz93 zPXA-GE8l&y>EuDgqH-EAbsbQ^OyE&CjqnT{>lsD0RcTZqfSeRd%ZhfxxWSYyYVNho z9;MzSMPZr(N7^kjdQj@vu`zvP$K`HV_V?>UT4^BFrIZCl1XY4@jDRaLjuSM>3$TT7 zjH1B|qqPRBKcwIX1#)VEd#Bjz3pTZE`}^j*^#{dU*Kg1Or)xh;w1`17b8ywde`K&{ zB$}2u=)(@)De&WJeaL3Gdlb8iAgDe28G2*8e$&GE*~ATJ_uX!jHq6nGohpWvbcL5F5ZfHa;2bH51OZMFnpGs0BejNu2S(MhNrKfj!>-O0%7=R*KJpmDia15_3~Zt7 zfOOhASuFRe0#A#Nwq9Sfd57@PwJj-e8c21y9iTxh$`Tw{uVBxDis3-f5H$EqVADv7 zqHQeiA!ml$&IzJ+zuc$lKmKs(-YN|?RcoH>%!+Cn&~zQ7FcMtKu(46_&au1#TLp#F zF@pl692}IjHms9kL2Tz!->&aZf5mmb@G>L<8OfJ;p0e`P zo*;4*IFaBarS-=Vt*`fA?1esk~pGfRO9)2}EDz|dxhcc%Z%@V zt^FEK(txMSyap{n0Ig7vbsV^4NHA$=mgFQ9sL1iGmgme?kv9uAa2<)f-2qV%+4*V8 z6?xdL)Vqm!=cavmd-9UR36RRe$Twp!ZUdVZP1uRhW`iF9pK45%cN3^9U&l)p; zuy5unm8+ORI++kVs{c3t)YL_u{~|H~c{&5Fb=bo5DTlqqi4DQM}Di^ zZf0!ZUYoj18nY$wy&(@T>v{9Pz2!%C#OME^^`pd%hnxM~u}Pn6Wpq^nd#1a5q&K;z z5O=djvC%8~6}@$O<08L|m#iH3&+En>nNn|7Uel)i<0thlU;9#la$|H|Y(J-ad1Q;Z zSV>lRdCI1$P2%SqNd4-60!Uqsg#R!^0Ex_V<@}*tZ+oi}-SyAAz%-N=2ech38LQhBoy zi~k4duPf>$w6P_~SDji+9=rR8#Ze{Bo2w)bT$}@o1&V>lIdp*tp8&B)VNDlZaS`m$Ec#^rde$bZmnUv|<%I*FE21FeamC2oQ6n2&y4x+K zRGr3-`{&x%(B;+rFQSK$$$MMIoR~9u>DZg!^;y)geYx<1=r=uHmS>JyM*ewih%mY3 zmJ&Tb+L*YkUAZzZ`1QIn+8}iHnM0$I%YTtG`xZahYL}yA{LWXl#Ok|P3t<2>Vyx9* z%9?v^YS1aUpRCwc>_=UZY#iUp@NGSba_!i8l;YV zI`EyF(x&=#M_#-tpO+v0qRSZ>+E8?ae-b@^-+{L`afRQ#ar~EECx6wWzMe7Q9J;Vy z&Qm8(g~`8-8h7@Ol2_N|ygVimdYE+OEiqZ$4djshUuHPuFkH@7%Mmj6|Nn%HE)5&n zd?n=f!y|i5ABrcwCbU^SzkbPSx&m{aDJuz?%0~QBb+wp#^7g04sy+bFYZ|Jph&d+U=9>Hv{0i-eEH&cJ%`EAAKO zOjG2<>R!z*ZSUQyPcLM;@rw?%a^TTq;)Xqabh(#9lK+cDe8C#`R2tEz>z*3(_Wv^H ziY{v{lv%#Wvbp;wZxnjxFSafDTKNKr=X4#pLYvEreEoSI=F-`Nrkn4-^IZcx^4oBN zMVGAg-~qM#8DVC7IIAcb-k{xsaH>QCEuRv*r*Z z^|uzR+PK-hhR1)MG3U^r`P+5*F`p?@80q!e8Lq(mIkRW(-`eGhrBm8fJ#yh0@_~_= zEgS6l&{+0lhh6{t)$~?sdtF;0R9U}B>7=@K_cLVaqFA+;i_Nk=2yy@po_`#pLU!1SD7CPFu zkJ|sB$FIW&+*;SwaO7_7bHD%8^N`yA;M2begR#m%`0P?YS@l1tU1iF*Ckrh~o&4_4 z&5A@0D?inU_(K@81Y`3OB@wV(+ zpgy1Xyg5K^W{ejxd>;f_u5#efHPtcBR;gLEJss|xIXa_gUE~O7ldC8UBQOdIN{mz@o1HznWvIPjFObHkH)CnU>*&UsL0;FGEWz?DN<%4fBveX?j!!W`!3v8b z+A7+c*vlK^iiX&qVzjiv)weN6El|INGT^=oBSg9hFLB@<`4}LFg zn+`$xFtw|X-;3sF_o8Su*u5!GDRO|b3*5Ka4oGitB^k4yT1hdRy{2B0?bPWHs9mg_ z!-lK9$(&F{^T~+|gBFcG+P_gCCtjCmmLMA;WMr z|Hrw1RZxo={gys0&%)mfx$QPXGk;F<6?S$J`o2NqDA>HPk!xnOlTs%x-@In+#x?8L ztrORzX48iC>b7d#YGm_r%Tj(nibNO;-E4*$&oX-v=KRfbqt~vFFhs^0@~VY#REjtZ zuf(c_OJd9rEEJ=5p0>nSk2SmkwZqglRq&e&LWcoKe-cWOnqy*3b_YC{U$L5@+MPO6 z7sD5Z2mmtLA4ruO+qsq7j=@?cFa`4IRl12qiM6%k;%ybz+34p zUSNe?B}?tmb(4}E-BoTFZ{2xt?)gvg^rwe8fT3&J(-|sqP_3G+>c-V<-uN4^pkQ0M z)L3KaE#5N4EZZZ7!XN6XJl9aNM~sGFnn0_xB;M?P!Z-}RY~@gkxT=p7n4l`edNvc( zCN+0=wX;&incXmw=WVXekhK$JG0`y5M@PDZJ?KBBRj0niaiD@(L2;eBzE^B1m^lNx-)N!M3!_*98}^_wavr(Y-(VCyzgX0 zs9)jt24vrzGHDmLE&6zWbdy^rdJo?{1y(s3Xd%^+lYu}`lM>oYx^1b(SM=146;Vl0 zpn@pQ%M2=`&_@KiaX=|Ei0R;XS<)69Qn@SMYK496B5`zllHIBJVt{L`wm5hKdWgiO zKa|lNHBN9?;?x!%aT0G!RJ+MVtF?|JkzbCIOFp0%uUod^wV4Z+*IsN~rhAgBVT-HT z6rbSmLUzdMF_Zp!`1-{zQ6m~|il|e_xI7qSwX<9ZOKhQtm=~TC#~ok?CqIZe{P2F?eVF=mZIB_@ z=)V)qc@g8!#((YlCUU%;`qlK?>{mPz z$usQspduG)B22G08+u-+!-VlLc3AjMv3i!M!Bh`6@_F5s9R} z{isjd(X+37^!Eh?Eq8XHF1`x#EiYI;yS7L6iX;+QiQQOmWw-6Ex2n~tU4Lq$N?!6g z_-Von-^>+BB$BZ2R!i&Vn?+A>zr`Fr@#(QF@XdUh>o4{^*iFxYu){l*6H3+_*uYrr zhf9<8mt&19-A5oD^St2g?+fX_SHTaS{yC!q!Vh_A{Id4@??x8&-u|I_%gz^jCJYjd zV3csD2ZNint(yPvhV7F-o>R1wWIW&raV$6G9=q(YXAXKjz zvhgcn6Lw-h&NcOjNt-;s=$7&2G+QE6ui5p2wNsFI1f!nV*-Iy0S=ig!=y9oPGk;q5 z)OgfOJ%#K&;m=>esg6jb)$A?Rhh3^*=-BL1{<8a$cj@G>;9e8{{1v3`h(zMpxhs;+ ze?PcK?TVvM_m3#3lfQy|&y5#+ns9HF?3GI-viQRV;?xR%d{X#y(QDUxe6`NF%5$91 zF;UpzoVj|5M2ziz_@!iJWI_KDbEo_zUQEjp=gcR1v6|U+dzi)1$?Lw9+}C#RwHf8H z>wEep7k@bG3y)^jGtb=@%Gp6c8mB`qDaP#NX|vw76w5ZgesD zznSk&*i#_=2GxrI2`jIR`mk!x-)-H$eo$#}l?TQRdI;b%-EU!yf5ttH7xF*HSBp8; z^+cyz3}3%ziHW3fZLrAu&h=s?TsFMwG_JhR{^^f4t7jVWzEoyy?S|Vwp3=%A;dD*( zdpNIlx;nZ{1 z{Ig%Ojk{7WXqgvqzHrrZZu8X(^8;(w6| zK)n=+#M7_rpY-{KEgcf)49?&A%G{u3UcmXz=&^PbD0(Vzq=J$JL^LZr2~EH$Nft3m zmQhlnG%dh0BFDQy&^v^MyUdX&*R`L;3W)_7Icsr3e4N?ZHN&x}iGJL->sZR-L4U67 z+^u8JQET2FW?cR6W;z>Acsg^q;K1e`<~croK&v`CuMapJ^`v2qP9-CZYl1@5f2yCt z1=9>=<&EUB#VUC-`u$-G52!`AfLuFlY9A>Jz@aKavQ@&o*+`)7sCE58_jbKZN4el2ZZUBOEx>6_}g%cRV}^OGi#NR8#y%(XYa{lS7qu}{j* zM3#EVq@ZVc?lLKB$O1@_NThJCHUsXX69(5VQT*Y&Qu*?G$t2ygJ$IR;fiNf`5{Z1c zeSfEuPj_$c(5(NlCM)(9^O8yWr~CPNOW{-;(+XW)R5RGUvqU`UUYD;nY*GDbp)YE2 zhyUDE;O-@l2OvtvJkMPox$jzn6ucGM<$14m*Iw1mEgNt$U#P4nEPQ8u6j6u(1%J=La2*ZsX-s(9|JuI2me@RCOQr@QoG*EC20j1chi9&A010oLUB7&@zv9$k(|Y!*yKd08oDzB|+#iAu$2EyFuxsP6*xA>!ad+F?zK6HMM%4J!YA)dj7u6?{A^W>uQ? zgL1}||7M>3&uOh(um!fmycX+?ynTxo=-8l8(N=%VC|*Z8W1JV{(34?-NgOPc0ILNV z*q#m5BB8(8z+HN1`1HYmgl=*jWXP>BwXbB6 zIvx)E>BQ3k%{;siG!e7Dy=5qyD|alPbO-Ny*|;Qo1T|AA+x4JE(gZJxtVFVyBA_zI zDY8O~ghJ9hL!qdsx$5&OUX)}`G&!PEO?L2AMXNWjP!W&xI7^=5Pq6gjkjDz#zC7rMHCu{bSJG=bx|z{rAtQ7FYKEQb;l&Pp`O1*N~B z5TI;Rpv1J@PlxHUGVa1Iz& zlaxaZzj~)(%^MH&n4Kg?;sQybG*7{f!AOM>FpL!_RDtg)kqKs}WMXRNz@a@s=FlUD z9!^=BvtP8;qcfq$4Lx#<5hPTkae`+EML`8ofgfmr5*ToH(71?eC(s1PU_@p( zr<&xh$ae=t6dyHa3q+J3XZ{13uV;*Qa}Z8 z*2$OzZ3O}Yk$$_SGDFVWz3v(Qf2O=HcNp-wK$46=aWpir;AIr2IFcuMf#h(4^11qP zZ#{cgQ?hK673cw!kcj}$Y8*)RJT107v5Cj^su4MsiQq?vl1&LHoL^zF!+BYEFcWYWOJy2U zk|CnBEbhlcIiP@;%%MtpchYQlMb~W*CF8hE3LHi;a4#oIILk`}gcnM(q+Ziy8o=jb zTdM>u7opu|yuaKF7dUhU%P~Bd65v@?1PoMy!iow-@*FLLKM?*UYt0KUm7thxvf89s z?O~e?sU#MMzvnpz5Z}<(M|vcz!s85v!EJyjz-<6UP=w5iB+udy%*O}{={Zl!60{6; zn_TXtfo7)A``KoX?rgVO{DeskEa6WVU3UoTwxvi6r*QC_(=?6K5Gu_p6ox~j4utJ! z_{DuvFq;%v>@Eg4ALu%!;G|4Sj6m`xOpMkY)Ss3EcbZrhrp?NsJa&WheGdM+xI03g^AYZ}F4B>6sI5szb z!r?g~3}3G6VvXk@^qWIDhNW0mU6TC%mBY_&{KXWT-3neeXq_J5MnM+= z;5HxlO}$D)F zm0S6L<(MBnbGIOe+!&H+MLO3BXkX1qP#{6=Ye0myrwVicSAqn1P;MBW$H+sF; zi^;`)@#fbht>YtfCHRUE#DIxB{0qlG@vtJeD^%!EjNvJk(1tW*1&$}1&6%0xg05}D z={JXev;Ooqzx-D5r+b~dMCeLt1Ggy#MiGlbS{o*?Jc;oTafM2#1PYqRgNyJ6sFSP~ z7eE!~&A-;HK*vpmKJ5GrHTF!62wkU9oTG6TVlRO6Wd^EQRR=CxPO(o?ieBD0pMd&(c@DeG)bs^|0kQ2Z{5C;T-SsWqqyud(SS7wl8 z2ySOopn5KK(FKqFWB~f`K#krCEW7fz1UO3XDR~ zpm+%sgNQ0rW`K<#$U(zFZhh~HUv$x=&!JM6-WWH3#2ZzbRV%r)Z^sB-#}Kf-B`|jx ziG<`(QG#;0oXC@q6iLXW=$j_$hCvfc=mMl-?yfJtQ`2fo?Rj#@q#bRqL_E~9I1&y^ zK$08*K7UZVEJQQP0;?#H2uTxUW>HPvfT%HrE?9cbJpAK7>pDK}QShV7MLsEz5TVZw zf*2DLw1fn{Hpo2$&zm3{uDpn6soN;|F2tNH_U88zNGroa6GNVL0>&%F| zdZ>Ycj>JhqVSy#!tSUo5A*ygP+=Pg-BGH+|n7O0uTtG~JaLrt$&0hK4e2D}9DSfR& zgswx8K!ZpVFbHlG0SJif5+Tk7LhdA#5;%^^1PH%qI~Opc9#z~oYw*0%^w!<<(E42q zM(8>xLUbi80uM?E1@2%_(3Bui;Ox%v7zMUs;LYM4b?1U(mN@$H)v;+`JW@LUuvVvu)E3nYXZgNut0A$fuTzZVJ~43^1^D1Om*E@0aJ)FQ5Moz2$fk5Z%Fef;je z2wg$2q5{SYY!XN_XVeU524bN_hJ^q;79?HvQFtyWnok{78SA#tvhwO`q|6&{ZP2F) z1&DQ(AzhgwM3w+iLPH8XXlV)ZcqN9+?BdryD$50p)c(z5`%RZAkoa2EpXb~(G8SV@*I6kTt77!&cqXdY~a)C2x?^9cc`=!bi|12p_!3Gm^N9YRI z!%&i82?@nT0^IkQEQ9YJCpi{8*`g@oTDP@ZmZ*ivUGGo&_VlDBE50=JoA=F)>ATyv5y2b*FAqyIk|0w&xS8O{B1saQdDWwDruJI~WwaM8-na8E@cz1Zs_D83)WH1* zdNw;Pt?nDKQ_q=&#o>Qo@-pCvqzDw8VQ?Tt1rRe}np5PzyLWbhcJ;F}s~^6fS3=G& z8Svqc|fhegS9B^9k7?$bT#RZb*ipmAgpRea{oj0xd z`a832)vHy1(n;TG1BxwoGC@dTo)WQm|kQ!e1GVt8@5b#~b6_E>| zPuCn>D8Jnv75l$B{YuOjGU9tZ>;&!uMZ!o5m%*>7Mu~!(6N1MB7=QRln9Ja!?*lwXy(CXBixGs0a=)$T<+<%nSZO1;Gi^uR-LgKmmBH>MF(`lpJ_rV0&O!;hz4v&6go_S#l=`r&@7S=*+j=pzWoToHn4;1*uZKcm5a4@Ma1Oo?Kl z2Meop^|=A@b{xCl=wI~ksW}~{EG+o##A}DwcD<=j0pMU%!Nm;&%L0crxXJ-p0%8VL zPqY9^CU69FAiDrsx46NG>GjEonf=zRIUn&)O2lt^lr}0cA_Za}%n2xQfI>?e76X;3 zIwCk!VYC|3O&F&m*#*G94rTsGQ&t|Ga;AOD_SX;o6QSrbxc*}&v7e7P99+bRuZQ?W zI*1Wp|8Q6V6Gpyj#Mf2*Vm;M}ucJE5zoT{289pG&x~rpt@J4n%x!19e$4A-)VmeD4BtfXTT1%AriO_xAR>Kn`!pywJOB z#P=#Y2O4+GN)BxT)ox1nPvp=hhc^EvcE*oyo_pjB;u|>g;vsl3kvoWQ;LZz++d+K8 zcESge=NvzT_=XR?==VSW=q1EAc3>)Gb!luhP5#k6o#5aKLxyG*{zTs;*Z@1ZF5_wB}SKbm6 zokiWTXN?@pp}benWDeKma9z%h`~OGU=u)^Lj*&)uL!@;D?EJ?O(ui+>bPjN?+k#AM znPs>-eJK|%k>!YQV0jK;Y6~0fa%NOF%UH_)8H&B=6amCHLm&qrXB7suIAjJd<421aR0_8yD zRY@*m)xw`fx^7oOlE8)d=5OgbFoigM3-Qg~3M*iA-O7e6lML}qB-7>24s9M8;+saM z%Lx1rvd9qMBr;taC?q*#h;Is67=WPbS~65gY>00TTX;aBYuAP>kq+_Aqtiu0~WicM}Q+pQ_k zg`hbU{f8oQcEi^uOLB_C^|if@$=2?IZ~k|4o3%4kZ?ng!hDQvJ;xtO&Y}A!OL#|9( zSHDfesG9Lm9M4s+FUl&~qU^FQ)g;O>d~$M(kYX}RG0xmjDC=i}wm|lnB-s`(OL5Sz zC`OWnl=$>7>Zm`uVTnoQ%_*`yidW*?KSlF4yBMwZ7K%i^?^AnwzjqgeheSsDT^t z(r=gs?OWqPE8u{zL(47n1dWs&-{bWG$Ll;S_Uf=s*W<-u|=vh0eAnqf1ZqpcQaH zxS=JvS4+~Y)}+GkcRFskaP{tlr-%AhxJ9|q3Opd}&~giSNh9FR!*f09xOV;fxyn8H z(m4F?iLwtoReXDWIZq((X3t58_n7^z0vGm@$A^{D>ua6 zYnRd?YSGxK8Z7>;PxujP$q{aW5=)}Qvu-s{U_s;(-s=;t!;mMN}5GxLGrh-Sm4 z-e@*#>W${PGUq3>D3`MEWX#}wW7uDpYtYPmU^t@LuC_Ot?P`0Y*=J|MlJD;o{P||x zd22tbIp9|fnwbv_J2W9%x=kxLn$F+6(L@i`DY$0n*=j%5;N~ry_>#qgW|jlPPJy_M z5?N!#w7tBsNUyk~KR&qBYHrdWUwz|IAOQ!29a;|e$~nAOZE=0!mDV4%9QdSF-jnaY zwKKtkR=@#ahgOOktrTyxHh!CUvBH~`Mqjv&4VCMc8RkJN;DB&LOL5zripJ*r^V-F6 z33J|P`Y`F#-3dc~{Lqb7-~nNWmdUkRiphJm7T16C>6cNZ&YFY@hr7Mo^oj?qfCIu! zGAgzxo5%P_|IHh{+ZXH9Jp6U5DjOdj?mVsXYQilUvmO|BtLOHtDjHX8E8>fzN9?vj zyE@zV)-RC1uxIrG4hT22;@u~Pc+H97*G9tast+UZ6s@PM#G%Pr{Q zHInh&FYC|T(K6rP2R_?#w9}yvzx1FLa6q`BmEe{L2^tY%XezzF=;+)1&7<$XT6kx| z1vgrO2ZSA3?yZub*;|JzcD#~*T+yW0KhE2yQl8zLJZJ?R5O!#}c`8A}gr-2%Wo=d5OfCIt} zEtA_RY|?msCyZNNU z%Qh^y=s_#sfUrZ$ZJ?Vp7JbPUJ4!d{_4?TYy=M*jtkmVf9<%}u2s^a8y7rc-tM}e| ze81~kdw;o<@9USzwl_BZ=is;2i-OE37T|BE5a6s6hWpy*5)td>6_POVnxVvxbU2Ud!dS^n?Xchvs$m-ZIXw1`Q6Lc z*57+l_=80w-Dm|K5O!#}jRv#E%9v=V(G=Z~wBjMPJ%K+~c%}!ffCIt~tyI_EGN*d) zt-PPyc(XvGBTFydUcTm3$%uD6XayV)ZfGUB)liZ~Z!Jp8{lm|Hmnp=T`gm9K)iXFZ zT7d_I9a?S|O_Ih%Gc;eno|RYO2Yx+sU`5i%H$7HHQosRWhn8CnC290l`?J@dU_C|@ z>~(YP`2i#5r+HQ@;DE40%k7#-()cpot+CAB^>mYY$EIyM`O#O?e)gaha6s6h5yaoKW$irv&4s~kTuNU8!w)9vHH(G%QgdJM$ARLP(YG-Ttg9j(I zJ5#Ccsk{w$EbnpBgI2%+VTYDmURyK*ep=;1RZor^e;|6uA0y>T9l!IS6>vbfp=EUo zHmgPw)=64bY~<;pGjebIb4$J!Gd<4gzyrb!tz`G1KUs6=ziI0}Y4J_V%vopac71>J zK%EA@qp5`NWJlW@)dR8PG&tY9MNpv+8fR0t-aBVt5N>`=u(D7le;~d@Yxr0 zCuz{kd|=oysrz`9tT~Up)#mjwC#e3@*W7$kPnz5MFAtLj91w13+1#gRo96U9xb}K; zsUmyhYtr4s+EnR#ZnOdq2s^ag*I72r{nzaLpT5@hqs?*0@<+US_x{Uq9<%}u2sgCs z?n_v^<`TB+xhdVhxbWSmwGpq7P2YXh6X_jzK-i(>K0Vttr{`@8JA6gu>-dl3!zQ-a zHyU+yua-UFfUrZ$t)}c6y|%LWOLv-bC5oiB-+o}-&(%(O&Om{ufUrZ$Z8O?6HshCjx;DCgw#cdz3*O!E>!jvwJZJ?R z5O!#}{bzQK!>z)#0^f8g{;*rjdpi@x_U^I7gI2%+VTYFc^3krjt#oV~w#&X`eH{04zD}i@fvk5Vl;Uo`Q0SAN~T5fsm&P60tg@cd_Y zlQ!9;h4{CnDEfuAoA>t3o0&In-pst2cDoydjay!N@hWhKYB#MC3FtuS^+zJU(K$` z<)d1UD1=|VW#M~+L+{^ls>9LYt&D5FJvH2^obA3KS5}v5H#H0`nHq+APpx?V-0|PJ zhDK&%4L(*p{M)(Gsg=>Cx-nyZ$#F8@=Qz1zQ=ilGHf{ew-LK$+ef5W>(KdlQR5y!M z?;N-mknACv^p`i?60D!h{?l6H$<@E=8zr0`biBkORes0nIL%H8-qY-q;62SR^Im7S z9h(&Y7V*iIcWe9+?K91?J66YOW@LF!Gb77;ny%=JmtHt=vQ7Te$yYi&zpAy*G|TQ- z-PU675(89kUyIeUwtagYdGx^^dFIEckcp+|w7?w>Rj-Y~O*U_O4IRAZ(6WxN?`!$_ zm96+&Kebd&l{N&wrphm>$y|_Lk-f8Ccy`i5uGD9)J~#5)Cy^dI92wJ|+|jk^u}0Z_ zPoF$C!DMA9Q%T0F7^8_(9<2iC#bFIri>b)qC^FMllfh(kINhnZY>+*M6H{>|`al<+ z7Rqvbn6nUaZ+-P-K0B}Vj4emzJ(h5C#M?ip?gX&?p!Q3XHrh;Cj6COX3Y2iD&Q$>^ zY*HpR*5Dc1lM&5kw=$f=Ard0V1D4h9&fFFrVPWl%1K#sZSfSYzf_(nk(fB8SZxyqp zzVqi=dDlXf69Y6mUyWyFbvYp&U8tFJQbL;Tuv~}L5`z5H>W9&p>)Jm&KlZn88h&?n zk8)C=cFKL#cVfuIoozRCS6>)-@^|v#j9CM4efTXLEnz{bB8?Wi7JGV6?BQ*JO~v z+>>9bzy0~C-xBZL)NJp_tA5Ni-H}7tIX2Nq+bMfd6ldcsEN5YikN~pg*tAF!<#42k zD=(h1E2|=z8)G%wK*SoLFp0rkx58ktIt>=e%sD_L3b`Q-i~yG*m$G{{CNGItvS)^; zg+U7i^7Dd22Y!A1{N{PX-+24_Wv%(b);UXeYra2Lr^Xb>GU=9@(j;T7CYG}+wp9TY z-9p?a)up#!FP#Q3WMFPnAaB3EV9(N|{&kXPjlAbd=Z(&b;?(|9DJR0r#B`nx*qI@9 zW*B8ND3Fj$bN;JOKmE&y&pxPmam|^Td&TC557Z4&Aa$r~QKu#pr@p-YpySD~sJt3) zI-C@3;^J600|;^_)o!(Mc4v{YDs)|Gd?6F4I1_`Bbr^U6qFkDn04-=E3Iw^*&Zru> z@AwD#_wJl$Q-*F9XFRM|jX9Eb@ZW0~kg5V-+xgmx^U507wkL;6nCQ zk=x6ir@LV&RRGIZ%Jr^5E=^G$YCLhx>t8%ECEM9~TuX`5*LA2-?Boia>7qVYI>QoT z?x}*AdX}=+jLV&0nnXXmR+P4PamuXCVeid&vg^lxOC0-KUJa!}*=Dasp)ihs&j8^w zBS%|kr(85<&F70qvx_EqhfQNLxq9_NKHSyi@!uQGI5BhEsSTr?M~!nD`#n;uw%W79 zaycgmLZihImS=UE;O?YUH7v|YIr1D~3F5Ozw}gt~7^@v}*0RVwLoTNscAV>bz`Sy7 zcI+3&lok21$EQ-XG2KGh9644<#|sH=jrowJ*O?PC-z_UeMNon*9NLCD+>OI%qvcIe zRNA1q=M`?UgM@FW*ryC~(k;XtA@J)AWh3O>a-axvIXJ(!D#yC#W>2v>jaCc5`c=8G zvfvPxP!OMQc2mgHH;Usam&sWUd>%}CdW2CXQx;{n7%kb32uHNtZnZm9Gh`rvOf`1l z><$1=F-QI#Z|67<7!met$9=QpEpn-RDwVQ>&~d^`RMY*w&o^gKkPF#adr^5r5+)8) zmYNQY?~-Id4Z7L#mzkjErV9j%2VTFqn60eK#0erWWH{UlHi)~%Wch0>)_68g>G#-b zbH-Wj^BWYlvuu#w4&c`$E6b_;`T^w=Fx4d1=n!_AB%qNI8Uh?~k*cv=q0MAujLry~ z@Q_n1=IusMP6W<(q;t*|(gHO|3)EmUxw7F7GXQM1TIwlQ8!e2TGeh!e$`mQCS6DVy zOSDB8h%K+La=b(sQ4XitIo?>Pn40TBa2LvCgyRRiN`R^Mr#GVvbS$NgZ|A|$X=y2G zZ%WgM2WH5yT1`w22p?FX`9{z~8Y;dlm**v+M!ua{JztkSB7UoO7>f;%FF3BI+EAud6dDmD5=q_)w~X; zP*SbsNKC_qi{-%tvU6;BnxLQi>_uROc<<$@g>zD)=4xhq`e~d?tqLkRzn)anD5oQ7 zot~sQhSP9bf>7)AIt)c|otE(#USjZ2hm$oK=}^p|hX4Hmy7+pnPj*Gl?)TH`Q-i`! z?6j%2%XOjhsuaVxTD4Zkl3JeRb*L7@P|!M97Q-<$j;c`~fCLpR6qv!9Z7~Ym5z6Ek zEu4c31xFVE7YeH@0DzO;?__xC&GkRNTCZ?Kc=$SA6;$DSJ&jQslGLJlHHT3+i>q0j zfQp|O%3!!gL-_z`p)A%Mr_;s)wluJd_+x8Ak6*9A?E?s9fzzib@g1S4CLj|%_(pU#^60Ac zRf7~;|D^Ukt@1k^mB&O3a52qdI!3G2=y9HhB}U;44V4st!3j#^0}Y74B2NhgN2uA9 zXLN@CGsddfXXm#BwU;>f>G-T4cC{a``YssGCs0zaW^}Ap&G3Yl)!}+lr$Mz^j%OI2 z(fFe9)_@jw?od=;&SH4Nx!}XRd71mZJb2@`H5)$uLFIRHDG$+l5;zdkv#1_~7BC!% z;}oZ5)M_=VX0&R~2hn~=rCk;lREJPW!zh2zItMln3sue?)*@#3f!X7iDOBr&!7VHb z3?~^(OVhL-)dPqer=w_{mcuwbruG$c`9@*KDuIfGm0Ol5QN;|o7}M(Gjm@S+Z2Nn} zNrNh=N>eCCV|tuHH5wiyuO8Q^b-=G`mLPSMh9`YjuLnswgRV?)9^JPhd*a8fk_Io% zn=n0$-m40#ax1B3)C7(*7{L%cj?=70uhB#G7K}zwKwEjMhNc9es{_GO7N#~RhmYH} z?X}KFroXsu&!uPEsWt^eKTfCSd96;3vJ|7yk|c?;YJwsd*duvPhX$mdSObLz>lO$Z ztpRqcGPVQtxe@)=eEHRilQTN6NP6oH2DJ{n8d{(C~Yyv?AWv+apHof%TrV)>9oIJkq!%cr%I=zc3sM?p9UaJR;5kOo5 z;G}UNCdIH6r)DV(G!h^1c(-;L3M^J8DTmL0@x{;?PpQ+LeekwxEzMMZw&U`I8HckR zY~dKD*HExkkR+#JwY&yaCC{Kd<|}|rTsFnPzTvWorCY&l!G*evroQLHM~aaLqEo9 zwX;SG<+R#CJAv~|xtLo2?fmDveRp_kk719UXv2KpM-^1nPL9&!Bnv8&8ly;x(^EQ> z!$>v7Q(B#lVDvtKv39C}yA_zey#HkHHt#uJ`<>b}uhqugals*r)ah`V0v1OZO3!Kt z(B?Q^M-r@>qgfqI`@rM?`vDvQZIlHpc{fGY#09mw4DNGrL!HJ4TgP7f?V#$fV2*1n zts^ju<}659Rrp4y z>%nb}Gzsb!jWHlOaazrSc-OHs&MPxwkk4olN{-!R zF{ZJH>4j}p#I-BDH)hDMjTWk|2SY|UqW}>xIPI#ndf2}ihQf59$-+jdhC_m{FcoDx zT8;+MZNuy9RD;&P{LJ+aS6-Mu=WLK@(orlBN(~sHwG_|k;UJ(Pa1a+bM(8y%-9|Ew zaxBD+Fu?9$dIR1nTkWdzdySeeJBSC2t(}S&qQd2Z2 z?}P^6P?Ktc*K?SjP|FZiT2-9}3lSJOLm9>?p29U{=vpt<42_y|WWf&~9d7+-qn+~( z1}CxLsK)XD62s68htYac3mXtg;w(^*gP%UjuoO7A4+j9l4B9dPYq#aCHGKy6&OEC; z`&i?L9=f3VJSePDf@KLbW(}_6Gz6moalw-sipSKjDYCwYj8eeBbRq(UmH`y`{=nZ> zcG%W(LQeQ>_TB@9!D-Dn&r)D9(bI4qr*SxSFj|t;0=v^1oM*JYMiky?=LCIJIFZ?` zQvGbu=*wpM+>C_9v-U>TU7eB4{MPrAi$QA5C`vb*V=|6-2cp#cNRC zV^9ff;NS=AwcQaa1kr?|WI5n1_^i>n-2;A!`ED(C@bk8_a)LX`Vi-r_aAwuQ&Il$a zn$W@tjbYVbM??u6lWEN!)RllIAuhn$oSC=o@>^SOOm?lD+3DKR#m9qVe=u0+c~-;n zaCpVED6P?JQ8fnZR8OG}8!~+egARPQPa2nE6uuM4(@2g92g+{*QL|d*parnIhL#H%e zwxr=_i^A95^U|-usS^MU4MqSp5BoI+$7`^h5o$0EV{mwcJ;|5*OYvm_hm;UQRxY{* zTy&sTa>4xN1snGm&K$o#xOEAFl_0?wjFVtkVstd2A@vx^Gb~H+z-zvY9{@6O8!wNV zaqD^~k4zsn+Lrdk({YClDZ#1HAW>PJj%9Ha&SjLA0t*EL_G?DNqclt4zH+t{Jhxe= zEMxlqxr;yhCjYxW{kr`z_tCKzIeppyE;yr?sMZi9iE#vjfi?&#BKSQ>8f+4vWH7$^stD6f zP_#F$QQHOgO#j=SK2b6K_2V(Yp@?MRXv*O_Jq`AA4GF*q+MpgNM}wJ3?+cE&0Bu&# zPOar16|J40pSk}}o2kq#+NQMWwdL(5-?z#?K8)SlEl5P+qz04-hEu~&@C<>0S4Z;%$Slwg zG0az5u~x<+%#5kW6x)LI4CC=Kc-PNOuZrg4p)05us06CeX1`DhD*>%7olvLmFS}M~MdN<5d&= zp8;_7#jCYu8xr1Jn$hTkcfZ}at%>S#Fu2kJ8D379(6`9`tt~sAUAB#FGv7wg37n=F;D)D)r#|Iq+|<{~nRM@2i*h z9+5lmZ=dfTk-P41kLMndJMM3z-yV^>?W@1n9+5lktG&-2k-O}xrNu;yG9+5litBbE5k-O@viKiZsJL;>ApB|CB>8q2M9+5lgZ>x_Uk-O-tk%u0UJLrQ_ zeJb5QkI3EgL2dLE>zzmB&iSB})(ZE{BXZY#_3+Fia>x8__sb)4w|r2Dsx+@WB6rH) zW}iGFcgY8}1y-I%9+5lbgVGr)(I1b<-SM~08;{7H@xh^}@_g}#+!Y^`_^wz_JR*0* zS06t-B6q_FC7~+K3y;X1@VDOwkH}r{LFvPl>48V&4*1~o;mY;DBXak9PzTe>@xCK+ z=X+30UunK~MDBVIN|sil=N*wd-h*0=mEw0tsMBL2VTk>{mzRZgszWj7y}zu5>XK(M{4%DBgEx8HkiJ#n>Z- zbX7vql=3e4*SdC-NNFj@f+G|Q7b2D5XBZkDDE~yb`|3MDEM(HMhjM0`VM(UU%5oZ14gZKS8#n~xVmgfHA@rJoo6s7#bP9LHA?0hYtafY#zwn z-9x4B5|7kw(_=!;v`>2O9rMPVf)mpi)#VE25x9y8nP2>Q9iqG80u4rLAs`V#+#u+j z(Q7%Fj~1@2kSGLB@oWBY(5<--w$z;rh z#3VKcgl}2%IXo8-uMWf1fM&SR84gDWxPb(L!+Hkp9}s%DmxptDH3_VP;&34qQU*ZY z0JRYOCH4lqm-d#h|6bFk1Acb?{%AUV?cJ5m3r$r!|6jnvy&|~6Q4I(ckQ%(2_X-Qxp@1BrR!6QUAwmjQq+{4F44WtI<9{$o`Q{AcZ z5Lx|Fi|sS%YiWoK-M-*8{GAIuzB1MA+xC^Top+QhM7qy=X4iy_ zXR!S3hcS&d%k4bx4!e_AoA23v+56Y zJ@NITA+;}jMPJx*XGlS0`O8n|?0Nj>;`&WDkEzi-V^4LHfrx!ctD~nzFuNKfSEqLz z+^Dvn5;{@{FP2nLhhnUh@~lL+R4kIz4)^!vshWzRQc6un4Zi~{Q`d$a{I%W)#Oou4@W!CL%K`}_8G>5cDb0nTaI>A9#6XP;Jo*{gdh zdTpyxNSo-(4}f5=9tSEDTm(y-bo^BBHYqz*r#iH+x4YKAc{C)W`{nrDL-&2O>A5r3 z=M&bsLdwnB>6c0_%4k>kMb`YE3{Sg^CXZ?^NE6{a>z(bi1c;I-dF4z;4%`dN3-$j> zNQbIG-prmc+B|j0p=~d}bfV6{-YM^InhV*WhfP#L4&<@*(w{T$$$j#jtb;F%c=L(3 zYD{7wxjV*enABv*NW{%L`_`b>+()?c$g5Lta!2 zON!2j2#rgQQBEz%Vd_@s4AL1GMx7erbnW9Vy?c06UFZDM%a4fQHG$Wq?^(096V>40 z+pj;^qi*Khx$tNucWlJHV?XGApkuFv?`kuf*H|m$LFy=QWhBMqaDq)mN~m1I9p&!3 zS1W~cBzsT5_2B_hF#>XK@I@TYi(DbeF_AUaGB}5@;}k5f)c{bVQw`fusAR zv>JRJXKn7ey`fUh2;4=QRQ^Me%U_?X*#CCxUlx;t2PV291m3DK<>N7vj%Ay=D$@VX zm>b3^28y(ih^d?;uBK4R>9iYZmy>fywCT95Rm_C`Q~PcEYhjz8>?g_XCA10D-kUb3 z3|qI?8rLM=^31$NCpR|hQPOi>`8}m+oYc%y|6c#kmrS}%bC zyyk47Ot(a=6CPZ@RZh23Tq}@5)jLa8KC{}ic7kc${SOTsQSyRCxAcO*#FAbD#47I{ z0g2`5SuXhH5bL-&e}P!#3@s4r;^WT_Y52*w6_7Kl}D&%ng;fIZx1 zw>quTIy!gA)^lI()Lz{$bL;aqTE0K#A=nKvFb)FWr>9nVv z7a(3JeScuReb1dR$9I0V@5`1?jS&(chwoR8EP1Vfz$qgZKe;V#*Qm!He|!yQo%e!! zdVs*OUhM*-%LBmV(v3x2A)ZZO&X=zqoP8nn<#Vn3av}A5JaX8Bi`fA?c%xCiLzi@& zf0M2fr1C9V>RwwpJ#cRkz4ATU)29qzy-@x3^CSP9cW<+hfu=XiA73#wJS5KZNQiQ3 zz~Kb6%Xew_`~dB5meD6L2|PfKa=2(`k9Of@2K4#%un%d z=Z)}`l=Bl5Z#sLP`Lt*Kwjr%{e&gveBXAE1oD1KcnOyVH3$K3MQ(uU@usVCCxyJD?R=hN{&8jz&=Y0Qy1kqTf za*X%O1!TUN_R!;|!~;)U@AlH*zgKLm>4qJUIl;GSU>tfNf%l3H9o5ndaNl8;{MNDQv%aPm>kzbUjpmJ96@oy`DbBW%ZGOdg8*NW%V!K z7~QSii+`+-Yuip5tF|x$Z=j^ca$I^E%i;3EX4F@UpWK=j_tQFbaKD;M4-b^!DikQ? z{eA(RU$6W6(#lim$&V}7tofp^cCmX3fX+$s#(@#)1_yMnLrqp|p3CM?j$*7X@G{xmDx~t~Unpaf^9vJRdnaYl zpLX26E?A^~KqgtYfD*;iSPqvLnMR+;|3NkXRMGLNoe%9e6RJ5S&LvJc&iDO+M2LF| z0-5BE1Cz-E&KM&rD33xX387s4N1r`f_sREST@%UrZU3J7LkU8CTY4k3(fWCHUioR~ zOsfC1pW$ju#5w>EUSkdB2P_^p9@!9$54GLaF^uL^;~))dK!DYF1@#pA@$ISQBJ%hj+I8 z=7t;aH{PdZVB}pC(NY^k#L{PSV;{V}GkUjUTaT|C*+uZE)6iynUU;~msUAhi(WBm5 zrW^xGyfaj^NJ;jx9zE+sUz*jt@BYxDA&DEGSa?IUm)sA1_q9vxv%aYDBT2}E@xRB> z2~d+sVH^uJnQBdf&nV$jUQMP4U+nZyoza~NUs-sj%f3dt=hi~xPoOpkn7+c?zJ@Rf zD0eLqj}{87AXH{bl?uQKRW_iSMg}}9r#6VPqF!v=|M0xuhdw^4aHe(nnz$1yYfZCT ztNP<@w$g6|qoPp8CZykV@25t4DrYwvpmkk z!htlS4k(-gKeCHzzb&iFB1)Mkzjj08k|Pr{qoQYcy-jH9J<^-L-@#4+32GyuETDsP zh78WkhzZqsH-XAJCKt;^n{Cb_uzER^$`Pe6sCl7MEL>&TMg^OfQYjcnE7~nozD?H0 zv!xVv*it7&MLT_hfJE@IDV5{Ap%ETksal$p7-5wq_E^7*)39FuA2;JoaN>bLa7jv) ztbDD&A%0e1<(!-LIa0w`EOC`Weq*UrBeL?nO-0`weN!{5+wB2y7*|Hd+&|fzp0b)$Bf34oge%o*TwKJ1^-SNt_wM0h26Q z_{?y!g#~68Yo>B}%t8}(s>oGn%*oBS6(O}I4gMrQYvMPbCPjV~`$Kc4p5GJ2=3CyK zqqxEdJCr-h=Q;|m6V86q4Z8B)U2izc6^eEDpr+uhD;O|^l45;vqWh#A1q0lM?jazo z52~+b3w|Qyo25@Vu@0TPvK^F}%vQ~je;I4C(v&H^$l}c5oJIx;1bVd)3KGUZnJvnh z1YsJr*MP(itR_KaK0%uZgZD7*N{TJSa)zb7$8^d}ibyu3MMp$MbWDt%S~`r`Xh~=D z+|}M{C=`lErj>pvlq-$m9Ik9iP#2Voz_-WQ!43^ z!v1>O2JQk}L0Oz)Ey=dx8W;~IBe$%sa;R$0D&<>Hz6GA`2 zD`xwB2P__GweZI57|^60iV0q9CU%2o-mC}gDmC=t2v0i?q1=Dhx)UpGhak;r9_`Wp zm5wLtcBs4Hbo0z7{fos^$Sz&pDZn>I$UizF#4kERIbW_P`-Z160tZyF;_3$xgjcx3 z&qQ!SkXNj_rmt*6ipL#HUp2J%rK4c>DTgt+|R1YIQoE zYuYpK-nthiXaD^0anq`8l_FOB4`Ph_6bAC4B>GP{g=K;MDg0!@#ihtO{7%n);nQ9! zNTeX#VV|zK%xm*5UvC9fzEE+#3TEwr$N+_F9bmpFG(h+K;L?_l=bq?w^~gh`Hw&hV z<1H&<2voS^ra-b>BYqiow&9Q$&2z%)>SDegAr7(kv5FW1lZJR|Or4Yg4Nqw|C(=>5 z%U-)jn#H8BiWov84Pgjr-=S6Jh}dx>1}?q#a_#!##993PVnqyrOGC6NsPW6PN5X&n z`jg?`tZwjKjx>vpn^nXRgfztdgz@ht*X@;g z8|{_jebr8}@#oja{NDJtJ^NZ|e{VJ5{XNYtZT=P-PmNWMfyN#kO>8+(VO;h0+V^Tc zGOP9PJM49So+yrgxT$iaM;8*CP3~#y-lFr-ZJ&So^p=B<+K%r1?qhi2NFjpx%E%J~ z#y)mNcm0!)8_gGuycZrV+LdwbnH$D?=l->Y>zV!(36JK@S^2e-8q(y<`|970OqjL_ z9$o8E16%pi&qb*n>OKF7am}V0ll>0PRVM0SWJ6FA1K^k2KLxwv15U6zKFGu872#8! z-SNbaJ=_1*Vc_wJ#S6x4Iv!P26Olhrd>)JeCyBGe?VaqK8XPO(rM1RdTyXQ=p2Bx@ zK~*=WLolHsqa5H_<5-Uca>qZMOpA1{*OX%eo9aCrFiwdzQvQWtQpnxvf%y7>O+9nzuPRUZzQ1M+wOtgg{ zDtumC&eYeG4^kKu5q1jdQ};9~tUCA2@a^qq3av8~x(NQy`nyBI zGaV3K6P`y|vI{6nIK1fpcW(J=!a=RV@QT^BL;QB_ir67Uh2UR^GEoZ&@zX*o0%hW> z|Ai5Hx5d&J9_p(UEEmY#Gr=7ppzczJ4H3^FsU% zqyg;w@>6V8m09SxdkE$@E|Nk@eaw3VOlv@Fm^KRmLf?j?} zaZ+!$iXRAOFB3)xA~#{c)j+QxMGyJCx}2^4>(a~k5`xH$FUn%S33|0xRXgjdpQWcN zcEzBL*M9aKzW}|-tS9Q&?No`(;g~#ycv&Kfvq3d`sOMc2B_5U)zu{ZD^jpI7rE(FFR_?;&90o7Us- z%(WYSR5y6C=JNaXi?=HJqX8^`iUFuP@MBaqR*T`6c4w_MhcqD+A6dtx|M9D6nB6v4 z3Ed~$^L>wbjULE<#JyPhPPsY->M1x7!UlI2=usrz*qMV_~!lrU)(?Nd$j>a z6HLHzd#R$oF5pvrfT!?i&P%OQx7Bm*nA5iII@gT{RtVPmo5r0^;462`X= zYKIQqG;Vi{vd6GV7q`b8QzG(5LBx3q##YW9A}fY8-_-1S>v5jJzPsiyu28(F;HcL; zWPEr@96@4SWOQ#(Twh>$Vf527P||4xqy@#&BT9VV1^FjM)QCA@WO@3CxdArjs?WL9ZQ*!fCKwoa?n zLpIVsRWp>kwglgE;;q_^owGOg}VXDQGsm6d|Qw zT3ImXjud5{7>ntsr>gx`09!O=GlqFw>tRN-%@h_VT$+T4Rj^za@stLKkT>QeetI03^ zJZkO3XLe8VSBY-{Kta-ETdmn}r&Y)h7?$m@TEfMDARVK?Hg=1%=AhYK-S-fKliK;0c{1`1WDOrT6~Sa7Q<8@TfYUTDso}NoxHpFftUD z#^{9N;jEtLAS*6Z1czM83>2~#A}BPpT1}H`Jw<7K7!bTuMV{1(j!?5H&*%&do+-QU z_-p4YHFq`6Z+?CL(zj>qzG-T1AAt2dsn_W>P;ef~%&T=YN5e|d=@}h^(iE%lEunsE z09(yMmS$96#v=M{efaQj>VS$&kZ&CmigBM^_T4YY2jW| z^iq{y636neMrmkHLt_lBMjj`4_aNRZ( z)qyYxgrRXm<_#L(?yIBuJ?Pj zHK(B<3%-VjG~hI@hkX8=zC2_(g-g={wjfb>0JygOwB~BQ>GijIfAHJqnkmChse-Dd z1&fcwcr}gbG?Z4Whotcs&gdviPilamgpjA)eIS|Xd4F5nCRIL%ch6UNB*9j7W225$RI+`SD9sEmZb$VYFfVWfG5-?>5tC-|JU+qw1 zd_vKWZR&(XZ5XTys*Dx^1A`jE5G+HXBo5i=8CZaNLPHQdhLgVJGjZ7z1N(u?X0zIz zAQ0?asLLp3dJn`{QOSd*z4Y0}6L$K$cHEAzuBxCEB^?C#(K@IRtS1RfN9jRN0->sf zZ1fzCs18r-*>2Rk0S;spk+w`v4@Z*JNRepE3%M%f#8mc`ID2Po$ zt>HBw8&Hs_5RS-m8c^hX*P_V^>F4cbLXw3368Bn@3CY*qds0VhTFqDar9&RL~ zYJ%0_8d{HIq?%UaT7tm|ip2Cnkp~|>7mhbJP|nK+Cj8J#r+>;deb}LJR>v21VqH{0 z6^A1AxQ1u-7)s#0POIlgl&2{I_8Ep$!+8k_{d2?8FYw3JSdj8eINy zRBV0h<@@$6JG9=iJ~$*1Izj0oA!=2Pvrt0;<8if`1g(Llv>F{w`@rKc839MxHp;@? z1WBE@uRU?C#@5#tHU9eTMh%U_RemV|%3~w7hSh7;I1gGCOX;921r5~`cuEIK7i_r~htp~nn5j&Xo%tvu`9#92gB-Q4{J4M0o}%EkI?x2vBxrdM=!+2?qt$D1mK4BJ z>*184^;P*C1x7e#ay*^0KA;_zoMVCr!UEVdD9c+T=ps$*U^A46Wsn zj)7&br)e$7N-eN8i|a5BBA;=F)q|p-k!wyMv(Yj%f$X0KHQ%%^Vb97rQx7lA85tTJ zdQg<$NmfH}I7tI5fkMZCPN@c67|yzkTBcJ%s2V7h9BYGX1;E;HH5tGPtTtu+-2U+H z*JivFzV3xLvt~QjtM=YRK?zi8#+|k|P?v?!(HNX!c@~aB z5NeL%dLAcW3K+-=U;vmCLkclK6F`;PIpdG) z6ZK!+Usq|3I{Lxl3&9C2Qm5gd3=9U*_bkcKP*{c3(V&PD1Oqai)A{gyDPWKQ8(b$G z0ELBV0|3?hk~T8xH+EYm{-NC?nvd^m~9F9iw=Y$8Bt0DyYfRxDW9?S1rI(}>Yu7T<_f1yu}8kAfzwfht8hQ0_n~aBybj zU=QSBH4sqg#|KMBGwi|=>x9x^ISd3&USZS^hAFxeO`6W1dn4w>E5YgIw2or5IvoK; zz@R)83yTwHfOB~rp#{-E`X2Ln$SN)#UEpA4gH>s9isyyE%Q10%%b#LTuR!WfWSE1t zvFhOTay3eD90%GGh4VPgQ49)2*5M)tPC@l4IOY4GsRS-?-hrLR?g-5l>@_G^hNQr2 z_uYEvo$+bp{G>q_wFB0wPW}T);bmO%j1RTW+z9dj5)Q{H0X1lwJed z1-Bb8gjUNEIu6xQU=Gw0AlU@U-!tj4oIj&?sFX5f=lHc5>DtE~{4pd2=r{D)pU>Z29 z0c+}@WGpDV94Jko;c8G)M=*ZL@|blzRPG57A< z4f`(c^uvm0{(kK~rc3;=;4nvEAUWVhpB|1zpdT?L)Ldl2HlbBBl$z7~iV<YFmLIj@uLbS1cx9LG*vh_qH47kPX82W9RzGSS}m&A z(t29sYbIf>j7u;k2~jR($}{SrYXd%B{lx-q?Y0L;KD)F>a9XUM;9=JR#Rm+4dN^s5 zf+j?g45QWR7)I@TbTe5Q%0%12J_4Rvrm3Gn?u6-*FppeTaw$YG2cPToEu%?9a&%C<+Ou3PeB*qn3kp1-Cj zI=Aq0hyU+DQd+~%t0*B9Ulh~}u&8Qz(718IwhG1pjMLI2PGVY2M^kXi6-Tuk{M32% z1iF^!6|W9|asI0rZw=elc+tyAtDjz^^2?hb!&sn`Q!dBkf z4OD)?s@;dZ#K^}! zTspNydg1neu$c*|NK0MSrN90EPHW`hI(WB{-JfWcyT0v}iTBv+`$cgE$EOwRvPN28 ze7yVDkH0pS>)yV>^lKe{uJ#oLtGBxvVOK1>_8FV;Ty53)?SCI@`0CA8wP;)rGhl#s zy{etn$nV#>Eao$Fzxn25e`MBZ$K*Q;+G^)mN3QK?a=iZOPWSbB*t-2EV&QwY*{zPO zd->h3scvhwbz0bR_LlJtKB;c-+%6|S^1P;f&#krpo;>VQU>g~R#r zNOcGUL0;Q`yk1W8)%*MJVqZz#8u{p5pvnlCxr-_9;Jfldi|!0eRfA|Jg&h#5y4}?pK>lN4D24jvKkCowNUtyHJ%G7j_p{5L8eal3Q*J-5r9f z>Jrz7guXbl!M+S->gMniMgQ}Mf^(TvV!+{Dz=93Yyo<5B7&AM-9&>k9f*iYT(aFd{ zW#c&e`6ru1M0{VEw7F)->H|qNiIPSJzjkS8({XD}2V5O84h@fcBPgqUrN&4jLqlK8 zL6TNK+3vv3ZSx-dD6JZUcAJ8?k>5W(yLj;K!#S5zrJN!%}qDP zk6*s-_mGv#s>fwHWTSIx)F*AGzqIhX8jeS z!N|8>jy<`0-wVI|c^9Mr*Dvn`EZyGwph&+NwN`|jx$)wWk>j$yRd=%A1;;DX*j?;6 zL(9HP?1!D(d6O7ie4lmk;zP!TpH?eif(mu1tV_+v&>NpVH~*0ye-3Cc zHU6nBDYfrHRpte7KU@VBzEO$Szmc(zf8z>|>=l)LzIjf|9!JjI1?(ml=I3_F-Xi;{x1S%+Xufo#`AX|IB@p$pD=bQHHH+=St{^!}C z+!~dWQ~-Hk^v>o-(exh;x}EhDODFaTO2AfPN&#ebUHiS;c5U9#ujq+hUp1O-`R*Tx zi;~OmC20iw5&~3QLIGql@x=6Ri}rmopGoXtZg#d_P%i0;PA7m&ePQ~*2Q7^as#Eo_ z38r-g)eD+xn%V&AKci(A?fwpr#KbS@F!}Lc*9L{PicV~RJfv#hQ*~(eJ;|A8&07zl zw(12iF=X2JaD`}EOGp3XmLN^iLT zSWqU$N=vYS9RGdh$ywj8I=*LO{D6YC{UUBpdIf|U9g=&p$)ts|nx5J*i5S%9|1w{f zUf%agkx&uI6_E798%(yYW0%|)_Bz#I?H?~zqtpsW;Ump@4hw%erc>;QCG-S-(w&r8 z0l8l5p)St1>$VLUcIo;#^w{CZnD*q3u1$|M%I$<~PmK@77$`I# zB&TrK52)!Erwx4hIMz$Ff7LV&euQ95R~1fbNQZ z-^ewR+X_=zrTqMM+Ufyi88!TNR3Dsr3cDzk!#uy9s(#Q3+-wjTwxnu_SePUPnK3oO z>DtF#diU_Cy3YBhmn-LZrcqWOrQfD?+js?eHU8!1bo4ioUvK+#@5p=Vaemdo#+O#F zcdt%`Y8XQ?Ih;`V%I_Fc2{SQT7&|AVUZPBr$Osi{sd!{XZ=)?#ghyGd<~r%xq@-o$ z73RCTTCI3Y7qVj-mr~R_F6jk@U-0PSEpwOd*1Z3VQdx{?<748olJyDsSUj5%%~~w! z85stYh)&Q!M|qZzx5SR87c^8B>&PUMb5RBzmzifW;JWnQrp}!sOju4#9(0r+`c{Y? z2c;^D^<-Q`oLSScTS8V^TA_o>)n>9rE1Ry#6d;uc-Aa)DuwJDsHWZ=80(-O$Pe;uu z-Qqfuu?8JWXV`LLGNI$p?F(MR-?`A^D^uORZC^>-xj-E7i!DZFF_mVENiR&($0g-j zyIc6)5oBCeoH^T)6W19!%Jp#x(#u)U&tY=tyXLalkx2%#u@jS;z-VJL@B8@zKjzO&Y>k7A;nkxnX7=qUGKFBKs@yb-3zWK!L`#$@SJ z@pzZ9OQx=~E2@x;j@EUJ7dpxfAj`#$qex{j8{Y^l5wd&Y7pnmW8F1=E_cchCp^94Y{x>D)Wjs^V%Fr0HfafobW*&fdsa+0y#qSRqZcHk z&b)MNsv6+k7;BE3SEtNp2p`Se0%iChV#fN|x@##ci8b(dc8SOneK!FNrG!-cgkPgNjMfAsao zl*Nh0jHHZowaXL%S$Or%6iOedW^#?%JW_yEe(y(O)E(pQRTi7#i(>OK5^z&$Y$qlaK`_eW&6kKsJv3P8sK+dAnBLAT zCMnIzpr*VOv`unOq&ikB2srsUcz?7dv6hU`eY zfE&4fEA^XJOIe)MJA#Ua@?SY@RzhyRAt|qS0-sMuXLfW%KtK7ZQ6l2#uF7I-tU;@Z zim_YbaG-uFWA2To>eSuUMwfsYc}AOsBAmOgw}Xydjad|ivhfMIM0ciReqyRMomZPI zcB`<2<);V<(9at|zaq8TmDSzStspfz&560tjJ#gG^5Tug6oG5xckHG0^hN_^acUbo z6A{IAXA&|pBJi%c_SCL?YD(`mnFT^Wc@{89@Gq>REViW^6RED2^n7!-1a*F=E-4v# zsLc@3Jtj`*CqK7Ja2_IHJXchfU7v3uV>%Ya=p)mO24i;z?t-dE;zlF8-z2fjZvba! zpj%Wvjz>96>1G`5z0{IbWITmA-9%EgxLF>vba}lSDigJqQGU&<2#|aGrnu4 z%h5F@mZ1cE%5CwIfI1cf{o<)!y22bRg+W<1$`Y$XbBj9hnK?F6SiSPVZHYsV!Tjtz zZZZ-n3F1i01Sfr;r zYqZ(M?C7M(UcGEx%?_Q=QSO|Sh(F_J7_oq2U6CXopJvTQ6A}%v+Q`gUTU26{StoFt zJe*0|Ec$J3sw^(zN!+fE?-Y@cg%M~{X4kYBi^gi~#*2EC+#4m0_~8f`u_z1Eq2|tp z$Ts>Mi&opoU?B55W~AjZZG;i!fiKdC$6iquch|V$46$w4oK)KE;`7qgNv{0F!kqZX zBtg)~jcgLz{M1cZ+?(%0WhU@eXLPs7!bD@PzGGYxn_iS`(h3q-p5jUpP{Zegpy_R4 zHN3IAKB8-4oH~ih%!n-N;$rok)e!j(z^dlrBGAVl?pXgjlaX^XZT#1;baR7%r4eU7>l9~hu{vgig-sFb z7lQ%FYA;HGQXnFzXb+6deOseGYuR+WK^qmr;rJ&Mh3;4sG6_Hy>`cvLAvLgxYpx3;!q5@ovAm;TX;MyQIT*wYusWPZ zCfeeJY1twBy>c>?PtJ63iDDThi8@dlMmajyViZ|Q?5>&)eUCO2UuM_pCOw9Mqll%&+O==5|LFd`W~iE**X(NQ5IN}rFB z)~TZtaHff~H&lFH1}Egha1>x$ER*WRq+)q&;0d6w`yGBHp5r@4nEO>yCr4NdbwkDb z{)&gwI07YPEXo4{#)11-AQKw-kl7b!7V+JUnO#Zp-1&0o#COeU{auej-} zr3Qk86uSvL9x6f=M%nU~++ufuwQ6s;3C(;k7iqQd#%!0gZd;^?loQ@EBt0%UHZgkX zO$Ua;y+SdWNMJRAC6%|_L!9P7xL7z$sEU;iVxcDVhyOY##@ZyKaYqk*1_Cx_I*d?> z)sihi90mFJTV#ui*dXLhZ>R_~ZK(m|Plh!Ob$r9zuLw(*zY45Q`9@ggeoVBY+)+I* zEQP6IIimRHVE7IHagf7@<#9z3CL`qt8S9pGqHs#!iat~RgIA@(osR;j6xNAy72y@+h@MfSrnjU8dPx-HUfFek+5!(+{Lk#$ErZ_ zg7FMO!ET{EhTA<;U^hBBkqaYAfe|d*V1<<$dKIeH>%*Ss!$ivs0Q?}DLzTA7GMT2t(zA73bT&r?A+W2`|E5Q&B+p4HeajZca)lDML zbBRhKJfa6pYNS-UVZ2ZU4CDbNI1t07>c~=AYSD)%*0FIYm9yLvEu+EJJ8nwhRGx#f zQ%dDq<#fVJdPM9R|D2 zV#sDJVKkJmv=`ZEsVKnPoukrE-g~IthQHrBb26>{bme~KE#WBWq0am(k?J&-fmeKi z;{LbW*8Vo;z?RXm)7jz5Zz}+=WsG*^&RdY#aO6}f=ih|YgjRpunUf0_U^jRq>WW*K zsCSPeciv(V=IcEL2u8JVU`S%DZ~_r+F;dNAzzHpww3It8zyJ5J8ZL>vFs=~ljVP5DDjUT<<87^R z$7yguO1qK;>tQjU`G+S`G-pbpY+)WfuUY?f16N(oij2E@eBHIQcQz>htWtu=0s8De zNFc^)$(J;OFy5_wuL+&{v0{IpaRXl)9nrDa^ojCHrBlTZivJ=hOi;W}Mv8s)XPe)D zzV}mWPe$mjtML!2fE0dE{QBS7CJcUd+&$`P#|F1f=vVQ&V^9G72NV`ReE4Z?AxM1ec)HhHyT1ux8aHngKl5P4 zD=asM;=f1=KdmhUX*gl%^>-4Or|7hB>;&sO|2fz03SK6Jt3H;IEQL`H}3uD(~;X=zI^bzn|o~k;ZVE( z1#IVlpjW3;&UG7u=DI-dIr%TePXL}9^6Gu}x9zWbCTs93f38U#YEtg25DfZ_^z)r3 z)FJeo16THfn}~C<*&lc4^dRKPDTb>nmCJ5ro+a)7yz`cbNT`wtgxk4n;T{15*V?QO z%4BeYKMSs;OXx7Tl@o~P6+MXtGo6na@=?LC$?(~diuA$=Y=rUI$)S%TUumWk^*XA& zbhEWn!61Bo=lNRX7=X|vU&Kp61O|u)WjKS=3KX$9a}2#)5MK{L(QFAJymi&(gWh=M zduxr}`Mc^)UAxqzRsI|-Au0fjJJ8ZB5km+c^P+*UDBRrdriH-!GK)T~y`HE!a((x( z=@ajnM$Y}}=3xu}bgVz`RLSb#vV|-Q!WOdpmPBhwhwtxH*;+D#a5n=v;C`mfORB2F zG(Hma@i!Y!ed0c3*;gSUJLBRWYpmRRYYR8XflmLc5$a_@gnN4-NL+E)x^_2?EuQ4s z-|VY)iJO!MD-fx^gZ;Y^>t%@(5xe73+Xtp>cx+<#oYtAoK5^!$3Pr5%VCU{sjupkc z!M*O`4iW6yyywcM&#ofdP(~hjdQ|sW#~Z!&#wW8owR>!#^6;%O?LQlD{T-?}c{XO@ z+|T4d7^Z`RFmM*^cW@GxR3j-M-V-AZVd3tuOalidJ_{#9dtplE<@@eQvc#Oe|Lq<0 zZ|9X)Zwc)c49CX*EIABLql_YTYVkv!ZJ01i@o2cp{OEK{`D+zXL=MWP{~%G^LCw86 zyNoKYk5H7e$xdWwH2?+8Rjl^?e)1Jr%DuLM}NQrTaHrC#WB`h8s|Gkhy_qEhX)*lL?yR-ukS2uUBkQ>IKa^uo zpBB{td6BW*9`B;x@w|>Jzsa22qy?xl#4TBQGl#();}A!53E-D0W|tJa*;atGoOv zh*kccF0*C*ue;}fkD_Y+?m{5+rHE7!r3iSr?FEnyQlupT0g<+mkJA^>^em@B;PN+`~^_R!`wnL3fgydzeD`63fZ`QSi#U?KEBQIV5_;En$YM( ztB`BRaJ5eYvrTho8YX);RC1Oi)(QfSQOg%c$o8B^FK_MS5M&-#91~tGxS3y3tm?f# zDwZ_8yvX|0dG_gYl@4WmT@L4bo1Q~rg53dGLrIY9r`7X~j)xM$E)TTxC#Ub(`Jc!> z34%4=?kvv-qb$5FfhNrCQ@1Y$ho{l`fYpuHwb+U&2!p;zN*)pPXs+#>1M; zcNTNpDiC+qY#irjm`}UKJTO)M>8!M3+BtP^d)lpuA;^uI7e{v7P`})~cOM)qarVj~ z<9L7LjL)M#;6I!gGHzd;EnU%TX%`+c<)UVOPWo6w8Cpk%Mm7hqLs4V8ll4#B#*$%v zk}Woc7yCp)o|j-vjYx)!x&*nIR(c(Z<437A*bO70FF=lEWIFdegjthWkY@kQC*8K1 zwmbV{VhFNu!2CmBwfU@I+nK}j|IuNq!#}gnzI3y3Q`??hls-BH3F(-S(yv;zJLx}t zADXr9@(klRKf{dABWCDQCr`&3q#%E{>7}vL+kd#}xc!arrg1*v`p?RIt7f}#p)Tt0 zZt|g-b83BdXG!o7B=O$$2ffDa$7_{nHX(EE?l(asVyP1ezY zBXNIvmqim!+#$~GQd^V$#TiF=IuY!s0XhERn~9J5 zpU=p@_Wh-0j;*e)jXe1#v~6m-=)}emVKt4fPo^hzj%8xt(VfoU6}2ymShBqi{&uIm zo9@A*HkR5BqTiL*c2v6CtNWGZ{qv31xRT@KIRAX4!RXy1#ef*QHcVXIpiAM6zts#$ zCicwJuV1)eEW0pcm>@>vk*V(7|^nRsO+h@O`q&Pooxn#}df) zkF$rrr*XdXu8yhX5_1jE1~?yTLd-J_jYpdem)t&&1|_y5%3@v;1Eu zIxqC&KBPdn@5j8cqV_rSPtum7w+0sPYaC&7$&XWSUwIC8CTQ!pbwWWC?y=achi)qAg7k0rZRHP=C1n;{d`_G}~I z?+f)WPfA4hokJQwm~TS#j|^+9Hn{UFJD{;vY@*%OvfH~wTWhNW zd}~dhrv^+Y;8J{sFRMHWyj+oqe3CuJ>hNs)5;9Ls&jn1J)YNdZs2(x9Yp|N%Kh2q+ zsy3c+zXDb&bZv7$@30bvBgP;nT{XLpjqmFM5agQxScE6rWuLbiN4w@`b9II*0opAP zu97`ITq8lNlmr)t+^|h$g$H9b0Df*tx*@`$Gtc|HO>I79Z)9&~vsrC+(^MTw(55Ta zWlS1o>wi;hG8oxT_ShQPde{rk)Q?cN>Gsgq1A5{>ma}P!&+jP-T0^_A#ZQ_zOj#Q` zq*bRj(O5J)OaC&p_)#*rW!(7s%mpg7Ku)%^L)S31rH>>F$vr0MUz2EUCB+$i9z!Ye zmWhRZJ_<*)9&kLgLz^Pid^GvM0q0xertwm&T|MACJIQIe;Vqk(M$4&c%fDDhqoi0B z+OR}{es_tI+VIF8DLbmhITvHJt0P!ad@@}9f|Ec(f;F+IVU34H*2KvM=c&czQV0ZV zbOvEuUa9srS&2XKS(&hV21mUb7Tj((Mv{&-Vln_(cIe3xyw2c$c7rO;u;;GEvlyd@7=@-_koZ zi->I5u5C1qr6**Ik70ZQthLzoa9vNa+7et8H%)XtO>#Yrbl8$bN3z<)ZR=A^u{G|L z4Ik(L6I|l|d*PC%3!2+_=goCh;0<4CS2-aZsa4E;?=enEV^9H;Sw>(v zMvz6BkZFoSIgZ6KjAUui>+_m`!$C^|H@_K=M&WkL2gkl!J?i%~>hs8XgG_gVksbmic!J`fi6DznEQt}E zzzH-%;0#HSIEH#5(*qpkfCq;9MI=e+f2>H=>%FV@7Pl{7ed~_tK`@Bm3L#($sW2if z(iksrG$BjCMp+^-8AC}gMEJx+D;(BUwP3~wze4oNz-B#=iYp>ld|}xAh(A)z*EJo8 zM`G-Y)Xk0WxH8xarVyyE41&v6BK`# zI=*(y`xg(?A7k?IKnFsa!Wa$}S&2qPg`y>v~*9Oz3V6+M>3Y=s_oE8Lu!#F@umRVk4 zX&IL}9Q9UnDY5E~m5mhxD>pY)Vro7(t9i}UTPsa$wC8d9g=mwHXDkr)FkHYnQp5;C z0nN)nt4|i>6_qH4P}=OCkqtT?LV#7>Z|E1`}!T{o8xhI&DprYG^c`3vOjU zDO~=GQI^pO_5SR%a4{;IeC{Czk}p{yM2Qv^9FrK4qbMGS-m)|=0dsj8msqdW>5ZGp zP_+zEV5U~M{@u3p@>?g2d9_@H2VYI;Wb#Q24ul@g(Hu~W0_IYHr$7QTc~RnJRN`^4 zNW9QfT-K!-L@ZZU4x87YfqCkiXr!YrS!aD>CDX2;SV>AUY~eW05j<=a3?mZ~tq`y( z6=>9pdn;hAcbVCqoRnm>IY3$1WOH(CK<=j5{S*r*ekW!mY%&Xhw z?5W)!41MiCZGF&fe@2VzFAuezIwdYyIBv8oBj^Q&Xoj~!dY69Ns?g{0Yl-K1_CZp zgv=`#>8r9P-rgq>j?yaoViOhcX*^*uMo6cGMYWf=te0A-`QSfGEi&B; zhK+DW0Vd*b+C^y&_HR+-aTY9D*eFprBzP-Rr*6jrSP)&d4A@}$V$+8;?ydUv+Pv9U zf+Q2mOTZ`;C?e3jB6DyMASe>l1&LD}p|fqkuL;JfEG6+a5yTyQd>~u7n_UGT<_rCh zT)c61(Qf*AIow=x*8>%>FE3I0wEG9)(tREKd=D2g;z7!pS&Cp*li2oh;6+SpW|a zI62Lt=y0CGiCk>02BGGrvro^z_`|7M6-(`#dptOe1xGbW0hB~h5M^B87#cPph9M>3 zpbYRAGdnIKu2 zphN=Hg~AZLf}^l0O5TTz9K^tN;zSC|1u14_+JkQ!?x{XD#xhGPbSyPEtC>_J9y}(T z0OxUmgj0t|GZGErE)b+5(%w!K1wyr|J*u9_l0fzo9ZrirccJeY)q2Uy!%d2;iE1l8 z=>KC@kXAD$2?~abqKLDw)rhbzISfoejAnR+z`Tz^*|}EC9#f&il*5v%3 zN@f1?`JLux*W<@G)|nX-+))8WRYP#!wvADaT_JSQTF4 zA0G?rq>l)yD@XiuH|mcJi>dQ?b%Tl6fsTErU+9}JIPJ>wxTG*F{81QBa6Bz2C`U1z zfQlG}>a3d_#MDh29Pn~HEP~uoyM83(SZ32UzgHboUg#1ko(gVdq9p9wvdF3GK>$+_ z4*mq3hBzLUsZ1!|wuGDt1rgP<3 zI1(`u98G1Cc z;{BV0Qw*30&Lj{giIfBaT!c6y!y%TUSQ=C9XPtGLY_nT!yu>Fx$z-ltr(Nw{I~SJy zwPwn>q0-?lK@y5&2rwc<8HIl#G6W7@R!}I=SzsUHxVN^FtYWh2K2oz(0xGMLpG-{u zwRB_S;EuO%PRU5T5S&HGh!hUiJFAd9IBmdzBonYtt7beLex#_a0!3;>PXuM9s!yJxQHmu9aD|X?_z@LS^i~Lv zt*<)U0_-(eKSp4?_r=9duRkrc_0bY|aF#sJF{B8dEC{GEguse$LFNL_X*&?*!Vr758uCB(R)N6ynk`Adqf|)e=(7JL?5_+fpL38 zAGY_oP!>oNzmTXsq7T}?^f7xxAF_WbBld_sVE+=t>k)mp{zXRX5q+@!Wr@`z`cVB# z5~)Y@f%=ywPLJrr^eAsqbeSiAVH-_?IURkLbhjL20Nwi^3!N zApDDu!6W(*d{FjqUPj;%eE>cFXHWp zKHMIZ)9M*V+Yx=RJt*?zMXVjshuVWu1$h!_NA!XA;E0q5adt!>W)I5V%hM=3q7SkM z70`L6F?K{BVh_qff3^{JL?2)e>Ol1@xe$M9+a_^XR&oeA6kF@k#$5L zSPyEec*b#cL?2f7siL}6OYDkt7NC4W`3b{HSCxS#t^y!U;(5DWt-%uLf`5U#Pso(k zYAo2zxJAuWf`7v?i@*947T48xz*wygV>8PMf-FJK2o&ML!_jcmf=M!gq3|DP&ISp| zxHyX|3Z!0(a1)wiy?e!8*dXES>bNA8F+A}LOd9%``6T>Gw@#=Q4k^`4+)asBHESwI9d-<3M z`L&RwCSo{TzmjDhhxA{ZfP8KNm;ia^@JB%=n;UZ%xLE_&WF)Ni2V-L<|M=12Q3Gf9 zK0jGB-F(J0hpU+Cy=)&@hwN^+K!Y@hjl0il zJPF^{k-1?}&!|ge>51YX=5!&`#eY2sHA^!-KDH+mCP}hG`j$0CCVK+m(Qq6EGQ)*V z3mhHb1`;F=b0XY7pg6dfN6H+^faqW(Tu6nI0Z=ypRg=G*&_MSbXpQ>cRjBa!Eyu%( zk;2_?zI9xyVA}U@5x00`a9J<{lnQ7K1(g&T1L213Mih!FFmMAJu1>;LS-6|P@i@(Z z0C_?}MFqDK*;@Tdr;Kv{8(}3AXC#YL@T6j&*yW1gQa5QsqI1 zJL}P!q2-9X91RrhO|sZ+q9p-Jm|0Xz;T;K<9?7wgh72Gu)Y1liY6NAcQ(_%`!s8qv zNb}-@icYV-XXK<6kEg`0Yf;Xq7Sam{b61}OoVOUa6K%~Bp|YIpME7>oTi@1=o95`) zVO!ZLrF8qJ~8WPp@W~-hj3;(d~?aS7>tv4ix1gzTWQ%bHW)PncPtofG$ zFC@ptyG?Udo9L^ZW+RbZXU;go9s}pDIJ56hYB^K`l7WP<%U66fdGf;t`29matlV+> z02Gvcyvzg@pj(_DTD92DNVAGI<5(|E>Kt!CPFvn;v%=V>(Td&m28;JPzja`% zS}XTbQRC#dJyWz6tcjjpj5DlMOGzkTcM<~D58qt&t&A9P|dyOMEa6jZ=# zY)#dw5E_uhGg8~Hy0Vx*-n-7yhGn}{(Quet1sKtOZMF8}M;s}2v}DSKr~~Xgc(l9L zf(7}{Toe|d12RkA+7k(nPShN;M|^E=!yl454f^3KW;P6M(=4iyxnn>m#Z@m3Gde_}S7CaNoV1Cz7N2d;G2sHE$lEo?HMU_dOFC)I75dZyt@V!CZz3VZR!HdO!ta&BPA@OT+k=2b+wl5uV0 zCAROP!^g27_h{b@Gfwsk>;y4%=<;B45yR?{wI1ht6jrsq8^k}RDSUjgY!Bz5=>Gl8 zBJqEueeucfw=?=KANO#t1~{UOaiYJEMaRP8Du$&OY?C&!Z@Zdnx8fQpz@-uN5u$(u{jyMHc_QMOfLjk$|2 zY_0Uc&)K{Q45>}y0x=hTSnN@^cy?RCg!XOgYu^Rl_yu7gj&A((bD*#vytqn-3>C2_x)>sq2er)`Pl4a7;&u261sb1ipSsE6=tU&MZ%dA5# z5nT`nG61u*FRRQ7@B)=tS(V=!T;k5fo#k)$OnkG%fK1oCRb~Z*^v^6e+QX7;R)&4SIXDTkWL(!5pk5i9@_kjn-P=z4A-#O zRxIKB>Ngja`Xup+6q$XMBx{XWn`JNQcQyxBccG=Yfa^Nr%SU zCtkGtaW)0Jv+Bz-b?S6+u(=f3m5Y-u0uG0s1^ z+z3p_*;t$_#Jvf;J9B53feXKs!j@SYmVMMSR2vW5>@2?ko@CVT(5KvFoc9D!4O9IV z?Z$M9e`qIp^?S4%CKqHqNS)Ar)67@D`{4UAYt3TwOm!aBCzKVj;@qwO!G&D6FGp!`J7ah?Qk*Y5YRhG~wE zF0cKlSe=lX`wqGZKGi>jhR(GUmnVc)yw-1Z*)shqbe|mK-kLJJfSlyL>$rPiVuP*a zFU(q6Jj49nF85Gxj6A5icj}JlJ9k=KJZt1z&#G4bcMV{i$vDdM{nOBm3A|TrIFUm|eBtR|$A_LMusv&9;gWN^6PhjuDo*wu z=}E^*HB#&EI8=7|mz_@*`x&`V{;->l({qE-kg9U+A8Qy{_Edfifmii zxNhC%{`3;p9DttV^@IIW)P)ZikA?C2XZl{ba~Y}Dr&oGxx%SzxSCm1E=bg-QD9bgF1Y?Hx`~B$<*A!GX=?D8~lN+5;v65;% zsz5H=kyPG(XYcnZ(dX?8zA2uuQKP&n_}(Ku37T@c-c?fz^J~NY7*(_6ipx{7VW#H> zqaoGouMLAw4;i?*-<-{?;mxc6Xa=H`i%HaK%p<0bq5E_bB=Amd@hzQ2rnupTcD zf_AplAby>FzxeoFOZrV7^3G=($hv&S4DS!96#e?ohD91RxKu0Ts~K;+_Q`<|*YSQJtTMF#$`g8xNgu0+MtfLFgShZ=&iAu8v z*D^>OKR1p7Gu~l#`lK|E*}nEabvx5xPr)wVPwICI-#BugQw@{^*bmcer+W6Cm!A3Y P<5I?I!}dBmrj7YO{A|7; literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/executionHistory/executionHistory.lock b/android-ocr-service/.gradle/8.7/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..310b0b0cf764142bb215ab76b0acfa2601486ed7 GIT binary patch literal 17 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

    X#wYXBa@Rj310<> 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 literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/fileHashes/fileHashes.lock b/android-ocr-service/.gradle/8.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..98bb767ea142f1e3be32f07e0463a3aeb6cebd16 GIT binary patch literal 17 VcmZRUHQlf|`jE_R1~6cD2LLUY1Q!4R literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/fileHashes/resourceHashesCache.bin b/android-ocr-service/.gradle/8.7/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..d4f4b8fba894818c406b455e2ae0e1d18f32528c GIT binary patch literal 19007 zcmeI(ZAcSw90&00!LW6dSs8sCcu*p~^7 zTF5MfrzlE6GmC4=%z)%`VQ<;Ts=MU-!Ob)0U8`M+dNxlFAi2X?+wv-LW)qiBll;lE z_S=S;TQ)AgL2_rX-I6;bxz6PUB!A&O;Ew(!=wWk}f#e?7Q;Dgdxt7aKB%k@BmC}wf z6*s4YGP0k` z)g;gAet)E+Y4R#J$3=1jEi8$bX@j_aEXnhyYtoIKR43QpL2`1Zs0F9lXShND0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##{!Jj>w{4a06f>tNq(@$JIA*v@l=tvM>}zF{FO>e-*d;UvR7JeBR~ zt@9e{a8LW=gm>GQ4Qh)L1~wM*8~KeNcWUZJb1bypX1h>q;5Tx`s;JbCJ0ptcCv^Mb zez^G!iQiCWX;#W7T1nTB$TaKtjdt%ncNbl}cqDBsuxP>?&2RjDMqQ#XE+=HEGrMj1 z`k&)#0{Jt{t@5drwyBG~+2h%2`FLUTD8Dh0v7vSAF~>=b zx^Hdp-o6L?#-SFOZkt%16j|*bZjvT5e^AU*pB#{tdc!KxjKksful|cF`Hdw)x1XRy QbLmQS#C?6WUC%Ur1I|}SrT_o{ literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/8.7/gc.properties b/android-ocr-service/.gradle/8.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android-ocr-service/.gradle/9.4.1/checksums/checksums.lock b/android-ocr-service/.gradle/9.4.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..3f9fa26f4ed2b6281853ef09ffb5f5c85d55f5b4 GIT binary patch literal 17 VcmZP;Km0J&to&I90~jz}2LLm)1o!{| literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/9.4.1/checksums/md5-checksums.bin b/android-ocr-service/.gradle/9.4.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..84b5680c69fc9df0332dda297a5db962fb37aca4 GIT binary patch literal 29847 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 PmY5$*k=|&>pO*hW28uah literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.bin b/android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..9076fc7e47d1051cdd0b20d0c4872dff821e04e9 GIT binary patch literal 19723 zcmeI%Pe>F|90%~X>k?&2OJGPAc`&4Kcb450=_1;i3TfiHDRq#yGjDgtU1zp8v%4e| zQ63aU-JpmPp`eKD4-u3}9V+k;C7MuZP&Y|Bbd3($>_1$ogOEhTcVK27Z)V=_`#x`G zFY6|x$hwl*$m&+O+C&Qi5P$##AOHafKmY;|fB*y_009U<00Izz00bZaf&WFoYfL0R zJ(;3%bF#5LPKaZh(J(p0;tq4ct+DjwhMMgE2iddHzdwBqM+iUw0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##{sjRS zA(j`${xrE?>**1dF3lHn`K42e>T^Y@Q}zesK zKOP}}ka967$5<`Z*yj7|$y3@w^J3>E<0B8hPSE9%ayg=#-kAii5knI~R0+hX zBD8R|i;21>h^oW{r^8w4a5<}Ni~R$Oqm%XCMq5pQDY`%viL0_?Q$=peOd}IEZa2m! z*0c1^!%hCOHzPaF-R<8R{CIu7|K6NyW~ZgEi}E9Kn3=w8cxfT~E@jxVUx-nWSUuJJ zz>QDU7ulty@LQ>1Vd8x<(A2WoG92Nm@geCl(^A2{{k34Lg^6|i>a(%EpC?;O$;!f( z*}3v3seC_7mH{obRHL&z( B`@#SK literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.lock b/android-ocr-service/.gradle/9.4.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..5f536cef7ee09fce9e19d28cced3c7724db94ebb GIT binary patch literal 17 UcmZQ>`Vq9&*Dc{40|YPw05%bM5Bv}uoS`cBQ8={Nm)Z$8&ID1^_O(?jG(ZGOuR0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009L4i$GXjq(WWBXBE4f>O~>CD&?l+%-PMXCq`^_Jp5w* zAKZkZk@hmHU*~a?+hXZ!;Wap+^8u5GGU3yf`2CE|4^3`Xna`;+o(Ld-00IagfB*sr zAb-ZkB>r7s#%b^5C|Rm1<} GHhus}vvfrO literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/9.4.1/fileHashes/fileHashes.lock b/android-ocr-service/.gradle/9.4.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..cdc6c3c852fe9d82f6fc26e928d0047de20b302a GIT binary patch literal 17 UcmZQBFTZl`9dm3Z0|c-E05@F(Q2+n{ literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/9.4.1/gc.properties b/android-ocr-service/.gradle/9.4.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/android-ocr-service/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android-ocr-service/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..7216bfdcc2cb8b110efaf5afb23197fff6b3c3d1 GIT binary patch literal 17 VcmZR+%kj{X$!9$W0~jz~1^_7z1Ka=r literal 0 HcmV?d00001 diff --git a/android-ocr-service/.gradle/buildOutputCleanup/cache.properties b/android-ocr-service/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..80aa2dd --- /dev/null +++ b/android-ocr-service/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Mar 29 02:14:23 CST 2026 +gradle.version=8.7 diff --git a/android-ocr-service/.gradle/buildOutputCleanup/outputFiles.bin b/android-ocr-service/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdd335b6591cb8eb7d5eb64a4023edf93bd5c9a4 GIT binary patch literal 22025 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 lx>6!*uzO;ET|OVu`9o^DkGZ>a@6%mA3-Bd + + + + + + + + + + + + + + + + + + + diff --git a/android-ocr-service/app/src/main/java/com/guiagent/ocr/MainActivity.kt b/android-ocr-service/app/src/main/java/com/guiagent/ocr/MainActivity.kt new file mode 100644 index 0000000..f0a0c32 --- /dev/null +++ b/android-ocr-service/app/src/main/java/com/guiagent/ocr/MainActivity.kt @@ -0,0 +1,23 @@ +package com.guiagent.ocr + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.widget.TextView + +class MainActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val tv = TextView(this).apply { + text = "OCR Service\nPort: 18900\nStarting..." + textSize = 20f + setPadding(40, 40, 40, 40) + } + setContentView(tv) + + // Start the service + val intent = Intent(this, OcrService::class.java) + startForegroundService(intent) + tv.text = "OCR Service\nPort: 18900\nRunning!" + } +} diff --git a/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrEngine.kt b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrEngine.kt new file mode 100644 index 0000000..09ec703 --- /dev/null +++ b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrEngine.kt @@ -0,0 +1,79 @@ +package com.guiagent.ocr + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import com.google.mlkit.vision.common.InputImage +import com.google.mlkit.vision.text.TextRecognition +import com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions +import java.io.File +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +data class TextBox( + val text: String, + val x: Int, + val y: Int, + val w: Int, + val h: Int, + val confidence: Float +) { + val cx get() = x + w / 2 + val cy get() = y + h / 2 +} + +object OcrEngine { + + private val recognizer by lazy { + TextRecognition.getClient(ChineseTextRecognizerOptions.Builder().build()) + } + + fun recognize(imagePath: String): List { + val file = File(imagePath) + if (!file.exists()) return emptyList() + val bitmap = BitmapFactory.decodeFile(imagePath) ?: return emptyList() + return recognizeBitmap(bitmap) + } + + /** 直接截屏并识别,不落盘 */ + fun screencapAndRecognize(): List { + val process = Runtime.getRuntime().exec("screencap -p") + val bytes = process.inputStream.readBytes() + process.waitFor() + if (bytes.isEmpty()) return emptyList() + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return emptyList() + return recognizeBitmap(bitmap) + } + + fun recognizeBitmap(bitmap: Bitmap): List { + val image = InputImage.fromBitmap(bitmap, 0) + val results = mutableListOf() + val latch = CountDownLatch(1) + + recognizer.process(image) + .addOnSuccessListener { visionText -> + for (block in visionText.textBlocks) { + for (line in block.lines) { + val box = line.boundingBox ?: continue + results.add( + TextBox( + text = line.text, + x = box.left, + y = box.top, + w = box.width(), + h = box.height(), + confidence = line.confidence ?: 0.8f + ) + ) + } + } + latch.countDown() + } + .addOnFailureListener { + latch.countDown() + } + + latch.await(10, TimeUnit.SECONDS) + bitmap.recycle() + return results + } +} diff --git a/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrHttpServer.kt b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrHttpServer.kt new file mode 100644 index 0000000..2e16213 --- /dev/null +++ b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrHttpServer.kt @@ -0,0 +1,88 @@ +package com.guiagent.ocr + +import android.graphics.BitmapFactory +import com.google.gson.Gson +import fi.iki.elonen.NanoHTTPD +import java.io.ByteArrayOutputStream + +class OcrHttpServer(port: Int = 18900) : NanoHTTPD(port) { + + private val gson = Gson() + private val defaultPath = "/sdcard/ocr_screen.png" + + override fun serve(session: IHTTPSession): Response { + return when (session.uri) { + "/ocr" -> handleOcr(session) + "/snap" -> handleSnap(session) + "/health" -> jsonResponse(mapOf("status" to "ok", "engine" to "mlkit-chinese")) + else -> newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "404") + } + } + + /** 读文件方式 OCR */ + private fun handleOcr(session: IHTTPSession): Response { + val params = session.parms ?: emptyMap() + val imagePath = params["path"] ?: defaultPath + return doOcr(params["text"]) { OcrEngine.recognize(imagePath) } + } + + /** POST 图片数据直接 OCR,不存文件 */ + private fun handleSnap(session: IHTTPSession): Response { + val params = session.parms ?: emptyMap() + + if (session.method == Method.POST) { + // NanoHTTPD parseBody 将 binary data 存到临时文件 + val bodyFiles = HashMap() + session.parseBody(bodyFiles) + + // postData 键对应临时文件路径 + val tmpPath = bodyFiles["postData"] + if (tmpPath != null) { + val imageBytes = java.io.File(tmpPath).readBytes() + val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) + if (bitmap != null) { + return doOcr(params["text"]) { OcrEngine.recognizeBitmap(bitmap) } + } + return jsonResponse(mapOf("error" to "decode failed", "size" to imageBytes.size, "count" to 0)) + } + return jsonResponse(mapOf("error" to "no body received", "count" to 0)) + } + + // GET: 读文件方式 fallback + return handleOcr(session) + } + + private fun doOcr(query: String?, recognize: () -> List): Response { + val startTime = System.currentTimeMillis() + var results = recognize() + + if (!query.isNullOrBlank()) { + results = results.filter { it.text.contains(query) } + } + + val elapsed = System.currentTimeMillis() - startTime + + val response = mapOf( + "results" to results.map { box -> + mapOf( + "text" to box.text, + "x" to box.x, + "y" to box.y, + "w" to box.w, + "h" to box.h, + "cx" to box.cx, + "cy" to box.cy, + "confidence" to box.confidence + ) + }, + "count" to results.size, + "elapsed_ms" to elapsed + ) + return jsonResponse(response) + } + + private fun jsonResponse(data: Any): Response { + val json = gson.toJson(data) + return newFixedLengthResponse(Response.Status.OK, "application/json", json) + } +} diff --git a/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrService.kt b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrService.kt new file mode 100644 index 0000000..01e84c1 --- /dev/null +++ b/android-ocr-service/app/src/main/java/com/guiagent/ocr/OcrService.kt @@ -0,0 +1,49 @@ +package com.guiagent.ocr + +import android.app.* +import android.content.Intent +import android.os.Build +import android.os.IBinder +import android.util.Log + +class OcrService : Service() { + + private var server: OcrHttpServer? = null + private val TAG = "OcrService" + private val PORT = 18900 + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + startForegroundNotification() + + if (server == null) { + server = OcrHttpServer(PORT).also { + it.start() + Log.i(TAG, "OCR HTTP server started on port $PORT") + } + } + return START_STICKY + } + + override fun onDestroy() { + server?.stop() + server = null + Log.i(TAG, "OCR HTTP server stopped") + super.onDestroy() + } + + override fun onBind(intent: Intent?): IBinder? = null + + private fun startForegroundNotification() { + val channelId = "ocr_service" + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel(channelId, "OCR Service", NotificationManager.IMPORTANCE_LOW) + getSystemService(NotificationManager::class.java).createNotificationChannel(channel) + } + val notification = Notification.Builder(this, channelId) + .setContentTitle("OCR Service") + .setContentText("Running on port $PORT") + .setSmallIcon(android.R.drawable.ic_menu_camera) + .build() + startForeground(1, notification) + } +} diff --git a/android-ocr-service/app/src/main/res/values/strings.xml b/android-ocr-service/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..041eec0 --- /dev/null +++ b/android-ocr-service/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + OCR Service + diff --git a/android-ocr-service/build.gradle.kts b/android-ocr-service/build.gradle.kts new file mode 100644 index 0000000..2eb1b24 --- /dev/null +++ b/android-ocr-service/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + id("com.android.application") version "8.5.1" apply false + id("org.jetbrains.kotlin.android") version "2.0.0" apply false +} diff --git a/android-ocr-service/gradle.properties b/android-ocr-service/gradle.properties new file mode 100644 index 0000000..729b51a --- /dev/null +++ b/android-ocr-service/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx2048m +android.useAndroidX=true +kotlin.code.style=official diff --git a/android-ocr-service/gradle/wrapper/gradle-wrapper.jar b/android-ocr-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d997cfc60f4cff0e7451d19d49a82fa986695d07 GIT binary patch literal 48966 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

    `Lem|V$A>eR0uN8Y&sdjtu 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

    1bvi{DS7E@q1{$_8->K{_OWv2 zCZTgG2Pr3n8|ec9kIu&uC|d?k4-cQ4#}Z`qDX5Y2mhC(jR1Ms;UG4Ho$DE|+SeJ@{ zJQQhAXj|<)*t3KiOWTuh{Wd^mS{u{&ERV)OpZwiQ%#1->r9p zSK_^*U~=?ywH~4IUxb}{0J!SmL!z2Tzq_PpetoC^_az1JFg0=gMcQADuOP%3=H1hH zH_=dG(PD;d*037Ov5G1924U#Zns?~fs+eh1%-bWqa%ssm3=nio1r3J<4G0IBETtr? zycs~0JIOn;MecYG=~OQsYHIrf?~A5>_ob%8+uOrVA+VCJw}{lygrBBdY1k<8B^wf6 zl|<%N$7)fOZX$%y>4ueco_Gb1H@B%XrKVwrn6hUOecnc^PU0rFuCB5=*2;|u-`o(@ zL*tr4bnQzXYLc4XqFbv5sK0}A)`}`8iM8ehtj#Oc5DrE;0VxbPmL@BUa_BQwa$EW~sU#-LP0?sGmqfUGhGWcciGZ*4(}u3z=@b>Ow9DQe7lcO3K}BG3j(t& zH10>sK!&4Q5-=gN@Nxj6{|*nuyqw7KZJ1?p)NUJ?U0bOigGdsOk}Iz&9PmN_5=W*Z9M zy^pA`&dX0oo6?CSuhE~(pYbLuTPp1a1Fa@e3Lu&mmgd$;D}&g-i=D-{sv?J9kIr9r zrX&Z)aFGK^kNY{LxrotP0}k*;uN12i_2a_JJhKwh zBt{D-JRxC$8U+-`u1xD>gJ^H4lbW;7spI-=H506i=ncdK;xq*L6f7jVz$XGMg5aQk zHRJY&$@g}i_SP##iC?lR?ltnWUTT-UDlq(*BTQaYNkg zNG#sNoo{WmP+Vl}U~?+T?g25b$E-7iwhu=VVgw3JdFXm~ba+LC4p>CP3~rNTiNBl7 zL{RfLLepNPEtZj}yL_#R{(^MqIlG)c0Va}>U|9Pl&B_3tV;Ps{r)WqBznD7FcTlP4 z`JQe2DvGhmeeHGGX39zGyOOxZ3tq~Dft(BQ;mDXwwJi?sBtxo$Gf1SS2w*eQ0p&RVMNVi@d zY8v4J0(n}%6*Rw(g~l@sUuxpiJ*Y}7TzBQyU+>-qWm*InUeGt@)T9g^0J#z4){Lw* zT;69if~U9DXBR9fgVPlYy7aDhJU)gDC?_GHQtwa6QXNaah7-CzA|Fx-lH7d@N9>38 zX(F&fd3w7AkZ+ha8-gKfX%@_~<#HDs?kBg5zW>V3%Xw5jwPs6uni{7r zd`EfPYrA*SU;xDtm@E>5TrJKlg5o=h;NSXk)pt4K)GbpP0xkUg>2o|oG=`UnX7^Un zb&@8d6Fj1cBWW^c(K#Csc8xEBa4KfHY>8Lp^77-lhzgWr9kR9_p+g|-9r?VSv?qA%^1O;cqgke)%AqHlR$B{!Y1Mq zj|)Ecg?{_!>kGDAwGa7%cwSUb{BcayJihkv$}ql+yu=O}jVvAFdC{Hjh$4}u+$mx% z5V$sUiGCX%D3A>bKwY8HR)Gv*lisI4q^3vJ*nDwj|mtr!0r!~+Qoe2cw^jPCXkT7tI*01|w@ z&gPC`?O1w7hQ%=&bcHi7(fqhY3${~JepA7y@^aLwHpew^Yk$;R4v{ASHjXjXtaTc_ zuz5*nXB&PrcyWx#gQ%?HyxawmS+Wu(7ssvB1UMh!1$to&o(mv_f=9~!9@VsJCGxpu z`>g5Sp=xDhpsiCy^y>=fI0DON$&pb7o7^d{@@&hj3!6PUd=vA;G;#7&8ChamsE{`^ zY8pDra8Jntp62Ivi)Y`*XbpM60s06v@Rz^-g)TW_F@B!~y7!4AJ>37mAuz!(!C+xQ zSR61?u!{N|qHWOeR%$RXRL~vpN0SGri7-klNHEJuivbi=0qSbdV4&ghf4i|7?$>z( zI{qH?i}`~a7GyB6|8pZRq982+P*r1+m-t&(%U5#ZWFQd-(CXKLHeN@y(c z;wqq1hzE@q1b$GG0VQ_)`{MeylBlVfy%UHR=;Z98>T3M&;{0i?+0T-Bck?I)AUQrz zeF**_iGu$JlCpLnFv`D9?q6R51jKPM{Rd6!0FF#KP=O|b3iQX*TqXSjO?gXaXAmLr zU#g&%@+XpjVArlGkfaPKk^PUSnMLsjlK<9nH*zxl^V2-jGC$4+HGE%?F3%4|y9>HN z|FJgz*HW$VwU8$RNtuBf(2vdZhW3x;R6%eoJM(|2zvKebxCh$s5J-*fhZ75B_yeUs zFTrToFiB^SNH?gV2>l?G&h!UD>UP%uKh1L;Er59!q&NoZRe$VEf?5Ar^&iUad&2gQ z&WE`E%lTg=_3XQT@gJOjkAi-Hbbqrl{(pA<>_GH4O8+xI^=IAhS#v+$vmgOK=>C!~_xFg-pLM>6kUfy=zL|u~KkNJ< z$L?p*?;%(Ze6w%%M(zjE|4dH&5$)_}mG3z{KUQ6s!Y@_+kInPH;kAC&{T^5HKmqz@ z@+!aA{YNIy&r;uKTz=r6e6v>d-%9<%_4R!+-iN^8H#0N(rQbiu-u&}-|2`q@k1agM zdHkW_1&%VDD_|I;NpK*OZfAjAb z`Ttl8km0{|{F`kWKWltH$^Ech;G2y`{7&N^%H;d0$cGv7Z^oJNOSiwAFaP<=em}wX z<8AA6<}bbeZc_7S=ii6PALi)3nOXL)o&Uj%-OnQ52M&L%(%ZaWiu^(R{b!Bu2WJl< h$Zw`p^gE5e2}ml*LW4$nU|{5+pXG<~Ugg7I{||-5t(pJ; literal 0 HcmV?d00001 diff --git a/android-ocr-service/gradle/wrapper/gradle-wrapper.properties b/android-ocr-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b82aa23 --- /dev/null +++ b/android-ocr-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android-ocr-service/gradlew b/android-ocr-service/gradlew new file mode 100755 index 0000000..97de990 --- /dev/null +++ b/android-ocr-service/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/android-ocr-service/gradlew.bat b/android-ocr-service/gradlew.bat new file mode 100644 index 0000000..ea603b4 --- /dev/null +++ b/android-ocr-service/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android-ocr-service/settings.gradle.kts b/android-ocr-service/settings.gradle.kts new file mode 100644 index 0000000..71ef23d --- /dev/null +++ b/android-ocr-service/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "ocr-service" +include(":app") diff --git a/config/__init__.py b/config/__init__.py new file mode 100644 index 0000000..84a6cc5 --- /dev/null +++ b/config/__init__.py @@ -0,0 +1,3 @@ +from .settings import settings + +__all__ = ["settings"] diff --git a/config/settings.py b/config/settings.py new file mode 100644 index 0000000..d6922e4 --- /dev/null +++ b/config/settings.py @@ -0,0 +1,30 @@ +from pydantic_settings import BaseSettings +from typing import Optional + + +class Settings(BaseSettings): + # Device + device_serial: Optional[str] = None # None = auto-detect first device + adb_path: str = "/opt/homebrew/bin/adb" + screenshot_dir: str = "data/screenshots" + + # VLM + vlm_provider: str = "poe" # local / poe / openrouter + vlm_model: str = "Qwen/Qwen2.5-VL-7B-Instruct" + poe_api_key: Optional[str] = None + openrouter_api_key: Optional[str] = None + + # Agent + max_steps: int = 20 + action_delay: float = 1.5 # seconds to wait after each action + screenshot_timeout: float = 5.0 + verify_after_action: bool = True + + # Server + host: str = "0.0.0.0" + port: int = 4380 + + model_config = {"env_file": ".env", "env_file_encoding": "utf-8"} + + +settings = Settings() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..406078c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,15 @@ +fastapi>=0.115.0 +uvicorn>=0.32.0 +pillow>=10.0.0 +httpx>=0.27.0 +pydantic>=2.0.0 +pydantic-settings>=2.0.0 +jinja2>=3.1.0 +python-multipart>=0.0.9 + +# OCR grounding (L3 - element detection by visible text) +pytesseract>=0.3.10 # Fast, uses system tesseract binary +numpy>=1.24.0 # Required by easyocr and image processing + +# Optional: better Chinese OCR (install separately if pytesseract is insufficient) +# pip install easyocr # ~150MB download, better zh_CN but slower first run diff --git a/scripts/test_device.py b/scripts/test_device.py new file mode 100644 index 0000000..b3e93bf --- /dev/null +++ b/scripts/test_device.py @@ -0,0 +1,38 @@ +"""Quick test: check ADB device connection and take a screenshot.""" + +import sys +import os + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from src.capture import ADBCapture + + +def main(): + cap = ADBCapture() + + print("Checking device...") + info = cap.check_device() + + if not info["connected"]: + print(f"[FAIL] {info['error']}") + print() + print("Troubleshooting:") + print(" 1. USB debugging enabled on phone?") + print(" 2. Run: adb devices") + print(" 3. Accept USB debugging prompt on phone") + sys.exit(1) + + print(f"[OK] Device: {info['model']}") + print(f" Serial: {info['serial']}") + print(f" Resolution: {info['resolution']}") + print(f" All devices: {info['all_devices']}") + + print("\nTaking screenshot...") + img = cap.screenshot(save=True) + print(f"[OK] Screenshot: {img.size[0]}x{img.size[1]}") + print(f" Saved to: {cap.screenshot_dir}/") + + +if __name__ == "__main__": + main() diff --git a/scripts/test_ocr_grounding.py b/scripts/test_ocr_grounding.py new file mode 100644 index 0000000..ec331ff --- /dev/null +++ b/scripts/test_ocr_grounding.py @@ -0,0 +1,149 @@ +"""Test OCR grounding: take a screenshot and find text elements. + +Usage: + # Find a specific text on current screen + python scripts/test_ocr_grounding.py "微信" + + # Detect ALL text on screen (debug mode) + python scripts/test_ocr_grounding.py --all + + # Use a saved screenshot instead of live ADB capture + python scripts/test_ocr_grounding.py "发送" --image data/screenshots/test.png + + # Try different engines + python scripts/test_ocr_grounding.py "微信" --engine easyocr + python scripts/test_ocr_grounding.py "微信" --engine pytesseract + + # Also try uiautomator dump (hybrid mode) + python scripts/test_ocr_grounding.py "微信" --hybrid + + # Save annotated screenshot with bounding boxes drawn + python scripts/test_ocr_grounding.py --all --annotate +""" + +import sys +import os +import argparse + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from PIL import Image, ImageDraw, ImageFont +from src.grounding.ocr_grounding import OCRGrounding + + +def annotate_image(img: Image.Image, boxes, query: str = "") -> Image.Image: + """Draw bounding boxes on the image for visualization.""" + annotated = img.copy() + draw = ImageDraw.Draw(annotated) + + for box in boxes: + is_match = box.contains_text(query) if query else False + color = "red" if is_match else "lime" + width = 3 if is_match else 1 + + draw.rectangle( + [box.x, box.y, box.x + box.w, box.y + box.h], + outline=color, width=width, + ) + label = f"{box.text} ({box.confidence:.0%})" + draw.text((box.x, box.y - 14), label, fill=color) + + return annotated + + +def main(): + parser = argparse.ArgumentParser(description="Test OCR grounding on phone screen") + parser.add_argument("query", nargs="?", default=None, help="Text to find on screen") + parser.add_argument("--all", action="store_true", help="Detect all text on screen") + parser.add_argument("--image", type=str, help="Use saved screenshot instead of ADB") + parser.add_argument("--engine", type=str, default="auto", + choices=["auto", "pytesseract", "easyocr"], + help="OCR engine to use") + parser.add_argument("--hybrid", action="store_true", + help="Try uiautomator + OCR hybrid approach") + parser.add_argument("--annotate", action="store_true", + help="Save annotated screenshot with bounding boxes") + args = parser.parse_args() + + if not args.query and not args.all: + parser.error("Provide a search query or --all") + + # Get screenshot + if args.image: + print(f"Loading image: {args.image}") + img = Image.open(args.image) + else: + from src.capture import ADBCapture + cap = ADBCapture() + info = cap.check_device() + if not info["connected"]: + print(f"[FAIL] {info['error']}") + sys.exit(1) + print(f"Device: {info['model']} ({info['resolution']})") + print("Taking screenshot...") + img = cap.screenshot(save=True) + + print(f"Image size: {img.width}x{img.height}") + grounding = OCRGrounding(engine=args.engine) + + if args.all: + print(f"\n--- Detecting ALL text (engine={args.engine}) ---\n") + boxes = grounding.detect_all(img) + if not boxes: + print("[WARN] No text detected!") + else: + print(f"Found {len(boxes)} text regions:\n") + for i, box in enumerate(boxes, 1): + nx, ny = box.center_normalized(img.width, img.height) + print(f" {i:3d}. '{box.text}'") + print(f" pixel=({box.cx}, {box.cy}) " + f"norm=({nx:.3f}, {ny:.3f}) " + f"conf={box.confidence:.0%}") + + if args.annotate and boxes: + out_path = "data/screenshots/annotated_all.png" + annotated = annotate_image(img, boxes, query=args.query or "") + annotated.save(out_path) + print(f"\nAnnotated image saved: {out_path}") + + if args.query: + print(f"\n--- Searching for: '{args.query}' (engine={args.engine}) ---\n") + + if args.hybrid: + result = grounding.find_text_hybrid(img, args.query) + else: + result = grounding.find_text(img, args.query) + + if result is None: + print(f"[NOT FOUND] '{args.query}' was not found on screen.") + print("\nTip: Run with --all to see all detected text.") + sys.exit(1) + else: + nx, ny = result.center_normalized(img.width, img.height) + print(f"[FOUND] '{result.text}'") + print(f" Pixel center: ({result.cx}, {result.cy})") + print(f" Normalized center: ({nx:.4f}, {ny:.4f})") + print(f" Bounding box: x={result.x} y={result.y} " + f"w={result.w} h={result.h}") + print(f" Confidence: {result.confidence:.0%}") + print() + print(f" To tap this element:") + print(f" adb shell input tap {result.cx} {result.cy}") + + # Show all matches + all_matches = grounding.find_all_matches(img, args.query) + if len(all_matches) > 1: + print(f"\n ({len(all_matches)} total matches found)") + for i, m in enumerate(all_matches): + print(f" {i+1}. '{m.text}' at ({m.cx},{m.cy}) conf={m.confidence:.0%}") + + if args.annotate: + boxes = grounding.detect_all(img) + out_path = "data/screenshots/annotated_search.png" + annotated = annotate_image(img, boxes, query=args.query) + annotated.save(out_path) + print(f"\nAnnotated image saved: {out_path}") + + +if __name__ == "__main__": + main() diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/capture/__init__.py b/src/capture/__init__.py new file mode 100644 index 0000000..ff66899 --- /dev/null +++ b/src/capture/__init__.py @@ -0,0 +1,3 @@ +from .adb_capture import ADBCapture + +__all__ = ["ADBCapture"] diff --git a/src/capture/adb_capture.py b/src/capture/adb_capture.py new file mode 100644 index 0000000..a92beb2 --- /dev/null +++ b/src/capture/adb_capture.py @@ -0,0 +1,118 @@ +"""L1 - Screen Capture via ADB + +Captures screenshots from Android device using ADB. +Handles device connection, screenshot acquisition, and resolution detection. +""" + +import subprocess +import time +from pathlib import Path +from datetime import datetime +from PIL import Image +import io + +from config import settings + + +class ADBCapture: + """ADB-based screen capture for Android devices.""" + + def __init__(self): + self.adb = settings.adb_path + self.serial = settings.device_serial + self.screenshot_dir = Path(settings.screenshot_dir) + self.screenshot_dir.mkdir(parents=True, exist_ok=True) + self._resolution: tuple[int, int] | None = None + + def _adb_cmd(self, *args: str) -> list[str]: + cmd = [self.adb] + if self.serial: + cmd.extend(["-s", self.serial]) + cmd.extend(args) + return cmd + + def check_device(self) -> dict: + """Check if device is connected and return device info.""" + result = subprocess.run( + self._adb_cmd("devices"), + capture_output=True, text=True, timeout=5 + ) + lines = result.stdout.strip().split("\n")[1:] # skip header + devices = [] + for line in lines: + parts = line.strip().split("\t") + if len(parts) == 2 and parts[1] == "device": + devices.append(parts[0]) + + if not devices: + return {"connected": False, "error": "No device found"} + + serial = self.serial or devices[0] + if not self.serial: + self.serial = serial + + # Get device model + model_result = subprocess.run( + self._adb_cmd("shell", "getprop", "ro.product.model"), + capture_output=True, text=True, timeout=5 + ) + model = model_result.stdout.strip() + + # Get screen resolution + w, h = self.get_resolution() + + return { + "connected": True, + "serial": serial, + "model": model, + "resolution": f"{w}x{h}", + "all_devices": devices, + } + + def get_resolution(self) -> tuple[int, int]: + """Get device screen resolution.""" + if self._resolution: + return self._resolution + + result = subprocess.run( + self._adb_cmd("shell", "wm", "size"), + capture_output=True, text=True, timeout=5 + ) + # Output: "Physical size: 1080x2400" + size_str = result.stdout.strip().split(":")[-1].strip() + w, h = size_str.split("x") + self._resolution = (int(w), int(h)) + return self._resolution + + def screenshot(self, save: bool = True) -> Image.Image: + """Take a screenshot and return as PIL Image. + + Args: + save: Whether to save the screenshot to disk for debugging. + + Returns: + PIL Image of the current screen. + """ + result = subprocess.run( + self._adb_cmd("exec-out", "screencap", "-p"), + capture_output=True, timeout=settings.screenshot_timeout + ) + if result.returncode != 0: + raise RuntimeError(f"Screenshot failed: {result.stderr.decode()}") + + img = Image.open(io.BytesIO(result.stdout)) + + if save: + ts = datetime.now().strftime("%Y%m%d_%H%M%S_%f") + path = self.screenshot_dir / f"{ts}.png" + img.save(path) + + return img + + def screenshot_base64(self) -> str: + """Take screenshot and return as base64-encoded PNG string.""" + import base64 + img = self.screenshot(save=True) + buffer = io.BytesIO() + img.save(buffer, format="PNG") + return base64.b64encode(buffer.getvalue()).decode("utf-8") diff --git a/src/executor/__init__.py b/src/executor/__init__.py new file mode 100644 index 0000000..53f92bf --- /dev/null +++ b/src/executor/__init__.py @@ -0,0 +1,3 @@ +from .adb_executor import ADBExecutor + +__all__ = ["ADBExecutor"] diff --git a/src/executor/adb_executor.py b/src/executor/adb_executor.py new file mode 100644 index 0000000..88d1f7b --- /dev/null +++ b/src/executor/adb_executor.py @@ -0,0 +1,109 @@ +"""L5 - Action Execution via ADB + +Translates structured actions into ADB commands and executes them on device. +Coordinates are normalized (0-1), converted to device pixels at execution time. +""" + +import subprocess +import time +from dataclasses import dataclass + +from config import settings + + +@dataclass +class Action: + """A single GUI action to execute.""" + type: str # tap, swipe, type, long_press, back, home, scroll, wait + x: float = 0.0 # normalized x (0-1) + y: float = 0.0 # normalized y (0-1) + text: str = "" # for type action + x2: float = 0.0 # for swipe end + y2: float = 0.0 # for swipe end + duration: int = 300 # ms, for long_press and swipe + + +class ADBExecutor: + """Execute actions on Android device via ADB.""" + + def __init__(self, capture): + self.capture = capture + self.adb = settings.adb_path + self.serial = settings.device_serial + + def _adb_cmd(self, *args: str) -> list[str]: + cmd = [self.adb] + if self.serial: + cmd.extend(["-s", self.serial]) + cmd.extend(args) + return cmd + + def _run(self, *args: str): + cmd = self._adb_cmd(*args) + result = subprocess.run(cmd, capture_output=True, text=True, timeout=10) + if result.returncode != 0: + raise RuntimeError(f"ADB command failed: {' '.join(cmd)}\n{result.stderr}") + return result.stdout + + def _to_pixels(self, x: float, y: float) -> tuple[int, int]: + """Convert normalized (0-1) coordinates to device pixels.""" + w, h = self.capture.get_resolution() + return int(x * w), int(y * h) + + def execute(self, action: Action) -> str: + """Execute a single action and return a description of what was done.""" + match action.type: + case "tap": + px, py = self._to_pixels(action.x, action.y) + self._run("shell", "input", "tap", str(px), str(py)) + desc = f"tap ({px}, {py})" + + case "long_press": + px, py = self._to_pixels(action.x, action.y) + self._run("shell", "input", "swipe", + str(px), str(py), str(px), str(py), str(action.duration)) + desc = f"long_press ({px}, {py}) {action.duration}ms" + + case "swipe": + px1, py1 = self._to_pixels(action.x, action.y) + px2, py2 = self._to_pixels(action.x2, action.y2) + self._run("shell", "input", "swipe", + str(px1), str(py1), str(px2), str(py2), str(action.duration)) + desc = f"swipe ({px1},{py1}) → ({px2},{py2})" + + case "type": + # Escape special characters for ADB + escaped = action.text.replace(" ", "%s").replace("&", "\\&") + self._run("shell", "input", "text", escaped) + desc = f"type '{action.text}'" + + case "back": + self._run("shell", "input", "keyevent", "KEYCODE_BACK") + desc = "back" + + case "home": + self._run("shell", "input", "keyevent", "KEYCODE_HOME") + desc = "home" + + case "scroll": + # Scroll direction: swipe center screen + px, py = self._to_pixels(0.5, 0.5) + if action.y < 0: # scroll up + self._run("shell", "input", "swipe", + str(px), str(py - 300), str(px), str(py + 300), "300") + desc = "scroll up" + else: # scroll down + self._run("shell", "input", "swipe", + str(px), str(py + 300), str(px), str(py - 300), "300") + desc = "scroll down" + + case "wait": + time.sleep(action.duration / 1000) + desc = f"wait {action.duration}ms" + + case _: + raise ValueError(f"Unknown action type: {action.type}") + + # Wait for UI to settle after action + time.sleep(settings.action_delay) + return desc diff --git a/src/grounding/__init__.py b/src/grounding/__init__.py new file mode 100644 index 0000000..71cdd5f --- /dev/null +++ b/src/grounding/__init__.py @@ -0,0 +1,3 @@ +from .ocr_grounding import OCRGrounding + +__all__ = ["OCRGrounding"] diff --git a/src/grounding/ocr_grounding.py b/src/grounding/ocr_grounding.py new file mode 100644 index 0000000..d773ad3 --- /dev/null +++ b/src/grounding/ocr_grounding.py @@ -0,0 +1,354 @@ +"""L3 - OCR-Based UI Element Grounding + +Locates UI elements on screen by visible text using OCR on ADB screenshots. +Provides reliable text-to-coordinate mapping that works on Huawei/HarmonyOS +where uiautomator dump often returns empty XML for WeChat. + +Strategy priority (auto mode): +1. easyocr (best Chinese recognition, deep learning based) +2. pytesseract (fallback, fast but fragments Chinese characters) +3. uiautomator XML dump (supplementary, often empty on Huawei WeChat) + +All coordinates returned as normalized (0.0-1.0) for consistency with the +existing coordinate system in adb_executor.py. +""" + +import subprocess +import re +import io +import logging +from dataclasses import dataclass +from pathlib import Path +from PIL import Image + +from config import settings + +logger = logging.getLogger(__name__) + + +@dataclass +class TextBox: + """A detected text region on screen.""" + text: str + x: int # left pixel + y: int # top pixel + w: int # width pixels + h: int # height pixels + confidence: float # 0.0-1.0 + + @property + def cx(self) -> int: + """Center x in pixels.""" + return self.x + self.w // 2 + + @property + def cy(self) -> int: + """Center y in pixels.""" + return self.y + self.h // 2 + + def center_normalized(self, screen_w: int, screen_h: int) -> tuple[float, float]: + """Return center as normalized (0-1) coordinates.""" + return self.cx / screen_w, self.cy / screen_h + + def contains_text(self, query: str, fuzzy: bool = True) -> bool: + """Check if this box's text matches the query. + + Args: + query: Text to search for. + fuzzy: If True, does substring + case-insensitive match. + """ + if not query or not self.text: + return False + if fuzzy: + return query.lower() in self.text.lower() or self.text.lower() in query.lower() + return self.text == query + + def match_score(self, query: str) -> float: + """Compute a match quality score (higher = better). + + Scoring: + - Exact match: 1000 + confidence + - Query is full text: 500 + confidence + - Text contains query as substring: 100 + confidence + length_ratio + - Query contains text as substring: 50 + confidence + - No match: 0 + """ + if not query or not self.text: + return 0.0 + + q = query.lower() + t = self.text.lower().strip() + + if t == q: + return 1000 + self.confidence + if q in t: + # Prefer shorter texts that contain the query (more precise) + length_ratio = len(q) / max(len(t), 1) + return 100 + self.confidence + length_ratio + if t in q: + # Text is a subset of query -- weaker match + length_ratio = len(t) / max(len(q), 1) + return 50 + self.confidence * length_ratio + return 0.0 + + +class OCRGrounding: + """OCR-based element grounding for Android screens. + + Usage: + grounding = OCRGrounding() + + # From ADB screenshot (PIL Image) + img = capture.screenshot() + result = grounding.find_text(img, "发送") + if result: + norm_x, norm_y = result.center_normalized(img.width, img.height) + # Use norm_x, norm_y with ADBExecutor + """ + + def __init__(self, engine: str = "auto"): + """ + Args: + engine: OCR engine to use. + "pytesseract" / "easyocr" / "auto" (easyocr first, pytesseract fallback) + """ + self.engine = engine + self._easyocr_reader = None # lazy init (slow first load) + + # ────────────────────────────────────────────── + # Public API + # ────────────────────────────────────────────── + + def find_text( + self, img: Image.Image, query: str, fuzzy: bool = True + ) -> TextBox | None: + """Find a UI element by visible text and return its bounding box. + + Args: + img: PIL Image (screenshot from ADB). + query: Text to search for (e.g. "发送", "微信", "Search"). + fuzzy: Substring/case-insensitive match. + + Returns: + Best matching TextBox, or None if not found. + """ + boxes = self.detect_all(img) + matches = [b for b in boxes if b.contains_text(query, fuzzy=fuzzy)] + + if not matches: + logger.warning(f"Text '{query}' not found. Detected texts: " + f"{[b.text for b in boxes[:20]]}") + return None + + # Return best match by match_score (prefers exact/longer matches) + matches.sort(key=lambda b: b.match_score(query), reverse=True) + best = matches[0] + logger.info(f"Found '{query}' → '{best.text}' at ({best.cx}, {best.cy}) " + f"conf={best.confidence:.2f} score={best.match_score(query):.1f}") + return best + + def find_all_matches( + self, img: Image.Image, query: str, fuzzy: bool = True + ) -> list[TextBox]: + """Find ALL matching elements (e.g., multiple chat contacts named similar).""" + boxes = self.detect_all(img) + return [b for b in boxes if b.contains_text(query, fuzzy=fuzzy)] + + def detect_all(self, img: Image.Image) -> list[TextBox]: + """Run OCR on the full image and return all detected text boxes. + + Tries engines in order based on self.engine setting. + """ + if self.engine == "pytesseract": + return self._detect_pytesseract(img) + elif self.engine == "easyocr": + return self._detect_easyocr(img) + else: # auto + # Prefer easyocr (much better Chinese recognition), fall back to pytesseract + try: + return self._detect_easyocr(img) + except Exception as e: + logger.info(f"easyocr failed ({e}), trying pytesseract") + + try: + boxes = self._detect_pytesseract(img) + if boxes: + return boxes + except Exception as e: + logger.error(f"All OCR engines failed: {e}") + + return [] + + def find_text_normalized( + self, img: Image.Image, query: str, fuzzy: bool = True + ) -> tuple[float, float] | None: + """Convenience: find text and return normalized (x, y) center directly. + + Returns None if not found. + """ + box = self.find_text(img, query, fuzzy=fuzzy) + if box is None: + return None + return box.center_normalized(img.width, img.height) + + # ────────────────────────────────────────────── + # pytesseract engine + # ────────────────────────────────────────────── + + def _detect_pytesseract(self, img: Image.Image) -> list[TextBox]: + """Detect text using pytesseract (calls tesseract binary). + + Uses chi_sim+eng for Chinese + English mixed content (common in WeChat). + Falls back to eng-only if chi_sim data is not installed. + """ + import pytesseract + + # Try Chinese+English first, fall back to English only + for lang in ["chi_sim+eng", "eng"]: + try: + data = pytesseract.image_to_data( + img, + lang=lang, + output_type=pytesseract.Output.DICT, + config="--psm 11" # Sparse text: find as much text as possible + ) + break + except pytesseract.TesseractError: + continue + else: + raise RuntimeError("Tesseract failed with all language configs") + + boxes = [] + n = len(data["text"]) + for i in range(n): + text = data["text"][i].strip() + conf = int(data["conf"][i]) + if not text or conf < 20: # skip low-confidence noise + continue + boxes.append(TextBox( + text=text, + x=data["left"][i], + y=data["top"][i], + w=data["width"][i], + h=data["height"][i], + confidence=conf / 100.0, + )) + + return boxes + + # ────────────────────────────────────────────── + # easyocr engine + # ────────────────────────────────────────────── + + def _detect_easyocr(self, img: Image.Image) -> list[TextBox]: + """Detect text using easyocr (better for Chinese, uses deep learning). + + First call is slow (~10s) due to model loading. Subsequent calls are fast. + """ + import easyocr + import numpy as np + + if self._easyocr_reader is None: + self._easyocr_reader = easyocr.Reader( + ["ch_sim", "en"], + gpu=False, # CPU is fine for single screenshots + ) + + # Convert PIL to numpy array for easyocr + img_np = np.array(img.convert("RGB")) + results = self._easyocr_reader.readtext(img_np) + + boxes = [] + for (bbox, text, conf) in results: + if not text.strip(): + continue + # bbox is [[x1,y1],[x2,y2],[x3,y3],[x4,y4]] (quadrilateral) + xs = [p[0] for p in bbox] + ys = [p[1] for p in bbox] + x = int(min(xs)) + y = int(min(ys)) + w = int(max(xs) - x) + h = int(max(ys) - y) + boxes.append(TextBox( + text=text.strip(), + x=x, y=y, w=w, h=h, + confidence=float(conf), + )) + + return boxes + + # ────────────────────────────────────────────── + # uiautomator XML dump (supplementary, often empty on Huawei) + # ────────────────────────────────────────────── + + def try_uiautomator_dump(self, serial: str | None = None) -> list[TextBox]: + """Attempt to get UI elements from uiautomator dump. + + NOTE: This often returns nearly empty XML on Huawei/HarmonyOS, + especially for WeChat. Use as a supplementary source, not primary. + + Args: + serial: Device serial (None = use settings or first device). + + Returns: + List of TextBox from accessibility tree, may be empty. + """ + adb = settings.adb_path + cmd = [adb] + if serial or settings.device_serial: + cmd.extend(["-s", serial or settings.device_serial]) + + # Dump to device, then pull + dump_cmd = cmd + ["shell", "uiautomator", "dump", "/sdcard/ui_dump.xml"] + pull_cmd = cmd + ["shell", "cat", "/sdcard/ui_dump.xml"] + + try: + subprocess.run(dump_cmd, capture_output=True, timeout=10) + result = subprocess.run(pull_cmd, capture_output=True, text=True, timeout=5) + xml_content = result.stdout + except Exception as e: + logger.warning(f"uiautomator dump failed: {e}") + return [] + + return self._parse_uiautomator_xml(xml_content) + + def _parse_uiautomator_xml(self, xml_str: str) -> list[TextBox]: + """Parse uiautomator dump XML into TextBox list.""" + boxes = [] + # Pattern: text="..." bounds="[x1,y1][x2,y2]" + pattern = r'text="([^"]*)"[^>]*bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"' + for match in re.finditer(pattern, xml_str): + text = match.group(1).strip() + if not text: + continue + x1, y1, x2, y2 = (int(match.group(i)) for i in range(2, 6)) + boxes.append(TextBox( + text=text, + x=x1, y=y1, + w=x2 - x1, h=y2 - y1, + confidence=1.0, # accessibility tree is authoritative + )) + return boxes + + # ────────────────────────────────────────────── + # Hybrid: combine OCR + uiautomator + # ────────────────────────────────────────────── + + def find_text_hybrid( + self, img: Image.Image, query: str, fuzzy: bool = True + ) -> TextBox | None: + """Try uiautomator first (exact bounds), fall back to OCR. + + Best strategy for Huawei: uiautomator might work for some apps, + OCR always works as fallback. + """ + # Try uiautomator first (precise but often empty on Huawei) + ua_boxes = self.try_uiautomator_dump() + ua_matches = [b for b in ua_boxes if b.contains_text(query, fuzzy=fuzzy)] + if ua_matches: + logger.info(f"Found '{query}' via uiautomator") + return ua_matches[0] + + # Fall back to OCR + logger.info(f"uiautomator found nothing for '{query}', using OCR") + return self.find_text(img, query, fuzzy=fuzzy) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..cb18e94 --- /dev/null +++ b/src/main.py @@ -0,0 +1,122 @@ +"""Phone GUI Agent - Main Entry Point + +Web console for controlling the agent loop. +""" + +import asyncio +import json +from pathlib import Path + +from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request +from fastapi.responses import HTMLResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates + +from config import settings +from src.capture import ADBCapture +from src.planner.agent_loop import AgentLoop + +app = FastAPI(title="Phone GUI Agent", version="0.1.0") + +BASE_DIR = Path(__file__).parent.parent +app.mount("/static", StaticFiles(directory=BASE_DIR / "web" / "static"), name="static") +templates = Jinja2Templates(directory=BASE_DIR / "web" / "templates") + +# Global state +capture = ADBCapture() +agent = AgentLoop() + + +@app.get("/", response_class=HTMLResponse) +async def index(request: Request): + return templates.TemplateResponse(request, "index.html") + + +@app.get("/api/device") +async def device_info(): + """Check device connection status.""" + try: + info = capture.check_device() + return info + except Exception as e: + return {"connected": False, "error": str(e)} + + +@app.get("/api/screenshot") +async def take_screenshot(): + """Take a screenshot and return base64.""" + try: + b64 = capture.screenshot_base64() + return {"ok": True, "image": b64} + except Exception as e: + return {"ok": False, "error": str(e)} + + +@app.post("/api/stop") +async def stop_task(): + """Stop the current running task.""" + agent.stop() + return {"ok": True} + + +@app.websocket("/ws/task") +async def task_websocket(ws: WebSocket): + """WebSocket endpoint for running tasks with real-time updates. + + Client sends: {"task": "打开微信搜索张三"} + Server streams: StepResult objects as JSON + """ + await ws.accept() + try: + data = await ws.receive_json() + task = data.get("task", "") + if not task: + await ws.send_json({"error": "No task provided"}) + return + + await ws.send_json({"status": "started", "task": task}) + + def on_step(result): + asyncio.get_event_loop().call_soon_threadsafe( + asyncio.ensure_future, + ws.send_json({ + "status": "step", + "step": result.step, + "observation": result.observation, + "thinking": result.thinking, + "action_type": result.action_type, + "action_desc": result.action_desc, + "screenshot": result.screenshot_before[:100] + "..." if result.screenshot_before else None, + "error": result.error, + }) + ) + + session = await agent.run_task(task, on_step=on_step) + + await ws.send_json({ + "status": session.status, + "total_steps": len(session.steps), + "task": task, + }) + + except WebSocketDisconnect: + agent.stop() + except Exception as e: + try: + await ws.send_json({"error": str(e)}) + except Exception: + pass + + +def main(): + import uvicorn + uvicorn.run( + "src.main:app", + host=settings.host, + port=settings.port, + reload=True, + ) + + +if __name__ == "__main__": + main() diff --git a/src/planner/__init__.py b/src/planner/__init__.py new file mode 100644 index 0000000..5491201 --- /dev/null +++ b/src/planner/__init__.py @@ -0,0 +1,3 @@ +from .agent_loop import AgentLoop + +__all__ = ["AgentLoop"] diff --git a/src/planner/agent_loop.py b/src/planner/agent_loop.py new file mode 100644 index 0000000..05bf3b4 --- /dev/null +++ b/src/planner/agent_loop.py @@ -0,0 +1,200 @@ +"""L4+L6+L7 - Agent Loop: Planning, Verification, Memory + +The core agent loop that orchestrates the full pipeline: +Screenshot → VLM Analysis → Action Execution → Verification → Repeat +""" + +import asyncio +import time +from dataclasses import dataclass, field +from datetime import datetime + +from src.capture import ADBCapture +from src.vision import VLMClient +from src.executor.adb_executor import ADBExecutor, Action + + +@dataclass +class StepResult: + step: int + timestamp: str + observation: str + thinking: str + action_type: str + action_desc: str + screenshot_before: str # base64 + screenshot_after: str | None = None + verified: bool = False + error: str | None = None + + +@dataclass +class TaskSession: + task: str + status: str = "running" # running / completed / failed / stopped + steps: list[StepResult] = field(default_factory=list) + started_at: str = "" + finished_at: str = "" + + def history(self) -> list[dict]: + """Return history for VLM context.""" + return [ + { + "observation": s.observation, + "action": {"type": s.action_type}, + } + for s in self.steps + ] + + +class AgentLoop: + """Main agent loop orchestrating all pipeline layers.""" + + def __init__(self): + self.capture = ADBCapture() + self.vlm = VLMClient() + self.executor = ADBExecutor(self.capture) + self.current_session: TaskSession | None = None + self._stop_requested = False + + def stop(self): + self._stop_requested = True + + async def run_task(self, task: str, on_step=None) -> TaskSession: + """Execute a task through the full agent loop. + + Args: + task: Natural language task instruction. + on_step: Optional callback called after each step with StepResult. + + Returns: + TaskSession with all steps and final status. + """ + from config import settings + + session = TaskSession( + task=task, + started_at=datetime.now().isoformat(), + ) + self.current_session = session + self._stop_requested = False + + try: + for step_num in range(1, settings.max_steps + 1): + if self._stop_requested: + session.status = "stopped" + break + + result = await self._execute_step(step_num, task, session) + session.steps.append(result) + + if on_step: + on_step(result) + + if result.action_type == "done": + session.status = "completed" + break + + if result.error: + # Allow up to 3 consecutive errors before failing + recent_errors = sum( + 1 for s in session.steps[-3:] if s.error + ) + if recent_errors >= 3: + session.status = "failed" + break + else: + session.status = "failed" # max steps exceeded + + except Exception as e: + session.status = "failed" + if session.steps: + session.steps[-1].error = str(e) + + session.finished_at = datetime.now().isoformat() + self.current_session = None + return session + + async def _execute_step( + self, step_num: int, task: str, session: TaskSession + ) -> StepResult: + """Execute a single step in the agent loop.""" + timestamp = datetime.now().isoformat() + + # L1: Capture screenshot + try: + screenshot_b64 = self.capture.screenshot_base64() + except Exception as e: + return StepResult( + step=step_num, timestamp=timestamp, + observation="", thinking="", + action_type="error", action_desc="", + screenshot_before="", error=f"Screenshot failed: {e}" + ) + + # L2+L3+L4: VLM analysis (understanding + grounding + planning) + try: + response = await self.vlm.analyze_screen( + screenshot_b64, task, session.history() + ) + except Exception as e: + return StepResult( + step=step_num, timestamp=timestamp, + observation="", thinking="", + action_type="error", action_desc="", + screenshot_before=screenshot_b64, + error=f"VLM analysis failed: {e}" + ) + + observation = response.get("observation", "") + thinking = response.get("thinking", "") + action_data = response["action"] + action_type = action_data["type"] + + # Task complete + if action_type == "done": + return StepResult( + step=step_num, timestamp=timestamp, + observation=observation, thinking=thinking, + action_type="done", action_desc="Task completed", + screenshot_before=screenshot_b64, + ) + + # L5: Execute action + action = Action( + type=action_type, + x=action_data.get("x", 0), + y=action_data.get("y", 0), + text=action_data.get("text", ""), + x2=action_data.get("x2", 0), + y2=action_data.get("y2", 0), + duration=action_data.get("duration", 300), + ) + + try: + action_desc = self.executor.execute(action) + except Exception as e: + return StepResult( + step=step_num, timestamp=timestamp, + observation=observation, thinking=thinking, + action_type=action_type, action_desc="", + screenshot_before=screenshot_b64, + error=f"Execution failed: {e}" + ) + + # L6: Verify by taking post-action screenshot + screenshot_after = None + if settings.verify_after_action: + try: + screenshot_after = self.capture.screenshot_base64() + except Exception: + pass # non-critical + + return StepResult( + step=step_num, timestamp=timestamp, + observation=observation, thinking=thinking, + action_type=action_type, action_desc=action_desc, + screenshot_before=screenshot_b64, + screenshot_after=screenshot_after, + verified=screenshot_after is not None, + ) diff --git a/src/verifier/__init__.py b/src/verifier/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/vision/__init__.py b/src/vision/__init__.py new file mode 100644 index 0000000..f0dedd0 --- /dev/null +++ b/src/vision/__init__.py @@ -0,0 +1,3 @@ +from .vlm_client import VLMClient + +__all__ = ["VLMClient"] diff --git a/src/vision/vlm_client.py b/src/vision/vlm_client.py new file mode 100644 index 0000000..867945f --- /dev/null +++ b/src/vision/vlm_client.py @@ -0,0 +1,171 @@ +"""L2+L3 - Vision Language Model Client + +Sends screenshots to VLM for screen understanding and element grounding. +Supports multiple providers: Poe API (preferred), OpenRouter (backup), local. +""" + +import base64 +import httpx +from PIL import Image +import io + +from config import settings + + +SYSTEM_PROMPT = """你是一个手机 GUI 操控助手。你会收到一张 Android 手机截图和一个用户任务指令。 + +你的职责: +1. 分析当前屏幕内容(识别所有 UI 元素、文本、图标、按钮) +2. 根据任务目标,决定下一步要执行的操作 +3. 精确定位目标元素的屏幕坐标 + +输出格式(严格 JSON): +{ + "observation": "当前屏幕的简要描述", + "thinking": "下一步应该做什么,为什么", + "action": { + "type": "tap|swipe|type|long_press|back|home|scroll|wait|done", + "x": 0.5, + "y": 0.3, + "text": "", + "x2": 0.0, + "y2": 0.0, + "duration": 300 + } +} + +坐标说明: +- x, y 为归一化坐标,范围 0.0-1.0 +- (0, 0) 是屏幕左上角,(1, 1) 是右下角 +- 点击按钮时,坐标应指向按钮的中心位置 + +当任务完成时,action.type 设为 "done"。 +""" + + +class VLMClient: + """Multi-provider VLM client for screen understanding.""" + + def __init__(self): + self.provider = settings.vlm_provider + self.model = settings.vlm_model + + async def analyze_screen( + self, screenshot_b64: str, task: str, history: list[dict] | None = None + ) -> dict: + """Send screenshot to VLM and get structured action response. + + Args: + screenshot_b64: Base64-encoded PNG screenshot. + task: User's task instruction. + history: Previous observation/action pairs for context. + + Returns: + Parsed dict with observation, thinking, and action. + """ + messages = self._build_messages(screenshot_b64, task, history) + + match self.provider: + case "poe": + raw = await self._call_poe(messages) + case "openrouter": + raw = await self._call_openrouter(messages) + case "local": + raw = await self._call_local(messages) + case _: + raise ValueError(f"Unknown VLM provider: {self.provider}") + + return self._parse_response(raw) + + def _build_messages( + self, screenshot_b64: str, task: str, history: list[dict] | None + ) -> list[dict]: + messages = [{"role": "system", "content": SYSTEM_PROMPT}] + + # Add history context + if history: + history_text = "\n".join( + f"Step {i+1}: {h['observation']} → {h['action']['type']}" + for i, h in enumerate(history[-5:]) # last 5 steps + ) + messages.append({ + "role": "user", + "content": f"历史操作记录:\n{history_text}" + }) + + # Current step: screenshot + task + messages.append({ + "role": "user", + "content": [ + { + "type": "image_url", + "image_url": {"url": f"data:image/png;base64,{screenshot_b64}"} + }, + { + "type": "text", + "text": f"当前任务:{task}\n\n请分析截图并给出下一步操作。" + }, + ], + }) + return messages + + async def _call_poe(self, messages: list[dict]) -> str: + """Call Poe API (preferred, cheapest).""" + async with httpx.AsyncClient(timeout=30) as client: + resp = await client.post( + "https://api.poe.com/v1/chat/completions", + headers={ + "Authorization": f"Bearer {settings.poe_api_key}", + "Content-Type": "application/json", + }, + json={"model": self.model, "messages": messages}, + ) + resp.raise_for_status() + return resp.json()["choices"][0]["message"]["content"] + + async def _call_openrouter(self, messages: list[dict]) -> str: + """Call OpenRouter API (backup).""" + async with httpx.AsyncClient(timeout=30) as client: + resp = await client.post( + "https://openrouter.ai/api/v1/chat/completions", + headers={ + "Authorization": f"Bearer {settings.openrouter_api_key}", + "Content-Type": "application/json", + }, + json={"model": self.model, "messages": messages}, + ) + resp.raise_for_status() + return resp.json()["choices"][0]["message"]["content"] + + async def _call_local(self, messages: list[dict]) -> str: + """Call local vLLM/Ollama server.""" + async with httpx.AsyncClient(timeout=60) as client: + resp = await client.post( + "http://localhost:11434/v1/chat/completions", + json={"model": self.model, "messages": messages}, + ) + resp.raise_for_status() + return resp.json()["choices"][0]["message"]["content"] + + def _parse_response(self, raw: str) -> dict: + """Parse VLM response into structured action dict.""" + import json + import re + + # Extract JSON from response (handle markdown code blocks) + json_match = re.search(r"```(?:json)?\s*(.*?)\s*```", raw, re.DOTALL) + if json_match: + raw = json_match.group(1) + + # Try to find JSON object directly + json_match = re.search(r"\{.*\}", raw, re.DOTALL) + if not json_match: + raise ValueError(f"No JSON found in VLM response: {raw[:200]}") + + parsed = json.loads(json_match.group()) + + # Validate required fields + assert "action" in parsed, "Missing 'action' field" + assert "type" in parsed["action"], "Missing action 'type'" + + return parsed diff --git a/web/templates/index.html b/web/templates/index.html new file mode 100644 index 0000000..807cb8b --- /dev/null +++ b/web/templates/index.html @@ -0,0 +1,192 @@ + + + + + + Phone GUI Agent + + + +

    +
    +

    Phone GUI Agent

    + 检测设备中... +
    + +
    +
    +
    + +
    + + + +
    +
    +
    +
    + +
    +
    + +
    连接设备后显示截图
    +
    +
    + +
    +
    +

    Agent 思考过程

    +
    +
    +
    +
    + + + +