@capagents/forgeqe 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/HOW_TO_USE.md +1639 -0
  2. package/README.md +338 -2
  3. package/bin/forgeqe.d.ts +3 -0
  4. package/bin/forgeqe.js +188 -0
  5. package/docs/ARCHITECTURE.md +408 -0
  6. package/docs/security-data-flow.html +1870 -0
  7. package/docs/user-guide.html +2094 -0
  8. package/evals/domain/access-role-change.yaml +37 -0
  9. package/evals/domain/banking-payment-transfer.yaml +41 -0
  10. package/evals/domain/gdpr-account-erasure.yaml +30 -0
  11. package/evals/domain/insurance-claim-fnol.yaml +30 -0
  12. package/evals/domain/insurance-policy-renewal.yaml +37 -0
  13. package/evals/domain/lending-loan-application.yaml +36 -0
  14. package/forgeqe-architecture.html +718 -0
  15. package/forgeqe.example.yaml +203 -0
  16. package/knowledge/README.md +18 -0
  17. package/knowledge/business-rules.md +10 -0
  18. package/knowledge/compliance.md +16 -0
  19. package/knowledge/environments.md +5 -0
  20. package/knowledge/glossary.md +5 -0
  21. package/knowledge/product.md +16 -0
  22. package/knowledge/roles.md +9 -0
  23. package/knowledge/test-data.md +7 -0
  24. package/llms.example.json +51 -0
  25. package/package.json +63 -4
  26. package/prompts/README.md +34 -0
  27. package/prompts/api-scenarios.md +21 -0
  28. package/prompts/api-tests.md +39 -0
  29. package/prompts/brain.md +166 -0
  30. package/prompts/browser-capture.md +7 -0
  31. package/prompts/browser-case-report.md +7 -0
  32. package/prompts/browser-checks.md +14 -0
  33. package/prompts/browser-efficiency.md +7 -0
  34. package/prompts/browser-error-recovery.md +15 -0
  35. package/prompts/browser-extra.md +5 -0
  36. package/prompts/browser-goal-verification.md +13 -0
  37. package/prompts/browser-skill-select.md +6 -0
  38. package/prompts/domain-rule.md +13 -0
  39. package/prompts/eval-judge.md +19 -0
  40. package/prompts/explore-charters.md +27 -0
  41. package/prompts/find-tests.md +28 -0
  42. package/prompts/heal.md +40 -0
  43. package/prompts/pr-review.md +29 -0
  44. package/prompts/skill-rule.md +6 -0
  45. package/prompts/test-agent.md +34 -0
  46. package/prompts/test-reviewer.md +30 -0
  47. package/prompts/test-rules.md +28 -0
  48. package/py/forgeqe_engine/__init__.py +3 -0
  49. package/py/forgeqe_engine/__main__.py +3 -0
  50. package/py/forgeqe_engine/brand.py +453 -0
  51. package/py/forgeqe_engine/brand_assets.py +6 -0
  52. package/py/forgeqe_engine/browser.py +196 -0
  53. package/py/forgeqe_engine/capture.py +538 -0
  54. package/py/forgeqe_engine/checks.py +98 -0
  55. package/py/forgeqe_engine/cli.py +188 -0
  56. package/py/forgeqe_engine/diagnostics.py +609 -0
  57. package/py/forgeqe_engine/llm.py +195 -0
  58. package/py/forgeqe_engine/logins.py +251 -0
  59. package/py/forgeqe_engine/loops.py +224 -0
  60. package/py/forgeqe_engine/memory.py +1004 -0
  61. package/py/forgeqe_engine/network.py +244 -0
  62. package/py/forgeqe_engine/prompts.py +20 -0
  63. package/py/forgeqe_engine/replay.py +240 -0
  64. package/py/forgeqe_engine/report.py +173 -0
  65. package/py/forgeqe_engine/service.py +1335 -0
  66. package/py/forgeqe_engine/settings.py +93 -0
  67. package/py/forgeqe_engine/skills.py +88 -0
  68. package/py/forgeqe_engine/summary.py +239 -0
  69. package/py/forgeqe_engine/urls.py +81 -0
  70. package/py/forgeqe_engine/workflow_yaml.py +689 -0
  71. package/skills/dotnet-nunit-playwright/SKILL.md +34 -0
  72. package/skills/dynamics-365/SKILL.md +21 -0
  73. package/skills/playwright-typescript/SKILL.md +35 -0
  74. package/skills/writing-skills/SKILL.md +30 -0
  75. package/src/api/plan.ts +246 -0
  76. package/src/api/run.ts +204 -0
  77. package/src/api/scenario.ts +502 -0
  78. package/src/api/schema.ts +170 -0
  79. package/src/api/spec.ts +624 -0
  80. package/src/api/store.ts +232 -0
  81. package/src/api/traffic.ts +281 -0
  82. package/src/api/types.ts +163 -0
  83. package/src/api/write.ts +272 -0
  84. package/src/auth/signin.ts +494 -0
  85. package/src/auth/store.ts +170 -0
  86. package/src/brain/index.ts +189 -0
  87. package/src/brain/prompt.ts +19 -0
  88. package/src/capabilities/docs.ts +101 -0
  89. package/src/capabilities/guide.ts +455 -0
  90. package/src/capabilities/registry.ts +343 -0
  91. package/src/capabilities/render.ts +106 -0
  92. package/src/capabilities/status.ts +137 -0
  93. package/src/card.ts +11 -0
  94. package/src/cases/ado.ts +325 -0
  95. package/src/cases/api.ts +117 -0
  96. package/src/cases/bugs.ts +223 -0
  97. package/src/cases/confluence.ts +111 -0
  98. package/src/cases/context.ts +223 -0
  99. package/src/cases/dashboards.ts +137 -0
  100. package/src/cases/failure.ts +97 -0
  101. package/src/cases/files.ts +295 -0
  102. package/src/cases/goal.ts +53 -0
  103. package/src/cases/http.ts +111 -0
  104. package/src/cases/index.ts +131 -0
  105. package/src/cases/jira.ts +122 -0
  106. package/src/cases/qtest.ts +108 -0
  107. package/src/cases/quality.ts +190 -0
  108. package/src/cases/rag.ts +100 -0
  109. package/src/cases/readiness.ts +284 -0
  110. package/src/cases/save.ts +149 -0
  111. package/src/cases/sprints.ts +148 -0
  112. package/src/cases/testrail.ts +176 -0
  113. package/src/cases/types.ts +107 -0
  114. package/src/cases/wiki.ts +105 -0
  115. package/src/cases/xray.ts +206 -0
  116. package/src/cases/zephyr.ts +153 -0
  117. package/src/childEnv.ts +86 -0
  118. package/src/cli/args.ts +114 -0
  119. package/src/cli/help.ts +167 -0
  120. package/src/cli/index.ts +1142 -0
  121. package/src/cli/terminal.ts +187 -0
  122. package/src/code/areas.ts +337 -0
  123. package/src/code/attention.ts +214 -0
  124. package/src/code/find.ts +540 -0
  125. package/src/code/handoff.ts +541 -0
  126. package/src/code/history.ts +170 -0
  127. package/src/code/impact.ts +231 -0
  128. package/src/code/index.ts +34 -0
  129. package/src/code/livebrowser.ts +67 -0
  130. package/src/code/loop.ts +603 -0
  131. package/src/code/notes.ts +75 -0
  132. package/src/code/profile.ts +226 -0
  133. package/src/code/prompt.ts +303 -0
  134. package/src/code/prreview.ts +649 -0
  135. package/src/code/prtests.ts +103 -0
  136. package/src/code/replay.ts +772 -0
  137. package/src/code/review.ts +202 -0
  138. package/src/code/runtime.ts +757 -0
  139. package/src/code/slices.ts +159 -0
  140. package/src/code/testrun.ts +187 -0
  141. package/src/code/traceability.ts +100 -0
  142. package/src/code/worktree.ts +153 -0
  143. package/src/commands.ts +101 -0
  144. package/src/config.ts +970 -0
  145. package/src/detail.ts +65 -0
  146. package/src/domain.ts +19 -0
  147. package/src/engine/bridge.ts +359 -0
  148. package/src/engine/mock.ts +102 -0
  149. package/src/engine/setup.ts +298 -0
  150. package/src/entra.ts +154 -0
  151. package/src/env.ts +24 -0
  152. package/src/evals/domain.ts +338 -0
  153. package/src/explore/charters.ts +151 -0
  154. package/src/explore/run.ts +280 -0
  155. package/src/explore/story.ts +106 -0
  156. package/src/guard.ts +51 -0
  157. package/src/heal/loop.ts +357 -0
  158. package/src/heal/prompt.ts +143 -0
  159. package/src/heal/report.ts +95 -0
  160. package/src/index.ts +12 -0
  161. package/src/init.ts +102 -0
  162. package/src/knowledge.ts +114 -0
  163. package/src/legacyEnv.ts +9 -0
  164. package/src/llm.ts +61 -0
  165. package/src/locale.ts +25 -0
  166. package/src/logins.ts +148 -0
  167. package/src/managed.ts +101 -0
  168. package/src/mcp/apitools.ts +335 -0
  169. package/src/mcp/captools.ts +25 -0
  170. package/src/mcp/casetools.ts +223 -0
  171. package/src/mcp/commands.ts +421 -0
  172. package/src/mcp/exploretools.ts +129 -0
  173. package/src/mcp/external.ts +172 -0
  174. package/src/mcp/git.ts +78 -0
  175. package/src/mcp/notifytools.ts +49 -0
  176. package/src/mcp/prtools.ts +261 -0
  177. package/src/mcp/qualitytools.ts +154 -0
  178. package/src/mcp/repotests.ts +286 -0
  179. package/src/mcp/server.ts +234 -0
  180. package/src/mcp/tools.ts +810 -0
  181. package/src/memory.ts +250 -0
  182. package/src/money.ts +39 -0
  183. package/src/monitor/alerts.ts +94 -0
  184. package/src/monitor/background.ts +68 -0
  185. package/src/monitor/run.ts +263 -0
  186. package/src/monitor/state.ts +105 -0
  187. package/src/notify/events.ts +144 -0
  188. package/src/notify/notice.ts +177 -0
  189. package/src/prices.ts +175 -0
  190. package/src/print.ts +54 -0
  191. package/src/privacy.ts +35 -0
  192. package/src/prompts.ts +165 -0
  193. package/src/quality/budgets.ts +249 -0
  194. package/src/quality/history.ts +149 -0
  195. package/src/quality/visual.ts +201 -0
  196. package/src/report/data.ts +475 -0
  197. package/src/report/html.ts +106 -0
  198. package/src/report/template.html +84 -0
  199. package/src/run.ts +243 -0
  200. package/src/sessionLog.ts +216 -0
  201. package/src/sessionLogins.ts +94 -0
  202. package/src/skills/registry.ts +217 -0
  203. package/src/skills/scaffold.ts +65 -0
  204. package/src/skills/select.ts +37 -0
  205. package/src/skills/view.ts +44 -0
  206. package/src/suite/report.ts +135 -0
  207. package/src/suite/run.ts +303 -0
  208. package/src/summary.ts +188 -0
  209. package/src/tools.ts +130 -0
  210. package/src/tui/App.tsx +983 -0
  211. package/src/tui/clipboard.ts +36 -0
  212. package/src/tui/components.tsx +263 -0
  213. package/src/tui/dialogs.ts +65 -0
  214. package/src/tui/main.tsx +20 -0
  215. package/src/tui/text.ts +28 -0
  216. package/src/tui/theme.ts +104 -0
  217. package/src/tui/transcript.tsx +344 -0
  218. package/src/types.ts +136 -0
  219. package/src/update.ts +311 -0
  220. package/src/usage.ts +158 -0
@@ -0,0 +1,6 @@
1
+ """Made by scripts/brand.py from assets/forgeqe-icon.png; run that instead of editing."""
2
+
3
+ ICON_PNG = "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAACvS0lEQVR42uz9Z7Bl2XUeCH7f2vucc/2z6X1llrfwlgWQIOhEI4lOVLdESc0JxUihnukY86NjJqJjfk3MhKIj1JpQT2s0reawKUOKTTYNDAESAGGrgEKWTV/pX+bL580155y915of+77MLABVKFRmgQng7SoEyr137z13r72X+QzNDNtre/2oLtl+BNtrOwC21/baDoDttb22A2B7ba/tANhe22s7ALbX9toOgO21vbYDYHttr+0A2F7bazsAttf22g6A7bW9tgNge22v7QDYXttrOwC21/baDoDttb22A2B7ba/tANhe22s7ALbX9toOgO21vbYDYHttr+0A2F7bazsAttf22g6A7bW9tgNge22v7QDYXttrOwC21/baDoDttb22A2B7ba/tANhe22s7ALbX9vo+Lr/9CL6f67tK0XP7GW0HwA/H/jYDX7vhSX73/f1avwZLP7YdHm/b4rZBxl3c97z5ML/TVi8BA9bNoll67LwVGSzIJpAB7vVexKBb0bAdCdsBcE9s+vT4uLXjKyACNVAZhmW4NiqXq3pUh35ZD8p6czRcqathCFVdxxANJiIUOnE+87nP2pmbKPJWo2jmvpn5pvd78my6KBreZUADyG+/X7buh+142A6A7/thb8bbjvk+sBB1uazOrPYvrazdWN1YHY3W6zgo4yBaqVZFwDkQ5h2cCAUkbv5BGszUoDFdD95JnklL2HDseemJzHRaeya6R7udHe3GVJHvfm0w2HYYbAfA93nfD4CViLMbg7n1jQsr/XM3li+vrm4GLcVFU/UZfB7FqxM4Jy4T0swyM0cANBgAIUHeTJsiJdJTqIRBTaMnnAXWtWj0YhmqqSI70O0dm5480Cr2NxvHOs3erUou3Uf3RDB8SyXDm0/v9Yr/rYKJ2wFwz2392/b9CrBY1ReWNr928er55bWlKi4P45A+uiI6D+9VDUKDmBMK1cxgBnMwEQFNSJIUjp//a7aKGGigCiFCcRAxU8JICCFWiwaGMrfQ85zymHV8dHrqXXt2PdxstJ3cqhf+mkqF28qht9DbGr/v7+eb3w6AN/ouaXbzvF8Y2fFriy8vbpycv3F5ZWUgvvRFzJrmcqOnODVTVTFCBIQRhBrUCQUGjaBF50HHcRDQCDPYrWZPoKhQKGJGA41iRgiMNDNPuvH9EMkocdSoq65qJ4RDE5MPTc08PNU9Nt2eFjRuy474/SmHxp2v8asNgQAEoAJKxdWyXqvLynQYY2VWq6kpFJ5s53k7z3b4xoGCTWDitakdtwPgr/fI3wRObAw+f+bys6/OLw5tg1J5xyIvxUdxNt7sShgFakYnqqopvYGRJgCghDkn0bzBidA4bv4YxgFgBFxUF6AmFDEKhBSAAE0IGGhCMaMZ6ZwKhOotigaJsRXCpNnuRva+fTvfuXNyf5HPvG076VtPegJbDYDLZst1PVeHa5vVleWVhc3+SFkZ+tDKtIZGIpIhqsC8wVNyka6LE07u600+sWP2cLM4kGe9NKZ9m8NgOwC+86lvwBXFVy5eO37x6otzCzeCDPNOKNqZOFONQISjkKnZLxotmlO7WdVSDCkAaKYpmkRIE0JIGYeFGciUKRFUJyoAzAEulclmJEhRmNLURcIcvJg3OCWMEBppJJS1atWuY7es9uf5w1O9x3dOv3PHxJ67WivfbH/dPOxXgSFwqj8429+8tr5xbTS6NiyX6zCARCkgGcUBAoiSUVBLutnM0ZyZU4NpdIMc2o2uXcb9RfNQs/XAVOep2cmDHnkqbt6eMNgOgNfOrcgAnB0MvnRp4QsnL11YHW4iC0WTRSNAjAQjoQZCSdAZSRgRodEDpmJGOohLJ7caKDRa2neeMI47mGaWCoJxbUiKeWcetHSfAKpQkHBihAkiFIRAaEJKSpgF6gExjd6GiA4ul4xlKKpyUqv7e42nD+5+73Rvb5Y5vDZNeWttABKAAkPgYhUuDqsTGxunlhavV3E9oq9aZlJlWXDOxFPFQ5yShkgaGQgDlQAoVGdwZgJzEgyaudyCuhC7FjuD/sHcfWjfrnftnHnAu+0b4G0/9SNwehj+6PQrz565eGVN+9Kp8x6yppl608I5WKxcME+AUBWFM3F0hEQgCpQAIiigIwkwmlEcXMr01VFJAzme+DpJuVB6G5k5Z44wdQaaikWoCZCigTQ6mmRmziAAqEaz8XlqoCkJKaL5qPAiWRw1q41u6B+YbL5n376P7dy9S9D5HvMKAwyQrcBZAOZNvzK/cHFlc34Yro/KDaLO8yiNGr4Wq4XRMRKqRkBUaSYGkmpmFIzTPwhMUsvA4MxgUHFKMSBDaMS6VY9aw4293d7PHjrwwcnuhFmTtLtaH/9IB8A43ScUPFPr505f+osT50+vbNR5K/pWzRwuV4uFc2LKGCli4sxBqQYlIZbOYwfQIEEsMlJIIylbuYJBQBpoYiBIYbrRFYatG8AIRxETUJWpbWRqBoIQQGg0eoF5M2dKQmlKmNDIlG2pKUzEZ0ZGGARezIVKR4NWrB/utD50aP97d0w+BGRv4i64vQ2gwBW1lzcHzy0vHV9eul7HAbzkLUgWSBOJ6cPQmSGqprRMaWpqNIE5S/+FjPu/BkcDITAA0SDiYDBTkBSEWNM0g1pZz1T1zx3a//H9Ox4Amts3wF07+GEAF4FPvjr3Z8dPnl5eG7iOuh1GMYFRnZihMqj4TClgloXMAUE0SoRT0AAbF7oQkDAFQY6HtRQCOq5fhYADXTr/xnPccZls6Uw3GKBpRgAhjM7oKAQImqqJGk2dpQuH4mnio3gTpWiqkFGZjyaMBqh3yDxyanC6OBFGj3Z6P3No3/unJna+iaugBhaBpeHwS9dufG1jMDccrguHeTO43OCgoAgFgRoQzUxMHERULMIgKoigOtBUNKSjX9KTMkufymAGREelipoDQAaNoFOFqZCSV4Op4dpHDu3/jYN7H7k5WNgOgDvI+I1kBXzu+sqfvHz2Kxeub0jLsp4x17TTECkmBKEwdRRCAKrzSqY2kReYRENUKkiB+JhTvUqtvlaaQajeMTON4mCM4iTASea9RRethlfvwFoYjXmtohozKmiRIHOnLjeKBZUqukj1IM0ziilsXPwCYnBmjBksi7kFF+AiTKl08DCn8BAKK9ORrzd3WP3BXbt+ce/e97YaANQg/A5pz6shfH1t45n55dNrg+tBB42CeU5xpMBIYYzRGJVmUAEcBJbCl6BEiKY2F+kBF4ORoJhGT3MwGtVMXB7B2gWjigGmZmLpEIIFxOg0N3H9ssHRrx05+I9npyfu3sjsRy4ALFWmwvMBv//s6U++cmYRLhQdZc4AkrUYxi0HMnViCBNQDFBv3sDozHirAjZSSDGjpmM4RAkgAE9zFs0LyEoYilrRaA+ceJqHD8wrWOYqX/UluOCbpXdqQWimJs5BXDrtXKoX1UeH4KOJidKph0kQU6qJEgRFAZOUY0FAS5kSjEQDAlFFKDRMlKPD3v30gT0/sWfnjnRdcbyl0umwWte//eILn7p2bWl690rWDVkTztLhLUZn0GjOCWHRVByjSDQbzzdUNUYaU/NW0rxblHSePqoBMXUBADj6GC0wQoxANDN4QGCgAdTAKNEcs6iD+0f9//qJxz7cKu7WNeB/BA/+gfDPLy78x2dfenlxUDcmmbcsqEfwTmsNHs4gMCFpllIPkKYwM/pIkiOn6kyNog7qSJ/ydPV16UtREc1NaaQiilQShhxtTBb5Y3v2LUWe3NhEI48x0lFgouXBbrGDxbkrN1bzLBRFLZIXuWkdWNWegM+1yGpPwFCbAWqilMgIZ6A5kxjrrAyuzKL3mtGc0alDQCRVRMU0GgtkFkSkMWw3Tlf9hYuXXlxZ+o0j9z3SLHizxUkarOfce+47csa7pfURGwRNLKT8xYhAOlJAT+YmWtcZgmnUUFPVaczJQlwm8AaqBoQSAXAijejzkefIs/ZQM6e1iFCBCBsPBC2OqySKuVyFIhWjuMbKZv8z5y4+/tgDE3epGvY/Uq0ekpdH9v/7+kuffun0gmvV7RmRtqtYOERwgJFlXtKWSjMempk5UCI9PNRUXKQqDVABxYRKpSk1OlWpgUg4b15MICpSan9lZ87HDu/74H0HH9o99b+cvHxycZGtwiJiqLPC14P+/fv3/NqDR89dnf3apesnFlbWfDEwY+4ymqgZzJlFgZrBzAVNdWmQGERqijOVVHIyHbVKMhIRRpozFIEi2cBBFS1fWNTKwFZ7Iciza5s3Xjz5sQMHn94ztedWdUQK3zU53ZqYnjl79S/nV5cKap6lMQRoRJQYfV0VIbbhulk+izDd8O3mRC8vOoV0vGuI5IQDoIgWN2Nc3SznN8trdZwLYV51PWPls1oESk/SbDwfBAjouAAXHxmhlgnotTtzcnPt+LB8ulVgmxDzJlfKcSP5p5cXf+8rr7x8o1+1pkLRVKUPdRYZa61zVs1mIBoqZmqM6eCnQnWcSZCudKaoXTlkqJQiedsggIqLtasE1qgziieddyjisDFcfnLP1M8/+sA7pnszwKZZUQ4l1lVVs3aUrLZKNHKwuQP24L6Zj+6bObW48alz81+/vrwhzYDMADMq6lqieoqaCyJGE41xaNjInIh3UbzBe23CzKC0WsxyFVKE4tSpOXMMiKVGz+hgGq2i3+xMvrI5unRx/rnV1V85su+JRl5s9Ydyw5O0fffvu29i8g/PXT4foja8ajQLLoymYPd1Og81u8fa3aOtzlThGo4NovcG38Qs1oFrtZ3tj76+uvr1xaXLdVm3e6XLaijEADowTQYMpmIwM6EInMApY9ZY9qNn5hfeeWR/926kQf5HYPebkNeB//iNc7//7IsrdSfkMzUs1iouRgT1HiZGx+gdAYtiJDNLaZBQGeEsIsAiyo12Xe1qtfcf3IOJ6RcuXu2XtaNXi8pokS0tKoU0lOXGLIY//8QDv/LgwRkiNfg6IhZiVdUxMlexaFDVsnbATrAddcLJntnuU9PdPzu/+Cfnrl0eVmXeiIQQtDoIxByZq8JpfOLg7gktl27MXx+sL3n65g4go0uwCXUGMTMahEEYYa425whqKhsIRmUNSmdiLcTFlZULg7Wfu+/YT0x19qcrkwA4C/ztne0d7SO/e3HuxtLyzkZzb7t1bOfuw73ioU5nJ+FfS+J546qyR/YyPjDZ/MBk87md039xdfmr84sLPi9bzVEaLSokqhczi+ZihKh4ofkQnbEWWffuxOrqUtjd9X47AL572iPky5vlv/7L458/fXnYnkCjZ5ohRgcQ0YiKMSF/Mo00E6sNAlfQ5TFGmnYLarmGOChQ3zfZ+sCxRx/Yt1e6/ne+dGpj0Efehqmok+BBP1TNPLC+vL/Fv/f+J/7GjskmLGEkBAQgIoRYmosahF7NeboiIYcAGCYFv3Z09tjsxP/0/NnnVzY2m43gHbyjlaaIhtQj3Fi88fPve2TXAweu3Fh4Zu76qaW1PkYx93XhozhNOTRZWYwIFBYGi6akURSiNp45q5k6VK3OS9Xg2qkzFw7u+3t7dx4GxGCEAR3Dz7SLAw8eWlqZ2t3pzDb89M2dZwZQeWsjvvGE7SZ0aNrsJ1vFkfv3HJ3pffrU2TP9OjZb0SMYCxGGOstSrWMKiCE3iGltqDK/MOi/uL5xeHpK3uJc+9Zy/81/89/8cM93P3tl9Z9/6plnLi9X7alKciWNKmZOzZsQYjYeWwmjQ/CI4qRSNVqRSRHLbHP5cMM+unfqV9758K8/9fCHdk1JIZ/40ukvvHKmbLSCy8SEJqJZhNVSZf3lJ9r5P/7QO35qttswsy3sMw0gvzS//NJi3xqd1P2nExdHj8y0f2z3DmcAKYQBzmxfw923c/ra+ua11ZWRc2W0DHCRhFdHk7ixsVitrb1z78539zo/vWfXsempbubCYG006qtj9F6FEUZE54xWiUTCBELzNK/mlGKmymgITgWusSZ2aXlpqQwzne4uT9mqS2nYKTzcasx6ad3sHpJbrbJbf35X1v+410TCME3saeYzU70biysbowFyZ+I8WJCCaAIIBZIm31RTgQndcHSgUbxnovt67NMf9QAwgIYB+Xunr/+LT37l7CAOmj2VQhT0GhHETEDqFp6GKVzUyIS2yT0aVhaj5UMt/ckH9/6DDzz+6w/sf7DXnnaiwP96Yu4Pn31x2JmJvpGADSBo4lH70cKTk+3/8qPvfnqy6V47ZkoB8NXryy8tDWKzaQzmRLzzdfnodOvHds+K3SoBQaphZyb375q5tta/uriMoqA6QCCgh4oh8ytrq9Woes/u2T2w+1r5U7O9h3bvaAqrzY1YDh2QZ45miNGJiwmGQYEJ00zaDDSjAuYiaaLel8LrKytXV9Z6ExMHMu/S8yR0C5S2RWMm7yAD2YKAoG3YU2RTk725G8sDra3INFpO0NQEMPEqMKlhMI1iSvgY9+bFO6Z7jYQ33A6Ab4e1bZL/89cv/s5fHr9GX7a60TmnbElGU9DG3XFBGr2kL1KMCl+5hqcVw7X9rvqFh/f9xvsf+8XDuw7kzgxqCvIzV2/8j88cX5zYM/I9iS4XmAsmEUTeX/3Aju4/+Yn3PdXOXWqK384JSQFwbeWVpWFoNdSF6CDe5WX16GTzw7tnbgbATWK9mU167t4zuz6s524sBdcJua9cDcbCvGeDWbGytuJzPjU5IWoFuce7d01PPDa7ow0ONjf6/T58XtMrM2pm5msieI2sIcHBnBlUBJk6wsG7TCSr82xx2J9bWu50u4eLPMWAbAlb3F1UJomG2aEiG2XZ2ZXlvnd0uRgcCRJKry7CVUIyRqgCro67IE/unJq6Y3yr/2Fs+NgK+D9+5cwffvXkeqsbszxqcLSMosEsE0K9OlAizAiDUiGp7yNVUa5Oufo9+6d+8R0PfXTHpGwBKI3mKC9ulv/uaydW2ByKp1qRZbUieHiMWhtLH9zZ+69+7KmjDf+dEQa8Ke9gAMW8KhQWTePrSQaRBB7x/Gfvur9TDT99Y6nfmDDCnEDhIintUSGfOX3pcKv9s7NT6XVzs0da2SP373/X3tlPv3rpufmFay4v21NRfaSZSNCQJYATVJEgyT4yUkxihEGdH/Z6L/fXfufkaT7y4E90Wt4Sxeft+dbIHPgbu2dOry//5UZ/VDTEvAKayjMjKAKLECgMUhnXQqjV4O70Hf1Q3QCp4TMX+d/95Tc/efzsZmdq4PNa6YxeQRVQoigIl2CHEDNGgwgEtQ9Vsbn87p2t3/zQo//g3Q8/0m6kCi/RVmhYNfuXX3j++aVSG92gyGChqqVowEtzsPaeicb/+SPvPtrO09t4ncyMX7q+dHxxIzSaoqR6oZd6+OBU4+nbUqBvyZg9MEU8uHtqoRwura76olXBQeiZPoxDtKX1jQdnpmdzl5DzCee3P8/evWtmx/REf9BfWV0LUBXUgEBcEAk0SCCjbCU0FrxaBiMQRdholBquXZ1rtlpHWk1527gpaQbXBIL3J1ZXh8gMeSRqp1QzcwYAEaSoJ51YmJHw/l0zu0W2b4Dbz35eL+1ffeH5L7706ijvlepMcmgtEDfOqk2iN7HgAqCiYxCNxsr1lw413M9++Mmfe/zI0Qa+lYNhRvI/PH/+K5dWB72pOqk4UCT3mYbuxuYDRfFPP/TUfe3s9Xb/FlsdZjAzNaNtLTX9boAUNdub5//oiYdG5cnnVzek6AWXVWLRBUGMmTuzvvkHZy7/0yeOdIGbeboBbcPHJieOvvPxT1668VcXrpzb7GNiolQvMfNwgaZOYSGzhMAzlyAeoEUjJPrmda3/8PSF+JD76amefzv5WQQO9Xo7i+bcZqmNZp34oraFxzJTJIoQCIPGeDdQPPJDg3EQYq7G/+NTz/358Qub+XTpezUaMdBRZAvSAyHgaA5wKqxcDFK50G+sLX5o78z/8Zd//Dffc+RoI8lW3Urg0998eWnwRy/OD7p7+1JUdN5lUDhYVm4cQfmP3//YkxMNGzMh37T4YQoAfPcvUkgDjmXut5568IFG3h2N8qAEDTFYVTkp25Nfvb78F1eXU2V762QlMrP7if/toZ3/9N2PvXeq29hYzq1OIl7O6CKdmbPoTb1BzAgTtZw+lDqMfr09cdYX//OpVz+5vFKnee3b9i0eIg82W1m0GlrDFBy3JZIoAMdJGMfnCLYD4NYGna/0n3/i6587dW3Qmt2Udonc4MQgCqpBzZC4SASFLqN4lzGLG/s4+IcffPS//uWPfGhnr6Oatj5vO7oJO1+Ff/P543NVNogZzZtCa83os1B1q/WfferQh/d03lD2A3xN92PMmEzZFe1N5wmGR1r+bz15/xSGPg58jF4NsKFqadm6b//JmSvHh5VsgbGx1VAywJs93c7/6bsf+9X7j+4ph75cg6uVIQMKE2EmJhJtjFMTxBDyrFCfb/piodF+NfP//ty5P15ZL0ni7sdA2tg5cLQ32YBVWgeBmqnZmENEQpjOMyE94bbVoRNRg7Blw//zz7785y++Oix6A3OBLkSlRtHoLHFMLETVLagvhU3Hbrn5WNv/k4+/65996KH7vBVmIt+CC0aEDcnfP376hbllLRpOg1SVqEGch7b6Gz/+4MFfeuiA6ZueyNzMqvSW8iff9DYxsx+b6X78scPNeqOhwRtNsppiKkPJTgyG/+7lVy8YlN+qS5KA048B/+zgnn/65COPt32jXsl9KYw0p8HTxjioICihJjALploBIydrRfM0+LsvnfzE0nrA23IPpCL7cLfbcIgWlMYxd1SxJSaZiBJO4AHPH/kASFS9VfKff+q5P3/pWtWaHSlijBoqsVq0FK2okaYUJzKebAo1i/1s/dr7d7T/b7/w9C8f25uP0cD8dr6YkZ9YWPuT589v5q0qblq94a0GDBl0sP7wZOuXH7+vhzeR+twmpaCqKfenwTR9tfZmY4dsAj93aN87dk82hpsOEuEjvVrom661m19ZXPz03I3y25Du3Ko122Y/P9n6J08+/NHdk93hakNLwMDMIkwR4WpKLQyi0WqzSjRIUIXbbExcyhv/7tT5P1sdVAkyete/TWBWUHgHqhmocrN04u1FU4xeWFB+pAMgzXoHTB3Pc8PW7pK5S5ejRae1xJoWSI0aYSaAV3XQFqre5sIvP7Tv//JzH3i0V7gtuYTvuJZU//DLr1wcssoaYhWlqq1SVHG0Ppvp33nfQ4+2PN8w+fn2jI23C+Nuccm+h4aJ2V7gVx48sjcnqkGMpmpD0ZGLg8xfpfvM6YsvD+N3/JXpKsiBD+b+vzx2/6/v279r0G/VA8VIGQ2msGhUgwIUE0RvmptmJsGy9VbnlOPvnDz3+UGlSbXiLmdB8A6Fpxgy0KeyTeB4U0spYQOtEO/vRjUuP8B0XrUR+e9euPTvPvuN0J4p4WEQU2cmqtBoGqLGOgYRsRi8xga1o5u9wY1/9MGn/k8/8a69mdM30NswA/mFi0svXJhHeypAYIiKEAOrqrGx9NH7d39ob/d7lVngbSlvqjBAfk/bKPEp39lt/ezDh9vVwNWjGENpdUQ0OGtOvNoPnz57dT0RM/F60wjsM/wXRw7+5iMP7K8HE3Gt4SNpibgi6mliRgU1wdtCzOlqSL/TPan177xy5iuVVq/zEne0I4nM0SXJoIShokmiJJEkk9BYM8ty+REOABgo/MKFpf/vn3xp3XWCOI+YWWKfbrUaASXUUNaVxlpU6831yXLlH378XX//XUcyM339zCV15C+Owv/6xW8G3wSdwIcotMKFLOsPH5no/p3HjjTw1tFYvMU+NH7vPyxmP3lg9omZCdncMFUvzhtYRo/2MOt96drcsxv9N0itCCiRw35p5+Tff+LBY1LKYMVoEtTVyIJIkBgRlKVhBIsiWo9ErVbpt9ovlYN/f/bVF9Rq2N3tikYgmnozbzcPC6OZRTVVU1WNUOs0m7NvynLkhzEAkgTIy6vl//CnX1oKWczaoDrWsKDpCAO3CKmiEFV6kXpzacIN//HPvu/vPHQgzXTkDdUiAvBHz58/uzKwvOEE0OilYcFlIU7F8Hff/+TRpsf3vv1tq62ZDnLdymv5vQYPuRP4xUeO7s9ZxBplzMXnEESEonHd8KlXX52DyetXq5KOEcPPTXf/swcf2C+Mg02zGmZQAh7MTJyJN8kDBY4Z4KLCFf1O92uLN/7k8tz1pAtwV+92BcScJOELRJrSQAENYmA0sdjOvL8L+/8HMAASBHzJ+K8+/eKJG8GaO6M5WtKZcsrEVvLqPCiiYBCxZuiP9rTjP/u5p/7W/ftyM/eG05yUFr3arz974cZme0azghLEK9XgKx1cf/ro7o8cnLY3LB7whkrIMRXCSDMnvDWlKjN7X6/xM8f2Tg3WKS7RBep8GLPAonfyWvnM4kb1hk1Lbl0mH5vs/Z1HHzraaVZhUOZxyFgSJRgpzkSiabQg3ohEUqtQrLVn/uLK4p8ubla4m8WAA+qaZINAkFpYwxhF4AirM4gzaYrtKIx3gxovP4iFbyD/l2fPffXEOentUFeIOIEIHMxR6VSdRmfqNGZa51pLqBz43ne+5133H45bW9zeuNkI/NmJC3MrG5K3wZz0SLI+9ea+idbPvOfB7lt++sRYDzRNOsdXwFvKoMiW4SePHDzaa3O4LlAH5tDcDMwGrvjKhasLN5ERr38dKRCARyfaj03vbihUo8m4+Ug1SU0qIVQiqCQBZ0LfXBP356fPPDsq8a12UG9ddLFfx1E0oyipSTMIBqOqEYwCWuxQdrW7vGMs9A/gDWCm5B+du/7v//Jr1p6onVcRUAhHc87SXCnJIERAyUgJkFqdfOn50//iU88+s7w5TBD2rY1n3z5YIJ9fG33ypbOa5QyqEEMuUjCXtpUff8dD75jpvGUqxq3Nnm6tO9s4DnbYu5957IGdUudWijEPlqkpMSqyk0srz83dsG9LFW7pHJoRWCS/stH/g+dPv3jhVXNCo6h6Rabqo5qFKFFpXgWQSCFdBoGaNhs3iP/wyumTehdCQAADLvYHw1gHWkxY7TS7hEFNxNVUhHLGuSOtFn7UOMEJ7fPyRvidz72wytbQtWr6qOYBCkRpcIkFY8JIGh1I1UQ0zeYHg8+9cOXMqUsfffLBjz5+7PHpRveW19A4JUo3jJGfOHnp6kh9u2E1QDGKQ3RxcKCT/dz9e3qA4q12oW3rAtrSnCDeYjWXepods4/tnDi+d/rzcyujVpZ+cxAMnBeXf+bslffvmp31YltzgC0vM9bkDeDicPTlS9dfmLtxOVZr7UaVF5l4F51TGMyoaYwuZlCYCMcIKoKsvOt3WqfW1v706o19B3Z27wAplJ68klc3N4dRo1C34CtphucgKgbGHOFIt7d76+P8qFAizSCwVcW//fzxM/MDtiZL87WqEyKm3TTWYKI5KCAuCk2MTszgIZI7kc6VavDvv/bq5166/K4ju37qqSPv3DvVAjIASc0PEPLVYfzq2QX1rUohVFU1MhPNy42PPnL4gU7jTiBhvC0Gbg6n7qSTYsAs8FNH9p+eX7lsGjJEJQQ13aDovLqx9sVrq3/rwPSWe4yBHJLXgOfWNr52+erJpbXV4DWfGHYxyhXBuxqZgVR1DIQZM3U0Z1AiJUUUqgkiWbls0Ol98fK1Y93Wz0x28jtDyylwtT+o07FgSXIvJqMEUkKsxccOwmPT023grigD+R+oxif/9JVLf/Xiec13RM0A54U0JaIhycSS9M6cwBxBySpVEzqSpp6i0TRHlWeXy/Lic+e/eHrusaN73v/AgfcemX04FwI03QT/7MzcpbklnZiGWtTanBcRCf37OvlPP3zoDjWZoqqp8m608G5eAs7s6Ynec3v3/tGl+XKyU9NEYWZ9k2vOffbS3Hv2Te0lSFTgy8P6G0trX19YOLm2sRBVWhOu2UR0FkNeqlcPExMLUicFQ4nw8NFQu+AIATw0uXx4whkrl634+MlXzz/4xCMPeXnrn4q8qrpQVuYzjsXlLHFExYykAyXUuzI53Mky3B1+gv/BEbTCC2vl73/hlQHakMKMQphGcszwShdmNFVK01OroWpZNFqVJV00C6binNKimhTt6FtX63jt5MKXT165f2f3fffv/sgDh/bPti8pPv31lwNzK2OAOp85mMUqj8MPPnTwoU4Td4YINlMzU1UXTWkidoehkMZpOfCThw8cn1s+X1auaGFkFKudXy2Kr62u/dGN1Q/unrqy3n/+8rXn55Yul6FftGJzwlpZNNRqIlEMWSCg6hQ+ZmGYjUJUs6I7sDqIgEFAr+NkHaCLJmA01o3m+c3lT124ev+xg+4OLoH5Ol4v6yAFSSa7nfGVaWbRO2tV9cE8u6/I8aNjlJ02x0bkv/nkN84tlNae1ZSeptzQbNzMgwMIBxUN5er9u3rdTvHS2avImpoVRgYQzFTHPwDnFOKa+SCMnp/fOHVt6U+fO3/s0C7JcHWjVt+GiJoiQBhzFzpW//iDB3EH2b/hpjD4GAidSI+qqgkZdwdBYIaHOv6pXdPnr1wV1zSDVSFkFopiqVH8yZmL37hy7dzq6lIVrdmrG00yy+hcpYYQRGOGWhgVLYNnxcH6rMVH9+wzc89cma96E6VIDhWTMZ/NZNwdMjNITQ6b3S9eW3x4avrjM523Nh5U4PowLEQNhY9myf3DYEZTRHEuA9r98tjM1GxKkPijIY2YfCT+9MTlL5+5HIvdtTmD6RaUxpj085k0xB3M2XAam7/50fc/sXfy8y/Ofur46XOLN4bmpTER4SJz0qDqCTgzVWae+cywri+V9eXTN5xVPu+N6OAMcIgiQleXH3zq2H2TTaoaqXYXDKuZyJH2Ftugt6vYJgxILvLUfXs+uXBjqawyaQpiTgkxMu9crgZXButlsxXbjahO6DMjYoLcR4OpOaWK1UV/1EX5wEz7x/bu/fDszgVFub727HCDnS6DmndRhAYX4YFAUyENGlGysdzQ/3TxwoGpRx4W+Z6yxPQf94FXVzf6zgfvI8aK25oAGQpvQAhT4Ltmd+COufA/MAFgBiHPbpT/4QvPrpuPicuCeizlynEn10CaCMWH0Cj7//Bj7/ilvZNQPfb4oR8/duAvT1351PFzJy4toZhgu6suSWzYlmK/qamQvlmQrQhf1xYzjZkVKpnlAmnSPbBvdhS150ReS9TCbUbZb+yJyC0UdFRNtklvwXL05qT6Jiwo3X9KWYBtWNnqNsOGaQwNmITQksKM0bcka3q1rGaEwsWIOHAxWRaLOjdio9zcEat3zMy8/8COd+yaOEbCbI/wVx95YPn4K3P94cgXA0Hw4oxZNELhJTgRMxcRVPqN1unR/KeuXb5v38HCvoc9SiAAN4BLiwt9WE2aqYwHJggwCmiqdX1ocvJwq3EXN9i9fwPYOvjbX3vpuUurvrPf1WYIJkzq+RCoSICQcKaFxWK08mOHe7/yzvsczETM7L6m3PfUwY89dPBPv3nmi8+ffHltpe/b3rcsawVmdSKcxjop9Y8sRsmLXFyss1ocJBrUYcT8dz/zwrOzjaO7J++b6RyZmZ7utaYd2rd/xd+CPv4OffFxr080UlyIUTR6jy2zgO/ksJv0cG7/Zze3fEqageWhXt7ov7y0fGlt9fTK+py5RnOyqi06mkXGkASyxiYdMTqRKgT4TMyrRdPKDwYH4J+Ybr/vwNEP7JrYu4U5BUmzdzWLX33gyH987oULvencmlZBnUapYSAyVRdpIsEzbMDKxvTnLyw/1d39oV6RvflugUGIU6PRyaqqigZi9OINrBkjjeoFIlq34vDxqX0Td9U4z9/7JPdTq4PPfONMzKdpeWamdQ2XHOe2fLbyRlTmYr7e3JWXf+/H3z8hHMMUxnx2O9zgP/3A/T/15KFPn7n0iW+cubaw0B82staEZA0zCkVcQzXQA4hRY0ZzQeHEHJRWOn/NGteulV++erGVo51xZys/tmv6gV1Teyaah3rd2WbhSZ+cV7b+9N9pApA5KVym9DHzmQAaHJzQuTHJ77WkeCZsDBNCpgZqYL2q50blcn90aWX93OrGxY1yJXBoHDkinyTER4iXCIM4IBLioplK7YWEUukdQmiMgquGUy0+vnfqJw7sfUevfWhccNI4nowY2TL8+FRv7uCeazdWgSZcPohldIEiajAVFQs0SAzmzHfmNPzF1YUHe/v3vLntn5xKavDFhaUrxrzRjTGIQQ3JAMqZE5PCqlnaA9MT2RhD+8N+A6SnVwGf/MqJG4vDrDsNSkj9CsBQKOAt5GAVRZkViO16/Td++l3v3DV5+wkx5gQaALu/lR958tjfePDIX52d+8rJC8cvX1sdWu0aWXNCtTB4idpkDYGKpWLX0dFgUWtnbObKTqVY1Xh9U19YWXGvXOvmmGrJdCuf7jVn2+2pvD3RbvU6rW672FFIIZI7+iSg6cQD8E0vDYJqIRgKl5E5suYy2XUsgEWgNquDVRGDSm+U1cpwtNYfrg3LxTKsV+XGcLBeVxuhrsQHn4esQKMI9MmKxiIEdCYiFqmAMcnOgkEdNDpU9aDfifHBRveJ/XvesX/6WK+5D2ja1tHK1xA4jehRPnbs6IsbJ06OBlXmyYLGCAsEzLwqjEHFiQsh1J3G129c+9Lu3t+e6r3ZeTn5qtqZ5XW4BqITKMxEjYQJICYx+HJwbGpyV7PAHcsh/oAEgJmQx69t/MmXT5ibsOCZwZyQwQHBttTKogqkkXn0l993bPbXn9pPs28/IW4SD73Z4YY7/NiBjz924MLSxh9//aUXL964PlhZqbx0ZgWSKw2IIppa0WOhdDceNATxdGBemjFvkTqIo/n1IVeGcnWd0TLm3kkmlonmHu1G1m3mnUaj02o1i7zVbb+0tFn6LEZLXioq8M3WyZX6X5++zlF/VOv6oFwfDNcGw2Gto8hKtYZESjAzeCOZZyh60vIqiDAzYwxeAErURK3ZcqIkAKpAhWoKrTqhmsBob6d496F9H9i984iTHTczitfB1qSL9n4nv3DfgcvPn1itc83bRF4jKEwsUJN4toMKaJuFXG5kn754+R2Tjxz9bir+N8vfV0aji5uVFlMhqHMStfYUJiIYo0Pd0+q9u48euNvbzN+7XEdwDfi9Z06ujoSNiUyyqBZFx61Pi0aNSSsplq4e7W7iH3zs3QW/C0LZxgm37SZ3z3Tf/dMfeLlffe3ayudennvu/DyyblCXfKpBAxlTo15E4aAUpyFWpuocTVVTWp+1LetAnEAtVjVsmAwj1WwjcjMINh0GEKtcaXnT8kmN5jNHWlVH+vz0Wv/UjUsOMGvCEoy1qQRyCWZGmggEdKJqIqIGRqNCknUNLUqtlqtzEAMt2QpLEj0UiY4R2gjVgZb79Ucfe/dUex+QAX6s8PndzCZIAh+e7n1l1/Ti0uYmvPrcRGiBBpgoGc1TjR59jXWn98r6+pcWVg/snMrfhKJWCTy/uLIIBlDo1SpLGjaQYAqY1KP7Oo13TbTc3ev/3Ns3gCESp9ZGz526VLmuYyEG56ymqWQwcxZMNZIxIneWD1Z+8SPveWS6sO92P27dBOMz0ps92c53Htt1YaH/9ZfPotOsfAaTjCJQMkarxTvxGdSiorTIzEQVofZiNDOFSR7p1ZJthhKE8wpGQHJnIiLixJGIGAFO4B0JxBCDd0UIBsmtNa1RBflrYXMRhGk01DAzDeKEzBkpyAwSogEy/hodHKMX9RY0BDFCnEkWDIxwAkMlo3Cs2zp2S+6ObwZUnC6BLvlzxw6/tPTSeqg2s4xgDgpUaRHOIN4hxjLzPoCLkn9xfunHdkwe+W5fhwIXQjhxY7EqCpeJRo1QSpJJpyITq7Nq+OT+g3tugzPdrSX3rH9jBP7imyevLKwja6qZQGlRoNGoJsmHJ5rA5eXm2tHZ4uOPH8i/rYjEdxNnNaGaLVV2+vSFjDlVaos1Y3B15DCX0Y4iTNQr+cZcNpzPwrILQ9bBRaNRk7QiBDE6DT6W0EqJIKiBmojCSixQo1hNraAIzsVMIhmTZ67TaDBIFISM8KZRNd4+F0gkQC/iiAzIDKIq4wGgQJ1Eh5JSiS+rrL/UW13csb5+n4Y9CI1YiUVn1ghoBIrL18v64tyC3SZT/j1IeMIey7OPHD7QqQdOFGZiFFCFKkJSTQlklWbK2GidWF//0uLyWKb7DfrcwKmllcWy1szZ+LGle0UCHOBkWO7L8ydmp5t31R/yHr4BDEZe7Feff/ZU5VtwDqrRIqIaTJGJkZq+Elqo2qh+7SPvfqjjTe17jegkoX5yfvnijVXLphGzXIcsHELt6s0nj+7/jY+8Y31+8dLcjfPLyxdX1hbXqqpCBWd507JGdBm8hxPCSHXwGkWci2oiEJGxl7Cm92XB+wihKUwRlSYwVQRzYs45ox+T2giKkYDXqIBD8hQQZ9Hovcucxhp13Qi1qyupy7b3E22/v9c+1u48Od2d3rvz+c313/36iVEWzGWo4dRFa49cfXJxPR7c6b/HzZTmfh3go3tnvj5/fX1zVZsToqZilvyuxxRUZEYXoE4GRf7M9Rsf3jF9mN/5tdJxNWf24vzSiI6EWSQcYAKEEMiCIfRG5bsP7Xwoy+9u+Xsvp0BG8HMnrs+tad7eUSlEkLaFAd4UoNGpkTFKufLeh/b95GOH8Sa1Sb6TcdiJy/MbKtZoWnRN+FCVglGz6j99eNdPdUW6O3Fs50a0U8PRjfX+mStLL5+/fHllsBbqfu3L4FQIR+/FucKxAaEAJiIuCbGMiX5mGoCISIM3ShRENSI6TaDfqBqh9C7JRCTtfU8hVWO0oDZSMzUMvLduhobVLQn7d7Qe2nfs0ExvZyM/0Gzsc8gAAJnv/lW7WCtDdFo7oZKWRd88ubh8flTf38i+1+M0Pa77HH/qvgNzx08tuapMHi1KwhzqLe9t84gGY1FcHPZPDKq9rSLH68UAXx2MXl4bWLMzdqQhnIkhFuKiaV6XRzL50O6dk9/Ve+OHJgBIbJp989Rcwr1JchdK+H6Y10iD0kVQtGxL9dPvuX+ne6vDEZHFKp44e0GarsotBqnVU9VXg+msdf/OKQ+YGokJx/d2mug0+3tnR+99cGkQzy6vXd3oL/WrlWG5stFf3dhcG2xs1GsRDHTqnIoHxcSN35laVosI1MHoDMlXQEWVCilBqIlKFCgc4QXUKBbEqtyx5d1MpzHRak92JqbajdlOsbvbOtprTjjJgAawxRCxaHDAMS/3T01cfPU62ByJRJiPIXosDPvPLS4d2b/bfY8RkJCnXdh7Jnvf6E19aWM46nolvYEKMoJQOhU4BKfqxa2pHJ+ff/rIwfzbDu9Ug60DX7g0v+hdQCZGFYVJMkGgWNDYqMrHd0092tiyKfihD4DEejm50P/muavIp6JSEBVQigHeamdKSm0R4uNw/b0P7/rIg3vUVL53iFqKmZPXN64trrvOTESMPoRIR49g+/fPPrajnaaUdlvC2gba5EzLPdCaBqYBBKBSLIzKhapareLyxmhlbWN5o78wHPXrGIxV0DrGaAha3CjDmollzhQmpgRjnAB2Zi5HdBJy7wvn2o2sV2QzjXyy05zsNHutvJtJN8/3ZFlb6L7FjmWL1pPqe0fA4IEnZ2eeOXU1BtSOEAhqFdukfP3q1Y/v2z39vW+pNBu7T/ATh/ecOH5yI2SWF4m9DgSAYk4B0LwZooW8OLGydn1/fTTLvuW1UvL54vrmy0uLVXsyWk5VgYEKA9Vo1lDd6e3H985M39Xp7z0dAIRF8DPPnlweAZ2mhRIWlS6I96Y5AumCOHERqt1G/M8/8vheYbS3OGiLwEvXlld1ItgUY2xa0BBrMmf91P2zU1ukI942TbDb06eth+iFh1rFoeTduRPAbgAVMALUEIKFGOqgK1nxb7788idO3HDdFkONIpYSbVQ+/dD+33znsf0aMgcvLvP0QAHkr184pvejtyGR+Nok0gOPTHUbuQytDuqEVAs+NkpOX9oM68Mw3XorJnNG5MBPznae3dG6sToYZh0ozdfG4OCdigZzAhHWZjHLr6xufHVh/ejeGd52CaTXHQB/NX/9ilhAXlG8Wh6hrJSiJk1jsbn89H173tMZK7O/HftN7jXsA8nrm+Wzpy7RN+qoMHO8hf8y0OgMzoFSbbzj2IEHD+363pP/W7nWADh9bbE2xqS8pzHz3ptOtYr3PXLEvlPeObaTGSPRaGO3u1u65zeVTnJDD5gkZjPubmQHOvkTBaYLE4xqqzSziOCszsNw2oaPFDjU8Htzv9NzCugC+RZW9OYvHFMpSUvuKeltvL4510QuR/buGg02NQ3d4OoAy5rrdTy1ug5AvncYamqJtoD3H9q/24kvR4RaDN4clRFRqZKuRXOBrvbZyYWFG2rfws038vn+6IXrK9E3o6ohGCLNBDDCeXC0eTD3H9w1m7092f+9GACpX/bc5eXrKwP6RvqOo0Y35gRBITWgzjlIK65/5LEDM0wmjG+NZsC1Qbg4v6QiCoUpxKkQ1ej+PbsOtwv/JrrOt/zhCJJyS8SPWwIQY62bhPn3NJ8LG1kQiWAurhVCs6onATPV26BE4yr4tl94ux3dm9mmk8Qje6ZzU2gIQaOxNguw5Xp0an0Db5mLTMLs/onefUXRHPWFUYwuCFQiVakxGXmpG1WRzfzi2sK1Yf9bZJc2gE+cn1uwgr7jHJwFihoFJmZKlM168/27Zt5dOP/2CbLfc3MAMgDfODW3ODR1eVLC4NgVIVkLjUW8rSwf2tP7uQf25mNezPf+UmoAjl9fuLK0XJN1HQhoNANaYo/u3bkLb0mz7fXCY2vXOieFsAFtm3brWKz2u2Wcbrb1NgeuN7PFb2ZD+ob+Gge6rdlGFuvSwGiIhirqQNzp9bX1tyxsAQA4THzkwN5pDR6VMzjLoTSoMZqhjqjhzflRWYoX3o4iNyP5zFr/xY3hZtEJ5oPWQiUQKRHOETLsH2nlP3lgZ+tuj37v3RogqRFeGca/evEcGhNVpJqJJCMjiKmS4+YP4UL50YcP7Gxlpibfu0akAaRtgi9eWVwaVrElMcbMewrMQsvC/Ttbd7ftcPP3+HLUHKxM+nySbvdE+9jjhw5MZE/unpY3/U3bltEYzSjyej+UhGR3thsHep3Li5uagxARRpJ5cXJp5fywerJVvIUPeVNh9wM7Jz/Xa6zEIdgxE4OpBcIUkoaA1MjB8OH9e442W2nfp1dbhv3F1fkFY8wbqjGBxxNDA8KGYaKqP3j00P25s7eh93+vFsFmIL9+4uLl5VHo9EKMFIlRU6U3JuKREPMWZhp870P32Z0woykrZicuzQffVBVAtQ7eC0I52ZRHZ+6W7MBrrOAE+MBsVx498MD+w4dmZw518953U7m320SEUoykTCjNCTYrXViYF9jBvXu/ZZ8kX7ODgv3dori+PNRI4bimctlKsEsrwydab5Hin35gn+CpXdMvX7w8yjoBYknCRy0YSzNFzAbr+7P8Awf2t7eoqzBU5CcX155bWq1bkxEhSgQk0SxNSFo+GB5rtn5s1w73dmb/91YAJPhDBX7hxJVSM5gzU0RVqBJp6G9ANHMClBsPHug9uLPHt/p80rGyuFFdvLEK34xqoJmpRWNd7tzp9k61cbf7bqlS/9DDD3zo4Qde65IE8Du81K1GkxnGJz0BLCpurJTn5pdfvjx/+eL1i6de+Nh7Hv7f/freb3nDiSzfBB6fmfrzU1cGoTQnQqOYmdQuP7m8+rF9ky2+xThPcN3HZidnLly6FkPwMYpRQUqEqJjoaLIefOTYfY81tgwYDKCdC/qZ81cWfaGkWogJQ6cQEUfNtZ6qq48dPXLUC8ze5v1/79wABlDO9MP5uc06sUNigNCImLyck4M1KTHk1fp7Hn6g45OSkrwlqKmV4MXl0cYgwvcA71Ij3UxC+fDefR2BKd4OW1Czm1DlrWEvv1XxE2ZjYzMyAo7ciDh5ef6FK5sXry+eu7YwvxmXRhwGKRh6jT2PPfyoEFHNfct2IQg8MDs5KbZswaDE2NgiQs6srQ9ujc/eUhMNeLTdOtbpzG+UluVGTTRemGSC5mjz4Ub+8T2z01tNzAi7Af7Z1fkTm8N+d9IZCFVJakXeLBYWOqP1p6Z7P7lrKnvbWp/35A2QGqAr65durIvLLdakAM4oKiQUGkl1PrNytGui+eOPHthSrHzrSfn1heWysui8GWEKAEFz2jvvvy+ph8vbUud/W8/+Vk6f6P0EWQJXh+HiQv/cjZXzl+dePX/jwpXrS0NKo82sUbmmNSekKDKUhS/27dsH4PXOgtnCH5jqXRhEdQAUSePNZL4qr9RxNnNvXY7F0CM+uHvvl5dfRSNuNbCE5nwYzYTwMw8dO+YkDS5oKMmvbow+e/7qerNVU5ROIDAlEU0zWh6Gs/XwZ488NPk217736CDs1Strq4Mq6/ViQvyrmWTQcYJkyVloOHjkif1HJlu8s/KIwLX5xTo6odfUgTWo1hPtbNdsD7eNv94WoRcba0LIa3J69IELN1afPz//0qtXX7owt9zXlWHcLClZw2e73ETmhHTOK2NVOYtWrh041Nk1XXxHMktqhu4U3r9n5+dOnte8STMBoTS4pXpwdTB4aqL71kFmBIEHd0zt6nbWY01JR4mIMRuV79i764M7prNbFiR2XfmlV69fVqmy3CCBTiDOamMQwqyW0eb7D+77QKfF79eW8/cK/UW4AXzt1MWRiId3qMU0gqomVIGZUSRDNeqE9acOztz5i46AC+vlSAohCiuNGlnEOs5ONDoNfxeEt79T4TE+5nkrAQKwWMary+WVuYUT15dfnO9fvXp9YWm1MoesqS5H5puZ93QwC7BSo0NNOEcPRSg3H9yzY1K+C1LgQK81abqqSnqYRsDTDWu3OCwx0b3DT7Uj57t7/vL8jaGfcZrXlDwOHszt1w7uObRlzgezdfIvFja+dmOjbkwjZOo1MmYwHyOgwbvW+ujBrPNLBw/K2wP7uddvgGsD/ebpi2y0K0NjLB5OkGk6JC6Pql7jVMOe2L8jEWDlDmxVVzfra+tDbTSEdIgGjUAMoz2Tsw0vd3HTpzqXAEXStq+AfsD8wsqZuaUXL668dO7ylZV+v9YSxci80Gft/arEWKAWElVVk1SICRXqLKpCTVEOHjy8y43dMl93TbcbM5nfVIVzkQTNw2ng0mZ9J5GefnAWeLCdTxsXIIDSwlTo/8LD972/nd+My0B+oyw/cerMSt7UrBCYwGgUqIJUYV1OVOVPHXvggBP7Pu46f+8UAJcuLfSHMSsKwAnieMxvJpI0EUxNEav9e2f375q4k/5Yai3Pzc8vLS9njX2KXLWmVc5CrtWhydauO4Ne2VapO4ZLbLV4luvw0vXBi69eOXtlbn5hfW5xdXljVFqGvI2sHfNMFIVBxEeDRjU6JUloJkFNdUxYp4mpqYuhHu2f7j1wcNcbbOJ03xxsNVpFLlUwB9IJNRHeFlfWauzJvisl8ruVwkd27tp1cX21DGhAVleePnjgJ3ZN3mrhm10nP39+bm4wkqleqYPMsaDEwKCA8451Z2PtPbtm3rF7Iv8+Hv/3zA1gBvL0lfmIjMwcHdWZKcYYG4MwmmVeqvX1R48+vidzd6bPbABfWtgY1iLtJhUZxKoyDjab9eb+iW62FSTfq19Lcr2gyHgKBSyOcH5l/cKNxbMXFp95/pWTc2tlFJL0OfOGa+w0KSK8wql5h2BaQw0i5pxtwTsTHd9ETJxXythlNdSjtUceOfjgRPsN9kz6EFNFNtXIXFnqFnhJYT4rbqxuXKvrg1l2h5YlDzWL+7q968tr0TaOTWR/98iePUm8EDCzmvzq0sqX5hbKZndEtUxBoKZoLpIZyXJ0hPaz9+3dfbNF/aMTAKkAqIFzC4M6OmO2ZUArICUpA4AmLoZhO+cDR3be4VMSEQMuzy1LqBvlGqq6LYPpth0+svPxw+96+ti+NCZ78yd98ja8KaxQKy4ur7/46vzXT54/c21tbnFzfm20PqrzRquRTbUaea0GEWRZjNQQ0zbNCTimlhRBKAiTRDChUaiUOsEI1BlAhJYLj9436/nd9ErNcnJXp+lXR2ELORWpnlzeHK6U8WCWveVTN00bGsBTOyZPXL0008GvPfzgA4VPX1CyITxTln929vx63q6zIlgUGqJSM5PMSIz6k+Xgx4/tf1ez0bHvU/PnXroBDCCHlc4trptrmjKpwStdGnuKSK0QJ1pWe2bbD+6evfP5YF2HcvHqk7Nu94HJg5Otx/f1jh3aM9VgA2M61ev9+i3UpwrBcc8SAAbAjaX+2auLz18fnDp76ZVTZ5bWRzGR5V2DWa/dyKPBGMoQ6byaWV1DBAZhdFQqQiSyPF0+QmEwARLbEhizPUVooDgvGEy15YkDO/AmxuE5sLPZ8BrDFpZaAQUGESuDgM6dZR0EgSNTjSMcPX3ooQ/1eukjpHlLDf7x+etnRyE0e6T3ZlojUwqyUg2+7tWb75vt/c39u3tm3+fdf4+kQAbw4uZwYXUAl40FycbOcYRG0IROnHMOe2e6h6bad+FjO/k//OpP+bxotZo5X1uxftt3YDePet5EQQuAyrC+MXjpev+br7z6zVMXbyyuL5eyVLmgsdGYkUlPVZ/wLWaw4MxAqhM1TVcGYCLUWKuWTgTReaN5F8xMxDnnSI0KUIX1uAoQOg+q17i7lx3bMfHG7PYku5ABh3td0RrjkSxMAHUq2dygDOj4O/Z7va+Qf/SBdxydnpGbxAkzkH9+eeULlxaHE1MwMMY8uV8bFCIZfNXfo8NfPPLgHhEz8Pu++fy9kf/jxvrG/Fpf8h2K9AdMBKBQhVRxZvCwg7Pdtr8LaaKIzE5N3hTsV0sdGt4Ow7REhoRRbkEuSuDy0ujc+YsvXl5+9fKN0xevz60MRppL1qbv0DnJUAhVra6VgBMBdAsZjQgZe0ImVd4YlZaOe5BeAK2iCjNXW4iQWsX7DERpEc45M41RxJP0IT5+aPeejv/ueAGSwK6JTg4bqKYhhAoUUpmb3xxEzNz5Puh4f//0zLdAPo8Phn9w/uJa0anV00ZimcARpFhgbMVyYjT4+QeOfqjbtu9v6n/PtUEXlsuNfmk5YDqWe0h6fmYwpYiI0OzQZKe4gwbodzCrI0lxvFXI2i3RFKatPzKcXx6urK++9NLFz3z91IXr/Y1+vwwxqCBv5O1JyfLaADFvda5RgwHinTM6tSTenkoaG8t8gjQCJs6rIVgwwoBatOZoZBbVZY1mu9F0gbEMtLEYqjOQGmi59zKoP/jgkexNPI20rXoN3ynypRBMMhABpkCgWxmU8a52824C+M4afu/cxVOjQexOimpMhlVjhFOdoWoPNj+8c/bnD+wu/jqSn3smAAgAV+ZWajVLUsYmRrEkZ5wA71SIz73snpm8u5CEW/vezJG31xaLQ33p5MVnzl45dWXhwvzSuYvXRmXMGj01VzQmLHcCcd6HqBorOhFPM4sQE28UOIlJ7QEmY3MumDdJ1sDRAAumkYi0UV2rWPDqJrLuzh3NiV5vYrph+Y2zlzevrTTAJn0slYzIRL2rYtw10Xvq4Oyb/7yZ95O97rmFkkXLgGiq5iO4OQqVoiW8W4807fB18hNnr3xt7saoOwmroRYzwMSrQGKUKrfB3ox/8+j+A8Bf1+6/JwIg1W9XbizW5hDUEzQTYURNRzjAezJ6GxQop6e7d6XmSICz2+BoCSSG1Y3B1fXy5OWVZ77+wvNnLl1fHvTrODAG33DNna6dm9WOVpkJTEhVRYiF91TGUYDzQ+8dxMxEk71tiitLBbOK1KZGNY8q1EFVGplrZdJsTsxO9nZPFZNN32hkWaPaKBfPz6+trmRRBdFMM3EGBHMUxv7aI4/tnZ5sv3k8eEc4VTRjGEgDUDAywkrqRl1V4fXYx2+R1leRn72x+udnL6y1uiWyLKYyXqhUAIyFlpNV/xcefeKJVv7XlfzcEwGQpJH6hnMLq9EXzhyjOdDBBKpkgETPgqEdN7pY35FAL3ew701NCBG5+dA3FGcvLb5w4vSL565cnFu7tGhLaxuRlLwwP2G5K+gKpRoYEIVqKbMnTQGKY4hBIM5lKiQNFj0g0RL+WQVKBCCqAqyFlY9ouMlduydnJopuUzqFdYu6kIA4DDEn+2vrm5eXuV5av8rUq9VwjIiZuajCqD1sPrq30ZQ3NbBLBeksOekzs1hqcIbMECUOJazFUCMC7s73YTK1VvKLm9W/feHlCz6r2ZTaiQmcilLU1FkOba+vPb1/98/MTBZ/rcf/vVIDrNW2OiidyzVGwNQ5g8KhNgWFIQyHy624evRI91Cefa9ZqW3pv45PekcAN1Y3Ll5ffPHV+ZPnrrxy/trF+c3NCsEcfSGZd+2Oo6iZGRhJMxoyI4Fookx1iigRE0Ml9xFWaqSOs344MbKGRbHStFL1jaLV67qJZqvbmtw13ZmZcA3vchcsjKwuabWYBmu6ot4cLc/Nt4IrNwesFaYkTSFizqJo0KpqZfbEwZ03B71vcrVaGawOofbmBQaBqVVVdb2q9uVN3qV8di7oHzx34kqpodWQ2jw0SKwRncEzEwt5NTzWnfz4/ccmvr9D33syAAwgygqhDBkcneaIamU52PCITap3tmuq+94nj334odl37pnsFMV3HQLYTRN2M+duMQbXo164tvylr73y1VeuXrx85cbS6sZgFJmbK5g1s3aXzAwWUSNGMyXgnU9zIyPj+HX9WOmSAjPnXLQY60AnBjgzbxpMR2rBs8oQG661Y2rnvl29HVN5uyHtwhXexIaxVimNFmlIJELVluSj5eHytQVXma+5vj7wRlEToanBYtQAROGo09BDe3Z9r/OQXu6cxSScRTWaRGO/qjfrCrhT4c3UsVghf/v4q99YWOt3ehp9w0wYarFIE1JFpQ4T0J956NhTmZO/ztznXroBhoNhYfUEtRoNw3Cj1ZCHdk8e2rXjHYd3Pnz/oSN7pg62v3uKmvABIlvoYhLg2jCev3Ltm2fnz1+69vzJc2cvXl3oZyP1eZYVxaS0xAvEeZDlaOR8dM4ZDKQDKBLqCBEjNDkPA5mSllo4BiE4Jq+oxRhjyVi52JrsNqa6vZnJxnS3Mdtz3ZY0syhWw6KLhoqq9IywABPnxJhTCvhqveovrMtIW9qwUcVaPcatqATWFiG0DsOVR+8/cKDn33w2mLb2pPMtYEQoLYACCZRBjIM63M7/fL04sDdCHAFqQfj752989sqNtaIXXYsaIzVSDZRodBItWj3aM9N7qNfO7swe/IemBjCCKPtd3Sxa7V07dzz10DsfPjr92N4du7qN/LXmuiBv1/+5OZ5KWEuRpJGDfrD59XDu3IUvP/PN46fnLl9bWl4f1ciUmWRTWVvyzJmqJGlCpZkBWkhmgaaKXNRMVT1AUpMHvUBpBvOyNeF0CDGUFqKDZI5emq1ub8+0HJjpTU9kzcIySuYDYmmqcYBoAGpAhB7mzAFQwkEYrIlM14drVxdjqS1pNJiPyqHW0YwRClABM9am9GAcvfuJBwGoqmypLdgtWMZ3TgUd2HauAUeziuY8RamQYUA/RDOT9DAB2cKWpiHa7Qoi9np3jhmFn72+8gcvvXLVt4MvsghaDC5GMFOfmTPVSFPTctAX+2vPfe6NAEgb+uF9M//Xf/g3W9M7Du9ud24906SKMu7T3Nz6Zkgy3LKFOUv36KtzyxcuXPjm6bnjZ9fPX7l+Y2lpWAaId0WBdhfj3S60odQDYQajQRLKWilpvhsQNdTeeydUVVIcqUmyz2gikXUUjGKoLGbdZmtmupjqtaYnWlOdot3SVj7IUSEOoUajBJJQFagzCs2RNLMQTUgRJxJHseUa9Wa9enkxVNHBO3M5pF9WFpWSmVnYOuoDnNXDHROdRw/N4NusKd8oHUrPqdVwecOLRJqmshdSqVuhWyInyGxLLS+RxG7+RVr1Fk7kO7b/nxvUv/3NU1drVJ08M8k0GIPSAM+QOYO6EEXMOKrKOkZ4j3sgCu6JFIgi733k8G1laxqF3ZI7sS0ircGc0FEARLXLS/0zl5dOnjr3/InzJ87fuHr1uro8+Bac81nXFV4hFUzNUgQZ4NgwyyPS31qI0UDxiBgZjXSZOdYxjYuNZqJKVDGqgd5rO3PdRm+y29sx05mdyCfaWvjKaUUdUWml1Mm1RWwLdWOEOjEzAUkxVYpXCEysQuGLMIjLl2/YoG7kzRjVQWIZhpsDR4GkmeBNJIZUg+HhgzuOzkze7CCnXXRmbXB6cU0TrE1uo+AQyY57JP7M5ij43EsujnVdZsGEYq544fq6VnChKmg5OCCbNCWiuDbpARJ1iFHc5LD/5K6ZnRPd22deJM/W9f90/NT5CmhNZHAiUbUWSbLpAkXUdJCJiasRh6r3yATW30OiiK8liZshoX5FkPLghLVcC/jmyyf/6vjJEyfOnblwfWFlOCydosiLbtE9YjTIAIJSowb1vrCxi/AYUxacU+GW2oKmPWYWYVFcmr05gwVBQKxQB1NpNhq93uTsdG/HNKZbfqJZNBvmGBA3aAGlwqIpKF7EgYLE4oQpxp9qy9jQFKCDkxhNjA2Xx35949I1HYR21gp1dKQjq8GgGgxy77Hla58qGwNatAf2z3YKgWlyMKPZJvm7z734mTPXYmNiXDWk0yNNnMfoDyh14LtmjqEuvGTKYFIj//LpS1+tKxohTgkhlUbSESKSiwiYaeyO1g55e+DjP3Yz6pLyyjrt90+c/ObiatWe8WCukdRAhSWHtTQNSQ6xZmoBWm8HwHfMhcxMt/rJWwkOAWz0h6cuLZ44d+mlU2efO3v1lTMXVlfXsqItLi8aXSkK7wqTbBRr0BRq0VJpq7EWZjKm/CoMcGOAJSyB2rh1CTmNOkKsWaoXaeb5ZLcz2W3OTuQTnd6O6bzTDKalC6XYyEpEOJ8EEeEhDoTCxEpnTAJGCcoK0LjVizcVGBmiijFzXjdGixeuu2FoSqHDSryDKSwONzcQgstctK0GLkCjSGxmfOehXQKoMVlJgxwonl9aW8zadF0KxTlxzoTpAtiKgUipFY1Yw3sEBi+eJuJawyDIWmSWhADGNjukQD2lIoXSrAd7evarH3zq0MyEAbLlP9snf/fMpc9dWAytnUEhYpkTVc18YUYdd+NGRhj9mN0WQ4z63erqHyUwXHpIwq2shwDQD7g0t/DNE+e+9vLlF148deX6wma/HFS18828mJ6c3ammBDXhy1FaLAGjeGctNVBlDLiEjotYgjQXBUrQAWLCoBphkRos+iKTTreYnZjctaM9M+G7TTaLkFEzbkJDHFDYMJGQrnORkCBLSWnBMK6YtwgClHERSRihpCq8RSrFWGR5WB+uXJx3m3VhmUDVGKM6J7GuhhsbDoh1IJ1BgXSx0GI91ZAn7j9wqwAwgDg9v3p5WJV5N6MmKgPHQ3YajEIb/4cZozhKRFkx0CUvQAffrCnOks2dJfCqITk1RYtGtSnRX3z/O94/27sp8Aazivzj89c+9eL51c6OqN5Dw1gbi16yCNYSDbXTCLMAuiTdHjTG+CN9A5jdUscZNy5TA6csT8/Nf/PE9XPnLr909srFa0tzN1ZHVSiaLe9baLabDTW6OBaLEyEcXUKYOUDoYrToSlBINyZkiIg4GA2g82IwWEWUFqITdgvfabYmu+3JXqfb9d2WTjThRAWlqTGowirQiXcCmFoUjLMRZTpgzYjUgiLpU1FoRqSRmNAzqgloNBUyWhOe69Xq5SVdDxkzNSbOj5lBxZWx3hx5TTLJNbyYiJmIoYz6xAMHj8w0EgUHAE1B+dLV6/2B+XaeFLRMx6IT461vgEDEI0JIj4BQe/GRzqCepgqVhggRS1oUq2lqjhWjQWW0sRvu73/4XT+zs3cTtpCMyP/02sofvHxuodGshKZqRouSnrkajOrHFIbMTE2hQKQE8l5JgL6fAXATc0Yzce6mOs7aKF65tnDm1UtfP3vp+AsnTpw5368b0RzFQzJpTHQ7PqhGvdnwTA4MTEVtHBNlBcKQgNKxci6DRqO4LEeC34iDSFANAiky3260J7utmYn2jqnGRMe8My8GVNCKSlNTpK6rS6bzNxXQhQpjSpTTZyIBjRifisnWkemQFGIM6AehjjCTTMiRLV1eGC31C1fARNNWphmUxrI/1CooXDK6T37CBjgK4+Z7n3yP47gBmgrQZeDVlc0aDY8CMcIkqVEbzajiBELaOEMLjKaxEGFtQRL0JDgnQDCIekaIqHNKMxPVBsppG/36+979Nw/0WltVBww1+bXFjd955qU5yWLeQVRSDObGST/GBq3pEIAjxauG8V2Mt1Hu+Z4KANtStMSWxnc6P4YhXr9+/cvPn/zmiydPnbt2eW51fnFzVFrRmvSNHa5QIdUYVRTUoHabw6kkcW5sKSKLGCVaVCNEvEgeM91ylK/qKgjNZ+at6DQnZ6aL2Z7vtZudlms22Mhq2kBrOIsIakgENJK6xYK5BZZLhhQ6pgeMNU625E22JE8Sb2ts4WdM0yHnxUVVZ/TmtQzzV+ar9VHD5zTaFkMFRBI72djYpKoIk9gshEZTMNSjmaY+eaB7C0NrAHl5UC0srxdZQTEgGmIy2mGqDyACl1RBlaq+WcEssKAnswCDCxnrZlQziwL1VINEFrU1Qpi00d99+r1/a//Olln65Al98fnljf/+q8evIAvFZCyjpwQEOrHENxiXEWJjR1oSFEdPsUiqQX+oAyB5OuAWEoEANio7f3X+1QsXv/bK+eMvn37+hRfX1wfONxxzn7VcMdFsNY1ZbaaxNqiBIowaSeFYkBigKILJ2EhxS3tfPR2EZrCoQ4V5V2uMTorJbqPbLrqdiV07uzPTUmSlt+AxBCJC1AghUiMIJiIUsTHtKvUxUxtqfKZyizeQEp8x0DmZOo0VNtOcmAkmNN4zlKhGQyaOJZavLI2WBy1pOKOqkWKpSKc4kzgKw/6QZrSYdokpNSLC6nJ0+EBvz8z0bQgIA9hfXJaNtR3s9kdllKBqQEJgkySCgSJeHCTPsjVFVbRCiBJh4iAqFjqhbAdA6+Ctik6FWZSiDDuEf+P97/7Z/dPtra5n+v9vrg3+h688d6pE1eoiSG6ERsmcWoSAsFQKGS0aDQLKlqwvHJkRd0935t4IgLQZ0nmZcvqU4gTg+vWFl8/Pf/aL33j+xKtzN1YWl9c2BkHZajR3tybETCliQCDVSlhFMgbjmEglzlLvEGmCtMWKNVISa54gjCGa1mpAdKITRd7r7pidbk9NuXaTrdzyPHhZtmhUGhFAJxAinfkgNXVqdKsDsuU5lFroqewzpVG2mGK4Tb3mJrcmtQXT/8CxuKIBiFr43MqwdGlxsLjZ8kWmgmgiEm++GCkmYTCs+6MmwRgBCF0qRMGgVXl4as9EM7uViJMAHt859b//6Q9XWTvazcp17GGxdXPSYHR+LvA/fuP0q8MhXAbvo6qYNWL4sWMHP7JnR7tWE0SaEWJ0ddjZbtzfy7kl7WZmgXx2o/qXX3juRD9UE7OAFwMcayMUpCPMMVk3JUMbSyxTEZpFgQjEvcYs4Ac8AFTVzJxzN3XOAJybX3nlzLnzF688d+LCCy+evnJ9WS0HG5IVvtjZyiUaYSGoguJJswjT8W8wOqTjV6G1UCguqsIJSSPFHEwgomQFRFCKzDebRbvV7razTpPTrbzVEu8CUDsGQUBQJTJvQG50ICJgoEtHu6U5M4U0KGwMMRjH3BZxDFBVjHubdhsqgGOprSTfOD71xz1ygFQrmOmgXrp6o1oatVi4SJgJndq4ZaPJKNIw3Bx6A1RFti6ZpI3HKBre9cBBnySybxv6dhvFhw/seDNf1nND/YSGwlCJaAjOk4i6uX6oue+npht8A8YqoGZCvljGf/3VF59fq2J3h9UQG2TO1cHUOTOhUsY0fnWSTv2t8YeCYjR1pt7M84clABIWpVIsr66fuzL/V9946Qtf/MrZubW1QVlXQVV83sw6e2hOFRGM4ylUZVBxJqDBtpAhHGv2QKlKG4vsmEYlSQmpsBMxehPHRtHoTbRnplozU75dSCODExUbxbo/tppOyTkFFBOENCOy8aRWbyp0Ymy5pYDjGHiU0ItjUVLjWKMnbWnb0ha6ZbjOLT49KUGjYtzAd2AOz9IWLy+MVgdNFKLprTF96KiaGMFQo8Z6MEyfXQ0wbpHno1WjqSbe9egRAN/uh5mm52/geJQiNFajqtwMmqmTDNCgphF16WOgIepYg+x2IiVv2/2nq/jf/+XXji+VobXT1OVWOVdHHYGOMYc6kjEqfaIWJEjRmNi6NZQGVR3wQxIAm/3BZ77wlXMX546fuXbq1WtnLlwfVOaKlmStRqOHHE5EiWGagyclDglJ7gbj1l9MNkRJ/wZ2s8xKiF0LGgIY6Go1ZnnW6uRT043p6U5vwjWaWbvtmo1AKxFrCwp1IJ3jVqsOMDf2XGcaTkVRvZlB25bKfZKLTcx4HTeY7OamN9MYE1xI6LZ6n7dyjTHOwkxhEAUoFCEtWg7nIxYvz48WNzPzjknyP8U2jIQqRcToKKyCDkeMUbwEMxFvJqrqXNRq8Pijh47uaHxnEdxbMCC+LuiQ6FtYj6ORilOlKgANUWM0EeU41Pg6xrWXqvr/9bUXXloZxsaUczmjikZlMBep8FAXQ4wha7TKqoT3MZ1agNHceLBAMdA0F8md+8EOgJSGPvON4//+P/3xM8fPXltcl8Zks7tzotWLcCYS1EhRHXfHzSKohBJq6swceVPQMiZdeYOmbJfi1WBmQdWcs6zwrXZ7aqYzM9vsTYZmEYrCfFZTRoBVJUjnQYqjUU1EoGljbs1gtxKccTc2pVpjjTjewhrBTDnmmNz8R8mE7zYYKg2WBky2hbweN6gSZFVEREMgXA4ntS3PzW/Or7Wk6dVFRBm3CFORvYX8iJb5bNjf0NGo4b1phJMImtEsOtROh08+ct9W//0tnp+jGKoIM6cREcEoVPPmnHPl6xACFCbkfBX/P3/13DdWQtmZBTxiLY4KAhnUIYKi2XBlZ6d16Nj+4yfPbFa1ZQXEjxly6T5I55xa5p1zHm+H/vD3LQBSm/snnv7gTzz9wRPnrnzhmyf/+JN/efyV82sba5I1fbPjxVOcAiHquAeKm9gUKoSq440JsXHGMIZEEFJrAJF3Ojv27WtOzVirU2fFyPmRZCbUqFFr8Rkl1R6mISVUEMJi2pkgkmEnLGEeJHXkkt6ugkjZEDT1mMDETRnP+McyzuMNt5XqpK6lqW0BzrYy9XSbEAZoDAJm4qS2pbkbG9fXC8tdRRqYMY7xPWpJ91eoIToTDWGwvokYnFGJAEZsQQK17jT8sUM7cGeipVqbr10hvlZEZ0rLKA00upI3vxO5WAEBL1X2L7/48jPLYb3YSYHpEC4EijBzIWeIkbEMo9ncfu3ppxaG8Rsby432VKmpsKOBRqUqKR6gIvN+yskPfArErbnUw0f3P3x0/3/xt3/i2VfO/8Xn/+rZ4ydeuji/sNL3WUuyZu6bBh/VEE1oNAijwCIsqgkpECgcoWCUZPmizjuDjvqbc5cvd/rDYmo2n57Nu43osyA0AcUBaQNBUutJjWZq6uhMTMfXTzqtaUqBE9ARomOR8q1MaJzdi3ALMPStnH2SqRufDmXehB+PcRxqQpjSi6o6Y46MI1u4dGNjca1A4dQlIYaUNW35wULHGmBaQGxU1Rt9UQZAxImlgRYcM611967ek0kD4g44VKEM0VhLFk28BSq0jrm4hvjvCE8U8tVQ/3dfOfnlhdGgvYeUqho670CFRihVMoASyh2ofv19T7x7qv0fL79K5wJiOhWcGamRMDOvZkJFzETa4zn2D3gNkO6BNPvwIh947OgHHju60R+cvXrtT750/E/+9C8u3xiWI4vIfNYUJxoq54gYVSvQOZ+pmkbNDA4WU/VH0jzVBHAG7Q9W+1ewsIz2tcbUzOy+A8XsDH1GJyEGG/dD1eK4VSqgaUzICJN0PhMQkqIgPTVSzBzHpktbE2nhrZmNqTrnLM2hUuGc6l4aHFNtLJAtxrE6L5rkoA005uZz9UtXFkYLw6Y1RQVkgMFh3L0yQCxdIwSd0RniqMagcubUiVnITIlgkqmJBL1v9/TuicYdemYNqlgWEpqZmHNVrbH2qpmOOpl8x7z/dFn+8y999cUlLZsHEDyx6Z0Ec2KWmyNRSvQy6g3XfvN9T/znh3ZvmK1tVkP15iRSHejNSC0JJZ0xKBjrwmfeyw9JFyhd0jfPDDPrtlvveODoOx44+l/9xi/85TOvfO6Zl585fvLE6Qsbo1i02kAh5oHMLMRQ0YsQGlO/WEQlI8VIM0cQjiKZSASr/nBzcHVjfiGfnOjOznZ6vanpSWkUZahLaCTNyyjWdF4FXuhJp0aFcySpzkxUJUZRk6TJaVse1ImcNx7t4mbnZwvyZeN0aVwUpPmUmnLrGLt1ZUR6kwx+8crC2vXlApk3x3EvPGl83cTRW2p3iafGQHDYH5jGcX2dpEAtvayK4MPveNQTMQEk3qp64XqgUgpWpua8QBzXVt7zyMEnpru3Z+Tp7H+5X/2LLx4/fm0Y2jOIJbSMIjVrMLgIQ67ON8JoRzn8O+957JeP7WmablCW1jYUEGNGDziT8TBP0rQ+1i7UzbyZk7B7gBF8dyfBknotNp6IdRr5Lzz91C88/dT88sYXXzr3e3/451/9xiurm/1qJEWj6xsioqnjGOGEjibOSKHdVBfbGhBJ1NwhE2dW1wvzGws3Bnm22Ch6szt6u3YUrZY28wqSC4JFowQDghnhKBZBUROaBiCq0GzLtUqTWg8BNUA5PsRh0NQr4pbv1hZVAWrGNB5OM2IiqQMJhXQqLS0W5xbWri83mLtAt9XbVaTE37ZalkkD20yVZk4w6vc1BNKbKcAIiDjT6BGmO/69T913EzT+ltfqqKxVvc9Ug6+G7br/s+9/8O89dnTKMQ0AU8AL+cLq5v/9s984uaZ1Y48FOAyFiNqERbCGZFBXqE6MNn/l8ft+44F9DTOjrA3rteFIioxwVCoRCFLFFIpg8FDUVbfI/Q8xGG4Lvp4wCirArunuLz/91C8//dRL5+ePv3DiU1986YvPPn99/nreaIrPs8ZEEK8qjhREmKrLUvt43EHWiNQ2j9FMG3Q06Kiq+uvXF27cON/Iet3mzPTknt29mamKKFUjkAhN6oVCCh0oVKhlUSCpMTrGLUCQTtvEfx8f++PWLG9dCGNsMW4m/wSiGgUGJCVrF7h2bWVjfjWLkiW6QBocUHmTxHxzvCYgoSHmkGo0Kvt9MQOVlkYFVKN3DP21R57Yd99E486T5o3RRoAJfFGP9obRr33g8b/x4J6Z1yr91+Rzixv/7We/+tJqKJs7PHOLlVKdFxcDgJjlRpdZPT3c+OUnDv7GI/sbZkme8fTy6jDU0uhRhUpDCgBkapaySbMGZVevyx8FNGiShjUg4YJIPnZk12NHdv1nv/TRUxfm/ugzX/7yV5976czc9eUluGazOyFOokaIKl1qVhpujeFpKoDQoikpFqMHc8d6NArlaGVxYenVM93pqZk9expTU67ZtFarpA1joGRIBkXIBNEixbaSNtka0UDGKQrg0oumrzSlP6qpBrY0zTGjjK2vzEzMe5LRRGV9fm3z6prQZeK1NjcGByWx61u8mK1KlmagmacM1jfDcNiicEse3iBq6jVmOnjw8F4n8pb7P2lmPTBb2lxreYkbS0cL91sfePwnD++8+UttS9Ht09dW/t+f/fq5QdD2DCEWht5LSR8UDY1izuAyb+3hyi89cuDvPXKgaUm3yADMr22WZuIzBoo5E4EYkdj3pCfq2BHZNTGhgLsXEqDvAxyaW7OicZGg5hwfOrz3od/6FfzWr3z1hXPfeOHUH/7lN5994ZRrdKLLIbmYAZrA/WmgtMXnMtKMEpP8STSq5rCCNGFVjcq5K1fm56TVbk5NdXbs6u7Z05ndUYkPQk2gHslABo4nAULZEpbYGhiktJscQ5vSiGvr/W9Jn5mlEXiqr40SkDFfXlxavbbcQoNGi7g5UoNZxBZwaeuL38J209EhxmowkKAUMRpVMe50AVq1czx534709NydVMAhbq4OW5v9B/dM/7MPPf7YVNdes/tRk//p1fl/+/lvXLa8as1QmTEILUJgXikDVDkkq6tWf+2Xnjz4m08eaW51IdJaGJRBCvEFYpBxeTR2O0nPVzR0nRxMNwB/9AgxQsLxJkZaKO9/4uj7nzj693/l459/6dJ/+9ufOH52qYq5lRuCSDgniqiACeASvEvTJEjT7ZCsgwCjIXfMnDPHuhoO5suNG4urV+Y6O3d1du1uzc76iW4trExLanTpcDcnY9SnoyAm8K6abLG6mHASOq4EKEzpfoJ2KWDmxbvIDNna/Mrq9eVMPZMWejrrx3DVm0nVVk615X2kpgKxOlb9gR93hkxgjCDoxcVqc2aq8ejhXXfkCWIAoRub9dz8jz/ywD/4sacONXK1m9WPCVCTv3fixm9/+aXrltXNFimZgarRQ81Eo5pWYmLD3mD9Fx899FtPHm1v2ZSnG+ZKjBdXN5g1okLM6IQwYZr6ixoF8IrZTnva8/vpA3nPMcJ4mxC/qqlpt5H9/LuPvnLtw5c3jw84WW8sjTZWynLgLToJSQ/QYkhgG0kSD4noPsbcp46NACaQTJhTTKlr6+vr/dVLV9jptHfvmtq/vz0zlTd9BVVThWkMkSQRNaZxQhrKUcYtXhvzqYBbjhZJ8Bmq6sWJMjO/ubi+cmUpV5dLnuYIlDQzwBg3wS2KALeYcGm0YHCE1nXVHxaqmsC0ZqCKGrVCPTq6e/fe2Z6aCuVOPNHWh6NfePzYz3/0vT0Z93nSGxGyD/z2c9f+4OvnlnwTTS8W3biV4SIAVa/BmyGMGqO1X3rno//kXfcnZuTtb2ix1mublUpXoxCJNqTejJqaw3CExLiv05uWe+cC+GvXBRIKXIgmxNFdk2g0kU83JmayUb/qr8XBar2xUPbXXKw8o/dpfmyiasloQhhT9mKpjCXH8Dx4Usg61lZbtVovr6ysnL/UnZluzU52Zqd6M9PSyIemVRrTgHRuzDFPATUWbU0Xzhb6I8mdb1V0MIrJ6sLKypWlIvrCcosJU2QJ2zrGTNwKHkv/NlnQk3RwTqQ/GJlGTzGDGj2UZkqlRVj4sfc+6QC1O/DtJgEc27f72L7dN7ucN/9iJYZ/9fVXPv1yf7XZQSFxNGr6vNIYxQEilgCMcKHslOu/+r7H/zdPHf1WLyODEZeW1ldKi4VPLa6o0SBJfUPFGSCIAuydnGre2Tz7h1AVQoRCPHBkT5bHvoYazazoZN43uq3GRCduLpcbS9XmWqU1oZ6SE0JEi9FE4RwENwPCaDaG7SsTqDg2yab4MBqFy3NrV6+tOGbddm/fzu7uHcVkD808CEOIKg6ZSxs/Nak55iHcVHXY4u3SiYoY15ZXV+eWfBAHh2AA4GwcRzfb3Aba+NATd9PRixrTb42D9TWrA50fc3l1bOGlVs5MNJ96/ME7m/9+myVhOvvVRLg4rP/FF5/9i0sL/dbBSgQhOBOLAnHJmlxi9Gqwqqg3/+4HnvitJ460X7t5U5MsgM9dmlsvY/DQVPZbhJlLYC8nRlJjQZudKHAvrXsjAAgAj8xkD8zml69FiNd6GENp8OZn3Uy31dvVGYxG/Y1+tTgYjar+oDFazQpjuxfVWXR0GiQSShASSKdKSTofllrSpRMTRAtAzaq/fv361YVWI5/qNXfMTO7b1925Q3OpKrUMKmTmKWIGB1FNSF/CqSJ6Sqa+0Hz9xtrm3EpTvfz/23vvaDmv6z70t/c53zflVtx70XvvHSBIsHc1imqWZSmy5CU/O7ZjO0px4vdeXF5ir2W/OI7t2HlxZMuWbBWrF0oiJRaxkyBIFBIkQKISIDpun5nv+87e+/1xZi5BiZRICZJZZi+KSxKxeGfNPfucXX4FjgzSBMVpkyEwUfGjVTvFVkAp/ssCaQpFrW5DwyU1cRqgTikXg0s8UcjrCxf2LeyvXEDcGDXH00ZM286Nf/yOx3adG8s6BnILlAcCB8eAObMUrOaVwTrcL4Pvv3LD+5bN63jRq5toKJO9J8cKlxqpAQHMzK7Z7TELwM7E+nze10ntBHhxYSzHvHX98u8c2MtcYc2ciZkryOcSSlypVKqVUk/J9TZq5/osn1OZfvjgk8fPHeO0r1zuTVxSF3Hei0KNoHDEosITTs2mkNbwXVEhrhBrLctqJ88cPX7yqad7p0+bMmd2ZaA/ndSddFdz5poZvCvImFmJVKRp7yXwcMOnhgePnU6VnbX2wdzaH7Qo36ZNKOoEcjoOUjWiTtkIlo2NWZZ5M1ElRxrUMRNItNCiPn/2jIr3F7BgiEWcY/rSwZOf/M62IxlrV389RH8yhmnixMzEHHxCol1Sn+KLn7vqoncunFV9UQ9TNTDtPnP22NA4Kr2mEu9/EDFpE2USdS5DPqnqF3Z34gK+aK/dBGj6yFrz+o9P6dqFk7t493g+xhBSA8w3l7iUGxF59ZWku8dj7Fd+/YMzfbj33gduvXvX3n3Hs5pVyh2AkKvkcMZqKsRBEZqgBxCM2ThO4whwZkrmDRXvQtD64SOHjx3lzq506rT+OTP75s7q7esuEleoZKEI0Khk4QqUXDJyduT00VOpuibjpsmlbJY+E+zNFpaiuUhWVThMqGY5gyOMj9dM5PnrEiCiUGTOWcJYsWAWLlzFHLkPZ4w+t+2pz9+/8xx3FJVuUQcwq8sBz0pFAYalqbFWGsPzOPvV67dcOqMneYkPQYQcePjE8LgZiFUNFE2gmqWfgdSMnFKRzejumezdqwQE8c+sC0REtz36zMjQ2HuuWWdNYzwsHeiaPSnZe2aUkzKMiZkBMQJY2BtIYN51Hh888+iep9/97ksvXvzuX/q5d35321MPPrJv964nnzxweGR82KU9nKSCEDEH0WaUrEmzVDI4Y2uO1dl5MjWgIykZkTRCduT4oaPHn92zt3fOjJ7pUzsH+ju6Oy1xdQtqWrZ07OTYmePnUkuTZuOhaOqQNNEEz78ALT4xnu8iYNEEk4hhkJDXak0FASiMAeRFnnhvea23u3zR8rkX5L6Me65A9GxdP3Hvjq9uf6rR0VeUOnOhlDQhIFNODI4UCYgdxDcGF3fg3165ecuU7pdKwTgAPWa288S5kFQMTMTcHPJyiwtpSkYaSpavnjndvaru/3+WBIj5f7RR/NFnvjO7p/s9V68likAzG+irLJhW2nf8FHxJzZsRTJmbVEMFKye5JuWuedv3njg8LrPK1F3mmy5fcdPlK/LibQ/sPvy1W799346Dzx49DrCSZ18ieIlrLQQCmKKRADmXGDgojBMj1giINnQAHXDZ2bHRs3tHHn/Gd3b0zJjWP3dWdfoAVUojZ0eHnhv0yp6YlS2Sd5vKaxpJkROy73SeYWgcqcY/EgVUHJnUs9DIIpy1uTOiqPcieWNk+apF86b1/PjXvzV3znTfufrffO2+XccH8+5ZNUoBTr1BGgA79g6WBTPf5UzLo+fWDOCj12xa3d0Vp8wvxTRTwtOnRg8NZpp0aAvm3cKKk5pZBN0W9YGyWze93798V7PXZQLEyXph9Mef/O4TR/OGFPsH84V9JYKpooOxdcW0W7cfIkKhTM5DM6bIRVcjOCKlqvrygZNHDxwdmrukX6KVL1Ga+Cs3LLxyw8JnTw3ev3Pf3Q9sv+fhXYefOwVK01InO8+O4wNAQkTOkVeDiDlOQNxEPkNhwkE6Iocns5CPD53dd3b/Ie7t7Js1I6n2+eA8JyYMBXGUNokIifi/6QVwKKPnq6Ao1NbqC7yiUatrnjkoEcNUxYyJHUvIPIXLNywr4bwq8UdsrsBkBdGXnzr28Xt2Hx7OpHNqg8rEzqk4KZjBjgtEjTGmIksbo1fN6/6XV65cVC2rGjO99HrNCtA9ew+PNsxKJdMQScAcJ8rMKsElrGaJFPP7OgbKr64OGBfCb/eVFz9Mf3/33s9/a2demv7UifGdh043t00EAG+5aNnkHsoa43CJwcNxc4FEkdlujsjYjxZ816NPxWs2SlnFtZqIzp4y6Wev3/KXv/Or3/zHP/3PH33/JevndJay0Bisjw4hBKYEnBCneVAj55I0si89SYKCrWA2IxMLokE1eJUOQ7mWy9FT53bu49EsifKgQVsXa6zpuaVfhKZAqE1IQke53KbMuUrEHsGJ1YeGrQhRAMLUIoFQRYiks4zVKxb/OOOfOO1hwpjSX2878Jff3Ha4YaGjp3DegVxR+FAkxKqUG40r5Zogy6tjJ960dNJ/un7DompZDfwDks9gREfHs73Hhlxa0Shx0VJ6jQ5rzjlWcxrKRba8v3dKC3r+Bp0CqRkz7Tox+hefvztP+upUDSH59kNPvGPDrBYVFwv7Oy9ft/ALdx9LvG+Ieo7jkthYgY3UMpcm8KVbdx56/7Wrl0zpnrilmAmgWFEz88yeym988OZffN/bHt175KEd+++88/5dTx4aHq1rknR0dnGaxAfaTM2CIyMyJjZ4BSQKbKp5EINdsG7ixmg9jIwlaacEIdckDotZxBk1VZhfqBfUegqaVRBHRVEzgknWyMbGEmbnOApfOCIFBUKR1efPn7psevePY4lJZsS0f6zx8bt337731HipX72pqCdjLQBj5rwI6liU1Ax53iljH7h44S9tWV5tdcw/+IcQ6JGjIyfqwtWk1RJHtGCkURNMSYOH9pCtGOg9T2bl1RLu937v936a9/9owL/7399+eN+gK/XVOXFk2eDZt16yvLeaqEWpVxoEPfToM+K61HnjAADkhR0IHEXhmJxPh0eGy5X0qqXTvgcn83wBYlDVkndzpkzaumbB+2++cuPa5R1dCXsdPncyy8acB9jgiBwZUVABmOBayLvYmooHqyhMzTSUyuXuXiIm9kYtEF1LB3Tiwp74PM/reQEUpXEICiRAMTTSOHfWQ5ruT0YMMgN7btTOXrNl1bsuXzuBhn3FFw1RRvTAc4P/75fvfeTYSNY50KA0fgBSJQYcCWDsGJpa4erDM3z2kRs2/B9r55dbbP0fintvAJ985MiTdcuj8IMCkKjjbgARm0qJQFljYXflw+sXVaIvHr3xXoDmOJD5E3c8fue2fVadE4yA3CeVkydO3vnQ3g+9ZR2ZRnjJ5YunzZ7Wu+9Ug8slhYKdwAsxkRARm1gwTapWmnzX40d+4do1czr4Re8VIjjHEwImzHzFpiVXbFpydrR+/PiJz37zvtvv3/HsmfFaDvhyWuogKqmJmcLUkToDmzkjJo21vQGjtbFeFU6SADXiqG7SWuUxWtDPl/watEmcB1OjXiNRIigpyLFjViamAOkoV5YvnkPnwRZe0ffMRGcLfGbbvq9sP3QGnXlnJZiwBahn9sqFMoRJDBDpdKrDp1fP6P+Va9ZdOWPSy0Rdx85kx/GRncfPNjp6DDWEKIsYLawgxCJWAjk1U10zf3Zv4vCqQUD81EsgNWJsPzX6v7+8rcFTiaqCgmAIRZJofECbdu2qC3s6Ll0xa9+JY+p6giYpJ1FKTckUjs28URFy4nTfscGvPPTMr1+zpLnh+YEEndgkANbfVenvmr9qyfxf++C77t2268FH9927/cnDJ04Fo6RUIjhzSRBlaAKLwFM4pzCwcKPBRWGlcog1l4KijZKpmfGEPdEE5I1byNKWYD8TgMKJFmOjzowdKztt6j8aO0chnzq5+4aLVjbNWF/ZeM1AtGuo/vd37nzgwKlapa/OFRUwcVMIA0ZgMBcwx9QBrY4NXrx41keuWrN6UvVlFigREFgYfWP3/rOZFh3EFuLphwmYNCJ2wQpnqpNLetGcfgYUPyqg7zWdALHBzYz+9FO3P3MartxvRV5456Con736suU3X7GipS6IyLT9uWvXfOmhI6ecKkqm5ExIQoAaOYAhOTsToSxUPnvHrsvXzlrXV3k5Nxc3hZ2b4/lpfdX33Hjxe268+LmTZ+/d8czff/kbu5/a36hbTRPf2Q0giHgkSqmYU8odWTkErdVdT4+yRyCvYFAgNYJFUSOj8zvX1m6riYoWYlVJPHRszBpjCakKiZERiakxK0TzxoZFsxf2db78679Z8RNloC/uOfLxO3adCmleHRAYLGdjU6eUwvII8ClE05RKod7TGHn7+oW/ePmqSb6p9UQv72fViHYO1x87eiZLOi0vWuM9caYGBwLDjKHGWuQLB5LF3cmra/7/00wAVXNMX3340L2PHS9Vp0YVfOMk1E4tnpL85s9d1c0UUekTxcSaGV2Xrp7z1e3Hy+UpIiFqebKQ+kLZizoKOUHV+aePnvn6/U+vvGmtt5drvfk9TYJzNGNq/3tv7H/7DVt27Dm4bfuOOx/df99jewNK7BKBU7ASsXOekInVxka7bQpp3FtF4CbgqKmzeN4pegEConV+RKXsaHRkNBRFEoFjJpGIbCqe1VO2aeVivGwJ/SghGYj2jmV/d8f2+x4/UPO9dZegYDAIajBjOCInLGYFk5GUakOzU/vlG9a/adms1rD1FRzPAvjW7gPHsiJU4EwYJdM48nJNjTDiIFJ15OtjK2YtnsqvxvrnpzEGjcXi0TH9n195ZJymw3cqgrGyhrQY/vBbNq+bUlHVFxgAqwG4bv2cHhtLpOESGIPJeWOWQiACtkJYFM5nSe9X797zxGDRxN/jlcGEneO4q1e1MtnFK+f/+s+/89N/8u/e/uYbNAiSkjqnnq3pVkEM1MZGNcs4qt20xLBaOkP0ou34+ceVYZCiPjJiIhH1yTBnxgQmeNikMq1eOPNlliIRrX2C6EsHTvz7f7jla7sPn00m1XxXjpKqQ7QqjdwH04Kcpp656GyMbOyq/v7brrx52aySmb2iVYMBRPvOjt+x59BouaNgWJGhSFhhpgZHSiQaggLOGmPTKu7qedOBV48lwE83AeKW6v+75eFdh2uSTlNXNe994jgbevOmBb90/Rro9zArYEwwu2HV1KVTU5cNRfnMWJyyikouCI4TB1I1S7ueOZ797Vfubyl4/ygASY4kL1AhCtMx00wJSUWRGJOxGMQUpuyZi/pYY2TYSWCYmohKnHqr2ote29aKqAHhgWJsvBgfJ1ODwIRM2eJumLL6+KzJXStnT/mhA9DIJyai5+r5n33roT/49J1PDrmsc2rNd9UphUtVhEwJRqZkAYCQA9TXzq6aXP73N1+2eUaLFUmvZI8JKwxffnjvmZDUXWIOzoiUmzY05MiYzMRMNKAxsnHB1HndlVfn9f8TT4BYVT54ZOgr9+xBeSAHGsGEEiaZ1h1+42e2dqbnYwae/0xq6K+m77t+Q6rDCJmBg5miAMibJmSAM7CPmIJq/7ce2PedA6ebOMQfY0mXOH421z/4xzueOnYu7RoIBjJlyxlCEx8trzeGznkJWmRqohBTheiEbf1LhaoqhM2KsZrWG5AgIioBImQCFYDyvLF84cyujoq9dD9qLc6OEn1z//Hf/NuvfO7uJ0a4z/wkKTyUCZCQGwXREDSIFiaFhkxE0BgrNYbfsmb+mt5EVOkVn0ojooePj2w7eFrTimMmNWbfFJYnVkTBDTDgQtbr5fIlc0otFdg3VgLE8zAW7E+/cPdzQ2yuBOTsmFwijeE3b5l72aLeuP58MetsAvCWLUuWzemkbMyCioZCC4PzJk4KBSuYNSRWsE/P5unHvv7AYMvA4kdc0hEdz+T3PnPXbbueQ98cKXUUEkgLkoI1wEzUYOJM8pERznNWMYiRwZQ0UhG4uRImbprzgSb+n1gbs0qo1SgvWFU1qArFvyxIKIjoopXzCRBVeomSkmBMdHRc//Dr23/nU/c+drrEvfPJEp+FNJdSEB9yx7kiFxZlMxgkmBRFGCPNpnZ3r1swreVd9Qq+rvgnhwWfffjJ03DEXAohERgxKCeOktMqqmbmVVxjdPHk7vkDXT8Wofm1/AIYEf3TIwfvfuw5rk7LxZhyppBIY97k9Fdu2tTUFn1J4VHtL/O1Fy2l8VMu1GFCUaJAYRqCaZypJaaqouXe+3Ye/dR394B+JAc2MyZ6qlb8/idv/8b2Y2OVacNW9h3daspqHAewUMA05ClMa/VQq0dWmppiwooFPGF0EE0Fnvc9aBpYgyRkI6NptCJAS/9FxETr4yOTezs2rF8zYbzw/YZrTBgHfXHPsd/6h+989uEj48lMqk4vJHHeJWQVaGriLTgTR02v8aj6QibkiiLkpUrvmTENFFX5mvbV9vK+JSK67fCJR46dDtVeJldStOgQhapAhKxQElFzIevMx69YvmB2dJ0C3nAJIKBjuX3q6w/XrTezMtibFIllaePEe69ctnRyp/0QqTM22LsvX7lsZhfVTnoEMoYpk4M5s2CqpmQGYzVfLtKBz9y688nBbMLi7uV7VwaivTX5o0/e9c1tB6ljcq1w40Uod1YNpmosDCUyAXImYYg0asX4GENVFa3zbmrRL+eFdf8LfppzXGRZPj7uzWJvClKIQMS0sKK+fPakOQMd3wNDmGh2iejx0+O/+8UH/8uXHth+DkXPtByUOHimwkidF4ZEALIaCZEymv0FOdOyqoc/emb8Dz9933/86sO3Hjz+nFoj6kO+2Mf9PgQ7ns3DLdv35ZVe8QmzZ/JsDBUxMSNn8CiiKKuv19bPmnLdvBlsPx6a77U6BjXzRH9322O79p7zPYvq5tUspcSH8YWT/XsuW/JDbcKJoIr5XaUP37T1dz/27bpKsMQhqHmFYwpkkbOnyjBiV+4/OHj6r7780H/7+cv8BOzyh35MNWY6Us9//xN33rvzhHbOYCVvgQnMyt7n442EvDGUAlGuAMyz0fjoSI9OI+Ym9jke+lgIUdPE5TxmTHPqSozx0VEEcYBGjxozUyOQKliyjUvn+hdWzBPrrf1jxS2PHL5t+94Dw3nRNaXwJTPxiRSWKxNzmmnB7KDGGk1KI7cMaNoyEgI7rtaAQ0VxeP/Zu46eXDapunXh7GsWTFs40J20SkF6iYIlgD778N59Zxt5tU9CIO8DmFTZghKTOY9ACIqEiKuGq1cumeH5VWSJ+lNLgAhCfPTs+Gdu2V5wj+WmrlDvmDiMDf3czWsW91VfzpYnHqB3bF38+bt23b9vxHV2QDMFNSXUGWZeWIzhnAvqk/KUWx/e/8XF/T972Up9GWOHCM47MJj950/d+sDjJ7RrjlJS0qwgNRXvXblSaYyOOseta14AckDKVBsa7MjqVO5QfZ7+3iKIUVNmutkIUYs6QhBtjNdccz9sZjCNxZIatMy6cvE8nHc3RBG5mtF39xz+1Hf3PnqspuVu7uxVAaxQpzULzjmvSE2Fuc5UIVICi3mCWmTeOwKMoS4Jser05ZBwLvrYicYzR/Z+88F961bMvGrp7PUzBvoctYQxzmO+mxHRvcfP3b77GSlPVWOCFoUSs3fmjAEidaQFVNh5a9QWT51047zJDrBXbfn/k0sAIgjRZ+/Zv+dcUil1lqTwlufsizxfP7168+VrXibLmwim6EvxC2+7aMd/+1Yj1MUzwxhKxmoKLsh5MYawgYlKNT/1L27ZsXTZ3HUDP2STKqqO+dBI9n9/8r579gfpXWwWUioKIfFlCaGUclLpquGUQk3hPZsxeW+CBJoVNR0dLlU6M3VKnsiAAFOyBFCBwqL4p4dBwcpggqtllBVKpJ5VlNiZOriShYblIzMmd21cMvN7mEMHz9X/8CsPPXzwXEZldPZnpqSBlVN1WWBL09yUEFLLBVz1aSmzjEsKhdaYxutJibRUKlAiLUiCKvvEzKhQT064PF4p1Sw8vePUN546vrS/8/pls9+2Yvbkkj/f/ZKITgf7m3v3nLGyGKuAmcmUTQgQcgpmErhE4L1Kj2+8b8vKySn/ADrB67YHiMSSfeeyr972KPluYydakCqrSDZ82brZM3pdbOZepmKEmd20afabLltitVNN4zqDkTNyBPVWlEibbo8i7DsODfs//of7zmTgl+6HVc0xP3m68X9+/DsPHjjlu/tAlDhv5uC8WnM+2NnVxQyTjDSYajR8aC46TRrjYxwtDWKTbGRGpq2lgKmqqWqTJ0AEJoRC8qylExQ1qH1008rz+uqlc6cO9Jhp84Ugy4B/uOvR2x/ZO4ZqQYmEzEyCkZAjQwlakixRAVwD5RJxtTGS5qMVKrxnY1Y0DXCImeChSeI7VR2x8yBSMbKcUPc+VDtHtPTIoXP//SsP/fo/3PW3j+zfOdKIizxRHQf++u6dOw+fQbm7UIBYxGACERMxNVNhUiFySckVtY1z+q+YM2XCWvuNlQAEBfCJr2w7dixLuQRT8jAjKrS3nN24ZaF/JXOaWD2UzP71OzfP61etDTt20gRgMpkndSxIJKSWO2RFyFCadt+Tw3/29V11EL3YlC/W/dueHfo3f3/bPUdGQtekUNQ9ihAsUMmISEICUQ1JpZJUOmDqKTCU2KvQRKeb1Wuk4ibesubQRaEKVRNV1dgOx67UqdbHRkOeJ8zQqK3OAKDCMAe6ctMqxyQ64VJAg7k9sHNfWuo2UdLMJMR/OUyMhCh4Cylp1ScJHI8NLugq3nbNqkllM2moS+CrLjCJMVMIuYWgEphJRAJMm0r0RiIIwmpptbvomb3tlP+vdz7zHz5zx/+4/4n9tew48+efPvnNnfu5c9JoQwRchAKm0Rwl3gVRlgwAW9FHjXesXdxNrxbxw59qAkSx1CcGG7c9eAiuL7qSqrHzqdZHLl0367JlA5iwlnj5iqLAmunVD7/9oirGiYQ8MykTKZULdAZJnIrTzJDnRrmWtDTpU9+482vbn8QLJ0JmMFVi+u6Tx3/rb779xIkg1WkBJYULohp1PIi8A7OJUeGraU+/EjOMTNWY2BGxERxTyBqh0UgYIJ1wUyVTUoVEQV9TVREx1ZQpUa0ND3mos2hpw94nTJx4TyrTJ/etW7NyYgAaZ6g7jp4crLvMyuDEiIIyKVgK0lwkBCVySSpiZ45O55H3bF7wf33o+oFuGz57MvUQmJp3mrJaVh/qK9vUaoNGjrj8bIIG4lbDGOJYXCrOwQm5zKVFV3+jY8qRRunv73v8tz935/+858lP3P34SSs3JFHyQa0pjd1a9MOIyIlZ4sk3Rt60ZtGl0yeZvcqL/59MDxCT/rbtRw6cznxlSrA8Mj0oaLeXN1262FOE/b/irsLMfunGdTv3D37lkTO+Y6oLdYEFdsIJQ52aUwRNhFPOhov8+OrFA2vmTDv/rYns2ED86Qf3/Y/PP3hau115kuWmJkZeosCc5BHPqUbqqwBxz5T81NGSZQwQnJkYjNg5Zs2zfGy0s2NSAUH0+IBFLV2NRnowMESEiFBYNj4camNlVgsWZYuiCq9jghSL58+ZNXNgYmQUqTB7jp4cahhVugsj5xzFHOXmJtjDuD7WhfGNCyd/4Kq1l83re6aQO+7dRUkSVNTUAqdIgIyK8Zu3XnzF8ml3P/L4g3sPHxw8NWZlSzo47TCwKZgdyIuJ94E5V6ik1Xoybc9wY9e2g5R4KnUIkQQhVe89xIwRjU8BB7DzjvOxhd3Je9ctSu3ViHz+iSdAnHScK+yLdzzaoGpCxixQr+IoH5s3o3LZ0tmvFOM+UQgpUIH94ls27Np/x9HRDI7gvZIJMvJSBArKSiln9bR28M2Xzf3ND92wrMNPvHFxsn4a9LFbHvn0rbuGtdMqPaEeEgYRifMQgxaJU6gBUCTqq2rkuwe42mONc45cYXBwhuaS1hny0TE3IExeYA5sKjBtyolyVAkFTBiEPG8MD1lRj3I5EbinZoB6iGq+YuGM3uR5ayZizswOHzvTQGK+JCRqKKmYsbIjMPIx1M+unNH93is337B2fp8DYA/tPnj47HhemioWFxdkSqz53EmVaxdP2tSVXHL1+qNbV99/+Mx9ew/vePq5E4PnrNSBUkfuEzPnXEpkCLWS96rIqMylqvmCTRkaNHgm78gsMLugTe81M7AaLK/mY++8ZP3csrdXyON5vSSAKjN//YGnd+8fdNXZxkqkZuac03x8y4r5C3pL9qOyXJlITbfO6/nVm9b+l0/cK9Xp53JwwokUgOSKSuJRO9sRhj5808Z//TMX9fnz6FRqxPRc3f7os/d8/q4nXcdUc0nIc2POzTFAGpIobgISFecS4wTEBEtTTlKmgkWRsBNRYm8QQFMg1GtF1uBKdxG9ALQFhjYliw4wwgRIQSEPY6MUcgITHCzCPcgRmeSs2arF87g1f4wDoJGx2p79R1CaRI49WxQdcbCkqIfG8LQuetMVyz98zbo5HWlUXhsxuvfxw2NaBXeEYszBTNWR+mJ80/wp6yd1xkdpVsm/d8m0G5ZMe3Kw/q1tjz+6/8Th4TO5VlDuU5cWJpw4UWMjNouS1RQhPg4EgSgRiRnYixiTEsOz+ay2ddGMNy2ZSc/b1r+REsAAZhpXu+2xo2IVl5ZEgiqcM9KCdeSKNTPTuCL4UScDRKxqH7pywZ4DBz51z6Fy9+JQUKLMUE44Hzk6Z5L89geuf+emuQlFiC9FHXPH/NjZ0T/42Hce3jOq1fnGnqXuXCg4zUwTpjKCEzVKFI7ZBJw4R5a5bHhGJxauXbzrgfvAiWnLDIUMMMcmWSPU60lnj2kkuzeFICIthqJyiilr4JAXo0MshREp0uamzIzISIvJfZ3rF8/4nkpy++GTJ0ZC2tmbFblHziyOmevDfZxdvWnuW69ad9G0btf0JoRjfuDxg9sOnOaOObUseLBZUANsbEop/5nNSx2gBG5JMPUCl0yqXHLD5qfq+fYDp+/Yue/xo+dGky4rVQIlKlqGMQJRAEAalbeVDGZqREqkpuwcmZRAqI/OrujPb1rey3iNFP8XPAHMiGjP2fFdT58sV/uCuWARY5xn+ciSWT2XLOm/AMKuBEf2G+/euv+5oW2HjpeqM6COsuE0P3fd2v5f+9lLt8zshzXZHVG4xjF/af+Jv/j7W/Ycyri6wDiRkCWOzExFnPMkwUgFMIMYMTkiRyHrxngnznzoxqvmz5j0iw9/t7BSbsRG2lyXglSJtKjXUyLnHMQITqHxuEAjUd5UxAGS1bVRdwhmTFBjVlMDJZ4aY6OrN66cP3sqTJsdMCDAPU8cypO+jJMkySuW52PnKg6bF89431Wrrlk8rWVwHyVZcLKRf/y7j5wLiQvqLPcORolPWGtntiwb2DBjkrUoLy0/2JjFuqySLls588YVM+948uhdTx5/5NjZc1pOfBc0Culpk/JvrBJpq7GupDhOYMlRZBWrv2vD2lU9FX3tFD8/kSb4wccOnBzKKZ0EMFNKpOTyXMdXLls0pb8LUGL+MT1m1GxOT/X3PnTDr/zJFw7UjoqvTK7U/9Wb13/khrUlF9moTC3sioA+992Df/jpO04E0u4pBHU6yg7BV0zhJHjJjE18KuyUiUgTI8+upFm5GPzNn73ivRfNKyQsnjdj+5MnfKlKgKlEajubAlIbH0uLnFzabH8tikVEk6U4GlKCjo8MIeTsW2BmExiMLITcTC9ZtyT1TkRdUzmTztSKp4+PFkmP+kQbI8iG1s7r++C1669eOrMjehS05mNRVOKbuw/sPD5m1TlUFGVPEsBpNaDor9K1G5cZvhd6Qs0RDkca2wDhvStmvWXZrG+fyT5+26P7jp6hUldwXLADaWrGUAFxy90ybhaKRr07tVAbvGjjynesmWevrcv/AiZAbIdOZvjSPQeC6yAuGRxbIBOQL3leOq8nJdiFGA0wkaiund39n3/hyt/9X5+dv2jJr77zTZfM78N5UjZxy/tcYX/x2Qe//O3HR2mS7+hqWEYs7BNTMjFP6iEEDcYKFiUGBIBPfP3slHLjox+45t0bZsK05Pym1Usf232YyypkBmWwqRopkWTjw9QYT6s+j8yaaK8daQ5CDHgQS9EYPcfWcMoEMyoMzsSzQbKx/i5euXQ+WiDweIyeOj16eqQo58OucXrtjM63XnzJtesXTkleKDfUeouO1fLPPbivjk4tAvmyamBQWQpXG1y9sOeSuVOe9/n4fv/gJnIDJqLOjY+NDJ09y+SCBVUiGAhCbMRsLBo8GyOI5MI+SdP6yKlVU7o/vGVRL8HwWjv+F+wFMICw6+DovufMfFXIqRmTOCoCJZVKecmUXgAKchfipzlmM1y7dsGmP/pX1Uol8b6JXSGKcHnH/ORg7bc/dtv9O0/66lRDWYN5nypboQkTJ5Q5zUAI5AJ5FSUTJjiy0Bia1lH/7fdf/dZVM00t0n03rlj82fIdNQnRsYy1qZTOZCjqYWSwWupoWMtEia0lkmOs8DCp10Ne8yzOPMiMgkbjSjHNazNnd29aPmdi4xFrtycOHxs5c3LZrBk3b15x8yXLe8vp8xCd81mXZsT8+Xt37Tk66KpTys6Pm7BLSJUbIz029sFLL6o6nqBcv9T9RWrjzn3qiYOf+NI9g+gM5R4lkEpiZuzMsYIh6gBncZVoSprXR2ZU/K+95eKNXeXX4vV/wRIgFrwPP3m4kedc6QgiRg5x/Q6rlPxAb/eFFQWIovs9XV3f7/ljoK8+euDPPvfgvpNZZdLMegGgALHCmTiKlFUTEBuxEJNLnJmzwodGGDu1cX7Xf/jgm69e0P98Hw1sWrmwp7dreLAgXzKFkVEki0HYaGxksNw3lakUmkKlbIBxVDs0Iq7VakVelMi1aPORPClmKqGxYN7KpGUCEOEDWVFkx4588MaNb7ls45KeZOLof095rWbM/OSZ2pcf2Asuxw9WBRm4CHloDG5cMWXr/Cn4gXW5ARGxfMvjRz/9jW1Z0p2UJhXqQUQU5QgUykbKTllVCgUnwZQlqxaDP3vdJVdMm2T2Wpn7/wQSIGqAFWr7Dp/Mjbw1vbbUIARTKyXU1VG+gDYnLxRdI25d/Ew0WJe/uPXxT9/6SANd6J46lhs5EEIEaJiCfEwAGFgtYZdA1VlesVoYO33t6pn//gNXrZn2vNwiiMx01rS+Vcvm7btrRzWdDG26vxNAFjwhHx+TPONKmSa8IKNIOBuZMDTPssgUjK7EpmYQGDxbvTG6ft2q5wsbIgCJ97/yruvKpVKELX3/0Z+o6BvAX93x2IFRl3b0KLEETUEBwWvem+bv2Loi/YGwczUwTIk+9ei+j932yLDvE19tWGreMxQq0RRNTYwIUFUxdsoJUCTjI+/csuTn18531pzpvlETwIyIzo2M7T1yin2Xko+INRCDDKYJw5n+ZGCndN4LQPcdHvzzz9z30IFRq0xriMuV4D0boA4QImVWIDQnqiAzFwrxyJyM6Oixd1+/8V+/98o5FRY11/qFEiBGjnDz9ZfccvfDJjng4wCGSSHineXZeD4+4kudBOfIGZpzc2JjMwtSZFniE4Rm6kTYkANJXp/a37N1zdLvuR2YqFwqNdP7pcSZ1Zjplt2H79h9hCfNkqyI1kQKT6rUGL7mkkVXL5rxAyqT+L3loD+/a9c/PbSnnvRn1GFIQtOiRny0CQQTMRmxijAFRgi1Um34yqWzfv3qjb14bZY+F3wKtPNk/cDxIdc9JQ/q6HkxTGYvYnlRALjg5rBNzUOiU5n9w517/vHWncdHPSrT8qAaDalVTYmjyzAXcYFjSkxMxjCwCYV6X0U+8K4bf/n61T1Nsyb6fguzazatmD21++jZBnFZNTgiE4njQDPLxobLk6YqcaSfSMuct8QkeR7yrMzMzkWHgBZt3Opjw1dft2nZ/Jl4sR6VfnDdQvRMrfjkPbvrvtvYOwcYgqOagPOxRb3Jv7h6s4suxy+toHioXvz1t7bd/vTpsdLMghJVBDGfkErhuTVKAxM5Ys/QQAHcKIfBi+b3/8e3bJkcPV1fu8f/AibA7qfP1ixhUwNH1eXoMaqwRtAi2IUHHWkTbfvAk8f/+HMPPXp4tJb2UmeXCQxEaojeuiQtmzAD2JRhaMGR1EGc5je/5dIPXT+/00xeVBCcCEBnR3XVkgWH7thR6khzERA5ItPCk/NW5OMjFBrsSIg16uYCUGOysdFhSGBiJidmgBpRVNpNPDYsnZcwqQg794ponEL08W8/9viJBrqmUV4g2g8QqOy5Pv62i1ct6yu9+NqxVadtP137r1+/d8+peihNLqRsFIglYULIEzK0GioDR+E755ISgxq1xf2Vj77tkrlVZ6/t2/8CJUDc2mx74ml1VRHzFt2CQCZx41MX99zQuKHvgjwA1oI2gGnnmbFPfX3HN+995vho4idNLchIGwmBzUF9NFMFiSI3gCwlpIiLTVPAYBpRLLfefl81DH7kTesnc0SPvuDXGj3evOPVy5d85Rv3aKmT2QUxZjYAJinT+OhgbehsZWB6cd7IPSGiIqsNDbJpxEkAROyJBCwmeVe1tHblkldqGhSLn2/vOvi1h/drx8wilzQqUhGXnGbZ4EVLp37g0uXeTF/4r52wihkGPvXwM5+55/Hjmafq1EYBTwILFOHN0QyWWJlb6wYiMkKe1keW9VZ/622b13f/IOGWN1ACxMMyXODQmfFA3k1onJs5qIOqK43V8eiR0++/ZPaPqQ7flEVggOmU2Mfu3PPZ23bsP1IvV6a6rnJWBJ+aSlAyshKZB7gJSo4+zcoQjhxZcHQ0MgFZUn323PBff+6upw4c+413XrNhZsf3cwIVcMCWlYsndXXUQ0OpREgK1apLQt4gJkg9Hxuq9g1ELzIGMSglQpFb3kiZJARHBnDLUsNgNtDXvWTR/JgWL/9LYKanzmV/8a0dkvaLJo5UNReGZ6oi9Lv6L1936dSKO99axiY8CogeGMr+5taH7t51WEr9lHYXDWVHhdYTx6pKMLQAeaowwMEcWUIhLYbmdPhfe+slG6ZUflzjmtdPApgR0fDwaCM3o4SYyMjIRcU/wARE5cr92585fP3yOZPKP1oGTNz6RDRq+OID+//xm4/sPDI+ah2uZ1Zd1VGWMElQYifOCOZICBBE/FiZ4sIHhcKgyhDAlCiAk7TbfDVQ/x27Rp4++o2bL1v8kWtW9Vc9JjAVccFltnn10oWzp25/6tmks6TsTULQwERm6r1lteFQ1DX1UayCQR6oj40hBNJAUTuziRiCd07UNq5fO2dy58t/AKIM6PFc/8sX79s34qxUdUGNUJCHo8JUauM3bZl37ZwXwPHjqAdEJ4Avbtv3hTsfO3AuWGWy8x2m5qiAgdgKiRJXcZMXtR4dwVTEESEbm9NlH333ZZcOVNSMmF4Px/9C9QCj9Vo9D0xxUSnkiE1NFQYtlKn09OFDn7t7z797x0ZpUgRfQbHbbEOZhgLu27n/H+964vadR0NeKlUndyDNg5IPxlYYMXmYkwLOm1IOIoUjSzSYY0gomPG830w81+RzJe+rda24UtfhsdpffX33I3ue/eB1G25cNzNlwCzuuUW0WnJXb920bdcBUlMEZhYlco7IHCQ0RjSrk68CalBlVRT12rCF3EyZnZggblYNjjhIccmm1QBExL2MBqBpxEr0l9985IH9Z4vyNG9EGpTZfAqEsmXLZvR86Jq18Vvj+GaiOerZdvzc393z2D2P7At+kqtMEUpEAjsFTARAQpwYkZm5OD0AFOaYvRa+Mb5oUumjN229fKDKr4vK58IlgAGEehFUXBklkGfOASGKrhLOFwR4cZM/fsvODasXXrOw10SU3UslgT1f7ahrmX8NCm7ZdvCzt+3e8cxzI3niKlN9ZylXNpCHV2GYEhQcyMxbWUOmPgeYnSNpzitBZPAUf78mYDFqOkWQBlhi5HPubiSVuw6ee/xv7/ynBX2/+LaNVyyZyhPufsClF2+e9MmvFiFYQsFAnOQKz0qaeSEbG+rsnDyuyCw4p1kx1KidThCcwsiEzRCInGcXGrXZU3suWf1yXVAt1v7Ef/btXZ+695laZZoPYA4FgnBCFqrA9OL0b91w1axqGqtzi28maP9w/ulte2/dtufYOKhzjlIS4rKuOaiI1wGraOqcAzlRJi3IQN5RSOpnV/ZXf/edW5YPvE7q/gvcAwAoRABmSpoDPqP41jcNV8gkKR8fGfyd//EF/eWbr1s2EKf336/915ySR2Ea4hx47MjII08e/cbDex996uS4Vag83ZJSAAeAXEQNGIhADnBqBlWPHMyqZWIWMU8hcRyCMTtVZSeAGpypY3UUh5akQA4TApEEn1ZHC9y+6+iOZ45ds2nBO65Yd8Wifu8IZvPmz5o7b/bTh0+naUmDMEfZuJyJi0LqwyOVyWYmcGqhsPp4MTpaitJvhVBiZGaiLknyrL582drZs6YAxi+nAVAl5k8/sP9vb3mgSPscgSUTNTgmy5NQuPHBd1277JKFM0SV4l6K6dnR4ju7j3xj54Enjw2GtMN3VEUBg4sbN4u/JyYjI2UyCgWRKxSWVgXWwZKOHN8yr//fvu3SJb0lfe3PfC58AlCTWew8JwSIRqWbhMxgIQ4CBaYindX+vcfOfPRPvvqht29+z5VL5nWXXvTXXgeC4ey5fNtTh7694+gj+04eH7W6pFydw2BVMyKJ4k1NamrTnj3+nUA5B9PUo+wsh46qjmeCJO0CV0BsKJgUlpAlZC7S+YwDmRpnbJZCVTn4qnVXT4fGP93/7F07Dl+7YeH7rl6zYe6keZM75q9asefwXQmsVEpCJo6cGZGxg6+N1iqjw9zZS0osRe3UmSQPzjEMDG0C7siRaOpo1dK5JSZV/eEECdM68xcfPfzfP/fdmu8llyKvpS4NhYqRJ+HR4xcvmfEvrloHVccM4FiGb2zff/v2Z/adGsmTjqJzqpCzQgwRxCEWhdojkx8GU8csRcZpmlmiwcpsdO7kjaumf/Stl0yruNcczvmnVQIRAJRLJd/kQ7GZRe90ghELAcTMSdowKnfOPpXl/+3TD93y8N4NS2atmj9j6qRqVwVmVst1qJYfPTt45PTwyefGnj0+euxcY1xLKPdLWmGXaMgQGimbWGimXRN3HC8zcGyVCeKI1VLLbOxEX2d2002bT58dv+O7e6TcT6VOQaqkgBIKswDzgGNJwAUQIpBUORFKcqOkVE0r3Wez4S/es/ehJ45cvHLetVesXLR6dXHrg0wcWTfMPppFOvKFaFEfd51dFjRBURseSfJMHCmz98waCBBRnzA5WrV8wQ+Fh6iBzBrMn37s8J9/+rZBDIivEFsKJQneOThqjJxdPKn0kbdf2l9mAfacHPn2zkP373tu/8nxhqtodWpuDPIi6poMdiNia3LWmj0JGZmY9+V6CC5Rrp3usvqHrlz5kauX9zBer6f/gjTBBKBarqRsJhk0UVNH1po6xwqF1byay8FIOgrXu/1QvuPgGa9HUm2wNUw1GAWXqisFuCJJne9KKlMAL0IkgOQO6ryHFR6Rlhsndq2tDihOHoXJACfDPhvevHjSb77vxktXTB03/M/Jnf9w6+6RQpBODsaghlKDiSAwJYAhDGMFFAngVMQ7R6ZFUKGK6559uDZ+6P7Dtz/6zIy+3o7+WeOjZxNSZhY1InZJqsrOELJaQpI6svG61WuJCCUukAQNrKJCREnI6tP7KxuWzvvB697mpJHoEw8c/JNP314rTRHfbQRHhQSJ/EnRoqen5+c/eHXftO4vPHHs/ieefXDX3uHgi6TTqv25uQj2Qd7wxBp/WnMd4URh5BQAlIhIm57fPHZyVjn7tTdd8r5Ni/DKzWPeiCVQV2e55HPIOKQLZGoFU5SK8WRw4r1LEBEmZgFKpRJQEk1zC9DQlNckZmLHPngnRiTmNDgDc7QWpVxhlKbQhAAWNQEbmm96XLAyFw0bPj59sv/Iuzf98vVru1IHsxLwH29eu3LhtD/7zN1PHD9B1cmRLisxgUjUJArcG3sjBzUPdWoWJanBNWH4Pk55DMMHTzeKpDfHmHeiGqmgStEfXa0oxquWOzjJ6lpkRCoGZQZZVPPxhPrYuXVXXjZjUtdLCQdaC9tXE/tf39z+8dsfLyrTAjqdARZgMEoEZKpZ3lizcvmufWe+/qXbDz83PBSSpKMX5UpI0iBQKEGdqkMcEiQRiaSAkQtMBg8y1mAaHIDQsPrpjQt7f/Mt114+qz/qhPLr9vBfqBLIrLfipvX5p46NQcoRDGYEIoYyR100BZEaGUgdiSGLcLECDJeSUROiYEZSpJbHbCFjgFSZnCMmNicwienCKeBN4wkOzhqeGo3aUG9Z33np4l959/qNs/on9lkA2Owdq6Yu+PU3/8EXHrjr0YNmnQl3CyWFqXOBvGkQGDsQWRE9q6NaiEXfPmIlCqBxq3aUOtNOtaEzRg2QEUHUQEqkRNyoDfdktUqlc6g2ahbItzw7DGpk5FQKCfUbLlsHQEQnBqDx0bSoL8dkoL3DxV9+7f5vbz9ilekakhIRWaamQSHsVZlJKuXKzt1PPJZn5aSkfhKqHTlFFVMjMhedG0FGrFHqOm4GQQpSdswOUjiElHJrjHVwdv3WJR+5cePSsld9/Qz7f7IvgBo6GJdvXHTHY3en3JcbiwkxDK6piw+K/RbMjBSmEcCsIIVrkX3JTJk0UsjJyMgboM3jG/+oOkBYAxMUUOeQJCapidQHEzu7dsWUX/yZ69++vL/8fShiI1KzNVM7/+xXrv+rb2z70ld3nBvJudTvS2lACEXm2HmXaFCHYAywU4reEqQEmLIpiAL5hvmk0sk+Nc0cxRKaI0GByRCybGiw6tLx4SGfcIA0Pz8QGQRZNjpjeu+GlQu/19+7Rc4C0XCBr+4+/Pe3PnpoMFj37DyHY/LRjYaMmBVk5BhmisRXLO3MNAF7hkYlFpLmMM2IDKTEEdfdGheACGxmeb3LWyKj1Bic1d/1/huveM/q6Jn3atf0fDUtwggALt28aOCLDw9mObsKR9tzMJqymHEhYwYTY4AhcdFoPHE5RsMSYiU24ThKberqsLb0OcxzhP57wBIOqWWuGEnC8PqlvTddufkdly/pcXBxg/vC3180qFC1aUy/89bNV8yf+7EvPXT/48/m1u0rXS6pqMHMnGeYi0RAjTuwCXFFUibOHRdmaeIqJa/jOcNFbAIRm5GJeBMZHbNSlzYaYBNVMuc12skbc5KHxuIFC6ZOeV4DKwKHhgVHz2WHT5zbfez044cGd+w/Ps4dUuovxLFT1aBmRgkocETUwVRRSlLRhirAZUOACeJbS8RMFKFOkX/zPFMh6o4iYSQebvxsl41euWHhB65Zt7K/M7qlvgGu/gsJhiOYzZrSdfHm5V/99uG0o0rsFazMavECjeM2qLHBk4HU2IQsMClBDS0WLUjhDAmBYIL4T1WVHdirUTDyVuGA1GXSOJ7yyJK5He+7euO7Llve5/l5cUZ6SZ9gA7zZdSumXLzspr++6/FPfH3n8aGaSo8vlUQb5hAsJRhBoUImRGbU9H1RkBGpSpJwR0d5ZDhnlxpYxEyNjMzUw6yRjZ05m3L0TGJnjo0VJoCqwGTt0vld5UREnWvuVQdz+U//68uP7T87Xuocyy24KpWmFOosGHFQE3OslEDARGSFi9YvzuUhYzYmMo0dUdTC46ZFjYJIm3hYcooECoMxkJBxyCkbndvX8QvXX/yu1TN4AtmCN1D4C8JOhGGA6O1Xrbjn7qcy1AN1NSUZDARyDDWJCwIhdUbOjCw017cUC1NILHiolVQwU3FuQkItOHIGRjHEYSxJ6psX9dx05VXXrJuzuLPUUlrmH+r61iq3rJPp31yz6rrV8z/7nb1f++6eMyOUVHpNUlVV4qDmnAcHQgCEnYc5pUS4BNJc87Sjm3wlhEAW/eeZTKOyp0mtMZ4lTg0eYDNS46ZXkRVEunrV2vNcM5SItx147vYnTjZKA7CqVUqqzpSDiOPouE6mJiTMzsCAj74XBpArGxJturWSmm8ahpBEfa3A5pjF4trLIk2CrLDxof4yv+nipR+4fMH8nnQC+PSGOv0Xjg9AxGo3LJ+88+Z1f/flHZpWlUuigYid5yJvRDMqgrKxwQqOMmzcROREJ5OmnhixFSCC8xAqRB07x8KWS2MsFI3pXW7poq53XLXlHZctG4huDmrExC9bcCWWQ5FRsGZyx5qf23D9lnkf/8Zj2544em7cuXKf4wQkpuY8M1IVNXLGzpjNQIagVk46OO3K8kFvQhTn61E3yhkEJE0Dujhn5HgVwIrG5L6ejatXTJSO8cQ9+PjJ01mSdk0iheVgVoN5atUuCpA5EFEwi4Y0cQ1hzYcNagjNihGkAFkU5QN7F9QY5tgZE6yg+nCPLzYsmvzz126+eG530rr3+Y129i8sIcYx9Zr+h5/ZMjhc++Ldx3xlsiulmWG0yJLUk2hsZD1YWYso4wBmMzJmYkccL0mCOgcxE3Ng8gTJRxFGSIZn9KfXbV1zw6YFly+aFg19oijIj9auRZBnlEu4akHfwl+99rGnn/vMrY/cveu5Rp1KlS6XdgYhFXauLGrGEJM0aAK1EIhT9uUiiOdAVjiKQrGpgifk0kFNnLO1TLlrteKyKzYtmNbdRJgCRDxY2BPPHEt8mUTMYIAYEXPUNY3MdwarNDn4za4+bgniwpEEgIA1kphBCq9M5KiQEF24rciKMNKFfNPc3vdfteqKpTM7mlC/N1DF/xNMgKgH0u3w+x+60pce/NpdT9Tykkv6Ut8t6g3qERwpWUhMfDADjAEQ2DQSdp0CykwhDjDyWmiMcxifN7myav6UravXXr9l6bK+yoTDBfEF+M1xy8hoNtPspTOuXPr223cc+trdT+zYe/bkSJF0DkjqlAEVU/bknQVSCcGCY18qR0KZp8LAYr4JMm3W0XT+opeImNjBrrl4PRGrKjPH/veZE2MHT426pCxFIOfQlFuP/2kub5tNiHm0TMcITZ6KwRhxp6tgI21aOZGYqSWeLBR5oSXKN88uv3nL2vduWNDrJxZtr00th1enMlyUKplc5j/+8NbLFvX96We/e/DkEaFeV+4jnxqETAxCFljFiI0S5QQET8xsJKohz4vCs5ZYejqy9St7bty66ZIFU2ZN6a24Cdf1OMu44AITMFgP0bvWzXvTmnm7nj33j3c9/t2dR4frSV2SckePKBUhM6AwJXK5SVLpcElCeY1gyi5w2Sju8Jr7aWsOE5sdvkoY6O1etWD6eaBXI6Jnnzv93EiBUhdTlGhoLasgBpBzJmZxG9Gc38S/T2hQsIFh5liZgpITciDHbJqNcW24rPUVs6e+74bLrlsyua/sJpzwmNAOf8FlGsxQhr33smUbly/4+v177nzs0JMHD50dKYRS8iVjJ+pIGUyKBpiYhS33lHWmNHtG/5wZ/XOn9ayePXnVomnLJvkJSpNpnM79pNo0agmkQa3KdPHcvos+dMXDzw7fsfvQfTsO7t7/jKCTkk4wiEyIMlC53EHlriwbY+fUEkJJDcwyIfwwAZclNoaFIps3b/qsWbPO2wAYQDsPP5dzueQrFE88yAgWpUOJyBD/azTapqYNn4vsAGYnqrH9UQPYE3MC0rxuxdiMDmxaMffN6+ZesXxu0wWyOSVrn/3nlcUuvIulnadSeCazfafO7H3m9M6nDu87fu7saFDxzhyYSin3d6eTe0pzZwwsnNO/YnplWk9XT3dHiheYeTWXQz/FX1nLkro5kjo73rj96ROfu/3x3QfOjNfq9UJdZ59xmsLqp4+NPXegk4UVCkfMoGDnacA3K3XSJPH18ZGfvWHDX/0//yrqyEfDjsGGfPDPb9l2BKVSj4VMyShWPjBTxMPalJomYtYm/JuZiJm41ambqbmyz4q6a4x3OZnTm16+au5VGxesm95d+mH+p+0X4ILbhDWfApgOlHhg9uStsyfj6hXDQCNAC0QZZOfQl7yYSZOZxvaQ8M+yjyQ6T3HI0N9Rfu+6eW9dN2/nkTMPP3Xs4d2HHnp8/0hIrNSZpmmpsyfURqreEERCro6alnj2vOV9yy8rbFy7jCZWa6ZGvOPwqUMnhnxlJsBKBMdq1rymHUSab0I89wW8NadmZKYJLPGA5KxiEqRRnztQ2bx2wRVLBzbNmTKrJ239GFD71v9pG2XHAV8TTWDx2uoh6vHxZ/L5rGKbKIqbVJhXS3kaH4H4CTuIts4Z2DpnYOi6tU88d+6Rnc8+vOfg8dNjTw4dER8lWIKRarz3tcVWIDCp9xzyRm9X+YZL1z9vgkREwKOHz44H8pVSUQ/ETqNsA2nMGBchUaqAmSooIWIyoRASKyQbM4Seaqm/uzJ/ev/WFbMuXT55QU/Ft678VvPdPuf/HAlwfm09Yfv8Al2/1lvx/Mjk1VkmToCIzQjWy3zprL5LZ/WNvmntiXONv/pk+snPfc1Xe2oFnGOyYCCKoLMm/kGhWq+Pbdm0ZdpA73kbAKopnjlyUl0pLwoQETlFnKNy/IFxuWGwIohJcDbGCCp54kJPCSsWzdiwfOa6GX3zZ02f0euq598o7Sv/VZIA34+dBoDX4K+m5S3RnBcB6CLtmlz+8Fs2fu5LX8ilEGKYsEbcjyOwQZWEjYtCJMsuXrc09U5VmF1EQBwb0/1HzxA5hpDzGrLEgwmkaiGzUJjkbEJE3ZVKb086rcNPndQzd2rfvFlTF87qWd7f2ZXw83Vj60O2T/6rNAFeJ3OD1oumxjDMnT1jyaK5j+w6XqlUVfKIWyA4EAcSOAmBvLjeSmXzosktkZLmAPTw4ecGz57q8N2FqIESEi/iWTtS19df6e/pmtrbObW/a25vOqOvb3J/b2/Vd5Rc6YW+bBpJcW/4iX47AX7qHQKTivZ2VLZsWP3gI0dQaeKiCdxCQEPMCCZ5Pmly1/z58yPwA63t9cWLBv7kX769oATsHBMTl0vlapWmlbiSJEnq0xep303teRgiMbv2b6KdAP9cERvdKzau/duuO9Rg7Jsej3BmTZ5P6n09jC1dsHDutH57Ic6+s1K+YuW8HyI8FkHZaK1A2k3tq9kp/g1YDgFYuGDB9Cn9auqSElFi7MEMZoCdS1QDUFx52UUJ4/u3Lmr2PX+1Aq0hDjtmF5l1hPbhbyfAq+nrIzKzuZM7ly+aKVawd+QcsdMoKs6e4GHa0+mv27rmRTWwmOh7/mpF+6y3E+A1UQWZlRw2rVkqRa1lWRB1veCc9z7Voli5fNH8WQOvzelXOwHa8TLiik1L+3s7irzRsolXstCSfdZN61dUSukbj27VToA3RBtAMFuzZN66VYsb4yMQtSCqhVoQCTBOErduyWwAotr+utoJ8DpMAFUteXfp+hXQApKbBjNREyYKedFRrS5cuGBirduOdgK8PodB61ct6+6oqITIqWcYEeV5PmfGlBWL5hjaUMx2ArxuN2IM4OIV8xZO61IlgqfoFOY8pHHj1jVlgqm1j387AfA6ngV1VsoXb1gTQpb6FMTEiahVS/QzN27FC6GA7WgnwOstVM2At113aZoCJEQJwUmWzZox0Nnd9Upt8NrRToDXXitMwMplC5ctnZvlDe9KMEdSLF0wq6+3u70BaCfA6z0BmMy0v7uyadWiIhszIwaz5ksXTEsdmWq7A24nwOs6AQBVMLBh2ZxSgqLILS9KiV20amGTrt6OdgK87h8BAOtXLu6okGlRFLXpAx3rVy8HwG0AZzsB3gjAOACrF85es2phkY+J1NatmD+1t6ONgGgnAN4wsyAF0c1vuhrIPRcXbV47YXXcjnYC4A3Cj7ls/aop0wbKJbd55aL2zd9OgDfWt2lms6ZPXbNw2uTeZPbU/teqBADalMh2/EjbABGpeLd5yXTKzvX1dLdehXa0E+CNMgtiAJdu2ewZ3nEQ8a5NW3+DaYO2Q1XPDQ0P9E2ydgHUToB2tKPdBOMNiA9tfwntBHhjUyXb0U6AdrSjnQDtaEc7AdrRjnYCtKMd7QRoRzvaCdCOdrQToB3taCdAO9rRToB2tKOdAO1oRzsB2tGOdgK0ox3tBGhHO9oJ0I52tBOgHe1oJ0A72tFOgHa0o50A7WhHOwHa0Y52ArSjHe0EaEc72gnQjna0E6Ad7WgnQDva0U6AdrSjnQDtaEc7AdrRjpeO/x9IU9ntJYsegwAAAABJRU5ErkJggg=="
4
+ MARK_SIZE = 56
5
+ # Raw RGBA pixels, drawn on a canvas: a page's Content-Security-Policy can block a data: image but not a canvas.
6
+ MARK_RGBA = "/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v////3+/v/8/v7//P7+//z+/v/8/v7//P7+//z+/v/9/v///v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/////P7+//3+/////////////////////////////////////////////////////////P7///3+/v///////////////////////////////////////v////3+/v/8/v7//P7+//z+/v/8/v7//f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/////P7+//////////////////D5+v/N7PD/seHp/5/b5v+U2OH/mNrk/6Th6v+56O7/2PP1//n9/P/////////////////9/v7////////////+/////P7+//3//////////////////////////////////////////f////7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f7+////////////9vv6/7Te6f9txNj/PrTR/yWuzf8dr87/ILLP/x+10v8guNP/ILvU/yK91v8sw9j/TMvb/4Ta4//J7vL///7+///////9/////v////////////////////P7+//L8vP/qOnu/5Lk6/+I4+n/oejs/9r09/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z+/v//////+/38/6DV4f9Brcv/IKTJ/x2pzv8krc//LLHS/ym00/8hstD/LrrV/ye71v8ku9f/L8LZ/yzD2v8kxNr/IcTa/yfG2f9Y0t7/vO3w////////////6vj5/7Xs7/9u3eX/NtHd/xXL2/8Jytz/DMvc/xjO3v8i0N3/K8/b/3Td5P/0/fz//v////7////////////////////////////////////////////////////////////////////////////////////////////////////8/v7//////8/o7v9QsM3/HJ3G/x6jzP8bosr/KanL/zCw0P8irtD/LbHO/3nO2/8xutP/Vsna/2HK2/8gutP/LsDa/zPD2v8gwtj/H8fb/yHK3v8nytn/etzi/+v5+v/T8fL/KMzY/yjQ3P9h2uX/gOLq/47k6/+C4Of/Q9bg/x/R3/8n1OL/EM3d/5jm6////////P7+/////////////////////////////////////////////////////////////////////////////////////////////f7+//////+h0eD/IpfA/yCaxv8gn8j/KaTK/4LJ3f+a1uH/IqjL/zGvy//M6/H////+/yuxzf+H1eL//////4vV4/8Vtc//TMnb/6vm6/9Zztz/JcXW/yvN3f8ezNz/OdHb/9L09f/w+/z/5/j5///////////////////////q+vv/YNnj/yTQ3v8n0+D/Utfh//3+/v////////////////////////////////////////////////////////////////////////////////////////////z+/v//////kcbc/xiSwf8lm8r/GpXB/1ivy//S6vD//f3+/0221P8pqc3/1Ozx///////w+Pr/LLLP/4DS4v/+/////////5LY4/8Yt9H/pODq//////+l5On/M8jY/yPJ3f8lz97/NM3Y/9Dx8///////+/7+//z+///8/v7/+v7+///////l+Pj/NdHe/yLR4v890t//8/z8///////+///////////////////////////////////////////////////////////////////////////////8/f7//////4/D2f8ViL3/KZfH/ySWxP+Oydv//P39//////93wNf/CpbC/7jg6////////f7///T6+v8sr87/gtHi///////6/f7//////2fN3f8XuND/yu7y///////Z9fb/WdHe/yrL3f8r0d7/Lc3Z/8fw8////////f7//////////////v////3//v9N2OL/GtDh/0TV4P/2/Pz///////7//////////////////////////////////////////////////////////////////////////f7+//////+01eX/GIO6/yqSxP8di7r/lsrb////////////1Ovx/xSVwP9lt9H///////r9/v//////9Pr7/yyvzf+C0eH///////n9/v/+////3/T2/x650P9Xy9z//v7+///////+/vz/TdDd/yTN4P8h0OD/Ms/b/+T4+f/+/////f///////////////f/+/1LY4v8az97/VNfi//7//v////////////////////////////////////////////////////////////////////////////3+/v//////4+/0/y6Qwf8jjcX/JI7E/xmNwf85nMf/jcbb/+Dv8/9pt9H/IJvF/+Tz9////////P3+//3+/v/x+fr/KqzL/3/P4P/8/v7/+/7+//3+/v//////oeDo/xq40f+y5u3/xu7x/2fU4f8qxtj/JsnZ/yjP4P8gz93/atng///+/v/9/v///f/////////s+vr/PNLf/xvO3v+F4uf///////z+/v///////////////////////////////////////////////////////////////////////f7+//////9jp8r/GYXE/xmKxP92uNb/sdnm/z2dxf8Ihbn/JZS//x+Twv9Iqc7/1Ovx//T6+v///////////////f8qqsn/hdHh/////////////v7+/+v3+P+t4+r/JrrU/yvA1f8YvNL/HL/V/3zZ4//H7/D/Ss7a/y3O3v8lzNr/q+nt///////6/v7//v///8Dw8v8hzt7/Jc/c/8fw8v///////f7+//////////////////////////////////////////////////////////////////z9/v//////wtvn/xl5uP8ghMD/OpTD//H3+f//////+fv7/7ja5v8/ocj/H5XG/x2Wxv8TksL/Lp7E/0esy/9fudL/bsPZ/yut0f9Lvdj/csfc/1a81f9Ct8//KbPN/xmzzv8rvNP/I7zU/3fW4v/e9ff////////////A6/D/Icna/yPQ4f830d//7fr7//7/////////et/o/xDL3v9K1d//9/39///////+/////////////////////////////////////////////////////////////////////f7+//////9jpMv/GXu9/xd7t/+ozd////////n8/f///////////0eiyP87ncT/wuPs/5DJ2/9htdL/R6vN/zKmyv8qpcr/JafP/yOpzv8trc7/PLTR/1G81P9vy97/reHq/7jm7P8kt9H/nt7o///////5/f7/+/7+//////9l1uH/H8re/x/M3f+g6Oz//v///+v5+f8/0N3/Fsne/57m7f///////P7+//////////////////////////////////////////////////////////////////3+/v//////4+7z/yqEvf8Yfr//RZXD//n8/f/+/v///P7+//7////X6fD/Eoi8/4bC2///////////////////////+Pv7/+Hw9P8onsL/f8fZ//P5+////////////////////////////0O+1v9Lw9j//f7+//7////8/v7//////9Hx9P8sxtj/Jsvc/1nT3f//////m+Lq/xvI3P9L0N7/9Pz8//7////+/////////////////////////////////////////////////////////////////////P3+//////+cw9v/EnS2/xV5uv+UwNr///////z9/v/8/f7//////6PO4P8Jf7b/xODr//z+/v/4+/z/+vz9//v9/v///////////+j1+P///////////+Lt8v+10OH/hrXS/+Tu8v/+////es7e/yCzzv/j9vf///////3+///+/////////2XT4P8Lwtb/muTq/+z6+/81zd3/IMna/7Pp7f///////P7+///////////////////////////////////////////////////////////////////////9/v7//////2Gfxv8OcLL/Hniz/9Xl7f///////f7+//z9/v//////Z6vO/w58sv/k8fT//v7////////////////////////h7PH/vtTh/4az0f9SksD/K3u0/xJrrf81g7n/9vr7//////+w4en/Fq3J/8Hq7////////P7+//z+/v//////nuHo/0fI2f//////btfj/wrF3P9f1eD//v7+//3+/////////////////////////////////////////////////////////////////////////v/////////6/Pz/QIvA/xF1uv88jb7/+fz8//7+/v/8/P3/+/z9//3+/v+11OP/zOXv////////////5u3x/7zP3v+Grcz/UIm0/yhupP8UYZ7/EWCj/xdsr/8ler3/F3K1/32tzf///////v///9Lt8v8dr83/oNzo//7////7/v7//v7+///////k9Pb/6/b3/8Dr8P8ewtf/LMba/9bz9v///////f7////////////////////////////////////////////////////////////////////////9/v7//////+Dr8f8UbK3/AGSt/12dw//+/v7///////////////////////X19v/K1uL/iqrF/0+Cq/8oZJr/FFaW/xFWmP8WX6D/IHKq/yiFtv8qncD/K63K/yd/uP8ZbrH/uNPk////////////6vf5/yKuzP+C0OH///////7//v///////f7+///////j9vj/OMLU/ybA2f+k4+n///////3+/v///////////////////////////////////////////////////////////////////////v7+//v8/f/7/P3/2+bu/3Ghw/+xzuH/9vv8///////u8fT/w8/d/4qjvf9QeaH/JleL/w9Kh/8NSon/E1KS/xxinv8ieKr/KJG5/yyvyv8wx9j/Ndvi/zba5f8rqc3/IG2t/y10q//o8PT///////3+/f/z+vr/La7M/2TE1//7/fz/+v39//L5+v/9/v7/9vz8/1DB1f8Zt9L/RcXZ//j9/f/+/////v////////////////////////////////////////////////////////////////////7+/v////////////////////////37/9je5f+Wqr//VHaW/ytUg/8RQ3z/CD99/w5Fg/8WVI7/HmeZ/yOBrP8ooMH/MLvR/zTN2/8z19//M9nh/zLa4f8xzdz/KafN/yqNv/8VaKf/V5G9//////9qvNL/M6vN/z610/8ssND/LbDP/zqz0f8zsMr/lNHe//////94ztz/IrXS/yi51f8+vdX/8/v7///////+//////////////////////////////////////////////////////////////////////////j5+f/O1d3/kqS4/1lykf8pUHz/DD1y/wIza/8HN23/EUR7/xpWiv8gcKD/Joy4/ymlyP8tt9T/L8Hb/zDH3P8xydr/McvZ/zHM2P8x1N3/Ms/e/yejyf8on8r/Jn6w/xBcmv+WuNL//////2m70v9WuNL/Xb/X/y+x0v87t9T/XsTa/3nK2v/5/f3/h9Hf/x+w0P8wudX/KLjV/z+91P/y+vv///////7////////////////////////////////////////////////////+/v7//v7+/+Ll5v9sgZj/HERw/wAvZP8AL2X/CjVo/w85a/8WQnP/HGCU/yB+tv8jj8T/JprH/yikzf8prNH/KrHS/yq10/8suNT/Lr7V/zDD2P8xx9n/Mc/b/zDL2v8mn8j/KJjH/ymcyv8hbaX/GV2Y/8vZ5f////////////////////7/NqzK/1290f///////////5TU4/8Xp8r/LrHN/zm30v8kstL/S73V//f7/P///////v//////////////////////////////////////////////////////////////+vv7/93i5v+jssL/V3WX/x1Cb/8FL2L/ETlq/xZAcv8YXJL/H3uy/ySPwf8km8v/JqHN/yekzP8oqc3/Kq/P/yy20/8uvNb/L8DX/zHI2P8yxtn/JpvH/yWOw/8nmMj/KIu+/xhdnf87dKj/9vn5///////8/f7//f7//+74+v8mpMX/kc/f//////+Jy9z/HanQ/yitz/+t3+j/Vr7S/xerzf9RvtP//v7+////////////////////////////////////////////////////////////////////////////////////////////4OTp/5ipu/8hUof/Dj93/xM5aP8MM2b/E0Fy/xxei/8jgbL/KJ/M/yut1P8rs9X/KrPS/yy20/8uwNf/MMDY/yWXx/8ki8X/JZHF/yeVyf8kerD/EFCS/3CXuv///////P3+//7+/v//////3u7x/6vX4v//////fsTY/xebxf8eosb/sd/q//j8/P85s9L/HK3O/2rF2P///////f7////////////////////////////////////////////////////////////////////////+/v7//P39//39/v///////////2Gc0f8EWqv/FlOP/y1Vff8XPW7/Ay9l/ww4bv8YTYH/H2aT/yWJsf8rrc//L7/b/y661v8kksT/I4TD/yWLxf8ljMT/J5DH/yBooP8PTIr/qsHT///////8/P3///////z9/v//////+fr6/2260v8ZnMn/KKHJ/6vY4///////uOHq/yOqzv8fq8//kdPk///////8/v7////////////////////////////////////////////////////////////////////////////9/v7//////8rb5/+8z9//rMjf/wRbsf8HZbn/e6zQ/9vf5f+EmbH/N1p//w4zZf8GLWT/DTtv/xdUhP8geaL/I4rA/yJ/v/8jhsH/JIbC/yWKxf8lhb7/GFaP/xxVif/f5+3///////z9/f/9/v7//////9bp7/9EocX/D47A/zGhyP/B4uv///////////91xNv/HqXQ/yapzP/E5u3///////z+/v///////////////////////////////////////////////////////////////////////v////z9/v////7/M3az/1iOwP/2+fn/Gm24/whnvf8neL3/9vz+///////4+vr/wszX/3aRqv8tVn//FD5s/xM4av8ea6n/IoXG/yKBvv8kgr//JojG/yR3sP8PSoX/Snig//7+/v/7/P3///////////+q0uP/MJjG/xOOwv9Docb/0ejw///////7/f7/6vX4/zWnzP8gpc3/RbDQ//b6+////////v/////////////////////////////////////////////////////////////////////////8/f7//////57A3v8AVKv/x9np//////9rn8z/BWK4/wVgsv9/rM/////+//3+//////////////n5+P9Od5z/Czlt/xxhmv8hgcP/IH+8/yOAv/8lhcP/H2Wa/whDfP+Ipb7////////////p8fT/aK7L/xqIvf8ajsT/W63O//z9/P//////9vv8//////+KyNv/GpnG/xubyP+DyNv///////z+/v///////////////////////////////////////////////////////////////////////v7///7+///s8/b/EmGy/2edz////////v7//9fj7f8QYq7/Ema2/xdssv/a6PH//v7///n7/P////7/iLrY/xdmo/8WPGv/Fkl8/x55uP8gfr7/IoHB/yN/vv8aUYb/DkBy/8PQ2//9/v7/qc3h/zWSxP8Nfbv/JozA/xyIuv9Po8j/vd3p//X5+v//////4fD0/zCfx/8mnsn/KZzD/9ru8////////f7+///////////////////////////////////////////////////////////////////////8/f7//////36n0f8ATqn/2+fw//7+///6/P3//////3mmzv8DXbP/CGW6/z6Dvv/8/f3//////3+v0f8Lb7b/G3Gy/xE9b/8UPmz/HG6v/x57vf8ffr7/IHa3/xJGfP8oVYL/+/r6/5W91/8EbrH/EX68/1OkzP8xksb/KIzB/ySOwP8Jgbn/O5nE/5/P4P9dr87/IZjJ/x6axv+Extr///////3+/v///////////////////////////////////////////////////////////////////////v7////////y9/n/FWKz/0J+wP///////f7///7+///9/v7/9Pj6/zZ9v/8PZLL/qMbe//L29/9flsT/C2az/xd1vf8ee7//LV2L/xA3aP8bYqD/H3i//x54u/8eYJr/Cjlw/2OBo///////N4a5/yuBt/+tzd//v9vm/wx9uf+Lvtn/4u/z/4vB2P87nsz/FovA/yWRwP8hlMX/PKLH/+/4+f/+/v///v7////////////////////////////////////////////////////////////////////////8/f7//////7HL5P8ATbH/h7DX//7+///7/P7///////3+/v/+/v//3efv/+Pr8f/k7fL/PX+6/wVhsP8acLj/E2ux/6zN5P+ntsX/Ay9i/xpTjP8ed8D/HnS6/xtPgf8GMWT/pbPD//H3+v+PuNH/7fP2//////9Gk7//IH+4/+jx9P///////////4C71P8ei8D/KJPE/xuKuP/A3+j///////3+/v////////////////////////////////////////////////////////////////////////////v9/v//////b6DO/wFNtP+Vu97///////f6/f/8/f7/////////////////n77b/xptt/8NaLv/HHG8/wpjsf+ZvNT//////9/l6f8VPGf/FD5t/xxxtv8cdLv/FkV4/xY+aP/Y3eP/////////////////mcXd/wBssv+Rvtj///////D3+f9ystL/G4jA/yaRx/8Xib7/n83e///////8/f7//////////////////////////////////////////////////////////////////////////////////v7///////9KiMT/AVS3/0iFwP/7/Pv////////////3+fr/rcje/zt9uv8CXK//CWO3/wZitP8PZ7n/FW25/yx6u/+TuNb/+fr6/1Bphv8GLFj/G2Og/xtpq/8LOWz/QGSI//v8/f/6/P3//////8fd6P8Ud7j/VJ7L/////f+61+X/PpG9/xWAu/8fisT/GIW9/5zK3////////P3+///////////////////////////////////////////////////////////////////////////////////////9/v///////0qExP8EWbT/CFuy/0B/wv92os//ZZjJ/zR6wf8HX7b/Aly1/wBZsv8mcLX/iLDT/zN8u/8CXrP/EWe4/wdhsP9DicP/Q3Sf/wsyYP8YU4z/GlKJ/wQsWf96kKj////////////F2+j/JHq1/xd2s/+GuNH/Y6TL/xl/vP8dgr//F369/yODuf+v0uP///////z9/v////////////////////////////////////////////////////////////////////////////////////////////v8/v//////f6jP/wBNr/8VZMD/B1y6/wBVsv8AU7D/AFWz/wFas/8dbbr/e6XP/+bu8///////5u/0/2SXxv8PY7H/DGO0/wxpu/8UZK7/FT5u/xRCdP8XQ3L/BC1a/77Gz//k7vP/cqfM/yF7vP8Xdrv/In26/xh3tv8Ud7j/GH28/xV7u/9Ynsn/2Oju///////8/f7//////////////////////////////////////////////////////////////////////////////////////////////////v7///7+///v9fn/V43F/wdasv8GV6//DV2y/x5qt/9Dgb7/jLHS/+Ps8v////////////v8/v///////////8LX5/9ZkcP/F2y4/wdfr/8NOmz/FDtp/w86bf8fR3P/+fn3/4Sv0v8AXqz/HXi//xx6v/8Wdr3/EXO4/xZ1tP9EkL7/rc7h/////////////P3+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////0eDq/7XM4f/F1+j/5e7z//////////////////z9/v/+/v7///////7+/v/9/f7////////////T4uz/ha/Q/zJgjP8ROGX/BzFi/1Vxj///////NH+6/wRksv8RarL/GHG1/zmGvv9xqdD/vdfn//39/f///////v////3+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7///7//////////////////////////v////v9/v/+/v7////////////////////////////9/f7//f7/////////////vMfR/wszX/8ELFn/kqGz//7+/v+Yvdf/oMPd/7zU5P/X5e//9/r6//////////////////z9/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/v/8/f7//P3+//7+/v///////////////////////////////////////////////////////P3+//z9/v/v8fT/Jktz/ws0Yv/P1t3//////////////////////////////////P3+//z9/v/+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f3+//////9Yco//I0hx//n7+///////+/z9//v9/v/8/f7//f7+//7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/P3//////5anuf9Ub47///////z9/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/v//////1dvg/6q2wP///////P39///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v3/+vr6/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////w=="
@@ -0,0 +1,196 @@
1
+ """Launching Chrome, waiting for pages to settle, shutting it down, and recording how it was set up."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import logging
7
+ import os
8
+ import time
9
+ from pathlib import Path
10
+ from typing import Any, Dict, Optional
11
+
12
+ logger = logging.getLogger("forgeqe_engine.service")
13
+
14
+
15
+ PAGE_SETTLE_SECONDS = 8.0
16
+
17
+
18
+ BLANK_TAB_SECONDS = 3.0
19
+
20
+
21
+ _PAGE_STATE_JS = (
22
+ "(() => ({url: location.href, ready: document.readyState, "
23
+ "text: ((document.body && document.body.innerText) || '').trim().length}))()"
24
+ )
25
+
26
+
27
+ def page_settled(state: Optional[Dict[str, Any]]) -> bool:
28
+ """A page the agent can read: loaded, or far enough along to show its content. Unknown counts as settled."""
29
+ if not isinstance(state, dict):
30
+ return True
31
+ url = str(state.get("url") or "")
32
+ if url in ("", "about:blank"):
33
+ return False
34
+ if not url.startswith("http"):
35
+ return True
36
+ ready = state.get("ready")
37
+ return ready == "complete" or (ready == "interactive" and int(state.get("text") or 0) > 200)
38
+
39
+
40
+ async def settle_page(browser: Any, *, timeout: float = PAGE_SETTLE_SECONDS, blank_timeout: float = BLANK_TAB_SECONDS) -> float:
41
+ """
42
+ Wait for the tab the agent is on to finish loading before the library reads it; returns the seconds waited.
43
+
44
+ A click that opens a new tab switches the agent to it within milliseconds, and the library then waits only
45
+ a fraction of a second, so a heavy page was read blank and the model spent a step waiting for it.
46
+ """
47
+ started = time.monotonic()
48
+ while True:
49
+ try:
50
+ session = await asyncio.wait_for(browser.get_or_create_cdp_session(), timeout=2)
51
+ r = await asyncio.wait_for(
52
+ session.cdp_client.send.Runtime.evaluate(
53
+ params={"expression": _PAGE_STATE_JS, "returnByValue": True}, session_id=session.session_id
54
+ ),
55
+ timeout=2,
56
+ )
57
+ state = ((r or {}).get("result") or {}).get("value")
58
+ except Exception:
59
+ return time.monotonic() - started
60
+ waited = time.monotonic() - started
61
+ if page_settled(state):
62
+ return waited
63
+ blank = str((state or {}).get("url") or "") in ("", "about:blank")
64
+ if waited >= (blank_timeout if blank else timeout):
65
+ return waited
66
+ await asyncio.sleep(0.25)
67
+
68
+
69
+ _BROWSER_USE_CHANNELS = frozenset(
70
+ {"chrome", "chromium", "chrome-beta", "chrome-dev", "chrome-canary", "msedge", "msedge-beta", "msedge-dev", "msedge-canary"}
71
+ )
72
+
73
+
74
+ # The library injects these; modern Chrome shows a yellow "unsupported command-line flag" bar.
75
+ _UNSUPPORTED_BROWSER_USE_ARGS = (
76
+ "--extensions-on-chrome-urls",
77
+ "--disable-blink-features=AutomationControlled",
78
+ )
79
+
80
+
81
+ _MAC_CHROME_EXECUTABLE = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
82
+
83
+
84
+ def resolve_browser_channel() -> str:
85
+ """Default is installed Google Chrome (`chrome`). Override with BROWSER_USE_CHANNEL (e.g. `chromium`)."""
86
+ raw = (os.getenv("BROWSER_USE_CHANNEL") or "chrome").strip().lower()
87
+ return raw if raw in _BROWSER_USE_CHANNELS else "chrome"
88
+
89
+
90
+ def resolve_chrome_executable_path(channel: Optional[str] = None) -> Optional[str]:
91
+ """Return a local Chrome/Chromium binary path when we can find one for the channel."""
92
+ ch = (channel or resolve_browser_channel()).strip().lower()
93
+ env_path = (os.getenv("BROWSER_USE_EXECUTABLE_PATH") or "").strip()
94
+ if env_path and Path(env_path).is_file():
95
+ return env_path
96
+ if ch == "chrome":
97
+ mac = Path(_MAC_CHROME_EXECUTABLE)
98
+ if mac.is_file():
99
+ return str(mac)
100
+ try:
101
+ from browser_use.browser.chrome import find_chrome_executable
102
+
103
+ found = find_chrome_executable()
104
+ if found and Path(found).is_file() and "chrom" in Path(found).name.lower():
105
+ if "chromium" not in Path(found).name.lower():
106
+ return found
107
+ except Exception:
108
+ pass
109
+ return None
110
+
111
+
112
+ def local_browser_launch_kwargs(*, headless: bool) -> Dict[str, Any]:
113
+ """
114
+ Kwargs for Browser(is_local=True) on library 0.13+.
115
+ Prefer installed Google Chrome and drop flags that trigger Chrome's unsupported-flag infobar.
116
+ """
117
+ channel = resolve_browser_channel()
118
+ kw: Dict[str, Any] = {
119
+ "is_local": True,
120
+ "headless": headless,
121
+ "channel": channel,
122
+ "ignore_default_args": list(_UNSUPPORTED_BROWSER_USE_ARGS),
123
+ }
124
+ exe = resolve_chrome_executable_path(channel)
125
+ if exe:
126
+ kw["executable_path"] = exe
127
+ elif channel == "chrome":
128
+ # No Google Chrome here: let the library use its own Chromium instead of failing on the channel.
129
+ kw["channel"] = "chromium"
130
+ return kw
131
+
132
+
133
+ async def _shutdown_browser_instance(browser: Any) -> None:
134
+ """Stop the library gracefully, falling back to kill()."""
135
+ if browser is None:
136
+ return
137
+ for name in ("stop", "kill"):
138
+ fn = getattr(browser, name, None)
139
+ if not callable(fn):
140
+ continue
141
+ try:
142
+ res = fn()
143
+ if asyncio.iscoroutine(res):
144
+ await asyncio.wait_for(res, timeout=90.0)
145
+ return
146
+ except Exception as ex:
147
+ logger.debug("engine library: browser.%s() failed: %s", name, ex)
148
+
149
+
150
+ async def _stop_agent_instance(agent: Any) -> None:
151
+ if agent is None:
152
+ return
153
+ for name in ("stop", "kill"):
154
+ try:
155
+ fn = getattr(agent, name, None)
156
+ if callable(fn):
157
+ result = fn()
158
+ if asyncio.iscoroutine(result):
159
+ await result
160
+ except Exception as ex:
161
+ logger.debug("engine library agent.%s failed: %s", name, ex)
162
+
163
+
164
+ _BROWSER_PROFILE_JS = """(() => ({
165
+ user_agent: navigator.userAgent,
166
+ webdriver: navigator.webdriver === true,
167
+ language: navigator.language,
168
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
169
+ viewport: [innerWidth, innerHeight],
170
+ }))()"""
171
+
172
+
173
+ async def browser_profile(browser: Any, launch: Dict[str, Any]) -> Dict[str, Any]:
174
+ """How this run's browser was set up, so a test whose browser gets a different page can compare the two."""
175
+ driver = "ForgeQE engine over the Chrome DevTools Protocol"
176
+ profile: Dict[str, Any] = {
177
+ "driver": driver,
178
+ "channel": launch.get("channel") or "",
179
+ "executable": launch.get("executable_path") or "",
180
+ "headless": bool(launch.get("headless")),
181
+ "removed_default_args": list(launch.get("ignore_default_args") or []),
182
+ "extra_http_headers": {},
183
+ }
184
+ try:
185
+ session = await browser.get_or_create_cdp_session()
186
+ send = session.cdp_client.send
187
+ info = await asyncio.wait_for(send.Browser.getVersion(), timeout=5)
188
+ profile["version"] = str((info or {}).get("product") or "")
189
+ r = await asyncio.wait_for(
190
+ send.Runtime.evaluate(params={"expression": _BROWSER_PROFILE_JS, "returnByValue": True}, session_id=session.session_id),
191
+ timeout=5,
192
+ )
193
+ profile.update(((r or {}).get("result") or {}).get("value") or {})
194
+ except Exception:
195
+ logger.debug("browser profile not read", exc_info=True)
196
+ return profile