From 1f922b25abff2d7fd87fa5b29619160862a06b59 Mon Sep 17 00:00:00 2001 From: Nick Petalas Date: Fri, 16 Oct 2026 21:21:46 +0100 Subject: [PATCH] feat(research): share the rank-seven restore covector --- .../rank7-shared-restore-fanin/.gitattributes | 5 + .../rank7-shared-restore-fanin/ENGINEERING.md | 80 +++ .../GIT-SOURCES.json | 11 + research/rank7-shared-restore-fanin/README.md | 253 +++++++ .../rank7-shared-restore-fanin/SOURCES.json | 54 ++ research/rank7-shared-restore-fanin/TASK.json | 83 +++ .../rank7-shared-restore-fanin/VENDOR.json | 32 + .../rank7-shared-restore-fanin/VERIFY.json | 35 + .../rank7-shared-restore-fanin/decisions.tsv | 6 + .../evidence/ADMISSION-RESULT.json | 382 +++++++++++ .../evidence/ADMISSION-STAGES.json | 113 +++ .../evidence/BINDINGS.json | 28 + .../evidence/EDIT-DERIVATION.json | 59 ++ .../evidence/ENVIRONMENT.json | 19 + .../evidence/FINITE.json | 341 ++++++++++ .../evidence/INVOICE.json.gz | Bin 0 -> 12653 bytes .../evidence/NATIVE-RECEIPT.json | 113 +++ .../evidence/RECIPE.json | 243 +++++++ .../evidence/RELEASE-RECEIPT.json | 7 + .../evidence/RESULT.json | 18 + .../evidence/SOURCE-MANIFEST.json | 644 ++++++++++++++++++ .../evidence/STAGES.json | 80 +++ .../evidence/WORD-base.json.gz | Bin 0 -> 96078 bytes .../evidence/WORD-extra.json.gz | Bin 0 -> 96070 bytes .../evidence/logs/complete-admission.log.txt | 8 + .../evidence/logs/declared-edit-stage.log.txt | 1 + .../logs/derive-closed-adapters.log.txt | 1 + .../evidence/logs/export-pr2833.log.txt | 1 + .../evidence/logs/export-pr2894.log.txt | 1 + .../evidence/logs/four-kernel-stage.log.txt | 1 + .../logs/fresh-current-native.log.txt | 3 + .../logs/fresh-retained-bootstrap.log.txt | 6 + .../logs/paired-extension-stage.log.txt | 1 + .../evidence/logs/parent-paired-stage.log.txt | 1 + .../evidence/logs/preload-stage.log.txt | 1 + .../evidence/logs/rank7-overlay-stage.log.txt | 1 + .../evidence/logs/source-preflight.log.txt | 1 + .../rank7-shared-restore-fanin/frame_trace.py | 78 +++ .../rank7-shared-restore-fanin/reproduce.py | 367 ++++++++++ .../rank7-shared-restore-fanin/rewrite.py | 96 +++ .../rank7-shared-restore-fanin/test_verify.py | 129 ++++ .../vendor/PR3015-CREDITS.md | 17 + .../vendor/PR3015-NOTICE | 28 + .../vendor/PR3030-FINITE.json | 94 +++ .../rank7-shared-restore-fanin/vendor/R1.json | 216 ++++++ research/rank7-shared-restore-fanin/verify.py | 388 +++++++++++ .../verify_release.py | 277 ++++++++ 47 files changed, 4323 insertions(+) create mode 100644 research/rank7-shared-restore-fanin/.gitattributes create mode 100644 research/rank7-shared-restore-fanin/ENGINEERING.md create mode 100644 research/rank7-shared-restore-fanin/GIT-SOURCES.json create mode 100644 research/rank7-shared-restore-fanin/README.md create mode 100644 research/rank7-shared-restore-fanin/SOURCES.json create mode 100644 research/rank7-shared-restore-fanin/TASK.json create mode 100644 research/rank7-shared-restore-fanin/VENDOR.json create mode 100644 research/rank7-shared-restore-fanin/VERIFY.json create mode 100644 research/rank7-shared-restore-fanin/decisions.tsv create mode 100644 research/rank7-shared-restore-fanin/evidence/ADMISSION-RESULT.json create mode 100644 research/rank7-shared-restore-fanin/evidence/ADMISSION-STAGES.json create mode 100644 research/rank7-shared-restore-fanin/evidence/BINDINGS.json create mode 100644 research/rank7-shared-restore-fanin/evidence/EDIT-DERIVATION.json create mode 100644 research/rank7-shared-restore-fanin/evidence/ENVIRONMENT.json create mode 100644 research/rank7-shared-restore-fanin/evidence/FINITE.json create mode 100644 research/rank7-shared-restore-fanin/evidence/INVOICE.json.gz create mode 100644 research/rank7-shared-restore-fanin/evidence/NATIVE-RECEIPT.json create mode 100644 research/rank7-shared-restore-fanin/evidence/RECIPE.json create mode 100644 research/rank7-shared-restore-fanin/evidence/RELEASE-RECEIPT.json create mode 100644 research/rank7-shared-restore-fanin/evidence/RESULT.json create mode 100644 research/rank7-shared-restore-fanin/evidence/SOURCE-MANIFEST.json create mode 100644 research/rank7-shared-restore-fanin/evidence/STAGES.json create mode 100644 research/rank7-shared-restore-fanin/evidence/WORD-base.json.gz create mode 100644 research/rank7-shared-restore-fanin/evidence/WORD-extra.json.gz create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/complete-admission.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/declared-edit-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/derive-closed-adapters.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/export-pr2833.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/export-pr2894.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/four-kernel-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/fresh-current-native.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/fresh-retained-bootstrap.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/paired-extension-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/parent-paired-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/preload-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/rank7-overlay-stage.log.txt create mode 100644 research/rank7-shared-restore-fanin/evidence/logs/source-preflight.log.txt create mode 100644 research/rank7-shared-restore-fanin/frame_trace.py create mode 100644 research/rank7-shared-restore-fanin/reproduce.py create mode 100644 research/rank7-shared-restore-fanin/rewrite.py create mode 100644 research/rank7-shared-restore-fanin/test_verify.py create mode 100644 research/rank7-shared-restore-fanin/vendor/PR3015-CREDITS.md create mode 100644 research/rank7-shared-restore-fanin/vendor/PR3015-NOTICE create mode 100644 research/rank7-shared-restore-fanin/vendor/PR3030-FINITE.json create mode 100644 research/rank7-shared-restore-fanin/vendor/R1.json create mode 100644 research/rank7-shared-restore-fanin/verify.py create mode 100644 research/rank7-shared-restore-fanin/verify_release.py diff --git a/research/rank7-shared-restore-fanin/.gitattributes b/research/rank7-shared-restore-fanin/.gitattributes new file mode 100644 index 0000000000..ccceda6408 --- /dev/null +++ b/research/rank7-shared-restore-fanin/.gitattributes @@ -0,0 +1,5 @@ +# Preserve exact pinned predecessor bytes, including their original newlines. +vendor/** -text +evidence/** -text +# R1 is retained byte-for-byte with its original CRLF line endings. +vendor/R1.json whitespace=cr-at-eol diff --git a/research/rank7-shared-restore-fanin/ENGINEERING.md b/research/rank7-shared-restore-fanin/ENGINEERING.md new file mode 100644 index 0000000000..3e5c38dde3 --- /dev/null +++ b/research/rank7-shared-restore-fanin/ENGINEERING.md @@ -0,0 +1,80 @@ +# Engineering and verification limits + +Build the Lever led to a deterministic rewriter rather than hand-edited final +words. Retained word containers bind the actual released source and native run. +Prove It Works led to actual-word forward/dual audits, a separate frame census +and an explicit complete source release. Power of Ten +shaped the bounded inputs, process cleanup and refusal of existing work paths. + +## Scope and bounds + +New code has no recursive algorithm, retry loop or concurrent writer. The +rewriter touches one pinned pair of words. It accepts restore lengths 203 or +204, checks literal source and consumer contacts, and changes only restore, +report and derived cleanup. The separate frame census has at most 4,100 A +gates, 1,900 B gates, 204 restore gates, 72 warps and four registers. Its +subspaces contain at most 512 vectors; its cache holds at most 128 entries. + +The finite check also compares all 704 columns of the literal restore operator +with a separate rational implementation. Its bounded matrix has 704 rows and +at most 204 gates. It runs eight positive actual-word audits and fourteen +rejecting audits, sequentially, each with a 30-second timeout. Two additional +controls exercise the source-observer boundary. Unit tests cover the exact consumer +preimage, source-address order, unchanged scalar count, pin failures and recipe +argument changes. New checks use exceptions, not disableable assertions. + +The complete release is opt-in. It requires POSIX and enabled assertions for +the inherited validators. A stage has a 1,800-second timeout and its process +group is terminated on every exit. One recipe has thirteen stages including +preflight, and jobs are fixed at one. A new external work path owns all exports, +words and logs. Failures retain that explicit directory. The cheap default +verification uses a private temporary directory and removes it on normal +success or exception. Hard kills may bypass cleanup. + +Every external Python engine is authenticated before loading. A fresh +bytecode namespace prevents preexisting caches from replacing source bytes. +The inherited script runner receives the same isolation. Direct driver calls +can still read preexisting caches for their own initial imports; use a clean +checkout or a fresh PYTHONPYCACHEPREFIX. The registered launcher isolates the +whole interpreter. No claim is made that -B alone prevents cache reads. The +source release exports one exact Git package, validates its complete manifest, +and changes +only declared data and descriptive source labels. No frozen input is edited. +The stage program copies and their notices remain byte-identical. + +## Runtime deviations + +- Rule 1, library recursion. Python's JSON and deepcopy implementations may + recurse through the fixed acyclic word containers. Source authentication + fixes their shape and finite size. No new recursive traversal is introduced. + The interpreter's library stack is outside this package's control. An + iterative copier would be needed if arbitrary nested input were admitted. +- Rule 3, allocation. Python's containers, exact integers, JSON and subprocess + libraries allocate dynamically. Fixed input pins, at most 2 MB per ordinary + input, the explicit frame limits and serial audits bound the new computation. + The full inherited scientific toolchain has its own memory costs. It is not + claimed to be a fixed-memory implementation. Reassess capacity before adding + arbitrary words, larger geometries or parallel execution. +- Rules 8 and 9, source loading. Three fixed, pinned inherited Python engines + are loaded from explicit paths. This avoids copying or modifying scientific + predecessors. No user-selected module or evaluation string is accepted. + The full recipe invokes the pinned predecessor's literal code adapters; + their generation mechanisms and inherited assertions are unchanged. Moving + those adapters into shared code would need a separate source-binding review. +- Rule 10, inherited diagnostics. The new Python paths receive configured Ruff + checks and Python warning/compilation checks. Upstream Python and C++ tools + keep their original diagnostics and proof checks. Reformatting or repairing + frozen source packages is outside this change; their assumptions remain + explicit rather than being described as universally verified. + +Before publication, run configured Ruff plus `--select E,F,I,B,UP,C4,SIM`, +`ruff format --check`, warning-as-error unit tests, and Python compilation with +a fresh cache prefix. The actual full environment is in +`evidence/ENVIRONMENT.json`. Normal and optimized finite runs check the same +literal evidence. All new functions remain below 60 physical lines. Every new file is scoped +to this package. Stored scientific evidence omits disposable exports, binaries +and regenerated fill files. Compression-container hashes bind recorded replay +inputs; canonical decoded word hashes establish cross-environment equality. +The pinned R1 JSON retains its original CRLF bytes. Its single-file +`whitespace=cr-at-eol` attribute recognizes that source convention without +normalizing the scientific input or changing its hash. diff --git a/research/rank7-shared-restore-fanin/GIT-SOURCES.json b/research/rank7-shared-restore-fanin/GIT-SOURCES.json new file mode 100644 index 0000000000..392925ea4a --- /dev/null +++ b/research/rank7-shared-restore-fanin/GIT-SOURCES.json @@ -0,0 +1,11 @@ +[ + {"head":"e244296debb45fe6f4da84d29e4d64fbab55fda0","path":"research/rank7-joint-endframes-restore-edit"}, + {"head":"51309592971e3b5be935599eed2a95404dc7781e","path":"research/two-sided-helper-extraction"}, + {"head":"224bd5e56041c40078ff6b5fa7393733a215de5c","path":"research/paired-helper-extension"}, + {"head":"a027b0f6fdb0ab2b42ba10fc31b53960166bf2bf","path":"research/paired-extension-normal45"}, + {"head":"b74b25f3ccc84c16e1a801d73b2f47e5ea764c78","path":"research/paired-extension-cap-fill-swaps"}, + {"head":"e62d3eb9005117d82a9babcfa937ecc53237c490","path":"research/paired-extension-normal45-rewrites"}, + {"head":"e2ca469b08385d3d5e29a918d66dbefaf889e9f3","path":"research/paired-swap-normal45"}, + {"head":"18d03c447886895ef9abf888398178e0428533ca","path":"research/shared-kernel-packing"}, + {"head":"e9307b48d7d1b690939935ecef0f8e524e6d92f4","path":"research/gmx-t74-borrow43-handoff"} +] diff --git a/research/rank7-shared-restore-fanin/README.md b/research/rank7-shared-restore-fanin/README.md new file mode 100644 index 0000000000..2ed3a44ebf --- /dev/null +++ b/research/rank7-shared-restore-fanin/README.md @@ -0,0 +1,253 @@ +# One shared restore covector at two consumers + +R2 replaces two separated reads of `X40 - 2 X54` with one temporary +aggregation in X40. Both dirty sources are restored. It saves two rank-one +children at the cost of one rank-two child per call, without another register, +a helper-width change or an increase in scalar gate count. + +R2 composes with Jeremy Kothe's R1 from [PR3015][3015]. On both of +Marius-Paul Dumitrean's [PR2979][2979] providers, their common local profile is + +```text +before, R1 {1:2443, 2:707, 3:232, 4:108, 5:18, 8:8} +after, R1 + R2 {1:2441, 2:708, 3:232, 4:108, 5:18, 8:8} +``` + +The original literal T74 allocation still fits the unchanged ordered widths. +Its complete complex moment root is certified in + +```text +[0.0017292679803119446932163, 0.0017292679803119446932164]. +``` + +Even this older packing beats the published T740+R1 moment in +[PR3030][3030] by about `1.15224307614e-7`. The verifier recomputes both full +profiles with their different denominators; it does not infer this comparison +from the local delta. PR3030 remains credited for its exact fixed-word packing +cap. R2 changes that word, not its allocation problem. + +A fresh complete source/native/admission/modern-outer release passes at + +```text +kappa = 0.001729267980311944693216 - 10^-46 - 10^-70. +``` + +Its exact gain over PR3030's released nomination is +`115224307613758681/10^24`. The recorded thirteen stages total 1,272.70 seconds +on Linux with CPython 3.12.15. This is an author-checked conditional finite +candidate, not a selected-frontier update or a complete multiplication theorem. +No selected-result file changes. + +## Literal construction + +The scientific base is canonical main +`d8e0f83f00191df62174b641e9fff055c357f641`, priority revision 6. +[SOURCES.json](SOURCES.json) binds the two original words and inherited engines. +[VENDOR.json](VENDOR.json) pins Kothe's literal R1 and the PR3030 comparison. +The [canonical investigation][discussion] gives the live scope and overlap. + +Here Xr denotes the current register r, not necessarily its original input +value. In the original restore word, the relevant source-addressed gates are + +```text +162 X18 += X40 +163 X18 -= 2 X54 +... +175 X22 += X40 +176 X22 -= X45 +177 X22 -= 2 X54 +``` + +All five gates use the rank-8 frame `E42`. X40 and X54 both already have the +rank-7 frame + +```text +W = span(256,128,64,34,17,11,4) = E25 intersect E42 intersect E51. +``` + +There are exactly four contacts with X40 or X54 from gate 162 through the +end of restore, at 162, 163, 175 and 177. In particular neither source has an +intervening observer or writer. Gate 176 only adds the X45 term +into X22, so it commutes with X22's X54 update. The rewriter checks these +literal preimages and this contact census. + +Insert `X40 -= 2 X54` at W before gate 162. Retain the two X40 consumers, +remove gates 163 and 177, and append `X40 += 2 X54` at FULL after restore. +Keep every other scalar gate and frame, then rederive inverse cleanup. Apply +R1 first because its indices refer to the original word. The full source +builder receives the equivalent combined literal hunks, with exact preimages. + +## Proof and complete bill + +For arbitrary dirty values `a,b,u,v`, the new four-operation sequence is + +```text +a -= 2b +u += a +v += a +a += 2b +``` + +Its endpoint is `(a,b,u+a-2b,v+a-2b)`, exactly the original two consumers. +No zero-source premise is used. Intervening original operations preserve the +identity for the reasons above. `verify.py` checks the rational four-register +matrix and the complete 704-column literal restore operator separately from +the inherited all-input auditor. Coefficient and missing-operation controls +must fail that independent equality check; they do not merely rely on a stale +cleanup being rejected. + +Originally X54 climbs W to E42 to FULL, with jumps 1 and 1. After R2 it is +only used at W and FULL, so its final jump is 2. X40 still has jumps 1 and 1. +The temporary source restoration is charged at FULL, not discarded as free +cleanup. The other two registers' itineraries do not change. The independent +set-of-vectors census in `frame_trace.py` checks this directly from the literal +A/B/warp/restore chronology, without importing the inherited frame pricer: + +```text +four touched registers, R1 {1:20, 2:1, 3:2, 4:1} +four touched registers, R1+R2 {1:18, 2:2, 3:2, 4:1} +``` + +Write `Hr(b) = r*(73/r)^b`. The per-call delta is + +```text +H2(b) - 2H1(b) = 2*73^b*(2^(-b)-1) < 0, for every b > 0. +``` + +Thus this is a strict moment improvement, not just a scalar simplification. +Its rank mass is unchanged. All 408 ordered helper widths, 91 private zero +buffers, source cut, compensation, entrances, helper endpoints and warps stay +unchanged. R2 replaces four ADDs with four ADDs and its inverse cleanup also +has unchanged length. The source T74 fill/order/dispatch therefore remain +literal inputs. All idle children and every local child are included: + +```text +T = 74; calls = 666; live = 66304 +complete profile = {1:1643016, 2:471528, 3:159468, 4:71928, + 5:13716, 8:5328, 48:28190} +rank mass = 4816512 = 74*65088 +physical families = 66304 + 408 + 8 + 91 + 2 = 66813 +``` + +The local formula proves the sign over the whole positive b interval. The +source-authenticated rational logarithm/Taylor engine supplies the numeric +root brackets. This reuses the inherited arithmetic; it is not an independent +implementation of that engine. + +The coverage/halving packing relaxation for the new profile has cap about +`0.001756475065598923` in this moment variable. T74 realizes about 98.4510% +of that bound. Its idle mass is 2,093 per call; placing that entire mass at the +maximum halving-legal rank 51 gives the favorable relaxation, because cost per +unit rank decreases with rank for positive b. The verifier certifies its root +and the realized fraction with rational intervals. This is the model of +`complex-local-word-ceiling/ceiling.py`, not a feasible packing, a new +fixed-inventory optimum or an application of an older outer-transfer formula. +Its slack does not justify another packing search. + +## Reproduce + +The bounded standard-library check rebuilds parent, R1, R2 and R1+R2 for both +providers, audits all 632 independent dirty columns forward and dual, checks +the separate frame census and both complete moments, and rejects 16 controls: + +```sh +python3.12 -B scripts/research_package.py \ + --package research/rank7-shared-restore-fanin +python3.12 -B research/rank7-shared-restore-fanin/test_verify.py +``` + +To retain generated words and diagnostic logs, choose a fresh external path: + +```sh +python3.12 -B research/rank7-shared-restore-fanin/verify.py --work "$RUN/finite" +``` + +The default mode removes its private temporary directory, including on failure. +Explicit `--work` refuses existing data and preserves diagnostics. No default +command writes generated words into the checkout. + +The expansion decision was to continue through one complete T74 verification, +not another construction search. The proved recursive saving and unchanged +physical inventory justify that test. Prefix/magnitude costs were unknown +until the emitted-program invoice; they were not set to zero. Failure of a +source, physical or prefix gate stops the release. T740 composition stays a +separate next question. + +`reproduce.py` exports the exact PR3015 package and obtains its unchanged +complete source recipe. It replaces only the declared-edit parameter directory +and the descriptive source labels. Stage programs, the literal allocation, +all native checks and every admission/outer acceptance gate remain unchanged. +The parameter directory contains the explicit R1+R2 edit list and final words; +it does not edit a frozen predecessor. The command runs all stages serially, +including a fresh retained bootstrap and both fresh native providers: + +```sh +python3.12 -B research/rank7-shared-restore-fanin/reproduce.py \ + --repo . --work "$RUN/full" +``` + +It needs the exact objects in [GIT-SOURCES.json](GIT-SOURCES.json). Fetch them +from canonical upstream before the network-free replay: + +```sh +python3 -c 'import json, subprocess; subprocess.run(["git", "fetch", "https://github.com/CrocSwap/integer-mult-bounds.git", *[x["head"] for x in json.load(open("research/rank7-shared-restore-fanin/GIT-SOURCES.json"))]], check=True)' +``` + +It also needs a C++ compiler and NumPy 2.4.5, SciPy 1.16.1, +SymPy 1.14.0 and mpmath 1.3.0. gmpy2 2.3.2 and psutil 7.2.1 +were also installed locally. `--dry-run` performs source export and recipe +checks only. Full replay is explicit, not part of the registered cheap check. +Direct calls should use a clean checkout or a fresh `PYTHONPYCACHEPREFIX`; +`-B` alone does not prevent existing bytecode reads. The registered launcher +isolates its complete interpreter automatically. + +The [retained release](evidence/RESULT.json), native receipt, source manifest, +final word containers and stage logs are bound in +[evidence/BINDINGS.json](evidence/BINDINGS.json). The registered check also runs +`verify_release.py`, which checks these bindings and rejects ten receipt/invoice +mutants. It does not rerun native execution. Frozen word hashes bind actual +released bytes; regenerated words compare by canonical decoded payload, not +compression headers. + +The actual emitted-program invoice retains all 666 invocation and 666 bridge +sweeps, 91 private buffers and 66,813 physical families. It reports local/global +prefixes 93/1,475 bits, stock exponent 1,322 and reserve 1,510 below the charged +2,048-bit payload. The inherited owner's legacy `live+490` diagnostic is not +this full `live+509` charge. The actual source release and +[evidence/INVOICE.json.gz](evidence/INVOICE.json.gz) supply the complete bill. + +## Limits + +A conditional finite release does not prove the complete multiplication +theorem. Inherited all-size/compiler, physical realization and storage, +precision/tape, caller, analytic and universal block-energy hypotheses remain. +No independent human or formal-kernel review is claimed. Frozen sources and +the selected frontier are unchanged. + +## Open next questions + +1. Independently replay the exact source/native/admission chain before adoption. + Start with the fresh external command above and compare word, manifest, + complete profile and release bindings. Scientific dependencies remain review + obligations even if the replay passes. +2. Compose R2 with the already published T740 allocation only after this word + is checked. Unchanged helper widths suggest compatibility, but actual source, + physical/prefix and complete release bindings must be regenerated. An old + T740 receipt does not cover R2. This session does not run another packing + search or that second release. + +## Credit + +Nick Petalas contributed R2, its independent frame census and this composition. +Jeremy Kothe contributed R1, the restore-rewrite handoff and the reused literal +edit builder/reviewer. Marius-Paul Dumitrean contributed PR2979's joint rank-7 +words and complete allocation. Credit also Mason Hale, Jeremy Diviney, Yiyang +Lu, Tekalign, Ross Richardson, Dugongue, icekylinx, themilkman216 and the retained +geometry/native/owner lineage. Original [credits](vendor/PR3015-CREDITS.md) and +[notice](vendor/PR3015-NOTICE) are unchanged. Apache-2.0. +[ENGINEERING.md](ENGINEERING.md) records verification and runtime limits. + +[3015]: https://github.com/CrocSwap/integer-mult-bounds/pull/3015 +[2979]: https://github.com/CrocSwap/integer-mult-bounds/pull/2979 +[3030]: https://github.com/CrocSwap/integer-mult-bounds/pull/3030 +[discussion]: https://github.com/CrocSwap/integer-mult-bounds/discussions/2612#discussioncomment-18981612 diff --git a/research/rank7-shared-restore-fanin/SOURCES.json b/research/rank7-shared-restore-fanin/SOURCES.json new file mode 100644 index 0000000000..d3d5f97485 --- /dev/null +++ b/research/rank7-shared-restore-fanin/SOURCES.json @@ -0,0 +1,54 @@ +{ + "schema_version": 1, + "base_commit": "d8e0f83f00191df62174b641e9fff055c357f641", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + }, + { + "path": "research/rank7-joint-endframes/allocation/PROFILE.json", + "usage": "input", + "git_blob": "46a83eeda67ab67cccbffe8b7ad8e44368b40ea7", + "sha256": "94a819747f3ced41f1544ada0036c983fc0c92847b9644380f877a06cd7931cf" + }, + { + "path": "research/rank7-joint-endframes/data/WORD-base.json.gz", + "usage": "input", + "git_blob": "d9aa96a93fea5f7395e7783aef0bc117c0a0ae89", + "sha256": "abaf67bfcb257528658c906b612f57025617592bd7889828f92b97a5f4f4300d" + }, + { + "path": "research/rank7-joint-endframes/data/WORD-extra.json.gz", + "usage": "input", + "git_blob": "74f6cb64595c21f7726ae77e69437868620bdcee", + "sha256": "e0eaf64c4d5d324693d43889bce1b9e53e8da00402105c8c978fd102f208bed7" + }, + { + "path": "research/rank7-joint-endframes/tools/root.py", + "usage": "input", + "git_blob": "bd6dc2eb4e5013625d17cc08461b67622bcfed69", + "sha256": "55f5aca39b5ee2fe4687ac8863e6c24569010f27a332883c069b8e14b8fe09e3" + }, + { + "path": "research/rank7-joint-endframes/vendor/audit_local.py", + "usage": "input", + "git_blob": "8224873d0497cf0b4c202f31b145fa273553d978", + "sha256": "a38940094f7d19cd6376aafdd4734fa68eabc9aff4c98c3c4a3e9540328b1c90" + }, + { + "path": "research/rank7-joint-endframes/vendor/preload_move.py", + "usage": "input", + "git_blob": "55b435035bbc439a9d55e8abd125993208cef8d9", + "sha256": "c8fda4674644fcd5cbf39b6645ce148a21daa90a998b678cbe51f970b78b0044" + } + ] +} diff --git a/research/rank7-shared-restore-fanin/TASK.json b/research/rank7-shared-restore-fanin/TASK.json new file mode 100644 index 0000000000..a980c3132a --- /dev/null +++ b/research/rank7-shared-restore-fanin/TASK.json @@ -0,0 +1,83 @@ +{ + "schema_version": 1, + "task_id": "scalar-to-moment", + "priority_revision": 6, + "base_commit": "d8e0f83f00191df62174b641e9fff055c357f641", + "original_card": { + "id": "scalar-to-moment", + "question": "Can one known scalar simplification be converted into an actual paid-profile improvement?", + "starting_points": [ + "research/r439-bsection-stars-seed01/README.md", + "certificates/selected-result.json" + ], + "methods": [ + "Derive the changed legal frame itinerary and exact child histogram.", + "Prove a scoped obstruction showing why that scalar gain cannot change the paid contract." + ], + "acceptance_gate": "An unchanged histogram is not a kappa gain; record any separate runtime or proof benefit explicitly.", + "first_step": { + "command": [ + "python3", + "-B", + "research/r439-bsection-stars-seed01/verify.py" + ], + "expected": "PASS_R439_BSECTION_STARS", + "inspect": "Observe that the positive control improves scalar counts while retaining the paid histogram.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Choose one simplification and derive the complete changed frame itinerary, or prove why it cannot change the histogram.", + "bottleneck_link": "A legal change to the histogram, not addition count alone, is the bridge to an exponent gain.", + "allowed_variations": [ + "One existing scalar simplification and one proposed frame-path change." + ], + "scope_change_triggers": [ + "Submitting only another scalar count as completion of a paid-profile task." + ], + "overlap_terms": [ + "scalar simplification", + "paid profile", + "R439" + ] + }, + "scope_status": "changed", + "actual_scope": "One shared dirty-source covector across two nonadjacent PR2979 restore consumers, composed with Jeremy Kothe's R1 and priced on the literal T74 allocation.", + "scope_change_reason": "Take PR3015's live restore-rewrite handoff rather than the card's historical R439 bit example. The changed complex word has fresh paid-profile headroom beyond PR3030's attained fixed-word packing cap. Selected source bindings were checked first.", + "bottleneck_link": "The binding complex supplier pays two rank-one jumps on X54. A source-restoring shared covector replaces them with one rank-two jump without new storage or scalar gates.", + "budget_minutes": 60, + "upstream_checkpoint": { + "commit": "d8e0f83f00191df62174b641e9fff055c357f641", + "checked_at": "2026-10-16T20:20:39Z", + "priority_revision": 6, + "relevant_guidance_or_source_changes": false + }, + "overlap": { + "open_prs": 286, + "closed_prs": 2440, + "closed_snapshot_at": "2026-10-16T20:01:23Z", + "discussions": 1779, + "complete_pagination": true, + "warnings": [], + "nearest_work": [3015, 2979, 3030], + "limitation": "Bodies, comments and available local notes were searched, not every diff or unpublished work. Historical X54 slot names are not this source-register rewrite; no-match is not proof of novelty.", + "canonical_thread": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2612#discussioncomment-18981612" + }, + "stop_rule": "Stop after R2, its exact R1 composition and one serial full T74 source/native/admission/outer release. No larger rewrite search, packing expansion or selected-frontier change.", + "outcome": "completed", + "evidence": "README.md, evidence/FINITE.json, separate 704-column restore equivalence and set-span frame census, plus fresh source/native/admission/outer release in evidence/RESULT.json with exact word/invoice/log bindings and rejection controls.", + "author": "Nick Petalas", + "ai_assistance": "Substantial automated development assistance; no independent human or formal-kernel review is claimed.", + "open_questions": [ + { + "question": "Does an independent fresh replay reproduce the complete R1+R2 T74 release?", + "why_it_matters": "Author replay is not independent supplier admission or mathematical review.", + "first_step": "Run reproduce.py with the pinned Git objects, declared dependencies and a fresh external work directory; compare exact word, source, native, profile and release bindings.", + "blocked_by": "Scientific review of inherited all-size, physical, precision and analytic hypotheses remains separate." + }, + { + "question": "Does R2 compose through a fresh complete release of the published T740 packing?", + "why_it_matters": "The unchanged widths suggest another small gain, but old T740 receipts do not cover the new word.", + "first_step": "Bind the R1+R2 literal words to PR3030's exact allocation and regenerate its source/native/admission/outer chain without another packing search.", + "blocked_by": "A separately scoped source-bound composition, including T-dependent physical and prefix checks." + } + ] +} diff --git a/research/rank7-shared-restore-fanin/VENDOR.json b/research/rank7-shared-restore-fanin/VENDOR.json new file mode 100644 index 0000000000..c699c2997b --- /dev/null +++ b/research/rank7-shared-restore-fanin/VENDOR.json @@ -0,0 +1,32 @@ +[ + { + "path": "vendor/R1.json", + "head": "e244296debb45fe6f4da84d29e4d64fbab55fda0", + "source_path": "research/rank7-joint-endframes-restore-edit/edits/EDITS.json", + "author": "Jeremy Kothe", + "license": "Apache-2.0", + "sha256": "c9c68660d07bfd12ed20fd8cbfe3d36301ceb2d7bb9b4ea11350cc399b19e0b1" + }, + { + "path": "vendor/PR3030-FINITE.json", + "head": "78e77d820393c6b8648b47af219e991edfcc54e6", + "source_path": "research/rank7-t740-release/evidence/FINITE.json", + "author": "Nick Petalas", + "license": "Apache-2.0", + "sha256": "00ee90400fa3f35b19a12b89e4d2a2754a02832d4800351657970dc18042b406" + }, + { + "path": "vendor/PR3015-CREDITS.md", + "head": "e244296debb45fe6f4da84d29e4d64fbab55fda0", + "source_path": "research/rank7-joint-endframes-restore-edit/CREDITS.md", + "license": "Apache-2.0", + "sha256": "bd4b09fcd2861933883cbce6ecf0e30743d5d3b4cb0cc38e258530c370c121b9" + }, + { + "path": "vendor/PR3015-NOTICE", + "head": "e244296debb45fe6f4da84d29e4d64fbab55fda0", + "source_path": "research/rank7-joint-endframes-restore-edit/NOTICE", + "license": "Apache-2.0", + "sha256": "ffcc3de2243815db0e9fb8d820b4ca511fce3c7673c966e14b486f05d30ac11a" + } +] diff --git a/research/rank7-shared-restore-fanin/VERIFY.json b/research/rank7-shared-restore-fanin/VERIFY.json new file mode 100644 index 0000000000..48f3a29434 --- /dev/null +++ b/research/rank7-shared-restore-fanin/VERIFY.json @@ -0,0 +1,35 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/rank7-joint-endframes/allocation/PROFILE.json", + "research/rank7-joint-endframes/data/WORD-base.json.gz", + "research/rank7-joint-endframes/data/WORD-extra.json.gz", + "research/rank7-joint-endframes/tools/root.py", + "research/rank7-joint-endframes/vendor/audit_local.py", + "research/rank7-joint-endframes/vendor/preload_move.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Both exact providers, R1/R2 composition, 632-column forward/dual audits, separate frame census, full moments and 16 rejection controls." + }, + { + "argv": ["{python}", "-B", "{package}/test_verify.py"], + "timeout_seconds": 30, + "checks": "Ten behavioral groups covering source contacts, exact consumer preimages, profile gain, stage reconstruction, source pins and recipe changes." + }, + { + "argv": ["{python}", "-B", "{package}/verify_release.py"], + "timeout_seconds": 30, + "checks": "Retained source/native/admission/outer, actual words, invoice, all stage-log bindings and ten rejecting receipt/invoice mutants; no fresh native replay." + } + ] +} diff --git a/research/rank7-shared-restore-fanin/decisions.tsv b/research/rank7-shared-restore-fanin/decisions.tsv new file mode 100644 index 0000000000..c0abd1be23 --- /dev/null +++ b/research/rank7-shared-restore-fanin/decisions.tsv @@ -0,0 +1,6 @@ +timestamp phase decision reason evidence result +2026-10-16T19:38Z selection longer restore rewrite current packing cap already attained; short-block search only PR3015,3030 and complete overlap snapshot bounded constructive probe +2026-10-16T19:45Z verification start one fresh full T74 release R2 local gain exceeds current T740 candidate; keep scope small finite-first/RESULT.json and source preflight serial jobs=1, external output +2026-10-16T20:10Z full-result retain the R1+R2 T74 candidate fresh full recipe passed every gate full/RESULT.json; source manifest 4f52f55e conditional kappa 0.001729267980311944693216 minus strict margins +2026-10-16T20:11Z postflight accept final driver and parameters stricter current checks and exact 8-file parameter equality pass postflight.log and final-preflight no scientific input changed during driver cleanup +2026-10-16T20:17Z verification prepare one focused publication normal/optimized and Python3.13 finite checks, 10 unit groups and 10 release mutants pass final-registered.log and evidence/BINDINGS.json no selected-frontier change; independent review remains diff --git a/research/rank7-shared-restore-fanin/evidence/ADMISSION-RESULT.json b/research/rank7-shared-restore-fanin/evidence/ADMISSION-RESULT.json new file mode 100644 index 0000000000..ff747fc2bc --- /dev/null +++ b/research/rank7-shared-restore-fanin/evidence/ADMISSION-RESULT.json @@ -0,0 +1,382 @@ +{ + "actual_expected_helpers": 408, + "comparison_claim_sha256": "656a4c93411b078753783513e2e71b1722a56e7b70120264a38118811982fa77", + "comparison_head": "e2ca469b08385d3d5e29a918d66dbefaf889e9f3", + "comparison_kappa": "17240352247481048785499999999999999999999998999999999999999999999999/10000000000000000000000000000000000000000000000000000000000000000000000", + "comparison_pr": 2969, + "complex_lower": "54039624384748271663/31250000000000000000000", + "dispatch_sha256": "65e435bd68e97243c003677271b88485a29d4d0fae2dff1354100404a145e74c", + "external_input_sha256": { + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/pr3015/allocation/DISPATCH.json": "65e435bd68e97243c003677271b88485a29d4d0fae2dff1354100404a145e74c", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/pr3015/allocation/FILL.json.gz": "c2136be9434cda511a1a8a44d98f9f72ea5376830a8426674253b4ee351c4c39", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/pr3015/allocation/ORDER.json": "519d1d5dbb997a219fcfcad34c0b03e7838bef24199784d7e964fa10090f66e1", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/run/adapters/extension_blocknorm.py": "6e6b8683cc87a84e5410c399b1128eb68694f852a3927cb124067f503ed7d7c7", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/run/parent-export/pr2894/vendor/pr2857/vendor/pr2839/lift_parent.py": "9a1edd7d4ab4a2f2ac8d15b42b7e40f93653d65026bac59e4c1ce80b486bd60e", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/run/parent-export/pr2894/vendor/pr2857/vendor/pr2839/reconstruct_replica.py": "5472811c24aef3852dc7e189dff5060076a6c0b25bfde928da50dcfe9b5bdc15", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/run/parent-export/pr2894/vendor/pr2857/vendor/pr2839/replica_parent.py": "48bdbf28f59d80edb266803ec61bf5e22e8fb5e5a0e2b88004b6039147589bd4", + "/home/nick/.cache/integer-mult-bounds-runs/20261016T1936-frontier/full/run/pr2969/CLAIM.json": "656a4c93411b078753783513e2e71b1722a56e7b70120264a38118811982fa77" + }, + "fill_sha256": "c2136be9434cda511a1a8a44d98f9f72ea5376830a8426674253b4ee351c4c39", + "gain": "2616377781919907333/500000000000000000000000", + "kappa": "17292679803119446932159999999999999999999998999999999999999999999999/10000000000000000000000000000000000000000000000000000000000000000000000", + "kappa_decimal": "0.0017292679803119446932159999999999999999999998999999999999999999999999", + "native_receipt_sha256": "3dce85d535c34dd5755b7a7828b9706cd38198aa99e849dc0f166ac4e7ea47df", + "order_sha256": "519d1d5dbb997a219fcfcad34c0b03e7838bef24199784d7e964fa10090f66e1", + "package_manifest_sha256": "c74a7aafa9f6ed15e9e989d9f23c859781f50167cf1d2bec94fcf2236425f05d", + "patches": [ + { + "after_sha256": "52f8b4cec2dab69cbe590e1fd0f7a68e1b35de5a540bd22fd2adfce07a92b46b", + "before_sha256": "faf283eb4edd2e6a1ccb40b3cb3ba30ae54338eaf5ea0a10d84d11d7939502af", + "path": "new/rebind.py", + "replacements": [ + [ + "physical=spec['expected']['live'] + 8 + R + 2)", + "physical=spec['expected']['live'] + 8 + R + 2 + max(len(rd(d / 'CANONICAL-WORD.json.gz').get('zero_buffers', [])) for d in locs.values()))" + ] + ] + }, + { + "after_sha256": "99bef04f24a99088e5c0c9b8f6bbc8386669d8315b8f572d6bbfb932c5d51145", + "before_sha256": "7edb4732b34e5814b27650a55c938626cb50d68f06397744dd4fe451437e90e0", + "path": "geometry_controls.py", + "replacements": [ + [ + " i['complete_invocation_sweeps']=i['bridge_sweeps']=333", + " i['complete_invocation_sweeps']-=1;i['bridge_sweeps']-=1" + ], + [ + " o,i=copy.deepcopy(owner),copy.deepcopy(invoice);fn(o,i);oh=digest(o);i['owner_audit_sha256']=oh", + " o,i=copy.deepcopy(owner),copy.deepcopy(invoice);fn(o,i);assert (o,i)!=(owner,invoice), 'geometry mutant must change actual receipts';oh=digest(o);i['owner_audit_sha256']=oh" + ] + ] + }, + { + "after_sha256": "6cfefe80c02a6c0f243f50ca9e146e1ab1440b84a033d8a71d42be5a5fa27f6b", + "before_sha256": "c43680a2da390f79925547a5ee1919d8a76637cccf98e2c8164b6f667fbc3183", + "path": "verify_release.py", + "replacements": [ + [ + "Fraction(1, 10 ** 3046) - Fraction(1, 10 ** 3022)", + "Fraction(1, 10 ** (spec['outer_refinement']['endpoint_digits'] + 46)) - Fraction(1, 10 ** (spec['outer_refinement']['endpoint_digits'] + 22))" + ], + [ + "epsilon=1-(1025/1024)e-3080", + "epsilon=1-(1025/1024)e-{spec['outer_refinement']['endpoint_digits']+80}" + ], + [ + "at the one 3000-digit rejection call", + "at the one {spec['outer_refinement']['endpoint_digits']}-digit rejection call" + ] + ] + }, + { + "after_sha256": "1dd56009986eb14dd6603c9193c7ad71dd45c7d005bf71c9cd3f916e66f54d98", + "before_sha256": "9e12909c73d3b3a31a45d801ae76c034510d6306400412e474df79bc4f1dc67e", + "path": "outer/check_ledger.py", + "replacements": [ + [ + "assert (m,W)==(73,66304)", + "T=spec['geometry']['replicas']\nassert type(T) is int and T>0\nassert m==73 and W==896*T and W==BJ['live']" + ] + ] + }, + { + "after_sha256": "ebaf637f1f818dac9c0fce0ee3f18df300873105818cea29a8ae9e8b737b5c7d", + "before_sha256": "08ca58abff11bdfba721dc56ab8acf06ec1b7c48a8699a0955cf35324680aca7", + "path": "code/witness.py", + "replacements": [ + [ + " with open(os.environ['WITNESS_RECORD'],'a')as f:f.write(json.dumps([key,got],default=str)+chr(10))", + " import time as _wr_time\n _wr_path=Path(os.environ['WITNESS_RECORD'])\n _wr_lock=_wr_path.with_name(_wr_path.name+'.append.lock')\n _wr_deadline=_wr_time.monotonic()+60\n _wr_fd=None\n while _wr_fd is None:\n try:_wr_fd=os.open(_wr_lock,os.O_CREAT|os.O_EXCL|os.O_WRONLY)\n except FileExistsError:\n if _wr_time.monotonic()>=_wr_deadline:raise TimeoutError('discovery record lock timeout; existing lock preserved')\n _wr_time.sleep(.005)\n try:\n with _wr_path.open('a',encoding='utf-8',newline='\\n')as _wr_out:\n _wr_out.write(json.dumps([key,got],default=str)+chr(10))\n _wr_out.flush()\n finally:\n os.close(_wr_fd)\n _wr_lock.unlink()" + ] + ] + }, + { + "after_sha256": "2964ea185a64061d72e4a6c648a48cd0ddbfc7ea8174ecb39be2a2eee52a3be8", + "before_sha256": "8dee5aa1663a70edcf1099a30b72166d89c29fa29ba2025fb5707fdbcc237f83", + "path": "verify.py", + "replacements": [ + [ + "run('lift-parent',P/'lift_parent.py','--owners',work/'rebuilt-owners','--out',work/'rebuilt-parent')", + "run('lift-parent',P/'lift_parent.py','--package',P,'--owners',work/'rebuilt-owners','--out',work/'rebuilt-parent')" + ] + ] + }, + { + "after_sha256": "0d8cc021d2401d047aaec79060ec2ea28ba06f12eca8dbf4c60c78bb31975c4e", + "before_sha256": "ebaf637f1f818dac9c0fce0ee3f18df300873105818cea29a8ae9e8b737b5c7d", + "path": "code/witness.py", + "replacements": [ + [ + "PAYLOAD==1<<(192+(GEO['dimension']+1)//2+2*CALLS+4).bit_length()", + "PAYLOAD==1<<(128+(GEO['dimension']+1)//2+18+1330+1+4).bit_length()" + ] + ] + }, + { + "after_sha256": "c5106e0d7a97382677fa228fbade989262347968a0e54acfcf6712aa37e02f47", + "before_sha256": "bb213d0af12218ff7c9c572717e522d8bbeeb2856b87a253f4a7f44e0fd71f15", + "path": "code/invoice_allcold.py", + "replacements": [ + [ + " required_prefix=localbits+input_l2_bits+call_count+bridge_sweeps+4", + " from blocknorm_certificate import certify\n blocknorm=certify(template, {pid:base/'providers'/pid for pid in template['local_providers']})\n assert blocknorm['status'] == 'PASS_TENSOR_BLOCK_NORM_CERTIFICATE'\n assert localbits <= 128, 'actual native scalar/Horner prefix exceeds charged local reserve'\n required_prefix=localbits+input_l2_bits+blocknorm['max_active_depth']+blocknorm['stock_l2_bits']+1+4" + ] + ] + }, + { + "after_sha256": "0d522b09c7fe6a5e62fe80c28f3eefe733557a82d77c6212e5d4b91ffb7e3421", + "before_sha256": "02502a217fe8c9e10229075b50745518beac512c48db20e64c3e06514a4da5b5", + "path": "independent_core.py", + "replacements": [ + [ + " payload = 1 << (192 + (M+1)//2 + 2*len(c['order']) + 4).bit_length()", + " require(localbits <= 128, 'measured native prefix exceeds local reserve')\n payload = 1 << (128 + (M+1)//2 + 18 + 1330 + 1 + 4).bit_length()" + ] + ] + }, + { + "after_sha256": "d598a2ac1e2e8eaee14a8c285e0277a7ae44ca6a15bd2b5cfc67fb40844fb387", + "before_sha256": "c5106e0d7a97382677fa228fbade989262347968a0e54acfcf6712aa37e02f47", + "path": "code/invoice_allcold.py", + "replacements": [ + [ + " complete_invocation_sweeps=call_count,bridge_sweeps=bridge_sweeps,row_prefix_extra=2*payload,", + " complete_invocation_sweeps=call_count,bridge_sweeps=bridge_sweeps,row_prefix_extra=2*payload,blocknorm=blocknorm," + ], + [ + " primitive_arithmetic_margin_bits=4,controller_audit_sha256=", + " tensor_block_norm=blocknorm,partial_cover_margin_bits=1,physical_stock_l2_bits=blocknorm['stock_l2_bits'],primitive_arithmetic_margin_bits=4,controller_audit_sha256=" + ], + [ + "Sum every actual invocation and bridge sweep and take the maximum local scalar/Horner prefix over both orientations of the fixed provider.", + "All invocations and bridge sweeps remain charged. Bound completed-boundary energy by at most eighteen active steps per owner replica, using exact tensor-isomorphic whole-family helper unitaries. Add the full group-indexed physical-stock sup-to-l2 factor and one partial-cover margin, then the maximum local scalar/Horner prefix." + ] + ] + }, + { + "after_sha256": "e051aaa166e01263780d5ae03699690670b597fed6593af4c37a7e978825eb85", + "before_sha256": "0d522b09c7fe6a5e62fe80c28f3eefe733557a82d77c6212e5d4b91ffb7e3421", + "path": "independent_core.py", + "replacements": [ + [ + " prefix = localbits + (M + 1) // 2 + len(c['order']) + c['bridges'] + 4", + " bn=c['blocknorm']\n require(bn['status']=='PASS_TENSOR_BLOCK_NORM_CERTIFICATE' and bn['max_active_depth']==18 and bn['stock_l2_bits']<=1330, 'independent tensor block certificate')\n prefix = localbits + (M + 1) // 2 + bn['max_active_depth'] + bn['stock_l2_bits'] + 1 + 4" + ], + [ + "prefix_formula=dict(local_scalar=localbits, input_l2=(M + 1) // 2, invocations=len(c['order']), bridges=c['bridges'], margin=4)", + "prefix_formula=dict(local_scalar=localbits, input_l2=(M + 1) // 2, invocations=len(c['order']), bridges=c['bridges'], active_block_depth=18,stock_l2=bn['stock_l2_bits'],partial_cover=1,margin=4),blocknorm=bn" + ] + ] + }, + { + "after_sha256": "393323f150d0bb686419804d51cf43d0f58450d2a1e7929725acdd26fdbb3640", + "before_sha256": "2286f00e462ff28abbb3f396095463482a1e063213b9526a7225275980c77eaf", + "path": "audit_mixed.py", + "replacements": [ + [ + "pending=A.check_pending_axes(ctx);receipt=A.check_roles(ctx,roles)", + "import blocknorm_certificate as BN;ctx['blocknorm']=BN.certify_context(ctx,roles,dirs,source_parent=parent);pending=A.check_pending_axes(ctx);receipt=A.check_roles(ctx,roles)" + ] + ] + }, + { + "after_sha256": "0542dde915af8902324db2f59136da078d5256bfaa8f1510f3e59336be7e2680", + "before_sha256": "f25e1e870df5d5a16a1e367b3df8843cb01644ab4b75895d7939af81e4fcb833", + "path": "code/assemble.py", + "replacements": [ + [ + " assert invoice['global_prefix_bits']==max(z['prefix_bits']for p in invoice['providers'].values()for z in p['local'].values())+37+CALLS+CALLS+4", + " bn=invoice['blocknorm']\n assert bn['status']=='PASS_TENSOR_BLOCK_NORM_CERTIFICATE' and bn['replicas']==REPLICAS\n assert bn['max_active_depth']==bn['boundary_depth_bits']==18 and bn['active_calls_per_block']==bn['bridges_per_block']==9\n assert bn['block_width_families']==896 and bn['physical_families']==invoice['physical'] and bn['live_families']==invoice['live']\n assert bn['partial_cover_bits']==1 and bn['input_l2_bits']==37 and bn['local_reserve_bits']==128 and bn['retained_payload_bits']==PAYLOAD\n localbits=max(z['prefix_bits']for p in invoice['providers'].values()for z in p['local'].values())\n assert bn['local_actual_prefix_bits']==localbits and localbits<=128\n assert invoice['global_prefix_bits']==bn['actual_prefix_bits']==localbits+37+18+bn['stock_l2_bits']+1+4\n assert bn['required_reserve_bits']==128+37+18+bn['stock_l2_bits']+1+4~YR9LiWroGP1W4ky=P*Rxa-Hs=t)(Zwbtn^F{qYb|80I-&g9#!Sh}!&F&HC#u1`cvd!shX zYB8W%`+PHI!a1b1>?6g|-faI;#kjuR~?>b+J(J_Io3JiDO zN&cAi$cT5w9dC0LC^eA*@~&c1r#+=a-1-kevW&@5)r}It&60j^-4vsJBb{X}VcTX(3r(4x!NX_D&0W`HydSI;~dablHOx$S_ zg?j$o;@8Ppj|=Una^v@a@fky{32%RcYu@nsyv;mGXofVz+)%}T<+WsaiFDMOFn^}> z)~+lJmMVE-H1o!#Qr@S=(nVrDlVOg?F(cJl?V?r@=WU=TQU113BrfK|Elg3ghEc8K zP=vJs+CKFIG||U;#=f4fUF;EgSdB@m*+a#Qab*{=?jfFAg;y1THKpA5KEhU3>)Dl9}Qjf}C zYG160udAL7dJ`4ayN|lwYX7m@?^}K%8mCMb;$b{4AkXirbmEk=xbKX+%`()^+@+|u zq)Tb9NVi~5^~LIqZdJQ4{rASct*!$PiC>HJr_N*L>&U)pmZ_ulzIXnw90yqp&7`e! zxEANFOI=-Qx0FYn9p7a}P8kfa$FR(rH-2}P7c8Idvydk$oQD5<|M*-7R~{4BI9o1J z{xbSwCdm=@#fEx)E~em&cC-ZjILL#e(OUi}u+Fcwcxwgclc0P2E2+_JcKAuw#Z1{` z;{p8I*MlEbPUepmeMip@YBC~9v%S5v#zh~^KRi7Q)bkveX$m^q+`IVQchPE9u~b-i zu^seu&$apZfN1$PW$VX(L8P;iJdsw)FMdeg2$Lm+^YbLLN7sl!hfDd}KJf2V;Dk@q zJs!)BiN1U2%GI&Zt95eRPF{bUzOclq$aS2)?X4v=m;+B|@gj10Se4eA|MJZo)T*yy zb#`&bJ*#5HDn~psu%Ss_60;;#%u;7kUQX`hTBz}3*mL@2b1~#0|H`&yaU|VKb@?WX za-V`SizpL_2jy+=H|OM1E|9Z_Hzsv*I+H^54kNG64?s2r zQ7mQh*(2|dM7QTjCt{Dk-djlcw#MY_#Nx>uw2fOVn;~~#S>#KuJJ-AGPhF{=(AiPL z^U`PM(_LSkoNuS;9zpil-STmnj*haPF#oRRU%LJ`js+taHKkf+$gtzWb{Jpb4iIYO>Rl0)olxTH_z}OSR&2So3=Y{2g;wW&Ij%|EBoB@kWxNm@*w-) zUu?gPd;Sg?OPFc)Z(j~Z_4;?Dh-qCaQV9M`C;PXH5vA;`7v6aFZl_hJ0o~ zFa+TSVJ11gvpW{Ub?B2=p(t10WFYstX;fyXBVm^+WV-CG5Vg$4@Hz)WPa>B(pRGkXJns1o8r%yx zae(gW2TOAc*q)4?ZUy)c<3QiH7-f${E5xVl)gRwF!#0bJvdqf9JUdy;d@2-jwA<0z zJiUxNm7>b{;nWV=7;dnpvv#uz7;3oXDqER_YSu1wAP>SS#&mOnwxZ(7!WHO66xZ^EarJry-XfQ zni$r)e@D3}dEVDuu`&AeVG}3prA6~8R(oqPb=l3bCHUZgWd$_Q8ghOTnd;UQ7?u1X zPb!ByVZE9s`h(Uww|9BoZGAC{blf!Bi_8ADw-|O}%s~DMT?0s?U96XRx|ii$tH0JB zxsYXZ$nk0-u}j)V|M^}1=V6?Az2&Q2U<)rD8dYk2YlNWzLyCZXS0+khmHst5>~V&H zK*P63$bq9hhKkvsiwd`#i;$OGk!;U#O*eX~OM5?ZThQr?rRqDxUjxBngx%V!yVqVV zG3J-{wpT`leJG7C;oTiUYkhbZCHrdP-Qw+C_pAl6y<`c+m1pAO-t`)dMdf>}w;DK$ z8mdvD`4fE&+{s03hcsG*u#ln zg~1yagqnq=y8rkP84-=H(^_?RazoMTW1YcLPm>2kMQAp`AMLSgJ6BE*M)nQZ^Mbivb4PAiYUEx4P96F)TalF?0DR#dr)#Ff5y1kQsl z3sncp;mKvCrH|V8aJOb zoX@zpU*rw$3r~%E34bXYsYY!=ET%qNd!OtPP!%7h`hC{}N85%c)E&IghJqF941~6gl@;-OFJxn07zvnV5Lx)5Dw#1kA-gHOWZK7Guovndc#gPmOYW`7 z@-z(^rI87TtD@_Q0QcaH~W8mF9UEyQE;U6s#eIuK#qHoq^omWOhaI6^?Ab%6ub>o_*BLP;yL6PQ2SVtzK!3*TeU~}8TB0h zyJ!3X4vvhgE9IJP5$D>T@Ji%9$!I#IqMnX-mXV3#Uh;mL&%S)gJjBt=h|9p}xJmFP zA&(JkV*7 z?svQC)!bR=o+9RJMM)%I>b|IR*D|BG=*$;39-Ni!35&OAm#*4$tkLm<5C49ZSlnO8 zbG_y*+SpcKJdzo_^fb>^jkij1`s>U(gCS%N4eOH&DAwDiU-&<_(5luw3aK}{PnEUV zwlT6*N1}_r0<2FH`S!Fo&NTgnx3Axo=Y6y@Tw(P8*g&7j|9>~ok=W3K%(GIK=D@v( zfm8177w(w4_JNb3Mv?9Ory#+Q{g5S#^dvN$!ZlA zWbTg%BJ#)h{)k~&=Fb^C^my~S#1 z46bss2o-v+>p-RTaj5as9gH%`z|Mq%gx5p0*P;qrVnx(UX}Xm4|#-a38JI6 z-}f^1X{w9SP2*I=noljmy_L4tx}X{?mY{7W?a z;=OA@LEX>O>MW#_ea5G;euJFEgn#x#1?ZQ9ZwWl49b%NhvDnsfR_|Fv;yeGezs#|P0 zWI)%<_m0cpchULs_YvW;EgcdItLlYkdO2%BZTy?j845a^`Xl<*s#jUS`piRvo@pHq z`pA8W`)Y>22P;0{mGi4|jc|gzj=k||MZAa>_eBT$-med_9seH%bU#!)YZk zP7SeXIeW1VxnY92xGN=J-g^_QS$m5LVxHw>5>=u^sCYqqjfka6vjA{I{#tZ&!DR1y zp)AO=xabdgC!yR0?1kc7Y_Mu$-YtdcuOZkNs=>IB$*dc4Am zY*g4sbr?-Es;(<#ce}$sN8F;78FEJ_Sj#|GFLwFC*lvV_tJrVqPNP)=@Rsvha|s;CoVMafne-TC^);WMht_o%#qEnV+#{!f;F$<=TJteW?=9-(EFJ7C`Ox7h#GN>U`Xp7W{!{r-X9IXt__s zn$n@hApcg;jdP;Cml~pHbWF&4`+Z1w-fB6xQOH}=CkAbZXW&8Aj&pjeimZwlB14M2x^eN zm0BLy`~9Z}lf1nniK*N2*R}he*7oU4|0w5vOZai`osub%{8iBMg13>{tzCV{t@!1! z?2HJ7oLwRUDaXV@xc-YQv94bTziZu&VX{&YFH8nXzey@R||v1dT=h(u*$s+JUHucp~Bz+vvGi(%y5paO4VIg>r3uWLVlbZ|hg zL0D@|m=eF22~RI8wX@XkuL)(nlcAyfM@@T5jh*SIm@^17rKk%M!=N4PpKWY>=~3Z> zn8FwQ)j9o3Oy0z0eTUS$9tQw%Runr^G4Sr%d=fC=aCOvmdEQ1Z8>FH+KFQCa%wnA z#)fSZ%-5x!KBeAEYWlh(TtOr5;Ve$wkvROg3|^7U>L~XxG0SKXOA#T{t=8taX%@vm z698eX1&ZJ?aPMBVqMy^-J>Ij8zvQ2d-N|3XYPCFHurPGCJ3dbFY zH5rc8QFa$M#dIts66=|%kn}kfnV9^#hZ12TuKRaw*NWMn3*4gJbE_DoY&3H-|Pfxn+Cz5*)7PLP_+ zwL!EyATZY3hyYo#3WIdYS2eaP8U$E1OXAl zld^z*glhV8v?UaWv*gv~2OeGRkI${)@UUwq4b6&H5D`7Z2mEVzx`s!=jwD4@Z*`qu z;hTb!)j0uF1I{1956|^rzZrtbo#hSHobYOM%Z{GqC1&k8s$xxyAmni$X^AHW@-T@C z;DnEEvi9A0+J&1)f;d@q5d!vlAgmV~JlVuiov=8V?Iyb;58RpRp(ttBL6j!6T0#a= z-{$_n%RHS<1GUQpeZfelzR3p%uz)|*r-f`Xz+d?AXEQ~i4r!o?A3!|Btj>}oQZfWm z;)#=~AVnM;br0I+9?YHu;`^@HLlck5o$tAp#ALJ>*!!=fNc>8tr+-=YP}v4s2g_s~ za&E&|T80|B`Mej8D-(k_yvZf8=4ztt)#6}xI**N7m%GrK5>1BwPblL}&eDw}$9|P{*(D|7Ie! zyV2$S$4Lvx|8`Ox*<;D~d`hu}oCv4G3XY%bcu0Vw1d-75Cr;Krq*OQUOac=8!3-p* z2ixS%r+CH40NLEde-97VAJAlnXIT=khiXzmwJA`DNyUpjQY4QCYwgV~R)p9sFglBX z1l+x;Y45HWmG4u}bRCteQ2o>758HSsYO#9_&OLH3G*HZe%lHj#}GOB%rf z0KuLFA&nIPzrQ8_e|f*2w6L#7NZlPP(dM2VJ>SFQ;bWe{XblpGLlNmUdf`P6QSCKZ zYnFr-{fdLK)@sxdqSzojT3si!{r&n`OaM4@hInvb&<4u-Y*Ggz5Pb5D+1y9dhO(^A zIf!1P2OlIp4&}3I2mpgkXGCJ(HnaMbKi)A1C(=!6zskA+A!jgQPhre86)?a6L9;~g zL2+Je^KV?Uqg_)JoKhdF1#}5Fw=?rHK<%4JB;#ZAeeT=85+lMg^WH@H2-yEeI>W&v1 zlelV#)3{`$>w}Rp>TX0k^*wAcs2?4K@vxS@ERnJHX4X}peC_$lsF89v^1u3USCRzK zhmCKQnodTNB-pB?zy3Oc_;`tPAT22m1eLJG;c%M_^5d}>YLjYSPfXbqzmZYQ^ULTT znO-H~NxQ0q@)e9m-7Sby27wcKmV=&v3T;5?bdm6$4)&x1QO#i}W33hmFlHzOdianL z5YW{P2naY*z`;T47tSE%8OiRcEBFjPGT}8Z3-u&DmJ+5dgg_`bZ1j`smH#v+duViD zD>7(ZH7ZN3C8c>nk(!jl(Gi3e%l>%xx)&xF-*K~00-#JE=Wi|s<+P;n9P>pkM1+7e zPE=TjjvQVI{Tnz=0UtQEuS(M+%gDXO3A$paJk9Gq z@^R@3L^)A!#(XNBq-0dD7WO~aBolNrk5n8KzInAxr|;f+3+K?spq*%*Dtz-GhePl( z0`9LptELRSr^ZSRacSfS7{}B9inU(!VVwbCu?vzoN(=#^l`B6QJnVV>Ck4@uSwGDr zo+@F7n#238^SP26Mv2~=k$Gdj=uYw91jN8&e}J%fGldx6axi?-!33|58CRnG=UIJ8 zdPa5XMMMqD=?q0PEwvS3S$tATwWcM8K=q+aKtmROzVpU>3}cE#LiPII8X)PH=*1j6aCgA*qYz44ELo=o+u1_qSr+@^7W3^g`ZRE||@m5ve&!MCQz z2{BLMaw?4nrX*`M6&T zm-zFh(1T??4}`Tr=;@(Al4uYfBI@PIcsPNSNaAF~<^Ho()82Y^3T>OJ+V=s(Ap(vs z`D@lZQ=$XZo-yWV-BZ*gA9F-0Rh>p24YCH2#i0-qV)gw%|mZ~Yde>HF6`lwT}seg5tC*dS#1%9(^vL%oB_^T4x+zSPscv_ZMfR)sG z2TP4*9%QYcxx^oTjNiACJXi)2EC|nddxui9zn7Q0=};fL_`EP^*A$3TW)uFs<|q<# zn;3ZZKa+Kj}Hh-Y0yy{GHDy`B^HO=o>9?Zpa{J)DHBi+=+n{UXcor=xy z9LHbO%jmOVd6qbT5a?U686AD24BZWLu6r;b zc~A=LCB|Rw&&3X~PT#=4O`YsQVK1CN_36<+*!!BE%X$(6#uOEWXRBSBR}rOi8_0q|WdDgyx}-4^~zT1jso6+4m2 zL_}?f!@*!6QII)T+Ka{SyuB#uOFpMaayGdqx)K9z%QCeOjrE&nO%#SB)!@1JvA2%L zNa>;R^y&X|w=-*p4rPX)6!i=KM7CwpYoUMohefn&BxY&0q}-O`Po{eQT@jRPPL_fp z60wy6T8-GMeA-T3ym0*wA4p?XS)+*XdoaHm646~Jmjs0_m=%)1ZOM?`X^(ve%aTbI zK=67IEfPLQN3cmkwPpkiejQAv4DhgRW`lJR-{%R|Y8ADOuYXYi!|5`$6SHDl+v^RG z&_BAx>mCbeWfT#sq*{ITdASs(aH)+^ zwy|H1_hUg*%Cy~y7Vj0QqjYd02n3|SSxV7EL=FCs0g1f_IOH)R{lf+kQ6yyM+Nd-g zejVDq{(4NL;d_rhIX2NPI|o?M0UA{ldga}u_m+r^e*wA1!>)y@a68fgWbpKH09>Av zKlL!?R0c!2jg%LGPdkY(vU3{S>7*}ur{nV(PJs?I6aVx zw?v4?N0?A|;WdN~V95j|0;taEAr~Ahzd26{jk4?EVM)xo1^mc_)3*Q4Eq0(1Vf^dD zS^A1c58o$VDfU^XbT|8f2!rQsNY6wSynr4$r`dhE;Y$g<2UX_a3Drz;%eLeO9&Z|U zu|exZd~zVT)Na{r5cWrx2puo9?Tr_uUv(sQ+x(Yw2ur(#_#~ z>T$R9uvBU|9R6cz|F2trJ|^d@(PH1;CJuxAS!;F?LF)i?7+qv{;;IsRAzU(5p#ZX_ z`G|dj5g_Z+WErE;_7n~H@hUj!px~uR-lX6-=Gg72=Pw!LdHfdk}%wdj0(HJ*Sl>80fb4Y0!^7b2#k1m%>vhkLk6;_;1fh>a@Q`gEji= zs%wFvS3v4iMerhv@Aqst)6fzBsZkYxh?U42Xq z`&EgQEB&$?H11HzSVO@F9+grHt;&k8LO^o1zXw5isp9Ubap=L$g4UNbxUKmG;?Q4k zd^`+A)}L{3G~%)R>_5kFbEOXY5@XWEWAc6lsUL&zX#;YBfw~th;eVSr;Ol;^_kJW& zPx~y0V_AdWT7aw!9ljgH_4GYsRV}_ynJ&V`FFHAHOg9l6YCPzXfus25aB8_yGzA~f zHaS}Uu8npW)O$u;*q`L?*x(y`r!27KtkNM|pAgLk<3WeCL~ei)!boJNo{fJ?9KUh= zgfUF&U@zNFs46`AfqoT$N|{}#$Cq3*LQj5Ha<1H?puSA%csV# z7t?}`#bdMdjeMnE-F&{%1_KQoRX2fB6dd2`!HVCxIrx);W6|g;gmKRHQ&Oa@I8twS zD@a45GK;=<&qCm{$5(#zMs`aT*qlXqTwSSn`#C8hf*XGn#;g;63*8dRtV5rNfcu`D z`@a@Jd z0cLJv#5B)~Y`};UOADYpc(ROnQ8{pr?0GTJ4B+sIBUbP07mt6UG&fFbw#|@?uNz0l zT#y({#{m$&(OXeazy!7`6Wl2HNiL#1AzW{^>?SaD)z-+uNAIW)@eg^p2kt4HX~ z(q6|;nMaIfBe7Pfa#Dp+qgx;a{EY0;lGkf3?`VT

ft|Pl0Bh$vx@T>&uEaagGPXz)nlN80NQ!P5y@JB&@S^!c zTZXUXQT0Aku_<=*CO{(jJ7N&MW!?x2iINwub&$PKpD|=EK4!p zJfy48;d-q_(wDBp6uT8~pgg4YcydRCiph(`5HMPW!zTxPB^>lsv1%aX33&8!tapYg zipi0-w#8QZOhEk}_ppb0ttHZb*$Eut`{YP?w$`U0C4xBV$PC3%q7j_eP4ts?()~I~ zR1p?+&Pe??wUVtjj#heVQT(AHiw-Ir$f37i^jf_{fu!$<%B|IAe)e$Yf2b@xxOdsB z429MJQ9|nWS1L-yR!ww35FoO@@fmN`Wf)Z(e3-Ny>n@-7vsV!u%EeafmwIhNcy^=e ztr~wmRTMfT${2te8!@zJJ^K91Ydq!eMiJwY0KCKa|0@B6Hw1blp8Hmy@Ua#v&=56J zd_(Tfw==M%3@5<~I_KVo@W3GGTzwc20EYN401pfwV2c;?4Pv1N3^UNBSo}hPU5N^r zmiY@p>jo2kVhQ0o&1+0}q(g>e@O{W-o$oS+J0zLqY{E4Us1YwXZzvxDR@tUrs0UP(}HF)0sL>2vlg}jD1CA zmSc5+zSZ*E=Hsa-i+ZCV(2-DqZZz5)pPm5Af9WA8fb{OzY8=4iE_?eX=oO9<+=wv` zEVSw(`LnM^gchy>bVK{8w8AOybPM5O!H*F!=)^$z?--rsvEfB7R$%mb1OZ+s~I00jyFr;7xwZou6nw74muW}9eff0JE+Sw&M&*5ks{E+{z{NJ>} zk2A{Vpw{E(?<>=D)KI*#f+Kyd9fbRZ`j~vBaadkc)K`LxW@xT^r8;69}%PF zX0H;*)3mavY2eqyuT8|Zl&yI;-O5qz5CD7CE_!gxct}s zKaaYMs@=WV`c4jAoAZ2~R-BM^y_>t)joS&7D93xLfm)yM&Xx*whB&4nP3Vad2D~3h zSh&#E8Pu3;$FnTm-~2SYzUE+YWLxb%z1yB=>FOH@I_~#RlNcXeioUkBGp?JsvGrnR z_Mf<^h7ON|_z0gy^9tId?d-;N3iu}9ze@)W6PEP@b#7zZ30>YSA2Xvv;6#hAKbIdQ zo$NU^*Q4V|S9_HC3W_`t4H_DrVliWeJtJ9bfkszc;t4 zX}4214<~2Q->e>FS2_i}y(#^>@9amv3vHv-;3@@QHuJUlufFS%24*gDf~LOeT$0t2 za+-CcksWit8kts#=5`uSH?5nrTch*ml^af7-EWgxWp~=N4$Q^sA{pI&l}|dSHgX+U zycCTroEL5g!Z|cMt?pP<1jrt}oN&HaZJnJtyRF5ne(`&@=Hh`&_LAhnh3x6<#Z%g| z)-EF-$u$q}qsjw82|2sT<-j>KmEW%oe}P9oeF$6Jk6e}S#g7NVAMJF_%~{Vr6ng1z z?7HHAv47q1Q!;W|aLTEEO*QYtucmx*9vUyA*qG?!+lv|f5s*4;={zQ}6*6SrxHM3X zz7h@jlt5GJS?9Dprhy|k%Qp>1RU9SAFfDQ4=^{JjXsr-GQ}p9-DJXQ&by;zhI2#@= zbz^olk|A9H9cnX@-~C`AH0fk^AOT%lo)I`-6Mrtf~Q)>L;>d&Pm510g0n2 zRnK`yj6TMv$~$vvF`An(#Lw>rMeCY`;96w4XXYufg=xjTXH6$8TjW&?;UYmn1&_QL z9_o5Y^dSYGpI5R!_`v=^48y!~KmTGoey`N$3?iR@RURYVP%yDQmPvEwR=BbxLpErI z)81n)-xM2oO$ADm4YFqnjz28q)P5wo(@!QM=tF?ikN6mDWS#Be$p%n^5#X_>ug(cMhF zJsL>O*i_k^Q6O;oa=5uEe{b`{o-WmJYG6v^p4*C*iO-AY+T=s7^PefCUCcLJ_N&pJ z{B_RnmSk??*7pwr8^~rEq?ywByJs9;`e66_cGxMzm;82SBwCoHEJEB;@)ExhQn z!;%LLeeEbu6xkm$s0SMPUQ9>r+erL8OUf7N=@pKe7nyB*w=FShvE57+W!A7WQ{tl% zpmlBYU#cVZ{$y6zkwEQISH-CnQ;1e$c%Zt|GS}nEs$4By(@w8~Gk<2o@%7UgN!-B7 z(6MsHKiK#)9gXzeCO!?_nc!zV%s+DtJCQD|BX4v9f$LPBSfbme~|mxmAKHwb0cU z?8Sf}4gB3D!p`g5(fQK8)_3i#2RTVCOid-}|3x{+lnTI`B&ApHm^GP|v-rsEgi!ie zwx2qU?h`W7_*-&%McFfhSF3g%Eo%kH+Ia{}q;7BulG$9mD04$>8?3#+{~3Z>^qz(JX##G z{i@+(2CZ`Lekc7KRFJs0GVzXlGE!qE|4|{CMzku0wRjEN5K|ZqNg{8KnWonx9A*KbN-yYzGu#bzq<`}xuN&3KiqDms8PSrjfDBk&7+|LSETk!BaCi7WD^ZQ?7C$9VPZ3EvFN`gJ)(> zcPs3yD7sEP#xSx0_gYbzlCi&y&Yo<)L9`_#n9*}aQyU)LabhGp>v7<>Qw(W^++qP}nwr!g`#>C0Q=ERveIhp@Cr*7R_w`+Ix{;;d7 z`mOb@^{ij@CWwOm_U`}(TkM%^Bd?;@^klzJ?SK_2O<7OfI>G1j2Q>i?9gru#&y~-+ z&!;p3zaBsDI)cyc&rXK-J65Q-mCwK18{|JeA0EJ*1@&!W`eRWEO-zU5Kk87C{8j`$ z+!nX}-hck$&+GFAL-e-xt2Ni0_G%v%Pw-3N9VXQ?XgET28xJ?y^@==1?v7UBCb zJu7Agsv|1`se@B?gYB231JUi{3V=21di;LgegV&35{!dLjlZI86^IrY*~0bU3ONx# z$hPo;5ZesxyhU$y`o0ykA=5H!6YQw=YJHmhf+Ws{WyO)jV%=;Z<|#y@eAGoHiZLKu zg|>4A+^uC;WKf5erG4oos+KCmk6uTmLd8|3L^Y&-u@a?Nbx8#{QmkeAZw2V@U-oLZ zRV)K&HbQhs1w8{OHXf`(ySlz^u&HDIqlKn!+t1HWTkTvJ`|V?riwc5gNM;S=5=|aN z%@|N$Z0MACCWAXrJO_R$IdgE;=f{4CmL}V4-x2M37)T6fven)fjAlGw_P4zX^wSZF zUeS;9F#`@l)1iPlc}EXYH@#^O`5E-{;nF^pgs{3lLnVy?TivP-k2k>2roWHWnXoPy zOe=#e6Dh0;J z`BOAiUsDr!D56KPE1gA}O{OC5GbajrEw_>YD&DDgQIgHm6-Da}<9cMpU3%3Sn=ySw z$U1bBzR`5e$YE59hrF8gd*Ubtg!)^9cN(9QKlu%=Y%kHQE%iHaESe`g?^k`4q^c?=YPW`l9x zwt8yg2y5}x+Lx@Rz7s8}^*X6pMoolha@O0*zZ5#omDEtFwbN6Z{jD~nTGD_^QRK9% z9^-r}A5U4WGUCI{s?Jn(tSSY)@YSXg;TD;PoQT21xOdtr==Lb+jFyGT&bi5$Xcmk`&(Z6xaA-rA6QfXrHRJXCsb z{WXJg$#Jo9Ydw%!&!xToSCr)&VRty7$9Kux!5nCUc{ZDRP$s_$JO>W6BQ zEjT;vEohxW>{b^s7PyYAD{1*7M^3`1qo$S_032cqwu-W%0a1&r^)k;8&zW7Ky<`;u zDlCVJcfiRbmb=P{VS&ApG5A1RA%dAi9__Qk5+oJq3WOn%L5!3KT{snu!yXk>% zg`JZ1xluKp+D{F^3qDrvv?+92Nk-F_Nk4CYHz&GXdwT9(m)LQoLq<>XBxttu(Sku+ ziqn&~qKn(l!LlD-=HgBJVanCqPqhT!{Q!HyTLd5pQP<19sh;Jr-kq}}`K#SVnK_WU z4~0x;kKL$MDt+Huv0w2iFauKw$0)b2?-zmPSk3)7WWeTRehY8m*J5F~lZGg>|JBfR z+A#o~1@APnv-_>b0}P1=XXD+yi7#oPqK`)=XY=9c^e4hGB>cS+i?g&^fWBy zLVOimvcAiL%ERPu3kWstnw{E%i@M2+#@TZ{I=jg?yhxfQ?P++PYYt3tR; z=)R0y?@Gu0`=#q!l{m;OHQICq*vTGc5NT#x&fDohWu`jAdW2+~|t zvjv;X@9@S-60r4KVu+=&juPa;-Mi`&%2EhK>CNQxcv|V6TP**5rE5O=)Q0K-eWn2o z1kk(zevMr5h+ruFm zPOlvyO*lSgvox*12v?Dq0tj`jG0D=_cnEDYn*mYkPt=RdSe5IBRP;%B%k%ni@9O#p$G+uxKL8OGBrbqbd0xM!=J#zBA6;7Hxn`?{`=F! zC`4V@@2m)m_HC!8+dYU$ycT>pWDBBNIvb?hV zy_VqfYT9sYI4zz-dKb>>2V8BiRA7I2nP=?MxJY>-mcdnU`BaYazGJ36;OW{VA}u#U zEw;pV5}yTU5Hvfb;45 z=9hc}?ppX!-;VBXTFYt~bo^p8r!kN-yN6Yy(^uz`QFhK7xV;ek2%TDv@tn55bEOw` z>xoHxUEQ6FseC{q)ay46!imGR2f^d?+~`g*);EQ!=f%k2Gr*bWVh>svWJ zozy0NlBUz~%_2xzq#vaTlsnLy5$mN9LwNh};O~9?2pPRV|IUUm*ID0hF44U2uV-oh zmm(cxdu94G?G`2&HbNozj^SsXFtU;^G->gj6^R6`52}@6{%(1tWcdvEQ_gvwST%Aa|#97j;YOF{UH38)tZAMfXu!p>J$CF`Ijg zRoj2CzKvOlono74?!jEhHSsMJlQ?~ranKEXzTxh~)pmd-^# zM8$zU-)bGheJIC~^|HyTd{VK}gV%z21K$O^f6&)L?HM9ncqY?&+$15q>0Q+YLfsW} z5>YAumd*sWy~FKK+sc(D?j(Xm5;@VGCy43@y8entIJ(6%qaspSTE9!>+zHdukt5?c zXxl+!k2-@U1y#FYL-mht5KMgyJ%5vT*j6^RvF4|5eUm2cRr#u7!3)3V%Ymq|BK?3c zlv&tl5e%#-*m@QyZF9O4TE|r-ld?=d5H(@y1UL_~ToKQpMu12n6#^o_zAe&yOk1{Jz{Ah z$fUMOqAI)_eL+jdZ_GW?#w$wEpT|4nwD)wW59NLg@zq{RPbP%rlGSkrykcAe#8MaR z`+g|;TV1Yf-%8IdcI0bGvK}U}^&}p&?EVF*emlI>c?+~7b(E;f+(1p%&K!HslmSW2 zu>dkSb_P=Cvt~o?dn?}8_8o4ER3DFYRx;KB^i8HV`y+azA zO35C@tCJGK3InMzCj$lklzj6d!L&TpQDoK`^pc?iLb)dtQnzR&o8G6=Rsvz^qEb87 zX*K(86+lu&Ak;I7n||?FpceLN($}F|p-A})9tiTKlPC15*RK>)x3^bY#UgaP^3=cv z&QiB~wp-w)$&Q1o#m1x;MB#7-|lbThJI@RwJ~)1YYIT}p4G*q?uX(OPQGDUv1CP4 zx4*a=l)-wEy0OhAhhuPl{nJ z-9_c>S&IhqL%hSKcdbb~CE%hqJ>!e7OjR_5mAbD3@Gz55dqz+ z_sf!_D>hMA&VriHQ(7zBWLDX~qk{5U=i4+R_Q^uHMLSL577s;|LY080QOS?AEeK8| zXRG!%#ktvwu%r9^4NMkYOS%H&b5NQY2=&Oir2BRBx}6!H8!0bVGX>Fv{5ZPKNqP+J zGx_+YicawQK-w7yfGsZeqXuqnQJSL6^RQVvFYNdJL3(qw7nE(ugX-~A?T>juqLfZG zoqq}-W9DlWRh@k zIwjtAbx;sv|>j=y21yc4d?!XLF(Tl#*e zc+C4-RT2n9dEjKe%K)@F(SIAzd82rfpNQ>MeNE>owKdRCntt}S*Jg|;4ubtes=X&o z?bqF{*h3@EO0*P1uE5!*Yo`%vy#*1%3NV~foo3jbG@ppQ2hP!!DAKzjPb!$z+mxTh z42{Rdvu89q6YlDjbx1o3lepv#JeBHe`y!W6zFz^znE_ib6e)~Q=#siDKh^ls(l|>C z)dtIBqz!c@*GqTn0>e0?b^Vmu(BSGRS5F@hv(9^!k;$0Ke#LHVC}vx#Ph;3C`RIrz9KO}gCl;h)-H2C(DEHQ+ zPj+BvZ$ao{>J$?AMt`k|I@Vz8i))Jy5y*zNBe$cIQ3EIwJEpzUekVRNJEnfgOD9XC z@>iG|k}Bzf>v}TIA%!i;PtH;HbZagn=F`x^YmSADq0gk!bv4Uh7*7{Z#%k-L->`&L z_Mz+RDj9n5^x&7yqdqWwf}uS(#wSO5-TED}E;-j0gcy`Wzla+$zp0qh9oLG9{!zj( z-x5K@2kz$3!cw)P(_~PiOTBqq-SqgH|E)l=CB%T&K1mQXNa)&A^M-{?QB#yPlvFeiHq2(%a zwtJ7N4vwvXIhE1Wp)K9`-&eaA*`u@h=Z`4t+47`Brc~=^~{^L#t za#6OS2naN07FtEkIwf4n9n+IeJVqh7dU)D?rsi+dyYU{lEG%-F@a8Gaj;au9y68lJ z+X0>k>y#47ik&^8nzDo6@maGAnj}x%{#mm?9yi;&FMgVZtM}IRKTIQW;>ZuhYvnnkInaq zAIV<6+|2n~R0{r3iilMXbqp*w`+*~|Dy{Xw$QMh2)&;5sI1ulwdHW<6e4C8&2k5Y1 z!0|OHoKM_u8n7-hvqRxbq|Ra2(m=4UcO<$caAwm^WzHz3f3ICNxES;nqocQUU{z`E zR`)OIsNo`WgrVIzdPs@kWKVFDg3EA(1G5c+v~fr@%%*N1B*@rk35=Cey|xH=e4&PX z@em78bA;^)-rqot#g*c)1^3N5(>$YQ$4Fm<@HVq`lLqC2j{Vgb8l`T8??_kN4jRRWJ0!BYVC#u8mx&AdsoIk%cV3n| zhMLqT>s6{r)BBb1JJ{gVPgUf*=mdv>2_Z!P!E>UqvBn>>*%5)~2@tm97!ih&P4de2 z8hvzP)r)ZT)%5-I4iH+iw8om={@XfjDU(yC91Z$~s3QHD9rtsnu?78rN7N(O=mHEZ zgfD%8;=!L~!g)qr{9>|T70^hm3#b*QJIL|C^k6SUMFdoyEMH68^2u4ns9otGL8 z06a-8{(p3S&__y(-sRrCDA+bhL|TNY)^j3Q4EIImDx?1)b456|uiPR?#T<5w8eGWX zHm?$bb*SA@Bw>PSQH;N1&1c^>?KI)y+>S+YhoR8Jq1^Q*E(+ZriA2)7MfS#=9Ho+E zsDOLO>DXk1S!GEJ-CNH&(O0TZFM9eAmZ0mQcI>DM>{PNLLw7XSbx| zK`%s=jrOOvmM{4>Dc^sm8b-g6JoVfyg0M|dl!xj_>eO>m#*LR7vt;M?EpLd#52V-T z?4!~>eaL)^-9-xIRK0(C*?qRN1QMfYHePy{0ZCcg*n-g{T?C>hBY9`2^xu|*H*e5l z0xJ_wS&QIyyj$_?)qhs;H!;(U+kj9VkjV(loy}$8;{==Pt5WY3AiwR9(elO6FZuGb z{}7TE(juON~HEj|Yuq=v=<-IO(LL5ohfV2S#9L zrlJ%GQ@6wG0N_neVA;ORDpMRJRbZ?e;VTnmAe+@s%mazatD2GlA!8xl401$5#FaaH zjdae{^{`*1PtyrJPtE?>TPG&{UlMkI``7z?C78m%EX@;ymMN$>tf0{}?o$H)1)}c1 zK&;X^oEX+sgsV41kE_)bKU|OOplb8i+6VPLF28Fi{9jn7<{hStT3%G~ql5qQMBFHh z_>KnuEZoE4!59d2TkSN_)H4WmT^i#|KtP)A7cPDIlcTfZMwN+6QKyu_FF`)xQu|it zwc-$2UU0!7de{{`m31W$kNMnpUT2i_wEp5=kJmiI}Y>Oi3y!V=4bDB-Bni=Wh~6nNcKwR?t}~0I3?x z=y5;5@ynd{?_i^6sTq7h@SIP-=&DRuJ2CJp^QJmL%csmrh^9?k(l!(aN<6h=T7F1a zf{=;&Uu`&Aw$wy+lmb!du1cL6M#L^|~=SLRv$4(Q4V1{b%6yhEQ6 z?U8~zH0ROfN~-#^6I4=o2*juk1i`axc1ZgLOGgUFCOId}M?)Ka2z2*k{y!#V;kk04 zN0;F@iss=PaPcwqkS5k5sBz5{>IUu_1ivJdCDs7)`qCOlGET8jm~&$moxH;_e`hZ^ zU>AhSFCTI?QkP6J&Dr={vQlBg{3BKhN`pVQ6IO*{;LpkCj~iSl3~GM)Wf^ACH@2YF z=Sz9AN;7#=^CHXS>NE0jk9dnYEm2YIJ{*%b%_#Apdn-MHdfFc=IT@kYP;+>tzNm?Q zaX~AvFnUoEA?K;n9Pm%}65}q<-<1Y$FKJZ4sWd=d5Su7H}Y z-5H!s-KG{w_witEJ{{F%ydmKonOvmcBrcHzaO@Aa46ezAZ{ox3T^#p~Y>sY&+!cU% zQ}i!ISt7WeV@`4~hN~_x_P#e>MWRY6*@;9DCaT8Ll=0zdbYYI`=5ITw;KX7}aEu=Q z0j12DxGZ1UX4Xx!bKA8>NS+h$~%$V#X9Mb`-t+T~SAm ztxC9io=^+<7e2$DULEPW_Kl={eD2OSxV^yBxu-&6Wew`d%;k6 zk(iw2@I9{Q5lQIxqcAY*_<_Av=d8j3nTfz0%k^TGuViev8zAuz77f7-aa2-@d+ zMX(;f=ipsZkpQS3>DrI`q(r*iS8BvxaRRFL)vnhVKEhS>1L`z?mTr8>!Rp%u^NW4e zHpI{|-9bp#D+z5N=u~aMoes(WTA0F6Be76l{1re6U_Js760ft`vWt|R3!kUFO_AbA zLIT0yyj-|yxAWn?=nc|Dz-ID9lW~YVecZ%Cib#G z4Y!ZYsM8`+R>@Fx|40w(AT$tlbNei1wZRG2h`r&$2gr154sg)JzoNm}ea8mJc(+%% z#SsalP>kq5(3cY}l`syV>?qyZ6`)LiKS1Bbn~;u zWDFa+&uBngU+R2|G|F<%_47 znq|4%7K&?r6J1O=ps3(h-{oVKbej^8wc>|@rS@-fI!yco`NDwCW?N0q+LV5yyK6|N z>nWY4b$Is2+!V%7{Ns#eUWx!oSviQdvO;r_`L0ER`$;f>h$l_<(TslL)RC*Ayj*rs zneAcvI5+-~;XQ|O->Cx))55;Ef#=(}v+J*+Oi^w6+PfgLc@HA4CTzYnDsD|u-wNgm z1@9I^&Ihe*L!L@uOV9A3Inq`~Px+v0o^lWooje%?2aZYyJ6fcSmxFn*r2H^SPlxhH z!*@HokdK|kH2T&sC2$#dcQ>U|V!rrAQ+8M_d;*H_nG6Wub8tBvC)uq$C2juw2zavt zfH*t15yvT7`r9rp?xVvX5Gu0vgRu}MNFoMcCk7;}zOw><%_lo}8EIn7y|O_LF3CZ^ zS#VMq*~SGoo84c%Q)|w#S%MTecv;)#wk%->u>yauSihmxtZgHq24~ae31og$b#<2@ zm1ZqwM^|q_;Q@<%wSw<%_EE;t3whw9GN>ffL9G4_J+oSfw;}i~D|^t)Xz_c470@e3b!97uV%0|y$U zUIg38(y^nbl>7kVaF04xsqi((_@Dvg_%~=ABG6wkEVxYL5fbNw^=miK=&kLHB5IV& z?0>brYy8_jf1>`)CfRj#(yWq=(`-~X@VkvHSwZa{9>Ebfsi74>oz9TC`yTDO<SP3QQNe5w9L!@A*O@BpGoRDg z%m(wBuwQY5zaoMd0B3IT;9j1cZtj6%ceb$Cghjhu?oj%6Czm%1Q(i_iPT27tEWz-_ zxXbcBV&wKZV~p45tT^?afoma~^{h5@nvt`*x0R7quI^AVEQ(%rC|t<=&dPl zHoEgr&cMybnrh9gkTN)K=1)Cqeo`2Vod@StNJbF>I+L7LOM}@$CLC27%Md?O;)e6u zJ-JQ`ItFYDeJ%S!YzCc#7hll>zPM)`y+r8liDM!~5uDDrgQICDGBL2j(c1SZPe- zSyX!ts)t)swy1cRWzJYBw_=^``}ne(2f3rDZ6UX0h;6bCZcVky(8+t_c~^d_u+cc^ zNSZ;HcDsJQp~L}E3*6i-N$D^{f5(A+`-!34kZOI~smL3RO;A}3o<5gFND#H5PE0(x zIHEAC%>wn?iTotHW~eutgdD5qW`A!~Z-C@WY~g*r_66I<_9iTuH;<47NjL=8)ViJv z6=Sfe%rB!B)VSTHsHHgbuM_PE6A#ht*Na;1>E@>P56qbcp>!R`q1QW)_Kjdl`K~4TaBA_}M zzr{H)rpJER&oMfZo_OgCSMGU+Mo_k;UtN#!dm=IllT~9bUP5i+M?>`A)*@&!;3=~o z?=Gv?Pf+`*fZma9h@`|_$P^Xp^D_}WCG3_U{?beSb$C%s1dY;eL5*qhQUr3S%!1gS z86KCNkooO}^d8A-;evqyfIgi^oe2y^v`N;)$=(Cs!^!al?%i@vJ6e8IOF#-SlC7W- zTbjzC3x>|@Rr)TDn*}MO1IqgvXg;DF%cLXG&UF*pVV60 zk0(0c)@1fH_#rDIk=LR`@Tcdu*eK1nr8{*MqwXX}{el6fND~PM!#U01G7TUh@@irU zCgJ0i$J10?*dvKdG!19?mwc72q^jtvy=Q0SiKZJQKa|P-9v+RXf<@VmGX9|2NUl#I zt<*m+QBmF~5@VA|T8^hCOW50S=2V$}jyLGd#JN+?2r>JYdHbo-(4R?E;G+_)8iwej zc<~FDu?m)ZjKc>>$JGdvb}6q~@Jq~}KV~R&noe_r^cTRHfOE87WHq5FDOv(CM;(Fa zBTz-ag8|xu17d`U$Wm9GUylI?6c$f_V?3f7Cc&H_s#);c^`O^=zXH*}W@EVv@VRTK~b-(6Exd0;8ZsU*tN_T4gMYoN0@Gvi*S0&L>=@yG& zRaz^?&xrQz#9(%=p$Hu)cM$ifaG+sO`ieVC>(_x_`vssWqGF5#6|bo^y-g-)%A94* z^w`vOvDy4;5OixP!b*Dvu0%2pZ;Zgb(vB$x$^<~&qiD62gYLq3iWcTkWa@V_H~e&P z-s)$~YsAONYdBNFODsHb#2Rg;8FaFPevm5eAo38G!IE30iIH_V?~yy4GCdf9G3c^5 z_p$|Cn=8+s%%TK+*M#1G4!1h>y!rKmc9sAUKWnIUF^t-j2OnggW?gR|pE2ltPst7; zgEniDN~!I<<(fjz7w~Hrw&$Sn^_T5ukZ?ckI`hiZHmQQ|yGN#HCn8fvQB)Ama)eie zc@-_7WyD1%xW^15r)IT<8Yq*zmh)ho7e-E^{GdGe53Abr5NFN|bN zXj_Ub-_87)0t+0;E*;}FS(1*Qm%P%y3HZmAV!YMTS}-e-6m2PfpT2A|Da$3)PDDV) zVNI0jlEit1lVwV3f$8UeU}+@pobN#P*= zvvjOsN;-i#gz{EBJd;mOMs3_V*$9ncm-DDq#*3S6h*HZ$3w#~Y_}t5-BaBK(Qc#gS zwKQBE&&Tk*Oel4A%B$A(Q~*BC)1Uu5AdwsMs3Dc)cnmL{#ZNp=a}EWN(Nu9O8q~q` zoNQ_CNT#qegMK@jv1bUld7vK% z=jthKxEFMUNG z^vF_2z!rQ-=&Iz+ZQMa~iV^9xS5HD?T#6?XtByozSJ-ln!{D?1OD@f541M~JOJHV% zOrS`=3-0!3F~NhF-%}t3{g$$)j=U{UR1C7xcb?m%({gzz*lNLs6dCZu<~UL*>Sdx3 zBSApe|2l?k!Ro!DFh7b~lUF{@E1`k&bL^y=CLGQit>V1p27euhyZd)SN9qN8vH=d= z=Gu{Vl235?HymqfvZv7*!~iWv)l>lTC`}KdX$KYXlKf6eHFN0dgX3oe0VkZpT&4D9 zv`WA>C3i^%GEw`qOh@tTY1R6eic<$nL1%BtQ9(8QlEdq-H4P>QXP+iFn1;8dkgBz` z1m$H!Y^!$k>65z*!S6pD(@oMBxWNwJi%SggCvDi2+D+W)kgL?XSG_M#QO6S`tVqTG zLF0sWlrbT&u;F;`9HzrdZh@qrjy^w`IfR7AmQM*#Nr~?6!091!nqp{HAQ9Un`%CLW zbumK5ZqZ?$l14FcbFI4}Vwt)Vswg%(ldC2wts$CZ)PCRa;l3zppiNbC;x?Ou8Rvzk zJ>H(bQfN5GG>?>WYed7N zPtNx#;jzjkNR6*&Zu`3+gqo(YDnoF|mmZWYT9or@VGD0FEjTNppNAH3xz>Cnh?2@e z%#2T>K~sN$M<0wOLwQE0Z0`Dkl_2f6!>oCwn@qFqbQ&s^rX-V2cYMaIGec53*^3Qt zf`5i)@@YPisxT^^gAL&_V|@a6GE35=-D=h3Z5-enDaroGq(jCVT2$4Ot3<9OSNXBl zURyzgUly$p{8xI4I$!R*K!MVWO&~3%btV{kSJ!%LB?4od(}(tSh9q()LvSRUa*O|Y zS)F*79OQB+g}ra-M{x$1!4te9?yVXJl-K7XW}^<&ICP`TF7di=83>6b#Bmqfdn54C z%suDNG;Rql_-mCb+hYW(?n|d?6XAdh=3HzuUmc0yC>d+0j^Q0tpDhMYNzevPz^2R# zd$v|jOAgJB`HQH*qx<}F^)*%G5eAs&pFy*dG=nR(M==vuTr`Ele8MB&-zCl+Ie|i3 zT$d_S)OH>D{|J)veTpHbKjO9oh7#|B3DxjB1Ihiz^kY*YA-b3x=ex0}Fvz0`bqL>n zwX-1pVVA;@QY0J#t14lHTaU6AVNogbkJFVn2Ya!RGu)D*;>1>eflguD?;=9VEj`lh zx6EZ&>I7`N)jL{j0h!-p9*oonZ-8xXeMgaG3fVh$*Fw|5ZxWmLz9ap^=ufzBSm_CG z8{g?KJWR&dZx*G~*=a|^G#QvOvDLO~tt)s!V55I0BDLBViz|i^i4(O068v3GQYP?3L9{Q8Opm-X&xbh9?=jOHH`^l~hba~UIh zPsS}rsbR44TfFn_LFa64Wn|W|Bw`YqLkyfHK_*vpv9*zkcjCLG_O5l_xBa3gVk_U* zoU;f7|8(A~EZ1%*H_5#V)ph{Rv)0BWS~+Wh?Qp*n+k;5WrRH(QdKx8|$L*)`u)Z%N zM~vsBAL}0FP}MfVvN64^qFnWQwt9>jr$-Z&fyNV!ayf~_k{rF+=wW5@DDM@K4Kyqr ztnE1&qA7c1W4XnC&G^YhIZe_eb>hNS%Ui$dBc;B?!BUe8Oe9BIWT6F7piw4;m~={H zM2E1s$jQYjT2}dF!_B&)x6&Cg4^vj(bf8cspZqG(bH5-YfBlXc->cY>-pwf0_M7<} z_3e&QpdE=t?PT;@BcGzEuMcCKvwJ2HloF7aDg~0g^jXd4R z`{vZ#Jh(RPfKpVQ69&&&ux`eWSI{Bc+E0re<}i3h7-RS8r~Y{bKeBI! ze07tR7il)ANk2a*VgqWtH}hdF*g$RX75N;WWj1^p{;yEG*YH7uV%pRA{=kwl$>-#)Ye8KSLlFh8 znFlME&}eaVB1CL?epSODL+ywDm$qnk$cN4>k^J-GxtS~NCQjH-UMKP_>1HC29A|Ra zjL7YQu~z1HhG^41pYi5OJYLfftP!sA-F;qsIYX{t02L9J)~U76PVS zB!8ZxFT2QZW;#unX~Z&=RMMG_Gv<>yliHbPNhgFo6i0qbYDU@~*|^GwE?-rd(swPGUdxl? zvDg>XiP^!=;hP*JNOReP<`ZlYX#WP;J*c*}_4YTgokpMTi)r&_w{PyFoW>CXACEI% z_t`hL-t2V{R;IPn-ng}0-JOt?205R8jrtUyKAJ6tZ%ePff z;XhG?OiF7Z!&W_?XqHwzx5X;osKm0mUEJt?D2oz%h(G!#5)2gL@CvxifL^{YvvX|V z`+)H0AK=vUSq~~$6gVdyeeE}jGuqv)Dg7dnr|EHbih^L!O-R|Xw#u#&7Lz>LiUU0z zH?}*|gRC<@r?&n^*|Xsw%zs5Kt0A~JkJi$BQ8m2nlLtvwr~a+~0GCy!5-;U9^h=;y z0i0qA)?NZ6RmbaZ84wBawJVg z)eYWk#&)*XZQ`ZC-J{$qpJpqJhq3-10qWw=%CnYrlAQQX0<(CYqPi`9$C$yvg*@oS z`S?&)B-kPr&3GdZihl@X-*{`{ztKO`e@6c@s<=J3>uk3F{lmeB_uZq_5?xj{c6@d;lJJ}!= zaUhJ|`7kOeFBOQERUnn;-1hud47=-)xXe7+*r7GJ^;%@LNP;O;8k}@29K;s}it!S+ z*KM-E3pGHd@!um5+E71v0?9NezQxm|In@ZH=elaIYLv$-O7K#9>l>+}mbWb_9K<7t zc%>reQ9NafKgT}}a@R#)F6q{tEl57M%{FV`K1i9{Jj_UUSi+8W5sr4S&(rHU#S^^< zk`w%9rPIg0(wT}U+###XWOPHxt8c?gHfdO$Z{_=fb!t8>fcaV6fb5DQ6zF^@^fwEC zl!%!(7QJ+|l^k9KzfwNK8GS#)IXAqT*m@0Ig^jnPWubL{bwt$gdLsfxHlUC$x-^Uf zPq4^&PN)z&h6NFm0{P2-pe9z81wXYexuzok!9*`7)<)*#?uY*-Zt z1smvS8h~vU_?U(S#Y(&72Sjr58IQmjh)ZN0#^6`@dt@Y!3+^@VEB6O?oAaQJkqw&8 zy&1*aoq)Rgxh3T5cSixtdOh>dzL*9<`f8&z(*$zAir{;H_Xu1Q!}$#B?IIsc&#u}a zznsV|oPDQVxms6&R`z)$a4f&L?v_cn6t}~#wYMEP()d)^nxj8(pcl96J~N1~m@mpGz7u`T+-6YEzDDX4c&V-O+XS>v+r zZh7O=qD!fYdAR!VA+(U2bbvaVIjgE}m2$VscV{-(`8MoqB9OL_S8G^)$0e^Z_Z-t= zr+?bN1XM3nCFpO-gO9`1to^iI(ZBO^ZeXyZ$gC4i`=#pMQ%4CJ!P*B}VY>ubXRbO+ zXr>e%EDvaJi3L&K+%h5kF6117JW%5_s0qKGIOiL0;DCjqD!GNP0Twg+^7w7q%!Frr zTKAEEIiIq0{K{#O@MMkUUV3J<2P;X$_!I4UtD4lZ;Xaok5Mw;!cKN-&;bw>0YP>{@ zt)|2s{~piD&xI~P*!GcSiln!=Uxb`5CVZbqsxwo`&OzM;y)-c8&Qpu(fp7u8r%12w z%-~ERoyUB-plw5kLU|ZUbefJr{Oz~%W84I3iJJwsF!IN!x{DgI%_PM<-hM%#QWrli zlz>$eIe@1ghbx3~v&t+IciU&dD^Qi5Szkrd50I4CH^On&0m}YS zJiqvr9K<50TJ?qtFdl7x=2@Hyb^PzKT!matfjdav&;6C$J4h~PR&7dNA4$vm2xkL) zoB~~;LbR*dH|5FRAN}PI_>SGFY;X4z(gq%vzj|U;<^^F!Nwt^qr@%6iWwSlQ_ z{q+ugKXIx?UpTIyDVYU}IdwYe5-J#-P^smGMhggZwRI@uXn>{SWwi7v7UCg+*UQD; zB{6q3S-eL{Ga6IIo2}xp_R~D1G`&-N)unNM<8_WUM$ztL2Vl8wpr=~j4LT@UIsxE7nvm*;*ONC2!tc`C>Q zbbrQT-c35FlbwRE79y<)?~CSPjCu= zs3wF5Eu~28;kD7cG<{e8F96IyGrwv#^I1E>JPHcsCgVVbu_ib%w`#<1m?qgP!GS^R z5B<^OGXBQfYH7jWGpi!E)j*Z~Bm*sdNmdKNz2+n3RcWQ-D;_5`NTC>})m30y!R>81 zF=_sS%~=nMv#0CE8qliYe?Obv`n?@j=0u89cyX)(cycW0)*CB9o+U>%Lzg(^uJIwj zPpS|eC)s9-JS$`Ns+#l9B-US<4UUeJq};WZo~VZT2Vvf_>5hY7lPj6x=#?#xQRmOq zp+0`*qaZ%mY<2kH7R$K@8Z?opQ>>Mi4FnS1;Ctqzj;S5mf2js}fPI7=~;G3jK^XqH<| z%wo8loGX(}(3Z<+s9Opw-m>ThON~P#G&PP@XlfiOq{g<`haTq=M9n{$c4f^eHb*u= zl_L`Zj9U(wCa*(rVuH0{JC$b3riK_C0;7t-^$%J=an{0ERI_Q*LJUq?5ZEmXYb0O~ z(I1o3mPyd#6j;1rDYmTz#pIZ!((*_^K#q7!IO5-2Q9*`T@k(DQV^gs~aAVI0T;KS% z5g${p;eY+WO!w2zcuvL-Xw(RP^{rj?c)jDRioB#$!`bij#Qhyr;y&I6fz|ys$=*jeqO_F+x67{Nv3?cn^4k6hXN*RZGdKGRSF1X#P zYdiChA!qdJ$csX_6EBIk>Olr2POc`Dl~y07qnvnUMh>O)+Q=EJPrr8OQI+WhMR^JI zJu<$ZNcJ{gP@72`;C;}Hdh2Rys~_Q#qRKGcM>Z1|?3<$Rxh!PVMQ#RtkBmtDBDmH} zy)C4XLWsbJ>Wh$hDAR8Li4!4{zQVlyw|mrfS2QO({NScHJR+7jgLug@})0?o2CBwdP)5UTuU?^Ld;)w`6Y^cO+|&C3fGm2t-K@~RiHRU#UNg?GtC z9HKbh6tiCxN;2{mGG(lVv-{j4GI79$m_&2N%jw*T5Yqz_|G9A zGppsqko%F;iK z`j*jf;Xai!$%A|LY+69&pGP7^{eeg^ead*%=o5{C{s%2% z^R&9co=s~ms9e(Y%y6qpl4e!!V}H_BPkdzgSb}K*y*3~-U2CL0pV4~vBxd=R%P<^W zPBme=oU6}tIg^+!e>4G}bg`cDCsVdN_!KGS=vL+7o4v*@DcV|e9|Wn43y&3pb0FE& zOVdR>&aOcf8T6pagGEy1$t@5(s1nXgHVLjGcu++If27OCaU(+5w5$Hnu%J1!dE65a zpa&)x^FZ-oN5(I%xhB8DSGGSt^;7rl#>AB|WJQbED_$D-{N!;@jo<|xr4r@w`W24Y zKKzu)2Eid-dw6ukYegS^J7I(13`7znBVKp=@MY>6!FRR!nvad(6WaIr%ZJ~y+aMsf zUtd88FJ{FdD7(Snk^bX$*E^h=`49i~EXWvK-zMtH7BB6LQM9HZt&Rn+M)32D7`ipz zhh)bTL%I7#*^q&|lJ=VlTXO@G8ocq*JKf!v3Ku$K7Dg#PKyQqXJ2MtlZ ziQ?%jimdI)NfAaZ1h-*oiW5%d)bmQXc(emtXjE(i6OvjS*`<-`Zj-qSihFEEhuY(5 zd{Wj5*~d}I3HRYP*eDxtNgpL!zu%>S38^m76JE%yjiLm_Ei|D&`gN85@kLri9xRL~ z+TazfWa|wGY*Gt^+RZ&SVJ&%jx6`>_e8KReP636Fr5{ab{hmwzeNkZ(XAo*y_t=EB z=G6M{oMy`AR=gy|iX{r8wD_23jI0o>4h0?CA5E!g9W+lJQui$h%#L;xg;0r~|g1pu(9A4a0@D;n`O<7vM*A zl?};>$!I2uMad&jNYkwpbq|Z^iAFi`D2dWNNwTIWg4T*EuTaAHb!U<-axBB<=yC25 zGtoqORi3O;$Lka25`*SHQJnR$D(?BVuxUEW$<~Jt`kWc{czQc8*+i04B-AOj5Zh!< zQ(4`(&x*SgJu@2m>~qIusVzLIqoyUAL-x4FXRFk5!z5cJp~V5qk1jN#)?v5a(Zumb zQQtBeF6@hjRaPc>aL=C2ov6=+qx5;=r0(@#yOrq^k?k0siQLua*lY57DpYm4z1rQ^ zkQ}qa>S7yIb9L`gN0n6=PmV^Hd)D3cpZ}Ch^b|6E`ciC7*Oq50=g02yZz9XeR z9x_k_honH8$JLsVJhyT3nnbiBeDI4*KIIH1ok^@% z&LlYHfr&m)*Ee&&!>fy*m-d!z?VAyN7Oh>3`~D0+5%A%o&NYG`Yv?yTKEK1gwGY3o zutDfGK=;opUc~zFGYT67`>nQW<66#rI`iSTX*LLqYxaHO>6m`;u7tB|Y+w6#rF9&ro1ZB84Zx!#9;|hJ; zL@E>eqG3W=>5S^(S3vKKlsow^!e|g07I0Q|EoVSQi^(xz$FPW_>_QzS9f5=OQ50Xo zeO{#WT{QXL76{>eBndQO^#%8k-RZqX^D_iZDxQt+HGXIZAHMl!g(1cnsYI}e5bvy5 z4Crt9TlnMEL1ENVZn5bi+DC^`{T?@us*>M<3-3c0q-w0+1!j(jt`|aG$w$(xCak)T zETsv^nwUO9sCIqmf~7`B4bA1Ho&&yFI@KQ9$PFgbgwIMT>}23jYED8qO7WG_I@etM zp{c1|P?6emrV`xYXb)j_HnESXvkafIa#mjn&>J+`P1>uxLQV@i`3G!2v1!^*6ekv= zUC8+@s7Xd3u+>v7LjFh14G&-LX$IbsG%>Q|AjbSGU$tUNnl>o}`s@x%rXH}`9IJRQ zy~-ypNjbS?)9r!a=oA$y`qsX07C{2pzn@JH;odKi;^2N&(OfB0u35+TUb*+&ktSF-7zgJ6>^ znd0b{J(G}?TS221+XS|?nw)$x+Kcg_0MuL_o#zg&ofkBID959u;o?^}1 z);$>>#3&PwG7%m1*tS<`O)AN)wCB&Z{P)Wy#sCaM&>kden+GV=2GBDXL4$GT^*Wm##+&tBNzl z6N}HASE`z^ulO68pEoZi)d+4@%XS*>^;g`y^Sfyq1X{GE*Yzu&dT>s;L9pHIm!w|t zhcZ9Vs zRcRxsz{R)BTRESlk~8C%qgE_&8G)J7O9&PJ?co$QDmGSA zj+=TA1U^(!(@-fq!it*~wTP>d&_jS)O5kLbyhQ|^Krgh+9#as>#t}q`NTHHW-QNnv z!XY$ECD6(sr{-b{ku$?NOFpVs%t5rDf?_T@IG3~YA!r78v67}d-bxhA>_~MXhu-Y zGv#gAkfL|rI0Rz!mJN*slo{mcLL&;Zo?67>LiN}`iu#t(aN$0gGs%N{_H0@}mCTPs ziuwbQV)|semFW|aCE_!YyZY2mE$d-)rqRT=4_Ws$B**Nq0^0`FT-|%rNgXSU2S-cY zWy1aMlZl=}rq5V_ZECF5>bW6mLHbmz>a0eyPki_EgGT0REjspmZke`fu_uv#FTliQ8MGCjP(_0 zPW5N=w!8QgE2Zg{(QwXQJyO2xg6>4hP7bC_`#-`Fm)_ZFS2`lw9WC?L zqQZ{$)!!p~WX#XCj9(Et+Xf}?0xl{P{t{*1f(D+Lt1sfQ*}G4mAk{m|vuih`g|{}8 z_p85mWGhlWMb6@Mk&m6~6hFcdrhWsUXJs}DYYA+4i5AlSySdT-$gfEIWuiYI9Ve2{ z3iNZuC$9W-EngU4J;3)S@eBXCVKQ;X3{plb!Bc@7+kXSC-VOOvzV{vcZre$Txy(1T z9GQ-pFtGJDM+d*%z&Bg@rH4vewYk(0VA|jH9|h_1D^l$X3Lg}t z#8o4xIqtd_BRByU!q<0+7hl<_hv4%sKX7Z()1lLkTirFq~HEaF9|^} z5Mmwj<*S7?=9k=}F)FKnBDYKLgMZ{Ob^sCavb*mkg7*DU=b1)adT+WyyjYBU@PLho zj=Xe}qekdpOKwC)9P#3JdrQQ{n{ppoK@lx}*JOhsQ9gWJp%`NyXDBiBuumDVOE18e zm=_Du55I-BM(o9}wQMlD@N8Xh@iIF`rV%gQ+2x+^IzqPCf^P9LD>VBS z>x|H{(w4vz;?hKB-wK%!FYcv(t?$nW7BOFYq&^`O$*(n>3GpIaU(JPcQe0^CwdYlg zNIA?;#(ZsgKO@lSt6nzeutN34$Q8l5?^`+XrJ66@&NH5RgxZI#UnTlCzZs@8|gF)y6^#m=IFSoCc$d}ICVAB|ml5gpe* zMLS`7XDb>j=~Xg&$sFwjSup$)9~QoNZ9)iio-h|Tg*HRKm!h1Uc)64U;X(?; zi>=+)ws$itvqZDXj4(?Igv%%pF2kmqnU@JsMa&2jV$;opaVZtX#grI+jO`bf{ueP9 zUk4FljmnG9JCs9Stg1IdOp20aQCU(7gbS$k^A8u7N5VYtxx{a2NHy+q9V<-JeY^j(>Fs*iWUy@5R+0NnCE`ktTK-jJlji3UxVZ! zxT``4_+`bW7-!c@{At9x!hW&t{-qP1*}<362*eu37mL4g$cr`cW{64AB5(1eq!b7j zQXx!8g)kXyj>vwLi~`{@Dul_XQrO+qUrvltezB?DZDJ(9*sJs*YaGqP+YvlKSR!v4 zA4XJ>Cycg|B_?S-$6{3ok9@+g_S_6{L@|Ud(JxyTmr~kFV-->%ST)wHOh(J$#L6tG z5N1e)Fd04T6E72DIWaAae`)<&E{sjQ@@q4~gOa3}V!I)1x-If)glT*jQ3&B~)-Mhg ztQr$9PA-I4!+6nE>LIM8>mjYlTu+^Ooe%wm>Po|4rn%VN{q=VF(#)v?lE)x z@TPK_o$yWwm!kMj2p3Wz*uDQ^&tKTWo>-Wb7l#*{AyimB#H93xwXwurCZ)ufm=a@R zN{q=V^UUOw7?V?COiq!TFNvWqZ=43Ec3O#$kP^Wu*e{+_xsW*JzqFpUCs;%|A=EAF zA>8DxhnSRpPbM)lDJ90llo%6JVoXlYvsF%sF*zm1v#9KF}IUsYni!JJahMENG35q`d;ym>$Z82wc@Zg6&Oj68oSNKGg4md7y+_>uc zO1Sp%V)1<0;XMxeaAhhYbpUd4#ONaDkvyBbfHfPZq4uy*We(d}R~^ydTEk7MUc|&7 zUtxw8D^VTo%3qXR^8o&cSe<0NM?rGb6_GFfrfRQ5dteZKz&`xqgxUFC^H5fP7mqj` zyN<;Sj*ZQjMPVgT^ZR>J_r;?pBsG~JWA7Yo1{0F=^Xo7#$G?h{eanE@<4Ay zNwL{pJ=PnW8Hl1qdKAmX!3BO)?6JVvn7^6soGUI(NJ7fnijEXv9LVrP)$FXKnKI<7jD|7Ck*p^dmtDiF>v`^Y~JKrZ>2YboduM zFT~fwB7JrEH}TdwX#Xpb`n|>d&re=FbU6K}DBaM5BWvehXVp5Z)zhq#y%X5ij2B!| z>T^CZ_VjXhLaN^Fln-PBq5m!Bsbfv}xGxAJSIV`9)!fDq7X*`W=(e93)d``ue8p>mZS4&eyLiB5G=!h54 zk+^0bk0{vHL?Xqu16rC;yrBHz_9njt)0{}FO~IsU`^Pz_JbLNjNuSzTnxtWj*?#8n z#dV1>Tk0#&d89I~CA}WyMx@m2+I;ABvql8E%@g*O{HzoDAl0(~p_jfY7?V;i=z=f3 z41jPm>&F$zkbirNi&!cle)cwblt)*?`tg}-IX1J>#fko{)JvDd^?=8%nmUMF-3`}I z6Dp8}TsgK!(oH}Sx+8KC6psqzn~HoD53 z+uekP;@FU4RyRH>fUc%MijGWexjd>Em#)sbSl(ZKwSBP)P04`2*oAqrOr7^aD*U`H z&mWa|DYHf?vxZ1q@y71=l3tomdVbD7aU(s4I;c8N1{#=Dnp!d%>B^vbp#7?fu8-ak zmM4a2dE(WZdP-_p7X77crEwuQd~-%-1p8IXOb}FBlBioSqICbl*fL*-9|~zyO%WE} zHRpd+A|#*3^R_{WCOd9Iw?SD-U%v^NQ*=F-=$S9TO zmKE$oqg3V0h`e|}9uvT?+a?K3E+Q`Spj!ZTA0cZrLIcBV2rqWwxL$(zao*Q+%6^OXu| z;#6~4DE|i`HKKePZSKx?xmE#9J{YTjKqp&o{p73NYJn6O-`nXOw&}Pez0PC0HBHIB zT1h!4TW(kP>1f!KDhZ2v&}}kk<$*KiM8=bMWR5w{7p>@RuBjGXX{Kbp$F=6c4<{lq zgD%o*`}vm_B8N-onSd?W?qkX?RswwoIe#G=C2wUE@T@GuhB`WI^lvTPVFom$>IG3P zNW$m8bnNRdw?w%V7eQKxYQw-^+(T%3L8r6` zvZP>l+GwMulApH-STsB?>qa)K%+kd5(yqNHqRrBSRw_)i%)(Jy^bB5&_4I<}1-k8O zSrn!O=N{)pWE+-riThfr;Toq*b8Wong_;z7C{iNd7ailGH#kz0cf?-0HZx8Y=Czr$ zl}_eg9W*JYf?66WwcP(&Eln$ZX(i!CU@O!~Il1H(Pgv}okKC$d-EiAmml0M)WXAA- zg^UrCCv+iM_6}`_LdhuI!<9#kOeaKyv#m4k@|IT>Pv_OrNjaWXmwC5Zch*71GCNF= zrrQW`Fo1oRO#@N1`_uz!?)UU8l*HiVUA2atId}3s%r)}$h{v)^$i>Wo?0AHsWp^-H zSKu!-CH^?Y%rRgExBbffi*v~R$MavTz4kvtsjA=qz9p*O8kxFDD-9gKpWz#a)YPR^ z{C(Tyz~_ZKZt3Pay-7qeaQq)4jDg*2`huofK81**LYFp680Trw4@cz3z(@@bi#?S& z=+g;QXO#%GVn(VH4w1`>S?k(MW!DINuxlt0TndvOn_ySzRGOiV36$USv7s*LUwxZ0H)Z`| z=>BVV7boWX&*Z(R_w7%#zVx6&TT?We4}7%q?+V#rB__pkWn9onlXPlz(nxaK&X@i< zZH!-dqsw*|^Gs#lt;)9UGAE*o+fpW-A7V!I02ZN-$&1+{AIoAh*LD?{q(ebcE6?Hh zTaum7RwpKQ-TLBO*%1hJX-}@my9N;j4J}az<-B%B&D*o4r*h2noVUS})z955`>+LA zQ#2WmJ;~ksbndi^M^;7SATuEH=TtB)!0j$9A6c162vT% z_~1$QkWSOGcc$TC?1h<5!&7QqJU~`hcYma1^LNlDQK)D2>=zTohgl`jXtf!Y(S~HE z!MS})t>3A}fAV$ME_`g=*!|1X2H*9B!+;Nvi-%rjQD?%@UC1z&QV%XW##Jx8EZ`IUW(Q@g|ordos+VY-3Uad%^<0E(M`FQI zAL}Q2x+FATBC^l)LU3fFD@f_`)53)vtq68phPHM~f;3qTGHrEhHwTp(wPvlP190W}+D&75P zebr>SVUb2RvvmK;Wa)Ai%aXWgd$S*F_p`8E1a!!ore(UQyciY=@0pw!_N4)B2o_le z(|9kHngO|%E}zXDn1hAi=+L$FN2-+_UXBD01I-n7bT+GLSIRarj02<1PHM5X11vNr z7W#aLg0c&U@MD!NA*{PpgQQfrR;O=$^kP-xpZq2Cy%cBXL$(@+`1!66%D#25%wIR> z8)SS*<9AZzQb9wxlfuTO($YMFDF%U5l-FK{$|!80ec(v_hLd&PWAOoso21;JN$ zigl(e^&9)F9*%AW)Pgl9<+##lvl?AvN(j~@x@qMO(tgAW_qOn@$rb{Sx80~BRBD>; zrkHoUq^kJ`EDXrbQoG!gq zUFmImF^z|ts~N4Cd;82Nu=a_GK5C;&a&;Jmj@F4X zsB1Ih{rg3Mjdgv7gx&F%N_vlj2$@BF#vfDtQVQ?Bz3!5JhiTzUo3<&{RH4_4Lnc7` zzQMNDrDfZlk6-l_?759uIOwpg&nnILSxFZA!yQeBOu)IonBLHF^15yv8_Qp`O-d}HiowpWRH6s zu8izOS>68T2tfFa21CcQkp4!6l+-GHR#KtdNH8<>ohEzKX=Z93$et8lM=tGsXMb|S zziGSS@}EBHgtvCS5}K)31m;RDlTeJe$wKCl`EM@64<5`~5QS~|mj{(^a=|I+B9fR6 zD!#gl(obLXbBKgs=Aodp>{C!AW#XZ*v~ungC>yft%VVBiMEb2@9T&hdYY3i~*ak@i_9;87o*pFimT4AZy3-<`KYOKP zcAvhYW*@$DJ{)i8We%;yHX#GNF#!A!_-uG}eG3o?yrlF4Rs|h}N z(#8`T@=wR;LlkUg60Gd!eP+D0nRZNHJpk=9il*rni@0O@QuJ@_xJ*`?%eBUh)2C() zO=(7>tr?6Kn($T)B#WDAVdI6MGPyWA(wiD4MDJYilq0_9@g|7vO%6p80_zj1l{iMBZ7LbW|(^W+LRPtPYwD6$UfU+My`a}i^T>$a#L1^>w|=P zw9uwN`}l))UwAR{pkjKzZ|20z_-fHJ4xJIgj^`cA35M_9*X*8>>LeUve6=V>`(Y{? zCkEOAXvM}K^R%T+#_MJNd$`qMSwW_O_gE%qEuB+e?;`aM=FyBvtGA=Z z+f!A#ur|@#J#HNn@cfRBE`GPyf7II43$ij`xQoE zqLk5zg1O>7P6bDdLm{#z(#ifU1QuxzjTCWQVLP1w~EEym_or^a#Bx+VseZa%@RMyIIVp;$1D} zjlizba%c7FAOUq37AzknMaOn!CquW#NZiroDqye`DFMM@i=_|rE(_gR)7WykS) zsL~9Oe$4-QI9}{~5=;MCf9Bec9_{jHy&VQgKONqWH$T+ibQL773uTZNR$^dJx7fc% z0(*lMB07?-iM1nQ@uE42S%{lRcUI_GQ25zR1zd;j?V(UwB2vlv(Mp%9i_5CbSnkHE zS5nhE64;joAZlv0m7i7DvRh`07JrwMT-L2y*{z3SajK;|q@VX()q+*mN@{EQ8Pv8{ zzXdmMN-10`rI@jCT%=^JeRIMSctZ!gkjJA~eJywVey4|LiXUC`GZ>kpruZ>g=(D=6 zlGf9tnZieOSWVv1(*uLR2{fx41rMLZ^^8u-@_YV9sCyMRGkr*bY2TyM9|!6AVmKPG z&n@@uhAoVcL#@)^Zbte7!u=bi{kaL#M>z1+*B7*mFcbS@Vi=)#WJC<8mX_@I zzo@o<8==2T=z6#Gy*cR<3Hri|d(?ZA)bC~ClN8|{zN~8t>cG@1V#0Y>c*&*r^=Z;WpjDE!aiD! zTBf}wU*$S(&>AdIp;Y(~fOe)d^I3V4m{e;rwKkz5SoS8}nV`q72-vn!hm2YI{)KB( z$?jdzS~O`dx)XkVrlAqGTD25RGUXq3^4+VN4e;~G^{aXX> zd1)2qReLi*8wzi>+C-DBa*woeB5ZQ%fhp1JS~daqKU;R}~i&%}vWblVOJ| zO?O3S)}7uoesiIFeio)?(GTJ5q7AycT9fYNmOUcC_nbwj`Pqhi;-|0htD0STop0Nh z7V_popWW{yeFaKVq@w2V+a8chT)PcJrs>rE_NUgn%nCiqM3^Gb8)>Q_|y$(Z4mnsjAiEW8bys%%eqgD%EvNXWXo+ zGAmo-qV^|w_IO}ERMT2DtHoASjuNkNLwQMPMJMclTzOy8gdVQu+_Y*N3Luj>-5SbI zOYs6pf>+ZePwQoE*3imWD?|Rnsw$MVu0FiSTfG)<($FX~H+pS&sD$g#s-V-+dp>+% z*@3aLD+FBU@Anx5w?<$^H{pp+qS790WDg`-3RFV1;lKB4bXFQ-L8q%y#e*+ayvm`l zF4H5e@Bj>tF?sm95=nOv>%zx)Fx}S*TIj)$0g+JslpdfY>7M~m!r7ytn@%U4bmc#XOfAd-}{{2Dbw9kJ)F#xc!Huy??3Cwi}s|w zy}FjZFxE^H7BRGWZB8?#W-L~n8g?6`b6;)l8fn`Cv~V-GM@m`}v&+Pk1r&9fQd}2! zzc{#A#Q)Hzs@1Y?@#@L06Ph=cWH(+7ii$DC-m*)^1|2q7P!F`U#dVhU83m|dEYYz?XeCYvI-Naa>na9k ze>9bnfXy>hKN_l7t*XO{T$ieKr!o^NQp{1YtaX3*Giss5SqVw#IFPyH{84vK+b=l> zN78orPmrzi(EE6zv!q`0vQAS`Uu5<2_v6vDb7FBccIh{nP8yN}snW4m?_{)io&Sac z_>fHY%ooRSwt{z*f>!w|fJDiZ%%ZY6kbGh-TvMu4Fxe<|KG;f6=Eccccey{~DF!Yd z+)_ZaS(^@KSO^h~tRJiH`*cS0Ct9pjI$BOgB$CNWDf7|+GbLvReAq!apX6U%n*UP2 ztu~Y}6agt=nH*XsHtW#6(cPVpWX|USTEu?g(J8fjwxeZbUOG9@t?@6hnq=c&eaIll z)}uF_&}Bl(1Ab{PV@Cdx zwO(h#s5?#{n!vZ;Bh%VZ31?N7n)gRV*0&fo7mym}35*Qf*kOEWLM>Df#JMz1y6gz_ zsNM)v0)B}(rSn*DMzUnaV5e=oGZ7v>w*^t_k{H(ymde>^XBOZ1!o z&~1ip(SDV)kxI=0sew!fE8`o{mUPq;d8+ml6If>^_Zh8LAWo-;<-vJ6A1h8Lr;{Na zeCe~orkky)VTN}wh5s9DP}OK_Wj4@M>{24yiSQ=VS=8nvaH7;v%yRTQEQvgI%Cem6 zmX!K6y8FUlKe3n&8T4y%e?WvAXt?ecrI6NX#4D^BCGF~`o(Ex~p$V!AcZ~G3;*kj3 zdJ=6Jp*1v*(*A%5C;1}mq_@P$vJ;J($+!oza{!*~E!n=PgE#1{i^IvcvH$C==2Nn- zom{kP8;(L#f*2B&;L^lQ^>I_-}m9*8)ZrU^a}QT=`Qda&&e7_r19v(4Lmg<`AT zC35%sk-HPlU#tSw7rfRyPrsB9@Y+DA~`DiMPD^CURzGb{S;gsW-TarbR z%4N$<$%0P5p7>!M?{TtIOSEJ4cGt9i6!D2fn{@tb{@*Z>oK}Dv3W>2@0X15aFnK%HA z8JFpMuWk(UJ`&fBJN4aURS~TF&a~ZFV{6KUcDH`5^}@6Tx;OnGFj8nO2V3#b8dBC=sac9GdV7&IDx%*{L09RrC*fF2Pi^)TOq0Xly&U%P zM=q>ASz*mFDsl=9_r%54xDUE$;=k|TZ(SF@qtR$AquF@JbU>%&V;Y`;?4(lA zsm`&3YmO`*M35}n$3!c~fk)U9>gPVkOCUW1T1wN@!WxPIPyARwt&bqIOdK02d729H zVy6P`>{Sh;Pts4P9<+coN$K}M^?r*du|3sq2lh8F{Q&4QjSi%nz#SVzu~F;ypIN`v zqM)(t*|DLv#l~#g(MS}Fl_MWC)~TvOxML$xea*9@!8tlSKCzJ`Cc-0)MD@vXCyE@o zFJ584j_I2Z-Gdj2QSo0C`A2+>7UVQ z*(@Wv8SNZrW+$<9GK>Cr2(uB}8|OhgKbLv7LSlQhoy5wDR&ggXiS1Q)qQiM))T6Q5 z;QWbG5G%SraI&5PW-=C+Xo9ChFC(~m3YZBYp`WKS%U@)Wo&qMq>ItAyKu-ZPq1v>L zdgBv7{SfVVE26tl>m>&BpOC7`mqoS}I>(Y>6Re1Y+uty0DM*`7531zDaS6PO)_j0} z*tP`!*bLFP4|>*3F=;A}1!4z~Pc(2Io6`*&w8Tm;jDsj>ES+{FbVaeT0PJWq@3H7Tj+I zwLZT*ww2eyyFp!CDhK^6?)`&WV1BDIYO};A#2LZ-#NPePK-qNE^`$HSN8b{8Y?X!x4k?p}obZY=t_ZW5}S2{!X_DivD;K>Nt0 z8POk6((xGC&z}61OPrva5zY}^wdSfWMR4M)4@73kIFL+8S55V!%H!Ka{kFq;Cqh3X zt5XfruNku3iO{dVhL5Vaxyzjh{j%%*WtGNjy%V8dRlaCFEw{OKspChK4LyNTk0i<% zsjZ5ynIK0SwgUxXpg3wmfjp5QhhUxLpeqzla-K-gmJWL4B0;?k)=t5mCnj2}^`5}9 z09*ZAh|;9;OQ9Vr4`nQk#6vmJvE?Cw%s=}JD+;E54#VBZ12$F8a$iM1F+F`CsJO3U zVdtRRcA@Z4g+gCZ6psUmnKFV<@Gw0`@ouGX$K)UdcibtxIkeGE%OF(j_~CkB5cJzqRDM6kP*MfU(B1|?dWjr z;L7CW(K%36-JLafWxR>4Clnw2-qO0D2=iyNS8@`S>Y+V~EcIz})pABCJ{NTU~&=v+Wj8?F)3yyv6qm@-R{_ZErj1mq9``65eUAQ{g*$3#!evlo$YSo*S{04 z_sfZ2L-IRk5cs95I8#a>KMa}ioCsk&=`Kph4_om<=YE3m+nsnB`r~2MXLDo7-6_;` zA2DvC0jJnISjaz}9(^G#_PU=7r8PFTnbt0S(%Nw)@`SR~o%Sb71N6;_!Fy!A^F}YDKO*z{%w*EJ-I1J_ z=YHgepU>z^=Ke0PIynE#bSR2NmR&O8{QPu@?Gq?z%}Qoc*ZueF5dABrQ~L+9@7V{r zUD~r(Rm_rsWtC$mICEnza^I<7n&1TqR%Y_IO9|xX6x^kR9oumqlv0&Kg123d9ikYQqRcg=lsM_S^;}s0wQ;lD2x4Vq5h75Oo zrK?EI{*~RRCW9y;>bP5=zS9*ySjbWJ&}uw8$X%7XWO~iTrw`D0cKT>s_AZsfHQax? zpd$$CbQCi81lWqgbstA4v*Vci37k1VLaDM?EgB`*;5yPuQp}D*(!fVD*pfR37Pc{0 zOcT}Zz?`!p?D8i)=Ab*2@RYCk&^q@m?*+%ZBKQ@HL=zV?FEElrIp8Pta-RrSFz=vw zc#Q5@5qZ1JUCk4m9ilTBo{^b%?oQr^g9ff^uqb;}}rz04?C!3X& z?Si~vwr>@7NvpyAhjU;|nj;u@NZlZp?~IoJ$~B2Qx+BqMWZ|*{#)jO5xYO)i2YGt$ zxX~n6CJvcveL5<6@|d{R{vM35i_gbe_)Grb=;GzgN1o-ij|+6~WUl!5E2ap}0khq( zn9)Hjf5yaUy4G;;!&=yTon1NjVH7%@E6O_3CDAUuvN(U&)={rHkj_1?lP%f`lJ&(G zI!O75q(L=^C=1||TJs-25cCLqAu)9$iEAK}#g8lx1IinyZ8yfxEYri^FCwlK|E-o1 zY21YNY^rJrcI`NKRd8S0WSW0qWi$4#g1C3+OcuBmZHdI)lctiIf{Z=(ep;K!w@f%j z9~GzZIF@)Cm*nRqasrcS>Tt!O7IQ=>e_xu%ktfTlZee?OJnp&J-Q`p**5H|^V&tQj zlIapGcZ*JMid;DC9GY)*bNAvT3x{B1=25o~9Jm{8`?Aw0hPAT%tklfbxQlV8f&5!! zztBL)Z(oDrb3N0go|Kx2)A2@)F{EdS7go&HlEj|nvr@T!<9@{whWM6dm>s|1@V%C3 zLhdPISf8=i+o$yUccT_8@SUFKs1DePl#g<9x@S^IDoI6VrKVi)!Civ`zc_pcUL*ovB<|3# zdXcZlJnN2yb&LZFtcx901}f;m;XCNY;I0Ndc2w+_Vl!>qef2JuNU#iN2!|sB(oNt? z3*TTDg`k%bu7rS4ih_|LvTCm!&yycBC*27dJXCE`SUEfx{Dc zkqG>O#85<~=K~9tcv!j^EOskAua+%>13y`O3tlV&pDcFJ^e^a>{bzSwu+qa4&XL6! z-qXqjjpmjim*hw6;t-(^9EK(^$AJRx9O*l!Iiiv2YEc&yb_*>93w&AQ8|Mbo zg7uc2OK!~*1tTTu9+>YeId2DNXAuCCKy1IjAEJi*Ph{+{;CA!4=x>J55xhtQzDV4m z@v|{S+Y83MQ~stV2Kc+BGH}5!O?(I5NF044@s@O*Vdc5Z_71~~x3W^SWAW`WQQ?B$ zvv>ubEP(G-u|Y=x-+3mhWz3N7B=RfRg9h_yi7~jbMYj&3Wk@f7u1E*1yqQ+&L$wz2Il;UA{Ay;22#9sDHm zEqIX#V3Jswb*cEVYQzn>q4aK#kjM-Id&DpY{{a^GQbhjp6?Rbwdg);xH^+?j4sr=Z zD#tL!1Q&(+n?qv@F8}q&VffD;yhu=C?k=(Ecb2Z5U$TDro`t!cM{G$Y$?CW$7aaIS z0yDn?FA{+-5(nt>oSXIFZOw&wXRMdOF|z!_L21AOpB%o!E($?U3OnTV$b(om4AZQa zEn=~qPd>Us_4Hd4@f~(C2zoMLK$|7vWXVbg3fvQ%mA^p&x&eQ;I2qV>n{4g+eT7{V zB6O#OiF~C5_FkF8fVP1RD5qh46W`KD!u1=<)=RyA1Uh6Im1FL$yN*l&yHe zH%h4geD}t0u!};_4-`gw|LkI{f4;9>Lu=b4YDfrXWpux?2n_gC0~UU@3b{B0z4L{M zj1y!f?a>#=ga}nzW1-SzfA|w?WI2UOq}MVCJ!y- zhsosMXd$q1s&i{$Utl*a923G83@^06aN~k^3OR2UcYUP=JoOllFR+^y4)Y0Su1o5p z7NVhdVs@i2Rfcl%i^o}5aQW-y4CCLBd;~8N5xczM4jpZA{_nvf*$8~!dOgwE$&!CU zYX^5AUJiv4#*f&=fx}oQKQIbm~% zSa;YM?L0UHL%$d6{QXPtGDgJij4{13KR4ta93r{!vb`z5KkwFHm3*%WV1X}9e1lzz z2ztliZjI+TZf#JdA=kO%|Fk;IBgL(-&}ZTVr~)Mha4zc$g#8V&i4iMon@w1SOSJ5 z6(jEWCL_I~kO+U8E7gY>UaW3q7WX)NuMaKU*S>dzpRp+T{&ANF!#yjQ6#9z9E5>vx z8TEsHQAC{ZFv||?7@N~6UqDgtci3nB=9j*q@Z=74k0a4D_!1{${*f@Myt?<`;J`1B z_z}zt)AE+9*%M5nY5vTz2p9b+6>=koIq(8Q#IwxCjvRp!_40 z_u4O@A@E`X&5L+sPqiHe_e6qg5}$6bd_6K?z#sU&)WRVA3j2aEy9_oCrwZmi&X4=# z{4l&nuK+hM`K$);M=)OTEqL^RyM6{Oe@Ej<%k@Q*tsqqN=Z$f~rh@eFuAR&BfGHk8PbqY|y$7?`;E>rym-3o%D#G@Tp5=?Mc>}}9M$1N{XA<89 zT-H6Gu4$x<$Dh8^2JV{)Iyja|XL~uDiI-S5o2*WlXH_zW(}Oe`N-T(*F17sYP# zlO_70dX3w76G7#~lLv((|A8{TGY1!`0$*N{U!H~I8Oy$|XKeBiVK;iron&^RA^nNO zt6t(WhSUU{Z?D|(hM`^}?~#M<-5Y+U%NExs3g0O=YgD|1j>6-T zi|?wA;eDqIj+~8he*})rt?m;IE_cu_x}ig?Wo+S(*>=eU+_<2( z2>%3SA1crt<-1sl=)oOX*V~a;UH{11&)Fe)g!^z;PK&{j9StWo%hT=}1~;w>E(iVz z%6?d&dj}q3tC4?jV3tE(kO;F^34)tixH@=gIisKInCM+i0yi!#E-n8AEiJRzY$Rb^ z=qD{h`A&jn6ZE%~nG`R^%Os;RqU7Bk)*_52myU^~{Pjy@=@_ZAYD{cQ_fp3!_dZeh z#w+Tk@8b@BTIrWw!Hvq`C*vgVZ=vk^1-clM=(iWc*Dd< zhDCU!g?br#+|vzyNBKMGdvp(UM>)Yf#lDEW^Z-W^_hq1`*!$$V;gDRh2jwUzl%E~B zuE7p|NBKMGpuD9EW(hx0E-fEPe6MA0_vY&E9c2di(m%nCYu?M1L*rX0jsbM1<)0h_ zH+UxTjW2W6Gxr`Z%A+`K4aKq13~pQvy+z+{x%dEOJ2=oqdDgrYeUFW13hXn9UH@^A z&85@a!2Cd&X;-r9v7mz+msIa5zl5?Y9q3ES_;SeKvppN>pGi#0Pj6|t{+j!$kCd6b zCCotYQe1uAHu&kwQ*$q&rR6|hQbz1SZ$R)~wZ5uKtyyE|zNS4JB<#(|A% zyLURye_L_7Lza#s_$A>d9oN>vCklfv;KS(ZPWt<9=-uo;4Jot#UESjjZ}9hYk$A!9 zpP{u57U*J3oQ{%{$MY|bv%E|Q_qVZ6_{hp*58sZ*xF7$JT_6&+H6zF`+#QY!%E2Ew zzl7FiVlwA(!c@sV-P&VE6x-H)^wZLJ%K0b$<=8-RoBRF}{t2(NoK^l*`aNg#yf1#} z?j>|^J{G@$&F?>RM$PFlmUrGc=f|GZ%)Rp582^BdhmH{*d;{S47QvR6hrM55aSpH# zijLsd&Jj(&;1TB-vL7_fh2&h)y`w#Qhe%I6=GgpQ)%77}`mE6zMd0^XUjHC`M|-vo zFKKh;m(p`3%D6ec5i=akOSDo)pbJ`S+{i zXU9QPR~Anp-(`)wqz1kW9y6eemspNS-LK$ZVk^_tnnV8SE|?=-aM+~*1g{d5e>}K9 zV2oXEG)QDAoz%=?+@#E^AoeliST;Eu!}gp>i~W^#E)PO*a4m%F|l#5 zYA55|hbXEm(7q#GuLAa-`I+o<|5^#%4r@&rVRZLII`J10uh ze2s%IZ5(YF#xI7KZ4^O2JH`_f$9Vd>OESeP$3Vvrc+azgU>#R@ni^j~`MdpsBtOT$C*mbf1>1;+x9U#1vpE888T17!xiG&~wI z6ph{v(9&?AcQ4xseW(RRH&Ps3j?v|R@+bYlG)5`nQNKamcR-#Xb3xvcxmv+*l^Y91 zv~vf(7_)uWWUb`BHZd^ZD?vn^iM`iYj+KI)`C&kRa0gb;()rK)FyZCF&z2h>M@dIl z8snUkb}mWDIHtO^m@RjiV3=Jv2~MSuu~IEA;v3_{L<*h zckKa(llf%JF6t1xl>CrT_(aY9(=7xvH7^}`_~dsETb#gwUtaMe_`OyLV7%{AMy5!h zJT(*f$%tQSoVR0o-F2gUF6aJ*8)5~0EYgRr5g72r`6uj9^XAGEx~#_v&rZ#p z|3)MI#iMKB>PDnFyKqWKVdnp4fd7Tk=}MzuB!#OY~Y?PATby}?cMwgJHA$Q5S?{Wg^pWsO=zB^X&?li|bv4B9hT|YSqMzx;g&EwDMC`;Dn2wUuM6$|za0pPJ zK|j!a1s!zrbpC9ca~Rkwx|tp!`k8J<^`zZfHr?`Fse@!(t(xJZKLiH+$oDlCe*k+F zJKXHqA5bu%{NxX>6wHT=wr~7Ynoo|{T7*M70S0`}_&aRfe;VwLF$-Q>1v?1lZUBVu z8IQ#MI;&-2fmMY38P-dO4&&(axFP_G4>0Wre+T7afZey6;u~2t3g4G5k#{bL-qB6v z2!m7;RCFZ4m!0k(WTN@WOa2{r7sXA*8;iy8wGQ{F2XJ22tC~DfG*;J zoKig)4iulH+7bR1ih>WB@_Pl3dv>>m7@f^R{>mTfb7||FUbO&}k-qc?K2-&J(hZ|E zJ$iB-u2TRy)XP7Noch`yvZpAbr*>n6DfXp5@KvzwYiLggRu1X~27IZPO1qoR9kAT$ z0CxJrfPUu>TtZRbTVsH8A!XF9*9wkH)94hKG(T9Z;q5#a*k^XYPR2iC2jeBSx|6MJ zJtsA;&bT)|CpzX+X?zInXuVe+3~GKzkB)d5`V|zH*gmMYAz!Bm6pZK1CL z1Ur5$3&tdw!FacM7Z~v6#OcGn#d3?s_N}oM8=Dh9>`-{mx(LD-<5YybU_yG=cJOhs zk8L%Z$~3`K89OL2;7i9pVN1us&e)jd_(sRYc(|&O4c7(sj#vQirK#pYzmhLyP;dW0`C>Y^R!F(-l_XRc7mTH@ZF2DHD)Byv& zWBe_aduVnaq8nnv{92!=*~yu-otawvFz*Z=4pIPPwm6mi6O_Az0zC+we8(%mU5CKcNA-zD zY%*KSB%wHRyy7_(^BNMlh0Raw*QpP69M~@Keu8qH5k3B1=*)t7EYp!=s)*tVkI8ok z9)VXLbU^3*&eO*^=fYb0o8w-qbgqFf{Z6@K5$+LNjDt{&OT+g&;@0xsHyY-nl&Nn= z(Zkouc6T2RYJR`8qHYp?3B@76PN~CpzVirfxQcA2U=Et^KKqv_rk5CF<7f8GC^+y- z#Xo~{n0)(m;#NkN;DB~hgB zIETQNFCJYZSijzC#6yrJhucLo>ur2I3M%e+Xa`E%deG(6*ldvdQvgfGhc@aQe7 zP(S!S*Vo-cd(PUHXT*)}jsa|Ud)-e^&XEMV%NHAgG3DRYQZ7KN@2yTxj*CsYulzoX z4%?Sx_cO-~?a?>E-Pb5~GoTk(2nVYOU(j!4JN@!ORj%_Lrpu7_gFAY0VDnSEWaKq> z9cD%=dyg-V*xK%$_XPFq66l!5JAX-$ey!sF^^d>&@Bj2){`!}H_m}_af6ga6FMs~` z|L}kO*MI-#U;p2K{`dd%FaOtH|NPJY@xT3-KmYkZ{rkWE>tFxnzyA4u|EK@(FaI^? zL;v!}U;a7&{?~u~-~P{k{ipxuum9yQ|L%XecTeFSrH0R_!u&SmhBFk?X$CKy-*WpC4){t%5Ab*s=;^Fy z!V6oe@$V~qUI-Y;J=#flk_c*%SURjUW)fc5v2WZ_(c+giQqh8xoF{c5A?JdXoCo` z;|7^J_?1buR!N|qi55Opf@rCeKpTEC%BxgKw()+kg+wx8W0x+jKpQS4MK6!i4aDHA z9qNzWbylYVoO8q0oiZ`P@%F2DqkEmL*1mxa@{8Gox5|A&amE?JEvqQen^ipJv2#gf zr z_~kpB_wWW2E49&YcWdzvJMydu> zXm%!DdHtpFyqwc%{l@X3jfN&{sn*gPyq^pG*i`)%jbt!qfv2Kd?+WeGI@KPUl0ONf&JUCpyzwZtrc( zdw@6A@N*GJYCvZm#shi5?={4#E*lPXssl`|*EXPdvkR;73yeW$mL%U)oA;AUj6qD&E0By8z1 zOFVjx`-W)Blh0m=ugCH$Vx~2)?Vo5YQjJ{tR>PK*z|N|0_QX=_kngHaTI%e+_AfbW z*`tH6TUb~tv2Mgc1wUEOx{)Bh-ewf5A&^Sz8ZS+$~TOSBcgc5+MhYmc}VpV~O~t1I?v-@Fx{ zLNqq;E9vtPffhcFK1j`^`Q%K67CsJwSmEPU=lolx`Q$H_X&exBL0;@43_DSjPdwBqNo}F}Jbs>y_u}L6G){J@ zgu{!zOI$Y`Nb&3H1j~Ni_#nk|IYiy#AU$VYfuY66>p6m<#g7|7w0L%k`Wlt@4lylU zq~`>hM=bkwUyK$%ZlclR*?U<#iyiww>slPC`*od=WuL7ybxDvE&lO1H&Lqb^XJ+cw zBq@GfHznC~GgVz9CB?7Hx3u_itCuzHx{OSV=UNxva_3C|m$OOfK=XvRdQbI{DC<8{-j6+do=mBP~`aOJBsE0^ik)wGWJx_?)TpZ5k!?pzyOmjPS$ z^BQF>K2?_Mk)?QUejYbPE3a9%Ra^1ggUvPDlKr~DTZ_;3qH&wJV!v)Rx8m1T?3R7b zK-U%PQule6GcKD~iVcf#=5>NlXc+j_<4+&OtCu%zdo43+O>Fnus-x*#q&`Rp0VQd8gPEmM6n0UrWq?f z?o|(G9QowbzF|9i3ypKK`l2 zXJZx5Nb&1)s8;;?)T$PrraPBTdGT3o%l0!ZK2wGe2rTBO~&p7ep8{}3s9Q4zA&te8AkY%)v z&%9gK>s#|mCF67VQgqfZa;-{(b|$(yyOS;&bsMbDFxNQNWgHDuY5`l%I8V9Kc#cCF zPJFQSj1?dDV*|4k&u--EzfG(C86(|lC#ISx0OgT*uj=G)dD-~s#RKILFFu`o-4(9b z1HCoYJ#Kl=|5@8wrT9#I8e0RdDcYAb&vt?tD34g>T#1q#sn_DkzkYgr&B2=s`&*Jy z&73Y!9?|TX)A{#OK(8YTm1BNp2l7Y4M6w6UBbNO~W?i4P+gB+ED356IsjZ)N&6X6O zH=23GiofM0`zI#_ooRvch!uZj*`{u-R_uZDh!%g#q@@nQN%7gxlSj08mLKaKhpSL>q2YA9w?7k_LnH~!{;2JJYvOP6C)pf?+Q>J@!}IF zJ|P3WX5q$)XYs?oXwS`YzRq4bgH)Sgomm6r5zCx&oIW1_9dmW%lGnKK#qTTu$|IIL zdjaR6Peq4~iStaR!n3Wivmr2hJnObm*+H?%bKW7U=p^0DYf=@QotWbySOw4e(Y)(c z!P(Es`GEWpEdrU63qmD4)EmM>1WX}+t{pvb>fR+kb`#cf2Mj!+SSaQdC3r*QT~}cDg-mahTy>eOj7(=@Zc~M zcXinE>9f2%F$Y-f{b_Wjlk_*Q&^Yu;;r zrkbM9q4(5g;i?0k_B8{xaCY{LJKz-=_Bi{C3E74mwB-^W4dGD9K&959;?e9vZYU8d zoW95(6>l+5=B7VGmoc5-Lc_YT>l>B0L_fkg_&>9lFKMgtGzDiem!$w9m=QJv2mWUg z?9YN{4nz}K_EgwX@>w;Qa?6d*j6JaxD`$Mm)a)3p4>q0qT;bWi+}Y{M=4*Bu+t6h% zI9rD;zD{$E%S+B;rugRt()^5+f~TvV-^o(&RQCBHFa>9@7(nVi+&de*nGty5V-r41 z6m?$2`7{{4boRX$mpINjm*MZ=|IBK_&oNi_k5X{SbIFB<_jpa_m7>bj;2kCYnRm&O zb{gb!+Cy+g`Dfmn3&CX>FF5c&b6?QUf(M6ETrS}<*mCQv5gTkdlFOMShd<9!=16PV zK;GFW&3^XI#%H$IcXp9;K%hPjdT#N-KbvvpM?cTBSa`Pl&##(Fd=lY!TO{%9nDJ@6 z4n)KTa=3M3p|R(GeBZMnKCdABlyR^zQ`f2ctl>ANn57$k4@!--0}q?AzeZY?#mUCJ zfR6?RuPqxo3O=(8RI;~1We$d!bgr-%DBBVomX=TDaW?FCcBXUWptIGS;|z^$`y8(5 z?8E2m#{9y&bC%kmFj!DD}Lim>L>d~8t)M} z8PHhcWv4&8&aHOF*8L7XX)lRS#d)|Q_YvkF3bzO)7gTPkt21G;~n zm5wqEJM}x8(mx9Ca~MY-8t;8Mh{2wHYf4UHbZ(a9Xa$@6t^7Jx;pu$VhPHOP% zPs}Q3XM;p0KrQjv!O&yVfk!vMwd$iAyvOP$V{O61#!V4Mq!u^@|K~`Z=`N?kLQgU$Ma#LxYtf33m_)N)S;0_x$ z$7u01N?8fZ5B%)Kn=jx#noaZ)c#BQ&noU&S*yJ@%HL=M{4i?=Q`0P%~ta9}V8_5|c z3Ot*DP6jCBEOnJ3Ifuf53!7s&7Q+b&kI&|559gc_$4k6;=BkYjJgWn@7N0DMbvk?w znKw47*14*fzNl2&3WigNJ^wx@b%%7Ec8y%c^1Fvm_&JBDq50wO;V9voGPPka+oI~Qs zipS@KpBK*|Eza|3@mYMFr;%L6D17W{HJ=5`d0YVIb1mOJ4dy` z9=ML}XdeT&*f8O@>^W!_g<3dld?KsCHWFDKd&`2YWfRp${T`AY^1)k z%df>F&S*um@7}s0=OW=OSr0{@fk%44hACM;NAZBhBw6A&$S5sAW{}ZAPFwtptQ?Z< zc~G?nfKoh!zUHmkY4fDnI84_$GsfAz&LJ?48g@?9aq_WqM2^#v9Psmw2j1sP&NFfZ zPs`6)Mh?npe8!6nbSNa+8|NSEIA%wD*u=seHVt@m(>WVD4$k^+vW}iM;IL^->FeOE z@8!oyShJcldf`%zfzK`oFUZ{Z=S(xPyhcu^>abBsrvDBbb)=>J8C%2S@M7nT9%m_A zhwifW-#Nj^Nz=}eL{6u2N>aylww-c9(&JMIIL~22F9*OlnCS6o$YTR7K8c`l-jtKF zE%7Wc7-yfc!Gb{po)k=k zSdHRrFGo^^yOeV3TyGMG$0v!g{a3ng4L1hR@X+TShQ{ZeKu3Jm_U=2)=#?skH%g(j(UAGjumj$>!YzE&k2+IAetQj zM@;g7U(4W(N%EXm5r<6jfM5OKl*vb4bjU?84w-!9J%@#71KCHt|2b6-3Sws)Yq1iJap`y@9OJTVso*&B zM;&jL@MNE;MoQ0u$%p@}2ixvH;+s-9iJ_V!$2^m&k4y@raIS9usQp_`I@>t&Mo3C$ zFY-tDYj|v$d|=^h`qaYNi2RY2ZYiAp>!W55PBD@EkyrOpdKL#i@*+#3xi|bHFDWFP z&6$mNeC*AvuSVL$ku-+mQRCfK5=-yIBxNE zyKrO2FdNtE+oSdevi8*Z=p{SX>YJBVK3msr`OcunXLkTME684rt!sSY+v6j@vD(R& zo*VCeU2R}T&&`*TMENa~11r4XI(FI4lW*dB-CWqF$Jg7fGTG46`qnTzdh&q(1@=1J zXg8($3146M*`<@RVufe4w>O_@sco0WYaX^cD` z?`N-#cNM&!z5enuSKiNF8_~=A*=t^JX@{<5O}|V@%X@7cRIQ6lJ2S1cRM$?qNIAMT zt`XtA)ivFT)erBju8nM4w|gcXTKRReC!ZqM55yU+Ss?QGGiGWFc*l@pl&PW?AGPG$?tZvj1=+a#w61}CYox39pc*Z0ng)dF{ZArGX&GzNT)u{tA&>*P1Q!xgyk1HoglMn1`G_vYvISGI1~ z8n|l*3X6Oj0(l@ES!1c~lHUK;Sh>k7tt`Z7A1y5M{Qy#}34+E0jKG^Ll$Zi!MXB)< zansfq(pKho^e?b3K$C76u`ocF?(xx4x=@c#CQ2J>@wL?1nFrTWXKNx{%XyudUM=Uf zrg|(}F`KcYX5H%6sNF2k(5`FwSx2E?xA=^hd(1kqlM#fJ{Q=$?wN9dCHq$zZmI*}T zwCgw+*U=}3bsJHT`DbS`z}jJ_*=6yt)9k);cJ=)|zrvJHylt%q8tqU`xZlId%g+qG z(=P^`7z=yFA757CIQQ;GIy3FKvr!IUcll&ZB@-v|cFlsnzokmn602g9PZ}u4ypNQ( z1A3&K2;~9Ar7YUH;jrFTUmLq!>TR_zFLk1|vv(*f^PN-nyen;-N#Rv#>jZ4xSacQ% zcxBO9Bw+QtGYMw-yfX>@$WH%DdPqmm)ReSKwq|8PKPg{&evrXO zw0h6+{+5*lFPs2z)n^Ox_`DDDfEza=CnGd2M9xq{o>gR(L1O-)$20Uc(s~_f(^caEj-+PiZs zg>46|?e3XfcDB1`?^ae3-t*c;W}JGUvC0)Z6U;2;_#emvoprHflB^rbU<`7UW|`E| zUwYxhNzlUCwovDd9S^7;E#SsR)I?!tV`-+7NmRNoA_c0Z#A*{2clD8C{)4lAa>YV0dGgap_AKQ64 zr)=2I(>i67eXlyDeFWU;r?WJ5$%2{8XCHxgzTfozHaB-G$FDV1&bZ_ zRr8&19ocfl6AdHe7m{t>8*k^v6P?$8Ov`og4{`*$?4nYwI>Mv>UTYCu`qqLL*|Q-9 zIyU9cgu2g|q2dzemetZ%_>t0t)B~!P)Z60DXT~`Eapg$xx!cdQ#`dKwYn!x|R|$=` zQXJywd@6x2W_3Q5z#)Rh&JfNJbgnS3ja{9sEw!=hn$4m@_p{+;YgA{i#4Rr$z8WR~ zpS3zm=$5^WUyU3HzH>$~>)GntB&D4o$DM*QpS`DJpg-Z6Z;Q6o}up}rRM07rfO1at=`EAs*scuuodCzHnfa%R-Y=( zE=ysh+9lxLc23#svdx56$mRf8=WcHffL$A>cRAqXvV5tLFIjcIAHaU%&dn?AC+^(5 z!iMh7jSFn(Zfy*DX9vi8us=dI+s0RqJf zCk9zfxxHSiv^Fjav@W`8qC# zbJ;T`YW~b>ETLsNUSu`CUFO%Z0B_6EtdUi>`?>H=2YQjlTQ}s8oQ2f*|OfbodU1t(zW~% z&PIGVGAqE@ktdVc7q!ZFqP&H1o#;qqD4xu!28xM-7FOB@isayh7QZTF8%ob~t?@>e z^TVBc6*xfL`MwATWE-#PZ`uCR`9>1QvO3rOa-%rMgM_U{L}ja6=Sl_6-F2?}{;=QdW-| zHf}cF7De}$#y;d**fd^b-)LPLrezy-rZje}*>uqOSX36vV=C$KH{Q$88!3;!kP*BK zaJfL^1x{vdjfJJ`L23j?PLcU$H`ZyKxXetzi_V)5UM|vfiF_1~&6az;DQ=v<3VSJ@ zPBcZwqS?pN`1(*P$46c`Sm|lEYG0hhXTIP*!&U8u+eVtnNG9?zZKk*=g>%eA%BbybH79f&Jl8z2gVvjffKHZN)8>3CAJ3jh8IBH zz!&p)OuR-iuUPd)N;Yi-_a{lIrX#X&eAb0k{v-$Awys=eWw9VoN%7ryxeDbBrLNLw!r z%&jM#59TerC6vRqgmI&F$rCBNzQd^Fye+G(Fq1mE4?)(8OD(ARg#z%m#w@k)ohw8l z|JvAmkNj&Q$7X8qS?2Qt=EazAIC*j67lE?I?oNq~DPgwb`UNlg^$t2Oi9GR3jxZ#; zw9*5=HI}~-pFXA|zA=|YdgDNPja79>bKxh4Q#AF=VslWS1Mh4D%(S;9yKygBh`ZgO zrIbs2tCIu*Z`|OE^eoqEcL}`lIfCNeIJFJFvGp=b{Ef@1LHmhM(2bW=L8rmAS`50e z2M69hUu2~RFCMTaqlwFj@KufX{Y4)e#0e4KF~@}Jb9BQ zO_B_>@YcE|TR^?LfOLCCXK5m?ZL3kf)loXKtCdluuOWUTkE18BO@Swl8X2ApOqBke zg>TG#CyskHUY>!?Ba*onzA;C#(>d9q@gfgwC0?cTw(#MMoifnLj5t>#XHf83@G`0= z-^wvl@m_kXNv&4EC8b$WQ`=kkxLKnVBuBR3nb4HOE3c&FwcvT3<|_?lrUB1pght|E zPfr7W>q)=mJ$g$z9dk0xSrazXQpnh>1o8Zj^>&6?(w+Ua@B{I)QO>~V@J8Vs-r3Yu zN;#vlc*k3!@iX*Bys=@dn3s5|@@+rb8JktZN-uE$(>LI^Lo*VOztB`kxE6mPe>T#k z_lE0ckez{6x^Rlwn4=c$GH5Y2QX?(y4LGT;As)R9qbfExzOT~}&tzuc&zxpcWp+Nw zE-YyjLLE)k-XS&A;RRayP^1@+Rv>Sa^{q4soijy_0LeZ>r<EpDSh~2hS9* zJy?t1$P-PcZO0Mq%vxU1NHopZ_TndbQjN9~f!*lJS4FUPYKpHitkYf%v^8B(K5%zP zrk>6Ru&F^W|Eh(*v$A&pD;|S}2if@^LTj2Yx$sIuNla4 zYbSl>6a>Dj`Ez))p&veI*y|!`en{76J~lgGdYK0O+)BZvBU(J$JSrtQFXjuEjZcXe zwDVQWD%>%d<_{h3&3w{xbWBqF(PrcDN`0P_Pi|`Zfp$LWSxG+LY~=%OL}N`w{hM1t z#b<`x-ooV|&hLY4d~%Y-`f7okRq1H_5gF2J{#Oz&sCP&{-D{RnD;WgoE~wec6BQ(x zPqe`0S&d9k*WXk-^Y<3N$k&DIjy(47B*|d&h%B#O_{Q9K<2YC2N}H-2t;WC!-S$F5s&7Ds(8sM66-*esowJu_Bi(5SI-Cqy}by6$PHCQvElo`OYg|Gt~(sv zraDyKWeyYVGV@L@H&VD)c2V%b-Q({@RpKjoHR#;(2b%7c(gL{GFs83Zz8j|alp^)y6L^q{+94Y|BDy+&6YrM92>7?SlBB? z4!bs_Q?DJHrOF!WncnY7vZ0yk9U3PersB0GaY|38RO#W^sezt)mu4M_OnX5(FpPRG zeAzT$k(PGo%E6`#M22;@?2diirYHu{|e@oVDl(Vf`p0VF7Rh9b;JvC1z zC^8a127B&gUGW=vTAtOmO(g0@pnJY_hk zPf9N`o#{%6KJ|fJwXsYpv|)Xw#N}TgPl+7BXOahN%7$+S5_4MFRgoH^S!&hr>=SP- zJLKExJ-5wjRRx`|?&06cU(ACVxjkRG!f8C8tPy3<8lQInd{96(@Id(%f)`JR?cXo) zxq{Ah@8u4;#?I0Q$}^rnjRa{@ww`!r!&>>s@@Sc)c-j=d4xFLlJ-nHa@&n}=tDceN z8}qq98%3lVN)nG`-%4t^bu_A!vV&~gQcBh#DM;Z3?ZoUz30itw*qbz;eMkUG*+IIG zmuwXZ(eWEej|@)N4_d}r#oo3 z2TJ&2UgbkFXL8Wk+*0MnD!sB%L-_Q^FjqDuvGK;C3AE;XI69;v#k!P?| zqXiwMO!>`h%k%M_M*JmlwBSj64b`Lsx8Sj?uktrOvf6kg3B9KM+@4RrJx|T`DiN zsGL_CAL7r*EauffoPjF^z})-oVBV;}@s%O|jLc*{?CI)Qk>LTGt4lcUE;sK~+f+z%w|i&Vo1k&JJPC+=~oYZp4Alj(DjnfQK-{tIrs%1n+-hj-d>3-nAUjmd$V5Llyn$6P>u%KQQ@| z-o3r9oz8w$4sWZL_)2oPsB?v|2{^%W=K4!9HOD*y-`$dMbWE_SLQf`zJ?)|oVC9Zc zM?~B75okl%Ez#F>Ny9dZ_cc^H#PekwKOMc+r*T5a>gD=7;n_)I*L-@seAoX%?<02C zRs8i2eC6%jTejPu2gk~)`PN(>@;?Bcc0t7xP(Fw3#YaKa^-J-&{;uIbRm#h1mVOzy z;X-ScAoUYMD5&!Txy}qfl>-QrII#L3iJt7I^k2^32+5f0nlH~u=|CIC%~!gqfQoo3 zh`EbxkV?KBjf#>Ew2@&0*3J^7S}vRQsXlX#XNi_LKGI7AUu1e&g}v~N zxjzjUL-z7xzV(K5r4}!IGM~9!DxHP3M)ECit240TH@#Ch9C=bja-&ULVDpI8dsle5 zqvw()sMDvE%XsO@ioRekqgwI7H(R(;ycJI|YUFf!0hN=+BrE-xM`xs&rT8*H*=@ih zKHtss4xD1=(N$v_p9rq1;k%4{1=WLd^wop;uCYhIzx}%Q;1ECW0cJkRFl{=5cjMcz zf%1e*M_%}Wxat>Lv`gQm6;-|h&&%iX+A}VbILD;V7i21!fB(_AM5Kt9a8G=Qm&AuP zljTISQ)GBRCq-NZSC{_M`GHk>%NrzJWl)=K*DS?Ki?mQm@nWTTahIaS-66ENyAy)D zyAvqx?(XhZC=%S=5(x0+dB0!DWHOmd?sISU+TC-`6dFJNhW*;%fouLui`w{(;DTeT zDO(zWfbqPDgLA#@B~%mLz>>sN9Z1^+cQGLRxN{Zf`6uNoLIO*o1{&e#c7WMlK!jrV955vR$#S{V#85zle#Q$`4fRl z<$Eq9vwSm7Q~E;cw$6stT25UK$O!TQU6i24GF#rYt(KEg$zC$VYSrblL|o@H$g28z ze2Ju^4&cMe|Aw42qpQ^6X5{!G;&ye1`Q;t#K#5j2@-W1*jhr1M<() zVJZ#y&vTuZ-G?aO@rWtJ3K;w3%A#{;HnHTWhQ)vz=Cs6w-?K<`i$N3Y8r#xI3m)KANTzuC(Ga6te}fJC7F7pF>}eziYiXeSCb1Lskm#Qu;dEXw)_qzICl(-U z)%aQJwzi+H6iS9v{v_h2;N3h-P54TL&!RQwrLJNT9v#6wOB~jY%3?5sCgaP6J62zm z1Td+L)2WUf{luQq1o&Bi*iyg|w83|w>_qGkhg&+M{z28Ce5E7=%UwN1vQMnzpnKyP zdO=9l^u#s2M1pVA?Uc_gr7xHUiJ0`L(ZvYsJ-GTXPrURGeH4!^;Xe{nN*E?X)GoW* zBfC{_`9B;d3ke&Y>c*e@O;#WE#}F{9F3++j1}97_xUMa_PR<<^__dr;2RQ>=TKrnW zA%TLiTrE1cJNlMRmGW-LE>%qXEZ&lHSr#MUy~$mmJYa)R<1*}Gk7dU+h-YHQdGB$K z;7GH-^ywC!|1`XBj<}!mve^)aFySC8nsH zi0B)b2c`QXio#|Q#S;SJOMZNlG}&8xL;rpi&#i#%T*a1q?N46rkKw7~F~b5aJ1!ZK zK5MZu&stvV!p*({hAy5a;^j&H0k+E)%?+kVZ^b@SoR^U3TEZ0Nk8AnE_;nEIV2O3? z%eME&$3{y?$6z+r?>fXhxFXZ+Lr=_}sbr~Yv%)lAiVb(;7N!>NxtuUd4jw4l# ze7$Q;98B;*e(SGY9Jy!eKiAcIH+X&Pn;N^*jp06A{V6umk(2n8yb$+2?Ii7BiQ0^d zL|xCKev!9=X&>(rN07=_S&u@^GlX8>j-G{eZZ$m1Pji~l6ZH#k@Bv(~+SMPb$m`vi z`^Ix7!}qNNv$BL7|CA(g;?89iUXL#4aKB&|Rtp$=?~m$c95GM&+nIm+FNC8UYq3>? zv^5&VZm^5JgtJ&e>Ya1rpDoP1bE~T5Klt)W)q6#X*SFtjt2?|({QMSy_CIfovjcs< zZj55{KJOd6M_X=2Dr1wr6_Ytm5+~A894vqCUa4=uPVe||8?MBP!{)xpR93H1iUFt} zNIcb`AI_#(BlAR*{(3F%9;*q9)ZY7wGt>5q5dq%5uKv8~0D`ajS-)}HzizzmI?Q68 zI?Qs8)3a;|s8}sntzl|kopBl=quYqz1Y`xqr7!uWp!cgK11~1HDnHr{sK);B#==>o zDX5^c>SkZOSD?#*a?wkv57)42dC=_EAXUjE zJe2@|7rY=VF3gF3HT~Zosptvkk?qXmXm?H)|6@42f)C~w%t!NlT_nlR;=6_ zsJO+c(UvX-%^Ug#z`{2;hg?=;|Hp7>do!qp@fcqAt}IN zS$kJ}+srCc`-yp>oHkJmU5_Xz0SF1mZWAI0aqYFC!i}kEx^^BpGk8(Rj!K_}V=LqhMv{<&_Au&r)>QM$=a5JQ?mJgVvdTl+_I@MB#Hd0Rd~~A(iF?<^-7_2h zAwr!`-EZZ3%dZ-|A%LW*>{O#~Vwqh5e1E2l6(2Bu_x}^;0RF+de@6f6gB#bR=}PEz zSLQfOqV~M}-T)+G=zNJkf+Tfqrv5+h$52GY-#keDr5=IcdC+X0b| zTCYD&L}rt)Q*FUgym-2CU=zu++E~8dEa4Hfhf#hXURWBn(4kYI%?cMiU^j*H}7wxGUol!C8DzS-|&mtDjG0xVDLln z$JRlnH|hW)efy&zDT4!d;9+b3Pb}!;zk;*G3)c>6id&Gc5lZ1uYFHSOnAFE~L-KZ) zx>*|JNpM#c6xnToGbaJ<*6Ie3UNc@NoA(j1?T)nyB7{7Zl>GhP>7QX`*$+9QJ({Qg zIKG~iC#LZc(lHxqWl`poGYG=tTeoT33P#q5t`=CwMx3=N#UZqhxfyf#iBW>kpPG4C zkDml=WW*jO>%-+Q(lYKrUz}bpyVDxZI^W-?OzK(Ss{pb%(JDZei1o@3)=#fmwQ(}( z%=zB)Q=rqrx|1FX(Hyw_z)|g8STIn}SL4sGV_G6-U&21zV2U1^_XDj^5}ljM>{KnW zv<8+h!lV7avk>8HTb)Zr(Y9vF6oKBDu;P$o>qqa%Wunt#)+>(B8(w4tZNH~9xwNfR}O_Q}*SRo#0>CRT$d^bs57yi08Gesv!Dky5f*Q(tu^`~+d zz-#OJM^?0#zV_#{8>}TYzk17-uq)O*>q@l(v9nTIn zoaS1+a>IgZfqW^_WzAMYTJi(V823x}4|%Rv?;?(u5#}Z|2vnguoxBm1k8l$AXckZ2 zgra2XTACxyGjw@!2OgF|a%FPe*~XP{CzLcZF!!4SgSS)4@-KI(f$9YkZ>wOn;F1b! z$`+~fi5s|7N3*I9&TK)T_WLmVe~tZ`o){GWXl}#v5jx{JhhA|(0{zHp_T5_^Xq4b=)^^4m6 zZc-hi)vo49q&E|YZe!cx6c~*IKFPB@NYKp|Y=7&R$E@^=_<}yQ!Vw&FtKb%^XzdE5 zIMIa~_&B=~0G+4L?JoVJZ<-3B_XmUZgSwystZ?EoOo>*H>pApl&R@J<#9H^rQqPq; zQY;G4R3?dAPXBK|Eoe)@S5pV&S4vC+gw4bKg_T#<^JTW4dtwiSDe}ka?wSAeWMe9J z2tSTSuPiS|;*k+M1Z}uo&GmF|O%jC#Au2_nsR{uSeh2 zt0rek-8)704^h=8D4j21CbdV?CvUbyKns>h*mhOP(6r?Q;w<5hS?PG$_~{ev!$RH- zT8+I^mV6AHgk$v3e3iedU(u_nXLUr26Z7yDBC=_%*E%!?ZxZf~AI%VfCJnyM$4Ok9 zJgerxKWxjGAs+j_`c!LO2J1gJK*$1rO*=inE^8T#`2Hcr=bsL4JB&8VdsRy-px+MG zs+u-MSp5nOw8(0Y=+IjY&G~(=!X&p__{d?%6oKJ4xDv$<=yGN?(E6teW$ z|DKdgW_;0WpwSi&ZNv+3mti5L{+HvT&WoV<9xiw?JlNBt3Cpr08FyWE2-2?;7Nw>s zOz&TPz!(shCG^9wO1;b28ll~v6Ic%uNXLpocR()kdb$64$A|?}j6WBoNOuSf%1)Wo z3k|5rPP_XlyWq}w3Ke+ZC|2H$Vq|4@-@DTTk%hvmtI!s-J)z&?CxmJoZpGCL?>M+T z)^#FeDFhzUJs~qGz?gc}bLkfuBK88iy~5UKO3M!(_*;J5&RSwg_&*R#$W2f;;(qs@ zpf7O&g6oY_kg2Rakdq$5Zf`RDm$lO57RydR`G~(g&Qq(ELfS|9MH%03(q>UCSJ{;%2 z1T?%Wy{@1yKiJT6>hb1W1M{T9z@wQ)E)@8R2M2}a;U51+n{Xf*q>{>J=w!Ms5ZT9B zmpA>v4Aen9H_US4o-4U84gsa*fe*W0Bl_5Czj@}GTx3t?O9bzGJqAs6%HY}6xCKS? zTW@t;J~C|RvPd2)z$LSn1HI1!N_3(}kQbF`GBIh;`QhVF-6TwOQaW#&FjnKi4L?-u z-VRy)^np)FbjRUL zAlLh-LaP01s0MVmY<&#|f?OpnPVXjfG8pjId>pzB^h~H2(_DYekv?*)yL!iD$1{bT z2PH@jIeAqX=Z!%@NB#`~@jxB5t~w;oC}i!+I?LlZ=akf@>>6R;Ya^DDY?-(ySA3sA zi2~@=p1_~w`$Ct?N6E{dqb84Y3-Y*8GH|J_C^)iP@gs}~{LA5O#}w*iH! zjsHl^_M$ic-mzOu;S}pK;prP`G>`_fD_Z4`JQWwhV!rBiSd*;G!>otwvMtJ}wMz!m z;e?iyL+RbI;A-vo27+nlYIK*(bQ7&{2@&)m`0bW1c^}m-Z8j6URBziIuNqKZf}2ez zZ5?^)`{o;GPED@G6$&lyx;!t&Sh&zVFA0Pg)_PT+9s8K)CAC<`S_ktT`ZHAp2S_ChxI3`?Ac4R{6K^)&e?a<;GV&MB~zc=BTOEnS=2-KC(AMgYev`)>lfT zi#SRubTnoU3S1A_#0~n;f0AH#E`N-Wj1j*7#eXAg&bY~ZkSznh)?%1Asm<=KinI~L zrJ8uieO>yt!*Z>ta;1}e@5znN%M~?Zfok=V5qcE%V0VN z7-O~dZ#g>K3`daB95nyq}61ISq&+HxEH|rxj9K9SSEWOmZ=$6Ur#&>%?PhjNkIZ zWk?pR1i}`~Gqy(%9WIJW>XePGu!BGfr08SWg^%@dctU^hKP{5F<#_bcf5kB45Sg{O zYV2W&qgB=*bQphk)EDLz@noqC@KU?C*RaN?4Vtb$sU9MSN&zNA5D5>zH-q)I zuanK{!RD9fS7ucDM0U+5&i4G%;|rNOTDz|EFTzCcDb3a&D3Qee@ zDyg^Sb!zrE3qAoa#|^k545#J->&0FI&~Wb<7r>ULn!LcbV&@LOPosnGllA~K75ZgS zybZ@B3=28KnbKhQ2ePZGKK36(|(Gf#1T=3Ue%4l(3S_8xmS8c@7c#H@@1;rTDB zI^A~-;zke9yu`Jv_<0f~&D8fP0>gQ41+i5B&W+3bf0m1gvElE;Ya%CYm=#o_9AH4#Ts-gc z-FngxNKzwi#BKOAA+mk1aq8zP06Lj=q{qRTNMD*bdpz`HducPYFear>Wq_T zU`9nbj8?76F0Pdwq+29RpHXzgIPI!BkZ7w-&WqaRmu5vAKf}B>6JS60qdiKQ?N5Wu zSMPOopoZ(y9+cU=f6~zZlPEKK>9n(DT=>&@q8EnoZX~gI2JKt`7480hd}+K3MW|h) zavc1e8O>iaDd)fAdFO-_Ijd}yKl)lrm_6==XA-Q~dX;ptXe{&GQm(6sh%06W`MR2VD}^?f)I_EH?ddC`pNOAJbPd zY;N|$1(N~h1v7tRC(yH{=zhJ$;!0UP6udM$>$G6&@^utvlY#sw&KoZMWLaGBlL>e* zBP&H`-$cgy5recKO}4Z8M6Ir5?VOjSmzW7n;k_u+82~uYD5R=wdfOY)#{i!-j#6vU z;{74Uiedm^0$XfuCuC!%-&-KdO1|3SzA~Pl!@m80 z7uDmdLZ;b?QU?N<(*`r>94df0t;5<_jMw6pVm#7}LUch=_T3JHb+fGh5s(RCjrX|X zaw=C+9-i{RshNm3@&7rh;ZkUyXSuXdj$GF8yhkde5lNR8V14NIDerl83J@(=YtGnK zyONw&jqb^DtnCR}ks_RoBOvsTnh*7yDg@qQdBMRrI_C$t3N6HgYhLIGkZR>2TJD*- z8^f|uZzEOjVx0w|&U(&;`Wi_$!ZwT;Cdk$vmt1#89Tb_!xInqJDs7F7LK|=Tj*M?2 zO2;aaJ~$TXe(EdG(c-#4{4x@3{l$b}{+(hpi7eafvZ`r&)xPN8c8BEt<$+wsqjH&k z=S>NZ{wf{19M9lu%hp>e1?XUVY1QZ{0-=eiblhA3P-CH5PuzxS4>(Hm#1X<&n*T5U za?hvuC#TbW&%!A7YU+0ch29x{v zPKzG1#8dnFM5fw5Z#JbkISR7o1sMcRtNstC`GSk9dLH9bAO-j(i3X}r!lV)YNnCDW zc@|xR>!rrs9@`ndEN9slz7ory#@_0I%;Jl3^PN+gFi) zo@zyzh2>x;&0U_V@qcwLiLNHfX@6{3M`TXb5V*~DDNQHvAIoMp0L##g6zy#QS!-y+ zrboZsP$Q0%l<3uteVE_>RL~&bwjw0;o!+wlWW`GDjmv%?7x=BC{8$FGMz6EGt)9(P z9X|t9Zm?9&J7mBJmOUGaKb^l=Ww1fkeqf~knu$F)*R>-io5FBhqXPUiMzmqti}$(a z6ZtQ)%Tc);jdk@CKUW}n(~w58w@b$J6KQ3nm(1nvh@bARnkhG4P8x;o@6?OIYtGyD zO3Uw44uVgU+{1$d$$3Mu^&`YWiSb{gQFL6bqS%7etoSjcYqC+p+#4rQg%;kvSP~d7 z-yv)k5>^2At)B#p-Mvd2$Mo_VJkwwd(H8-oG}7{~vgtmxI#&mT0vK2;{PmfH|? zzp}XV#FJN)4O|e}f2D=2k9Mo(sZE1sxwA{JB^0GuwjH9gu-r#C9@VdSYu%mJl3%OU zq56*4{%wTMkd*r6fo?SaI#EhGL8pU&ei>NlUVBnO{pWM9Vn9qq9 zF{{kaJ(6D!-<-ENWkktggJl2R%=|rl{k#YjAB@Ez+#L)Jjt-(NbnowV+U=FnU~sni z`Fk?y1D`g+q_1RKHjA@m%r+Oem5;vL&N^AKC#fxS%hb!ibhyM?VuI>+!t;`}ue_IV z5x-1pi;39Z5bz@+cFN@uH}%;%B5LE$EBwF5%oOgepJZuiV2kF_b`ateBYYw7mlp`H0Ud?pG}LnoDKQzvfLZ!^|@=T8l@8gKxEH&RI2Zs%lIZ zqm9B*bAPNyNL{;NWF%l`bT^Raj0QvJ<6`nTDrDCCJb3D|y9Hq!7*WP>^wSxbLRxM$wXde;&wM+VH0AkSFrbI_J(Uw?(Q61jmU$%gw@z-;wN$L=qZre<}!Gi z@a^zhe*J4DUv%}+{TQP|P5rCQbju*J%z3gx@~5{|r=wDg#I8@23zjy3t}A_RoETS8 zTCwR92F#~_U4uA`iVR$fEV3Y`?TCJ1r`I0Z9*%*U3Kv!QSK=n9Fa5V=DmMFmDPX9XRA6ucxw7`JA1x*Wtm#IZSDWyc2Bqp^QIkAh z(ODyJQRiD5Xkis?-fv>mVXWk68;E+(sFKvm_^$R;^chFfgLOyGfS{q>b#cyc}}~AG2WpUZ=yw zCc~vm_ptl#)ZWME-TL19;s6}46lW-=`Zl^h&5-NoOVNsfZ(iJ9IQ`^DRyvhNSRV;y z&jQ-$E;AmdIXPC%4(3fR{k*MCCMWO;loBk?$=*IVzj5RFXQQ~O%YiN9*?mJp7;rK` zpD>@ghNI_`6kwW{`0O`pwvY6X8az@-H3;_uAD@RCmO~67_wywKn&SuZv&D(AmlTpe zi7s_Rk%U~Dv7$`$`O0;W^bT1yb$6zzcNK1E|L#?LhD68x`!&nGcDH!}n;KN86A6OkjY zJB;^&&4NGBUyhNHHC^6pCtiPGiT)R=9bLD5b^0s(Sp{Q}}zW zBU;(#nTs3H7i&+dpX}LY`HzumTJA$&xxapR4EAxe+^0M~Ut*-%Z+Aa@TY&O}Fx<|o zzI+mPh#}AbTDM33_!+c#!~cN=nX#_l@-073es$Z8(jn8|v})>tnm>sYP>V@8(u;^o zmgjigF$c6TsOdEclZmpTr8(h5S3t$>jK=4Da{^l8VL4=7;qUGKJh5>Gl8eyTw8)!? zV%C3`rp=Cz4nwv}64Eg(hI5e~3>DUjjwLB3*OA?Oyn4lwjHl`@I9x03ScfKS*pIcU z+vt)p#r1V1Wc+jsA()(b>w<$|-PUiBJNHeH0;(mRo{)|!IKz?{H|UF& zqji9CCxLTMf! zpVses%A#Wc{&9MXpp!S9Ovh+)L6n7@adj6N7%48maN*;L+c z0m&#)OJ8~5j4xloiZU0d!8MIP8QDKBXrhhx4E;Y(cXfKkzK0Sb&Jqc=3aTFsuTGUJA2lHcMMHZ?E9~yS-(2;NJlN!_*kg*sR zj(w{pUnDQs{2FK2pcvzuyKqMuqMt1E;!~a__re=bv~_hr*H^(gU9+{M3(m8amG8C0 z?)#2Ot9)B&HWmVD`A95n{!4b?(hnC$U3>4OX*OD&;DtReI?EI0W=@=UUc9pE6gJj_ zrLCdv3&xT3OTI>0Sm0or>KHtZotR*yFoSejCZ35Hf3kK3<@zy5!&zPbT(1;tz#yHg z^`tw&;Xgn|RuD(Eb-8{{u6ou#wi>go7V+5IfS@NIf6SOe`?Y5z)Z*@8=4kIU0qQ)m zL9hPMn~>yL$k%Y52Rkkp->p@v=3E6zx{H$-(3stP6?XoBA-GoWIq7Ei9gT%aLoPd zl?_{qMvXaSI|b``so4aX>{h9bXWlJ&xlmVwq?Fm6hT#!8qpW9;&lF3fi=Q|RtU{sh zK^;U?>HTNc-)GA+D(`ntq}Ega?dXHdvEQh*=X|r$lP^s_dang%tAKrZiw>Z7|B29 zwwol7(-HLt2tv}eEVo;cgg#&%LDT?$09sGI4t$mbZUL z6l6Wybn$_swIuD~#wETnhm4QbImYwgFLe)&`F;s@rE)x5k4UF{sFCQw?$BdhI|rzH z0nyiM>h2;b;$_SBK+jrl0wH~Qn~avJWzmh1H28}_LjVN5BqrqW0cEpnET}4K;~c^J z1p!}-w@uLU*fdv*N@b03@g|fsy~S&Xe^4|M4UiIb*^>%tn60z>h$tpX66X#HtSA-a z6$YKt@DPo98CnGDG?k&}e;DMGp~cjiBXr1vSAO-Z;2{R&BG<*s9HR%v<*7Y}m8CyB zmn+SI7m*Qy#rWrOgt-h-at!NWL#>FCcUGsD?HtW_7ngsppWfYxZ^IN?>l5*oBvs%%h519{A_i4U24|JNQnn5I7zwBESabd0X{S@==>6B^3gIzW; zPYlr-q45|+t~IG@t-$XuO-rg5^K@IW$=AboDR@S#b6%KXIse;*sm>CSGxAzx%u7=C z@}3%7&HYKZdv0FKQAH+l9N9Any)isa0>Dj6C;584%=45-K)*Jw5_iG0H;UsQ8Lva*ye~=tej|G~QxYY&3xWU?EGiYe z&6DT0@*YEu?I|~wCXq78|BAl4pnK|asE>={G6B77gb&5I4T|jhh5I3R6>=8(-e>3Z zvd`UNla_x?*={^6Yj+)}4n6VSv*sW=hhR5EQGIFnNTk5McT6x3x0zm?XUBH+>vm7m zS3^`fM>m{Rm&o_;gC|QKttS_GUZn$&MdMD7-ql_BX-;Y+v<1U=63V}ElI3I^Lavd; zHHY-l0O%}hem7hY1@L+Q+gY0b=hHk^Gh|%Os>@xttr1CSkKSJYpnelDbsJ&H7i`S#6P>eS=!zgEC=+0ov1Nzd<-92S~QZndk9A=7oX z=b!d>#Of|am~9u-37o%JpUB!+qD029Wlw=@Z{`W7^LO8?QF*r)?jw2D3HyNl@GAAeIhvQF*x_h0gZGpCP@jnF@PM& z^%Pp{sDke4T21$;KKR-Na*^#pOsH8%2_$25fO@q-Qw8%({4}qLp~t$f1>8%7*lH(T7a0TC`ExIWQj9&8K0jDPR;rZwp;DxD%P zEh0-4DtA`d+4*F^%~hiy4_x8tLpWF#mtw-WLbc#*H3M_oczC&)=VgXjDd(RazVzx^m-1L9W7^#9;WF;Sb8n z`+irHx80G1g>TqQej`D+{8_u-S2@0au zcub&&35cW4?$Zqhdo=Ci|Weny;D&c35EH)R+iN|I5ZVJ9|3l4M9YE#@pQsQR3 zX~8doQqRqxV$*7sm_C|3DN@B|W8@e9Il+r$MF}-@#qNjA=SlHqq^dVF8G<2fPqhQX zTnP2f)VD(w7sNIf`;|B?0DiWV=e(6lMs9Z=+e4G*a@@NckHwHA>w3|gzhu&qAFR1G z_QqLYS6>wE*Y;F|0kgJVxok4j37yRL{R*VuozK%GaT%-1{#Dm?@}HnC&dav4A>VWfS7t6O3pQfOnYu>Q4 zjaDE%Vm8;_84W5mV* zz53x`8#Vi2=+aEq@bv|eSqR*&_J>h52RC+?#G7N>m3S>4N;2?5_a{l9T5})(z(Zd9e`;_DEy@OtkYCE zx#;4|Q_OjaKKBmU^S_AJGV2!#RtHp`QzJ6@{els-`B69Vk6%4;)Z(r<@18^_T?vRL zFtvG`YpN)0)0H(1UF3(muM!*jXuzu30ZIn;Z97&`K~p&YeGM)qIsvE2PZXb;g7FjK zCq&^!7rvxOw3WIzt3tS7p8%sBv&=LWpsFj}ceE!ZM!x867go2Yvf*YW)k2NF&~T`ap+M!Mvo`vhc@+_yd$Tz z!SeN7^~&Mi8snU6oy5_*lDOMLo->~vCg^0EnLZ4<4M%&9!13p}AQ1AKota*8;fuSN zWqNbeXHMS~GJ3wl)YZ>H{xi*Gz-WuXj`Oqrkv?!ADP9KMKu~QP>0}z_H$zoS{+TP9 zA~0&`NYX=j+i$aQok{Yu^F^RGy5e8wi=8k?LohuaC)pP?zDQd}Oy|#Q&6`IrM(1mu zCbH2x<1dccvLd^kS*0M7@it%34D!sEH?WaVOa_ zvDn9s+o3D38jlK)j2C3D_7#7a4L(nlG9Xibc+wH(Fq5r02%3Y zVR}{{v<}R7_>E=<%668|wYHg5gvl2XE=k%C>#2+=%1lnc;Md=EPrmJx8w&WXBVenO0A?RLkNAL4nD(^Pz|W(#$d zNHaBy6(C*{q6KIiOxJ^TZ{NF5;W)g&bji`ORSxHH^0E_ro|%tEkjRF%iV80x z<%MZnsyqtCVW^lMuzq|G{b^oOp1rOM?0m$y+)Aw2^EPniWyE9sqZO?J(~5ZESTApp z`$*NXC)OmW+k34&eLGWB2&Ab88_^V#}+{H2CJLiSJau=4vY?Fa^ z4vbrIE3r=D_jAVATt}Be`#tQ%pn_-9g1XHF^4~(-y;OZWqjS7Zcq1^22idEUUqzVC z*nL6AYWH5WMa1(b_d^T{ zCi5+QkW$EvbS_o`h;KH zoD@=>$r2wP8Qk)+-^p%>+@MeHg>eA(cdtdZaeW%a32s{WHaP(4zH*+UqEk7%3}6HI z4mJ_nMZkk^#)d3;v*|pXXC_D@A_4#xypXl^{_X2!+H#fA?&d0pDnOjl$?SF&GPVbC z7P9A4-r(c|(*f2KKMD?OS50Ewtv>J*pt9I8Z=|42XJ3xKatgbGZ${e98*I5Tb+Y+! zFcJvG8qjy;%mB*{M_+Z;I+!3@71%-~d9qsTk2}5xcr9ggKFn|X?%PqQ+@g^_p#MIYARkx#!HXE%wmx2%irFu+FZ%+9EHt=Zyt26Xgs}HVDaq$hON2dgh6G;E^46! zK^qe9m_6L5Z$9Y&{;_vA!t|$r_dXuN9cuTJ-8*J3ZhS3&B8#8mUZihk2GtMs0G}_Z zvsHfxT@^(Pgg(X}c({5mOE$KA@i}tP)+sN}tGd+Rc0&Ou(WW?0jl~pY#doE@O6p?ELD(x_glP!1-(?y?JXW*;X9oxhcCccFN?#w`MT^titNCvsA}>w441} zarlJ^L!<4Iq0qs9K}z8pyYwbeM~S|Y!hY;9c*8kuqu_KuG0 zD(%eU7BK?m!puc+cRY3f6sQ2&`CGTXz5k-Q1&=eC8iWasWPj@V+Xt}Hzp36H)iXGw zyQ^oq6^F{?9Q$3+Tt?hV6{V(_mQ^ts#NC(d+JeM&@a1yY%S5=# z)rW!Gw;Wy{O@dT8w+sh7mA#vPJ%-$wB{}$IB>Kp}B5pot+Ie#MwWS)Agd{J$WL4OG z5H`T30_C<#Jd1kNwHsKvOL%Y43TRJ=`E=?CCf}9w&258U_@FmXjhDoti65h=4)-+# z{cD4O_iiyhpvt*zgV-gTD~6*3`U@HtXMAXSyXuO^?bEe2!919jWIu{U9v)YRaYxxP zzyfbv4W(tsw32z^p%pd<{(w_ zM60S=bm0OWE13*eLJ@){nM1I3)GP8Q$mvH|y)*8u)a2wX;-kHX&Q1hl;)G94KiogQ zp1d>H7-C`NIUIn=XT0086`PEB9GKSZ-{r&=Zc_mXpWu5Sw)nXy(4ZLHx6FYPQw*XX zXm_Qa5?~|eG@XAs*hQ^<6bQ`%8Aiuw5r2JDnJW8n9~3aA!rH;&5^%k}F_toI7&BVg6?2;^xjU7K6fOcl27xZ11g5%}|J35d=hYjOE-dS{ znK}bs5!9O13V)eQvz;O}Zrti*`ynDr;&+PtkEMe!g?^5d<&DS~TR!SKS zmDpFN>|*-|1I@y;(z5nZJ-~9=xc5t}EF^_6=e-r)5+bRrVvCB&g@ebs*6S;wuRK23 zUOpObwV@ADKU4m)DBOW!JzQ&-PqM(}O~{(o;Ipk>9oRi1v(~z(P&6nzhB;!A4Px0*_Ve`c!HN+|w<%Ji~qxt0-)XRVO!hkV& zm1j+V(y|abkFKPkI)jVQ>Nz_PugI{0nXjt%;1hCDR|NMJh-!ElNNIB7thsY8dl517 zthnI~dzyN=1^YZ)cfrr9eBiJtgXc}|`~6!_{o=*%Ll~6MJCc_|meEy*mOZmoq1RWQ z`YhX(Z>a4yDB!$jrHZ!MYyUPBk9K77Uy+-q9j$G(u;GkCl`|6Mrk*U6UWzGuDsQ{5 z`uxHY^nN~D)Gpk3@O^|~nZXFWv54k@GyH?n69ixu|NjG!KySbL{`NJ{jN`axUDwIq zE}o3J;gcCld{WL1$D8gA@h8K-NRG($G8yBEn$O}-T@>A)anI0SiGud*(A3KPR z=BfQA{xrghKQDxA@c8_`fc_y^vQ2Um__mIKEuYHx$>o!qI&$uP&puN>vIxmKQ~%s8 z>7pOa8u4{T&!%T(c{Vqj^g$3O8(Q;CoK^G#Oj7aQ!tB=laU#B!`q^JBs=wqp`Qt3- zn|1vIC15XqpOlpGuLgm=CXW;Q!@Ns5m^@x9{o?0AU;+Q69u2B@l@Gkm^qH6!tG^s1 z=9gz;Uc_%IGvDqZe6yE++Vg>L^42liz7Cr_Mhv>wa3RIEar&R~x5R zHk=g!mMjV2sR&Jzl>+gkY`|lA!fkrMlMV^D!!|x^0(gwyxV}pMU0znY8%@FHHzjVc zn_Gb0!~*OL-*DPJf|cO_cC**;&C55B`PS9;^5xWcg}qD!Yk~lKk%-*!0eFl~xQ!0< zPAY2EDwit=5O-1``Pjf;23_YG699c|K)7c`_`$HTP7fR704zrZ_OV%sCwY)~ObJSQ zx2XPhw?W(*U|SwGII%q8HbK)Q3;_024KI1@mgNKTL`}2!$pNq=m|EKT0W@^G)bNB} zk)%L_bV9GCoo8FYm#4|s*=K>eSGa`*@X!$MrR(l0D+jQX39(prz_X%++m6B4S!GRo z*eof~xOmX8S!X6&Sx)vG4Gc7vWg97RT@r2HTg`Ia8DNSgh|t9uGJmQlmIq4z@BLLOt;Jw@Jy9( zFL=|(&pe4VVX1S0Ob06ZxSfcs<~c&1FZd^T^y zpLE}Ca@NZ5s(qG6_mW=XOK*eeSxNzyHz6$jY9-Eh_$$g|)rp7jRU%LgoRgBFh$ z0PH9xmSNwm8{aU?YV;I^CXZ({9LFe<@r#n4OwbyRyOelBdv3t2v8tcUeIeWr%Lwjq2FItBQ(fl9s6umYrx!2Ut{J$@QDS2+xf6124bv2uS>OKjjL0wgmofqTl!JK@@oRk^eci(jqi1a$s9}d>e2dX4~ z;Oah51zq%hG-7cs0cjtc63nXj;8fDJ)IK;3%Q{gXoHqH(_YboyE1I-M($6tB@yD1O z{1|gl=wwuDJbtE3pA5_bB|-u{^lc6g|O&XJgEfmBwxb4 ztc{PFjgLOG#dqEazL@ittW3DA?~{d9Jb4yi&lW~aq9xqc1l%1tX{oa-#t+8T&YI=D z=rG%4a?)q4usg{uxg2=Jedk|S-4EbszJ9?H>Epf`afb@%nNkmU5!!ZLRRlW|PKyu9LQViC+^+o|FACsgrh-_}O!E*fKopxPD{?_%y{izg*-e{}S%Z<72~BJo&fb_BKZxd7mU=_lq}JTVMb zNvyVbVijN>bYimEC-#bFVyxk8&;Ula7*B8MIC{a;fAk^e_`lD3SAS0X0kG#EmQ_6N zPq-bRPm&WBAf9%D@BX!TKbV>~lkY)jQ$~D?Hfu?^Ya-z3qJ4(H(rDX6qvn7ESX4bxe3U8j z(Y;_VYd=m%KinFoy#-a$-V*MRZT57Z&F*tZGFMJGKztUd;y5Q6EuNzZ&@pEdAnq&? zaR@WQXR4)*FNehh>sqH(?NR++3Nk^CAwV1#bq*XYy{MiCuRuO01w}p`W*cleOu||B zJcff|C&=;yW;IPZOh3n2;cSrsc8oQg5CihW7~x*-rb&#ExPy#vF9_g?C&EX5pKIc& zwMpCnO9H3G6E`Gomjv+x-4i%1p11+_oaur14BGKA>sNRpp=lBbFlx@@8Xuo8nsIp$ z_r;Gk&A5ECq$vZKT{1Q9{#}UA=l2d9fSs80C~OM@YY2E+xTZ-52eADYVAdrE^(~z~ z4PYiw3ZNm=r8P0WRJy3>8cH$Rt$60Fz)*xny_ zsdzVgzhI5I;Scf+mgl0l{Alo1M;8;s<&MI)wY#~Pp!jH0mhpyX zR{Oe{6~3>YpQ{7xW|mlzf11S`MijTbKpCC!F@B)D=8y8p1g%ao0lWnI-mw8HmsNag@QR3A3h2l(qOo6XEDK*}zHp%>-#?37)Bz zG;)u>_d}0cs(C%F$WvbbKHpY{69&MNH~`!ag@GpV(Ss&DfFNx~(K|h0_l*(3qFJ)iEiu!hrj7x-AKM{~V+m*ulusR)}u~{5$+fx{NYT?vgYIj#HYi~(~U(w z&kl5ha0}r)IwRPICl)J1xP7vpspO6^;tp18vnrWZ9ca?46MjHrA0}~|nDEhlw~hC( zQF2+>TT(|@R^^jA2tOD#tvYCv9-Hu)Yz2e&y)>)z&A{XP04V=l+jYL)`;vST3(Pl} zh4AONtKEDiJNz5YtKz*isgsNY!zSer{xs)0YT5}#m3WchkjKv9e3lC z1nUvd2%jDfsebO$FyA(E@ zq}wFPxd1p`{9+k)5^$d8t)}q{q2?EtHr(2Sd=fL^c5A@1+<<4k{r$U1!2bT-s(z*m zutx=!WKO_yfDnA8Py5{TNwh@c_#oWI1RC2CMop?E+_|=C@(d70%^5t1A1Ik5Of(K- z&?d>*^qYe?j!Ar!-yQQ7M}uMItjzN?+B$BIJz?Brf8bB{Z}ro7koYWNsh`J#H0-Fk zTPHOH=u<3utx_xiK5*|Oe-L-ZZ8#wdx}=vPd>m&F!DN51Kn`1hCXr7#dv{WLE1&io zVD_5H=&j`Rhpo)ybi#*!v%wtN0{uZY%bTGfNai_X%_?7<81cpD=P(zBy=O%^>nfin z-1HmlX00cioU5?fCYzH9fSp4L)@Xt&aQuJ;aRmlTi1FR8x?zlqym0DDOrj{gJfH3A*u z{~+$w0P*-g;Rp1t+EH@JB)0?x(LCm~ifb)U8y}&OmI)c4Ps|X0pnal-hDU4xFdvk9#&f&!4*;B`v1#2brXKTlK3P1z-o!WmY)zT7nukI@q{4ZjzPl5IGfi` z47T_LVJ;%9R`7|8dbN!vmjwv6fA@8U9J~(o9b8MNQv-M=x|5_&Yw5IU zptw&tXrgJ;NZt+uc(yl$vzF?G?bYO11Gxd)4B}$N;-qwT{zW zmH0GQ_3gb}Y*4Sg>oVz{aO+;*>YH@maMC@%UcH7BVuqK3ny*_#dV@WGAaPa)#dFxu zb+l8g**(vM)=;E9W^I82Ial9b*a(npr< zEO~w}xQ}e?qVWAOI}yNM&^&}%oy)(}M0he<)A*?pu&04-X+Mo8@+2crCfSJaBOab> z(o1WT4i;bs2Eb#OZAotlT~N_qq@bxLc$+=33p5E{!Vi`&0SWR6NWyVe6JRYq5k~m9 z!Cp-#m}<5;)Nd2#{tUs6gCdy<-cJCgf)j3&)dPm9;0?#$fh7(Pcs!nPyK2+N;{kRI z1AIVYAA>RD?}U&1mcwqoJCZ?{9Ck~1081();X||gKz_$$v|RZUIXzc@n*zlj%CGq< z@dVl=pqf4L1TgzXqN$~GXlZzzP+|`Ghg)kBe_CL*n44mv@x5NeA5&VDbhC`&kEyQWZlXzCjR@lh^y0Y7ul(L0 z6TkPzh(E{Oc%I{K_|tDzYx*KD@jHDCzVbMK2-p8#o>%xO35w6!R+xCZj>A3{Yt_ zXVAS?_(T9Eq}qxq%H@b$48)Qw*&4c)qWODo5?xl!-AWPsaJzLWk~w?KBu>LCck(7I zMG_~7kLJa~VdQIAGtX7Uq)iw!d6RG_&Yn{8X6u-=3DOVauDbZ>gSa2YUCcEpGa4=| zIS}b3np9dErj;DKZ0xAZBv@c!7o7xK^UwXRo@lOjjV|kq{DN~3_m>m`FPcx*?Pq;A ze^En0um_zVmi9QM2=^Dh5I>Oj zesJVhYwC+I#&@fEKS=Pf@6zc2!N%IL(DPW`K{HadHMdi;;Xo~TcG6xLmMZ*WD4{LewL=9pLmSd!xImirr|g@z;?cd zeV#$ET?V9?BpW19+^=E+7C$urSl@a@*h>fGKDPiCA6uaK=u!<%DlpK;Pul`MH-}ME zf`BFN3wTOXv!?_BJS)BHK4qfB$9sFwDIbL6dgN`fV9A^zv1K+PD{sS3ZDHBz+UTyQ{oEF8)B3? zch8tgM!3z`XRQ9+HGosdS~`0OAkTpa;r0N+9ZQ6JO$qlZwK^$p0DF;uCA)$aPxlY7 z3ktBPX<>ZkTIFq~y2J699yG@W03XaKwXnrg3qkcXv>-n0yNYROiDedJ_q?g7EuVLt zfgz{8ENx~#UT_`;Xh*UunZ6KUyEU9@rbM=QatVm1Mz*-0a)B=T?L~r9Bby{85@0Vz z!zq!Vp}yLH6HSe5n$$?3@p}Vd)Rf3(Nrh}U=?-8vO9~{Yk^xaCWk+y}^Pt{s zq4>e5u17Gcw_yZ7rnD})bm3G+Imxg~DlM9URQM{j%6 z>#;leXS^iKX$GzVMYNJ`LuIQ@1v$BdvQ}9i-WcZqi_;-q?)ltBQWufw;Y^bxC-& zEr zr~0d&e*8lExL1W~rQ!j-d)T2_>AjC5dY#%0{c43&NSIY>A>m_uS#2HGJG^MW()$Sq zY2)Lih_5WEsW57?VLMt%Z99~EY9eP9{j?Y~_coE>M~>JOe}vyM{mIs)_f+@NJ3GoA zGEKbT-Q;;nLU_u48!=aCMt+H>wEY=&nNl{aBfieb+W{K(p0G>JbPBD0PI^=nEB=zo z3HS05?iB$%{dt`w-jY^9JSnlolMw;7ixG>xhH(2w(6i=7 zNsqGR9v`{KNw^Ph2v11|o|HwvQ&#{_0rA`2maxAiGlO`ND&Y>l#wTkP{Unk9`STu2wlEO9FUu4dD*&;HzZ#%cOs)O3A>j}7(}%;7{Ule38)G|mm=NuY!~fd*d< zpF<0fPZLMDvtnzR)C%;8H4s10#*doAzABlP50pv7HhU6!n=B0Kl+S98x1M7 z8J|elS38Lwrj*8xa5u?4)g&PjKhQFTp>5!=?GXFK&8GV_aXsji3&Ka4qIp_uiQ;_K zK+5cOA&=k@M+?u69<)hYR+gM|niiitTra@8C4n}a-VR_pli{V&yd`^rv{$3yIi3FN$=Y1Nr3?K0x2|U{{H3# zEPnD_bNk697%^!J=94{XvEy>ra6ct+#yQ1W3)$2_bKsxPC2&>&8kjPZqF$j?1(RQ?w0Pe#gklH znKYlo@-*vf4MLrd3a+ z0r;uYsemX_C zvpnKTLWqx&#qYc=`CWM@T!IgzWnYkX0wq|hC%9B`#zOpHN={io?^HwZjJi+MnT7_H zJ0kAnLGo@qVN_=W6h}iQyqhKQ3M`3B5ce@E!91pSq9E-)4aU5=kI+kl_Sn1mw2JUJ z0m%D+h~!<*5NG-1ERatQ0z6%;GJ1KRPdbI~{t+_(Y~KSG@5qUT$=x7=wEIJXhr2X) z9|+<;RutUgUZ|dtJ2Db?j|JlHu>j7hHo03PB6n{@c$@%q_p=ii)m;a{cKB9CUXAd9 zE@D9OS<*7EABE^6JDw8V%A`W0IImtx7SN>F^r*Qdq|{Vi?O+1f2FtUArB3D%AL0k{ zDNaqF)B&&!45OwrwRlPsi2D!*=H%N404FUqxtns3PHAds_tGS7PipBDCV*$i-C=I2 zOdxK*gXyO*5q?0Q%GC7kQ(N~bOeH;qsRy0H)Z!^j0J9tAfjQ`sl-z^n+(NUGYp=%> zUJb)bk2jG)=e4$P@Krve3g24ne2)U?{f$6SCiQ{XZ35872N$S~y}IY>gA0Nk?jUXV zg+Wu6K*`jlkMG_$OZwPCG`nHa(R$D|m!w(&d2$9QlcWJO5BqNHtV^1c);t-8#vH4c z>JOu@p5a3aux|1ckf)%60a8&3AJ^EG@u@{dT@8@D*5*oGZUdw)_tK>-n`E76k|WH> zM;2fJpI88#+TP?zv8{MgER31vpYZXE-A8?10lK7dXtN|!w=O=c5D8~$!k%JO zWrFGb4R3=!{Ba45{J2#6z-$zn+h-Ld{jmB{Wb&nUk{+XPB`N0=kzN(dPOLTY{V+*y zE}g5zg15ArLw&*Jq&}tBnr^D(zPMnCFB6)Uuf=m5(Xb!I0eSK(kf&8^mb7Xho}AX= zNdXNfcmcNG0(qjV#U)DOR~(2lxTKx(1?G(}3^+yV?WPM!Q+Y6#-xa?PgJ2#h3A+DVwQo620ms(x`BfxJn+v zY#J3MlGZ~*98+b3an?okfyHN8_clY@Sy0CL8)5b(Cu$N`WO8H%gDL0p{)(Wo;)adiod+r>b8?Qj@pc^41M?+IJ=>Q$>!i9AU{_*Opr zcsBA|{cu4rzWYIvN9dPY>+R2d*bTRlK^<*?c-SL#?0>+coetv<^|x~Nw9Zm;Z%JC7 z?W%o}7R**#9gkY#UXqBf>`7)Xd*vQ~HOs1FQe2a3?{X(!b=13GMwe~Or@>Zn?NaVE z>!`_y(tY;>ZAUD>yNyaW)37!w>7=A8IoF!+$&=+_s%l?QNgW3v&8)|6ffNN;RXyW0%RZ$P1rp~$ zwFiifHR>30W1nJCtLI*SX0+IAYDKB&Bc+VFMUA`qVOh-U1`EXx(xfliu>35?KB``} z!QvbqKFUJ*RKWHEH}{s`5{=&$bf;N@-c3K@J`#JCnYUX-(>UrQ+tG}E#~Y=++V$m{ zDHQxQ6pMHDwvL3`!mVQp1&nF~)2IhZ+U`xB>H+YWt7>SfMC+0&(Pm7M0O`?u^CaKm z$%OXBNK*q7)p^*=Xz}-3iboHc;?XLmc365N8Ee(j>1B&##gr7YEO*v!>90WZRGL;X zg+}7L0a9szeHOabD3u0AO{r;`RGKzS3Qg;nLIcvy0yHKElHUACX4E+u!KpqWUt;~1 zcGN1aYnQ47x}+?%>UzZ^4VtRd(kV)9#I(9FW@;7T_u$=^I@PMJo?-wK zDpFZx3Q|uq1mpS>B z2&AO0xFdb?I?(8-4C#}pN#6Mm)XWJ7;K{OtAMhk^f_(C3@YM`SoP;0PL8o+Nwwz`F zjn2k#x=9hexJeP9eS)~eCx!ujuE`p#X(C(6X~UZ4zyZ^Q^{q5NfqebG?(+GYAq2G)5+N*u(U`g~M!3HZ0yKU_HEv<=(+6h_qH)@QQN4C3KH6;UiN9?zEUPZMop5K_@KI)G zaZUnVoRbJ11MF_(oJ5+t4g-r*Qs7lXrzC=TOlKtG<{_PtB)!L%-TxZ!A*WKs}MCT(`VKK;(V=$NCbh_A461jklk5q%KlYsB)c|{y zfJLub9F}F3Zr%a|xl8!4EbDPgDJjEDCFw!OlY%ca*)H~|Q+a?!qM&3R8I6+boZ@1+ zNw?viE8)&;zQ4C9Ii-rk?Hm^0*ll1CPmyWy6d4eYj|E?~@u}Rgl~3L1QR9-p zo+J+9GgXD(I;anhXs&VLR>n^#NOvC*5lvhhY?I7P_*2bwNzx~^I!V|)SwGQ;C0CL} z2$(D(QY;e+HRePDNV8=o*Y->&*EUT8q;;GKX=Tz?fq2qk;}Z$q7_OE{&({0MX{!jg zt2Rv<3xI7JV2SUwczgq3yGFxt0U(bL0G@(NxC5c-y-x?-XIV>pRu$OgjjuAY!f!Qv z)~PSf_#y#`r#=Bq3Q^M}h(SEjM7SplcxpxC6Cs3;`rBm3hg&?SZhG3kw+7P!^e$7& z@jBwGE#t(!JtsK?A+0;HKcdkL_4HWP$D*KS>mR41@ks#9x|1k}1` z*8rm?0}<{j)HK;20PK_sIwoHcK6Bl@I{B)_XNN$zn-RiCoy{XBzm@VinHiSF@Hv?w z_U!I^)X4;X@%TcM$HA&}d+*}&Nx_v=lWc*-(F82^Jzz;{ZkD7C68Cx#K1%MoC!Mr1 zN&Lj(z?cb@WU{x)l+Oh`Z44x?Z*RPUEQ!nc;>S&baG4&neqm( ziz*l^Nrv!)l}?&5{c77}8GvWhUG?Oc)-fptbjgWDlPC4SI;Ua-`@xKolA1jy769{N zB=hu`X$D|MIkF&}J-`n)!C#WUYS8I40QSDT$DAG=#2>0Gt~3rdIS?t^j0&yE&aLp;E1l$>xZqV$$w*k^|4v^-F#x-C@@r`EjjffsIO-$frNym|jB)tkqA2>!X z5Wtx7I5KX|EhSzK<0Gq=>;PBmx+xKkZfbaycJnbT%T&jEVSgF-ZFVV$%DDRgW#a6h zjQxuSwSU1>6C15eLIY@g9)>h_C6Yf-#~ldqB*=ir&4%Rn6-ki6th~`7b-dF-{HgxB zw24+2mbGzjLX&cHg7|^^`K*PsblXBaiF&X?!k+M1l--y{|~!-l&pQ`q(8%pY4RNpvlMQB zYGsoBK$)aJQpPI<%Gkio?qmN*uR10vf{w|GJ*6Z?Aa_y$Y1S|qu}P8;nPfRbYO*Y_C(RP>Jlpn4ng#af(k;4Ank|;e zvWAx^%Hu|jxlMF(ERc*Hcj;ujy9v-Rn~P?N z`x{=3=%;{VmIcpQ0^-gKMKha`8gw=z4aeu2B+do!!OEFM^=0>$R9E5qOzm|ezJy}R zXv8;Ixr^BC7{o5WAaP+MzOuXijrfKijOv{<$-CCkur78eKWgs2WcMW+f7t`^p)VR{ zcby^@7b?UL7S_dwC%wzx^d4JX~oo2zR3z=80@56H&_>t;@lXNbnRQuwCi%}=XH zJWCFvI$45z@>$a-pON@|vb#1;XliK-w(bC1cQ{+|t^mZde9huB5o8%%YMrtkG^)L| z>E!`PFRP&V%xSlPAF_~=Nn1Urdvp?y&$PIkaZugOIIYUJ*D_Hz`RKAm`RmH0jzbRpxNCT6OCJA#MuXuKYOM=fB=@X#)v=6zGYkV zunFLr(gbkBiQhI%PDiE7wn%xvODZ14UNX7fIkc^H(!;@ZC4F19LN!_n*Sn6ESLtO~ z;Bjl~x4><~CgO?43)14=*$duma7!Y9L6ZnToOKZ~lH0GF#9zK8m`Tzb^?Z_JfO}?N z-K5U}V9cZ*jk_&Ha!iw_k7`xY7y&%f+}AC6r@51N03M^16M16~^GR>jsw7J_xu4?# zNs?C^CCMwUvihwb?~0{No-_pxnluGG-tdDq>F0V%{uV4qCri~#CmR8bLr&{gLryX( zyG%0b`Q!<#G~CudPhbgl)@=>%$)!k~E-k$*MZR?k+-W^ple8W+WKKc#dP%M4dVSwF zR)iPq#9igxfDboou~;-uVJ(d>f5ud>sw(rxjMCrRM?u zG&ik|&kjkQG%-MvcyAh?Oc0H~Qcl|YS{LF6>ZGOUVSS5&hV@s%7zXA8DF0c?Xc9Nz}m^9T5V#Iw&q+3HI1V8GuzA;9(9gp9K` zaj{m?XJ5pw9|J@@t_Rwrs5E_wO2erg0K23Dd1?fRALyuGy+Rtjt&niPmeBa-8{>BX zkIU@&bIJ#ZvocdBT08}zO_2M^V48`7mQR*flH0Y+K>*@%R>WoF!Ix5$^iT3m^N7nU z5kDALrh3Gbq>C^TcL2heE)_uT#+9UbJ`Q4#cHb(vR?lUH z#Cc4|Hb^_P31$r)*rbXhn{bCV;tDbt)uD~zqq{7yuANI+Xf~LYcOip8od^g%@Lkup z(QzHr^$l_MujHALUowB{9^w!8-Nc_Ex#4JoBpPCOrV+lyOcD*iM{ymN{_5n-J*nQd zw6XhV)(w|qhn{dN2{blA!`=iF`>WR*#J%1C4|(b6UJu0mekU5#TT;Y%O5T$KyZ4R6 z;te8+J3PRS-U=dqFjt>V0loKd04L1akUoJT>4Pcxs0nn;<_>W-a9%2e@?)FLCG+yS z*3vJfCglVBM0<(7DXRc`$cEiV66_&!{JoOPM92-s?6+Bxp`f91e z%U_ILvwhaOzb~7mCKl_`;tA4-uk3LR5V!NTE@{gE_8I{RPblRJq`jiRJ@YA7Pj3ek zN^jRR$uA`CxC1jL?*I*3SN+1BWqmHFbj;W)j%`Lu@{ZJ zN(T&|EYK`zKtY)ld=Pge8D3TN+dIeX8~$*Db!X*s&##xc{=KfC*1*i@*Uv^tD1I&dq!6Uw^lLQGgDQ+bHaN&*SG3o+O zEv)69^jnskjV?&zka?Fitm^bmK+Y~UIlK*!=Q=~bIN9`6P4Aaqv=_`ap{JDA2?o7q z@vU^`6c2Qn4h&BBlHKd@aCX-uZrurYh9KM?4|sBL51SNB;xp`?3zBL#W@_z z0fATTorefkrXZ4;Q*ny=<))D)$rM#$^+1N&j335 zY8SGz?kO8>82$R@kgv|}*Xd-;4Q3C>j-*wb+EZgr>8bhW*qulo^I5EwBZZm%vPRj| z5X)mioAh%+E1o*ln%`@~?$J36$e^o^DM<3XZJ|?-;E8Y8`NFLaZ|lE7Nrcdv8j-MLe60^HmL?AD;(t z_Okf4AD*pV<3l%XYjz!T7e)9k9@hrgKG|@Z79da4LihoVeXrRS@2I+L#kiLhXuL|G zOtxKwd$pU!r}ab=9|js9bD{jGvl~7erXDpO59}#rEuKnN@Kg_g$H1E^OqSq!2>*tR4mzXw0K%>n13=nTn>-B*9GYOHmy26jk-p>-bMF1_!>3Y7yy0h4dHeU zz!M;?PT~V#J2tU6;z8UVM&bvPN}*_)^w&U>@N4lzAHZH$VsZWf@dMpcSS-G-Q)0DQ z(p|%#iB%9E!)*S3OLgio6TnT9wiw1t024k2DA!BPYWf5=&?K@6AK%#H>6XKd$gh@6 zjU(LA-A3>MIV|gBlvZaNQo_fzH`7m#Sw@(Y0xZcXgpc#>?8zx0o+4Ls&DX?Xu5$tb z$MT`ChX;A!q}}7DOkUO?xE9J^btG}S4X`+F0QNEgd5!~GJSVXro>Tz1j)G{^w35v( z8=^AVA_Kec!@->V{D|h1&25jG%`LEJzuMy2uadYO6~qq=oG5Pbbe_PTaB6%y#-f=G z8;PUE^7IxgmIp08r#bs;_T0Bp-@iL>N^73KK&@=?1R21tl)#co+2W~`01wNqqMxFI z=BZ>&l1c`!{SGt~hIndI)1)>5O=?q%r;P;hR3XAgo81DbLd~8w5?E4gT0F(3;7R%b zyNv{R?6_$-DZf>joZl=-`5>O{4v4dR&0eZ$lH2uN=Dpu=Y6sZesNkyQZVN%&*_Xtf zWWtp97){aNaD=mXas3TBau5A5%(gM!4i%jo*oQw)FuIm;$z8enG#8@ z%mfl`)XY-*x->}y+w8#NCJAwMNr>CR#N%~pZ4#&ryG;V=gfEc0OQJ#DCL!*)?or() z5qvPEWDU?JS)HBE1sW~z(fjpbleZ>nR0Rs1ONB@fp{>}>E= z0d^1e248TMG+(5Q_%di-R!XqrpstGNS!&?Lym<@-(wQe*#Lor{REz<7Mrj*cm*jnb zS##gFl!|2*Kh_<5ol+7u=&qL(jbYX&{@JjQIBS#q-ZS<4#bU>mJXybIs_$u`^kc|% zLa7BkWJ&?pCG9SVvlk_Y%iFidmf4myNisW(nbh9%Oim{8=aQ~7O;!f^>;{8x@=k0d z&vQ-h-C8E;6U%71<%U~2^=3(@4)Azsk&NaAKOAEXb-#EFyes=yFiXlztCA{Xcr{{* z3`n!$DKRi+Y7DUOg#5}hTDX*$W}g~U>{DU@=FBiV6%c={#bTG)m$zHwpe&2AtkGXf5{180Tm#xlEwh%Ymp!b7;H+BB&pFlv-+ z@uYPSPg*D3rJC^3rh2wC+#sJU3wY9O@YM=Qvn1~%-qT7#ZCH|b?N@eRLKrkD z43tdc3V3oD;ZJoIhq@(owDvxy9^0?lCrN;s3Gbqrg9U&cmkp-}0oZ351*g~2S2TCu zwo?);X9C!_cLkR(xpx3@HvA~@r^Tr$MCz3E__7pQU)yE=Ma3bs=hG_?5Q?Qlj}MJGkadq3F3a@ zL4*1XhHys#;Q2O|)}&n3l|}g8aAa7xT9;w#?pq$B6T4622zN5isB1cLE+^O~>p|Ue z6M4c6rs^-kqr6?O=@VxF+s6PNWp zNIJUIz(f=8KrT@fXL1*yndxd67a+uEjcTgN51@@ZbQ_0 z{lNmduccupJW3n1{N$NdGG!8!Nu%0>PND&td&qCfSrx$rinDbHdvngtm0`UTRfd)!zpn9dyxQU4O8G+I<*PlQGB1K z_b)V`)F7B=YEZMMssKC_s(|!1(63uhi)n!uLTgx=2J!%?LfXCZwP17L&IWJxkK1?aO3Z|qz%iY7) zDWyWRlFI9M@imsx4#TiXZZK@J8{rQ(ShYz3YHiY0!>CDmZL)ORz;X~|X=FghtuA-kAx8Xw$2C;)JH2Znz%G5n?y5z& zw|jtRr-t~Eyw{|)bSo*}*_SHMXoc^S@)_TVueS8De#DpDoMU}r_bD9FWT`+Kzgs8t z>!^MT0HY?Q^cihZN>9nxcSx7G2e8ac%V6&IhGsQ^+dahXHBFz46$`9WP0AvC7GzIC zei%*cyi9(`5b1TyICiU;bO^A+2{cR`fcR)wc1(PL3nZ-qebTDwSKWPTN!ldLS{pyY z01NmLM&NZ#-5U=1hO28(JRn%1vxAWyjtC-#UyR3=VuKzapwnX_`_EXnSmW70cVAo;yV^%kF|(}JAW9}w>$;!7s7o07wJ`*5>_oC)Gdj)Wf! zn*`QcCi4JI`p4kQa_1g7*-X1Xw52b-krfiztxiH1hD{8En(5?crY%MZ_%xEz-U*amAjt_`pojfT^%^!JHwX;%mznyNqPKtMj- z1L01RtxooOAf8Iz;;G~SJG}!-c3ps{G&fB=9>leBq;K}}`SzlBT4>4PjQ3MzOheRd`GG$__6-g; z{YcAr)yP?@n;yzHffp#IwGUw;u0d5f4jpO=4VBm?ej+l8zln(GbFifGZ~xdr>5hMy zmt!2FsDbd3`;bPO@=8OiMfs8E+sWu+z>$F-yp6L%nb#BPrnEd>rH2dk-G{I6{R_wj z9c%tH2B;$_#PkQYqq~kqS!3CaN8FsI00ShB4qnVudq(b=p%^Hs&=P(U}apfI@a==Q!u7>g1@*qGx;n8uoc*Vfa9%X7B>5lPXC3eE5A z*Hr#WN+%{omwN;&7Tgi5TDX&vh>#of6d#0hxHW5p7|CxFEB1zExxt|&u zU%kw;Cr5yWh4OwqtYQ5L-;j+sRKr_pEl{7dh{N4dxmHN!oD)4$*LmUc=2V5{PpZ}J z1|RdA&8d|w_i_BOmjrP-AVs;K--l?Yx*#5|C%8*FJ{B`MILYzIYvGQj7%yFY`R;i^ z(t%lrA1NNPniHD;T@l`=2M=U9Aj+D8rntLjh2&}AO`21H1H7ihF33B;a;sEAwK_+F zJZT?mM^_&2&wk7Zet)LCJdSDsa=F}i7~xbBJlTGelm8Vo`7R4U9zj`BRLBJ_ew6rv?(;HP%H~T%ia85f>*h-& zbj)%bgJ=;HozIn+s0(!XCcV`M?w|N@aoqV_z8L}pQ294_>yV%XeCoHd<1f5=^arO1#`A{)HlQg_|=bhvd7;@Ir;)j~a0=YACm z9;jI4^*cc(ROLe%mPkGz zykEvIVZG{_Vs>@#3~!77XGXuMOg+D#YEb6C=^`dCb$tPaC2Fd0!3ou)w**B_3MfYa zr5=Z*Ch7Yumg7sv7(K}`3(+^nH>Y{!SKr>2hoSPqa@Pdb)w7;d6Mk;V8>4l9KzoF| z-yVuYG&vH_IP|s&g?5P|DwNA73tCpIMp}NQ=@~Jt5Wc)#r>K6h=ePa3x@PZwN|`%j z)njL~2tmuFrnsm0Df_H{UspY6_v~Oxe|LVV@F6WY7P$BA0X|slz;~J82*a*)#4phrtntB3)!jtW+f;LE2z`c2~=O47_j+U!Zf9(uXOO-j{gK!j(6j6e63$GNHb#)wZ(6uQ>K zaDhUD`1?L9E41b8#Dup29B{dVYwO`8+VmIeA350gaP;*`OfW4P_{=Wj4@OpB$Nw3PHf`@Roh;CFmtL`U7ZV|bw zOxly~(!U>D^MV}RckLY`0<(sOpJ}neBN3_TaUpeHy}J*yLQFr><(B$qs%B4Ar$82#4Sk3ms`VOR7w z>4%(a3w`(Unh1_t{MOfX69yU1RcPB(;K7g@5vpJ2iZ%N9-F1;`OjE@~p1wq1D95V` zS(E!L%&3gql*}pOT3Av&WW^A~>#eU-+B2v;(}>_GAB%Qfw4&A^J3HVtb>oV)?h4dqxr*=tW%M%rR{3dq;kgTK6l@mQf&QPRt zi=QRI8kNNU6$ZeM3=z{6N%Nm?FbwJ_I0@A{Z=h||8Tg==T1x`-kYI00c>yx54E3V_ zx9`U>RWnhy8DWE2l&|S2s+@GJd;31sfWY=jj}2j$Bh(j)ODd3=UXr8@0Y0p@%sHRn zV_Xmd<$IO-yoi!@B)!Tp%?8j%xLMiOGB*TFl7HcYMYM!w_vN=%H-UPbvo@F`SpVR$ zKg{wWKwKL3Ry^H}GkqaLV*Qq9iS1kXQ@S;fR;9*mF`ESG18Z54uKLMr9T=q2^u-XF zgl5yd6VV?z{*AVEY5h{)LM48e4^3I%j|gX}5M}WhNNUhL>Uvk{T%{gV$IvytW?BMV zsCbieJ|pp0x2B-J_uj6_oqUq!>ED7lvF3yLTg6f2+mNa8FGq4yba+)LRRFS${mZ^8 zAv{%UKbc>O_N(4-FGO2uc?{o4Um=)FE{1#~b)KY|ICy^MTW1uW2MuG*PLpU%>Gxe3 zo@_jgI#M`=dO_e$%Tbqa_uQnznti4t$Y|PQl62>XKQCvnE%S!&T)K~r$5q(^*`u5X z#2rkumGWCrR`me1qWPSTr~1P3G|w!H(6GrBnmL+q{%(oE1?*gFwmfH|yR0;e_-Wh4 zrsHxF^}Nf{z#4SOfmR%9sM5-J!NbW!G}}!EYw&e63#X>3hlq)HCE{vO2%I=?uHn7l z`x}*==TU0i;}+24metzx{4sOiI*#y_o5hQv{W6$oD%Yuk7*mg8*L;fG8)fcxZPr8Z z&TuFI*)X(|Ys$EY!HF^d;{jypd;z}D_DC=Xk6$z{}RJtXN zGE{mjHc0#>34)BoY5Y6zJ?EGsEWls-eLs0HP!)LMJ4>hCGuG!8KV{#@ z>}S|haDt19qm@vw)IC@yH}2v(=@_flOJo~1t?!bLcC_aVmcjyKjyKxDk0hYdD{&;*J#&wJ8q zO?#oXx$cynX7L;HPuEPKY|r^y>$HXP9PZ6u5~T~$u9=jU42eCG8^*6OBKR}o z(avAtcf4SL?|=3(fTeSD&>1g7_|Li%g-A`z+f?U}@eOwt(o0vR#Y_V0CAr0(I|y*UIaFk;~uf0}$@3_;JJf&U6${QGJCN<2Hp4Gv95!Bax3^{K=e zh49we)omxK(y{lY`R3X!+v+X75D!^exMkN{aX48`;Ui<3st7(yQuaJ~0v=qhYb2@C zpo%~;pLsUV1X)c+w(&t~6g#7s66}0eK9X075j`FbQ( z8l}l(L!~3kf$sWb5DyA-t#_7LC~$p-@#*cfASubT|Mzk0JKNu+(>Af8`;vPqQU__F z!llCsk1lo}l3cyK`2BIUQ_+LIsCb3`N#}cAR@>E+ie zAU{NXt7s9Y+C@B!lAe+!=q?*m>_a@y>th$U@I9w(w^{Ib^|KW`ZE%h}?4OLXw9qg%SS>pO;2+{5m-F&P z3WL?_vdoOvxWLq86}{o}M+aZzxU*3(4-RN;o5OAnI^nt;3N*R)bE+-K^Sc@B+AM$j2iY2?Nub={V-x;*mgD+?pJ;1%F1 ztMM>ewFa{|xuidj#A|vwdRQU+LBJbuiSvt*_8IU7>4G6K7T`%vhslK5g5PbE;#pnq zcO`)NyX+Xd z*6p;|Kc=(@sY>g(gp_O!rYGpI9tG=%X&q!&slK%ZMG)kfk_K=!A~@!rZCn>TG-o|-KYg}~{A?HTq4Z8F=Y}pvv%u}j z@?S0~o*#fjc&=uU)_qPjXE*m@(6sckT50B;cLfceM1bW-$;X=X0b)ywe8n`>TJir7 zwfJ4n@gFiVORzQHzcD22$yNFUevloDhd8myEpN_M_aL z$D3bJ@epd7B8?IMtxQ_Ps!kZ3;F48OSE;VASr6dA_fx!gfaYr1+SO{)ZX!#nCpa2W zJ|(>exq{q}mgHI9!~L@mgr}$B1a*c7HnvPPUMwT-D$@b zlKjEA#P!}He;fx=!DE8~)^@{@8?fy90H&cKxZn{h9G`{9w_HzjXpo>}SuLP?^R06R zba9^vj5kEW4-*1L;v|NB)~7NqER|pgu)>5YbJ}16?gb_?>9vz#@*V^k&`glviU64`+p`(mvv~gpjtLIJUp_;i~ zR0ksP$cC3G*5R)hiVkDQw>2^d#bcPoPLKlrQ~qRBSIy)goY%uMGtQ&KDCd|(G!h+W z>85%rRZ7!uxeHDLELTe_q7_$lFt1mODUanIC@=fr$sbCwulUW=;-x#_jX^&8v{;zT zdDQ8YQykWWLag6UPEHWwq|C}M#kSrVBZeqB!n_IhzaLw=vUZd6>611MW%rq=>ZFSf zbGTdN{7QeE5KFGs|2fw_%U(iccjH@n-nS8(u|>p=8rkY}tFx*=9^?BE+n*=rWw&~t zSN1?e9vH!&c*jK_N@CJE*o2t#H5FU57OqFBs|D~Jh}7iZiLPC=-4T3KJ5TW)nR>*9 z|FmVLhMeOEIx!7_E5uxy0$LB~$Bp(I?-h3->1nFU0CL2V03XDQ8FK(w!C>cfOFSWz)^tgIXg4EO>r~d$i2N$2WjjQz z1RUDG2J+4Ct4wkdKT@U;mkf-f3|{Y)MQMwyr86_ad^1+4@2u$;a{Co8fTJNuV7!sfEXt(%+nSRH^{ah=Xw0X#`>d0WeMjiw?Z+Pfs6I$IJ z!92aI2xSA0iiiWJ#6%>LK ztjAAuTGGHlsD~5##(SaK`m@jV<~9?MD}{NY1uaaJG;@_obaRr5G;=59F{pd&F=|(P zFGC%!qd{oS|BgXv%b=2V#1i*W#&`r z9$}JCt+6jv^PWVRFR>?cZr|bdV*X5-pAWq4$j>L@a0hQ`0>7z{R!;e-yl+ZLF6-k= zVW63O*2e%tV!2iVw$1F-U5Cr;IB@)_q8)hdAIctl`M8I*>(OV~u`b$Ax|MIaHI^nmM1N!g{|Fq@_Fzbt>~0k4Nesmlf~yV*!VK8Ql%&HI^P-=U0>4G&kODbb_~6Jc$JDz0 zr#T0ENED>q69OHo*W-j=g|skUlx&wg5eb>x<2nLU)W1-BUjXi#Aa?HwBtI9VdPI{* z`_JL!R|X2&mfeg5J$CqpKo|s1;_T3zSyNoDiQg=K7wp2QUR`|6xC2_h90GvUa~`sHu5cAekZY zv|RI7%3T+A=sA9x3RxPRx$bM}Y{@ic1&$nG0bjNp5eC1sATJVF0Q^U{JdculUrpAN zGU%@vG5AcRj_u_-UXQ$DbQ$uli{vw<9I`VzQonn2388;vhdKJbYu%-Tpkq+5q%yD?q#9ZlGlw}e~Mul$W; zK6DLp8co^dN ziI44&a=aerI7`c?F)`7{FrT_uZjx=#^>u1`_qEcC*)vJ6glrE>Qaw1a9ASx(R%Gcm z(4+plx9;5+tm5eBd{oNYfdxY;`7cE}jN3ZbkGWjZfX6E5hO|JhGxm2}QY#!?0D+v* z3Ohq|gvVWk@Shs(TY`b6D#c^sb7GRmFc*%5_<9F$D?};(*;xMZBhu-i@Gj6!5OLUA z2{0rpYE0^G7`KwQ^Y2cVu;@V`_DBb(`y3t;7G$C&YCei@hB%hgsZn1*mM?Ej% zb#vzHUa1bS<@am&J|%4WEZRXXG+ti9UJ{mRj0&CegAY z=5|R#ehvsWF}L(H1$HC!=dSwUQqjQ`Bc}_ju+?ndw*@7cNO%=VD|R?6w6>h+*#<|&NlF_CfqAiXBK;=mI38um%lURhaalR z_QCUEP%GC)r;;mV#{3}=S#iFQj)aA?1yQ1}mc&l;G*&Y-OD!inFNJ2>Gp_pm*+GYx zCY9ZgTeGp?>aRsQ6=~SJykwYF_|St@D~8k22dl8P>iplZt48hR9WfpBMhDs+b!M3c z{5^p}LGoT*-z2f4_>2%qnEL&Es4#sBcgr{gEE^3Cw9DBKv0ld3O3dgJ?@6MNCSab#yeU5_OoooZKabAPi z>r+&I`0Y6MCJBmN*9pJd&j`QvLY=N;iF{bhI!r04x&A%sK~Q_HMTXVdHT8j#dywY$j}`U9h+jA6^zx=CI^qAi zFfyjk`CH3mKM_Yq*TBFZ)`D3X=rUH4T>c51QyG5%tQ=CS@JvC3G_Y29D(EN5tm>%! z6&<8p+nO7R1X1y~mj(&`t#IcJG5tDcN%u>D9opsj;)=yP$12TgO}gXhAPb$l(V^$6 zY)JWuIfI*5XXOJP_SyAsA6;XQJT;ZJT3(+JL}6w!(IhM5l9DU}Vwc#PL14wi?I{#9 z7>>qSF#oPM{5A=D4Xq$YZRcZ8jhf#npx-KEj+BX!C@XXtP@cQxx4>maz;u7-wT9^n z8r|N#w1+QwxPZp&txfj)XyGx^g)sre}Ab^Cym_zRZ66V7sNmj>)PXJXZZ z>!6qFVf0q5nk9}#A<(I zti9cPi_3ILOM(xuXQJC^{Iu-Eqz0-PrSospZv z=FBmiSdg7NK&tr5q{{s0Py6h|@6<5R*O*w9dGbzUn|FQwG@Auno|Ye);mk}YxrCMh zkl~QPrsjd-|J75_ptb4TYF+^R!vRcRt@e+t|rC*B1s%{<>e`7kJO7mYI7PR~{ zR;(xM@u9wi3D?^9z-q^+yO3ggZc+)vtI6jl!_*;0j(nm;K+s7--#GczF5_@&vhRyC zLooz%jO>@(zHhRzlPdpV+p~=A(-Faxy_@+T)IDIV3NGVl!v9{pBi|yQrf(SQGkk2MuH64>JZOs@UoLG&xG zgOZ9A*_i)qGu=xcQUGvq`ozMS)Xm*v2sbxkd=lnO4t<`^7cA=uL+uE`cAH}O3 z02aL(d5g{< zz<^cvBfvoW?kcFAa=Vi3pxx&oCq$d*1DY>OyYz$E7|-GYI$10HR^_w}h*oN|O=^Zv z9vOU;)coKi%QHonH0QMd)%u!+?<*_fggG zwvoNP!qR4yeXpc;*ZRY;Be}#j>7HKs&uY0VO$h%mq?DP$Z<|qof1YPqRz_0Ttih+Y zc5Yb{j~TUSVv1RW=lkkIZTRZb_Zh1#IcBmm#0tbh;kR=@^!ZZ$T{fHP-WSbq%xOmc z-TpZCur$#8r!srv7IN>~YU4b67CJhsoHFf*Qm7|-v6hnm>5L3wDcuwlsV)k-OI5#72*DVfD?noKG4H~Q&l zbWkMaqY28iYRX3mlv;brsi@>Eb{A=d>D!PpYScgYpJ=}rcCmwKmMvwWuITv7@2iK( zLX*)~C7bTf-!~JWg5}xd)bh%xs)q#{dTnI+NQn>wB`#9~pJI~d3t97;bw&J@!6^k%vn0*=k=Cp#$yUp>w5p_kLCWY&}+v??w2 z*+XDjhR!#_-k6^7(Z5QJioQ+JW%rhYC}@OA$O6u9!+U0R)zxc-*Vfymc zNkS!K|Mfm|Tx6aPzupTY$CMg5P-QGxFJCUv7J-I&{jVeOFeA&pAFb!SrWd58?;ahD zuh)+|o++6Kt0-XZEHGo)&GNF~xIMDscSBu56%`&o($J))GFv<%VR}L@w)>xMwyK6( zUN6LjH9hW!NCbpFPp5=ishfp;Z7fQ+vjLthCWHu9;>lU4x+7WNUE+%NzV>Jjb4_SJ^*jd{LawTqY;Q>e*}D zCsR9?*WC7>oLp_|?eyNb0*k-UOVzuRR*QN+sYLYz9i!$I-8Q}!45ECPIpR|px)pgd(Akd(7@^h6huZhqfXAr}@IN1}cJ+7BY zI<%>4!Fki6tIqF)K$jLrXQscG@4Nw+s)Q4MRMzZyX%uXwN?}|q%q{nj`ii|(R&+4n zlS1v*ze4_}>#O0T&V{pLN;OXhZ=42#9CYOZwb}XK=-ygv^_vqESdqHS0IXBldyv9-c)Fde@BCg>}M(uC`e}ZFp&N9-BR| zM>@jK85^GiD#m!2u~yt+4H_%zW!@9fq591gzjhxppbr*(_SY0&#FpupJi6ajcnBBFjM1%v`yMt$~chvUc?uA@4_oS zZJS|VSL~aY2Gmp>yT5X(jysqLEufs!aJi!C?LEo!fA7Pl^?nhCMxPXp(Tyl$N^aCyb4ngA+b zx24KvDWSsVGmJSFhB14(Yewc5oh5AOxpm~1SD9Q@#toGo7Odqv~*O3kXDiELC+AV_!GeVkB-y;w zpDFeefphlJT;nx!nS9&3ACbf2i~lAO@nAW+z}0scmTc))R`;cidW!GSf3hk#w1$X= z{>U8^fCb6uZ3n?Y8q0Y`%3;1imhvX8kCZBTMz>*Y=T6N_W{nn?wY=Nk)J(?-DsN2Y zS`^)uUM+VwIu%{Y%0P-GOKE#r&428Zy6vNWyf->?8{!ELP;{dVB!LMDos9W~Q-Tj% z$$Q#IkC42xZNDfIGZn^#UcCF!Y1YmhU;wxIT>n;DI)24?kfbyEtb#0L@?!bkFrEyR z@Ej*=iTa*MMaIf2af^O+o z?Y;Xq?6X$hInepPf#GTcZ%rbUgA^N5|usQ?ABMKgSOnwT_mx z(06+ip`&uW(4cEDcJsv7%I$6go{xo3fLojV*#Gs0qsFCzKd5Xc1yas8V}ouN+5?^F zf`Y5ysHLg#)%Bl0E>upL$_Al!!;C!OfLoipn*?r=%^3C_&IBKvy~J_o$o7e)N73+C zLFlCsE9EO2<`ryUvtALB{x1~jx$P_0n`;!ia&yXCI|voRTsOZ7L@zakpi!xofkV@} zVQ2eS*B6X#t54D$?%>%djCCyapM8hVoYfFq_ue7HEN27lD4_fx3aF+xddyv&O?I1N zq_Kj%vA_P4eR{Mr!p)xTe4QWYHchg@s(Tf#Aavy!T=iG&!xQx|z?UOzNY%dDs+YeS zRCHs-{$tqLNmBa-zu)zjBp7x#X%x6#jBB!fzCP;RR>*dJH(nYFJQc22f;vnlwMQQ$ zhB0%A1hf{y7$HxHG1t$V+qpd*Q;dKs|7#1~a!?AoUITaYXRPQ|-07D&c{0?n!>~7Q z4b}cBOf}ERwJ9h{^8xnbrIwZMa|vCN6QIaxz6YC+}e4C ziJi=yT;3}{h@$ZQv)#!kV|0!3xOV73IRh*DGiX{D6AI8jd}BZXVw<|wFY}?Qr3*nR z$+(467uCm^30utm85O@kb4}2qKB;72(9?5MwcfECXKjMn$~{PzFeFQBP^Cc1oo%zW zn8Q|ccKLwE4zw}4u9&TS_d#O0XRG?1WZYNeQ4V3ObRf8Sv?5!r_6(n4lToy6sUYjnamza)#dL- zF;-Zmy4C3{;q{2AoP5&tmVcve!DvNQmk8jl<%ks3JrFtkOE7WJC^rNKvNwN~9$)yt zwl0+>d8?yy?o28S(V$ug?Kmm#YD+Dvo-tPu8|S?!di46-8VKc2p_+pge)(`V_FYHd zEzf%O$xRRVrKrG$!Gp#p>mzN#%4g>L&@@$8#ne~(Kcz4Jn%t#lLtCpnM!wD(#jMsR zY~6jEOx}sR9}XOnD$RbpyVGTP@FtI=PBI_N#PjAZe{xKy&5iN?4>NW9-%YcVQ^h{W z4u3`c@pHhX)y8W(ygs|vv~+LVChGsGC`I?-Eopjqjf}nbe;ieZjP-t;(C4oPB70`i zM3{PTcxl^QO=Zf`oJG=PcpYc5h^M8u5(({^)TfIoD z`QqT{vz)LlG``>##vI71ag<`3FQs^KB*%|TOD z-J3ir8jBO#k|ZyEW;O*%g@)+7S6AewJQ{4>wa)oiDfJKbYpf zIaH>Y)nkN>bwgPG+{C?EFeva+H*|U;H0M*aycv zPf_bce7>KrO)yp@Fe^Rxri|Sxl_2Ylgx3rkxwyHOEFSzqeGG|)+vf|{gE1rc-SIx9Yf68UU|o#q_o+M=1R^2%v4#jn%vKxPZ`UWjXqi9HA?Ch2zOw48kOqaCqqY7cTb>c znN`7Q;|o!0oVw^yya!RwI^MY2ZGQ;4tN}FpZTjpqS1(SQD9c%bAr>01s*sDn5-BLkxH}Xn?!}=v58vPY+;is4 zIhkZO*~uT7-Ph-JUHjgUMk9Rs?*R+5&^4Y!)e%?v55zIWI)2%#zPFhrRa;;4+16^3 zJwXZv<@Wl?FQ6EPQZl}hRqZFkRD}v+Kr2iq_r~)34b%Hg&x^wQ%g3AL_b2`LfA4?w z{d{%*^mIQwANIVY>vLV+(Fa`gAZ?WuzWC6OSv~yg$bWhM2k7iB-Y-79Q=|3weN|J` z1Alt^^M3dKBKWqytY532ce*TC+XIsI_n&}zzw3GB`iD5;|M~>?jjXOk+(05SftAfj z@*Nx*-gEl(o%iIT$B*nN@1MRuVDS4=)FJ{l5JMSRl-&{G9h?m6D(KK^WRzI75#tVA$^i7j2#2?YBCk!;A5{?SgAfdLB za_>^yUOKIvuARQnfA{grW-<;dz#GwGLRX3^qqI_Uu;l2|_UhAZkOR^=Sl`_}pDrK9 zcDylIRS*O)-YWkH*2GbP10w(j5VtEcVd=KMh(v4u?D2bl@(F(QmSX8gYnX|#QzBnr z;f%O|o6QOPgk>Km6s}#5CqVHCvHyO=D2g<3h}XKvR1W8}2)0s#Ss15o1yX@9Z8wGe zW{&SpUk{fB^=o^~N+g-y8UgR*O4hKCa7HX5j~sp3>UHT3^U{RtRuu=93;GvgjB`jP z1-Pqf6eA$?DlL~<#B;02=#UOA3x}#ZJY6-wyJmZ(a@AR-bPd3;LXASQrm`w3R_f=3 zaHw{z{q55hL{QBtkYPPkk4o4pkaqo!e_%s*hkW}S#Gas)wp`mI*aN9@EkyQvH6=-f z&fP9O1N=iQ4*)hGX(-pXDcqID8q8ThyHlB8FaPn+x{j2g(Qnle?{ex(3}t0n*Y8Jc z*kbcuR}1Xf=!;&kKNN5-_zncQgkiqeZiVsyQ4^UiFTmlAl!%6KQ`PMuqrF<*`$vc` zT~P0dGohWz;&ph{W@w)(NA$HN&X3-`xihG>==~S3id3R}-1_z_*uyWLRI*%r(|MdR z3Z>Jlcr~t2r5t>hrJQ}eePyNfTuc9Zx(q63F4H!ou&4LEPgERkmE_?+xH488I+U!8 zy(}(AyAyCf&LNXj`)NDWd)kHeH24ZE5hRNP^knypYc~*yEER{CueGv`aC=_ zUPIehH|Xe)D|kEPT_R8T(2LjO!qF5QX0b8*c75%6%Sg&ZVW!in%N$u_3Czd3NY~1` zkx%Phm$03b&4_L~_eOo)~{MZ1A$j z)kQ`*f}{$lh&di*AQdYkT)pO;EjdiRT8h{PCE^9UGT$J3((Qn14uwI}VP9j+*vdU; zOV38D`K4fIcf8h&8stupJX3J(d}{Atr-=cMUalXC4V_AFG)~Y_bmVC7D>K=IY!F_R zXJ7Gq4h-*giPnUICQ){Embz0_DfF424udH*ZR+-Vd6>OTvz6AMvO%gGaf9lj zi9xE#lsioApvji&Um6D`V|YF5iQYMHoKf-5?l_mOQnVnkeMFrSiaMnABt4>QTPjbe zX&dglN}tVpb0pUvuD0$idopXejF<0%=DS={T4&YB4DS2b%$He`@Otj*@On4ny{88f zTUO?#4i!nu*zkH>I{&?(FB&k`lkkx|^+z?6$zl4X&v%epq}$b@*e;d`(iwiYi084X zKea=zY^#qo5$m=#rM2~Q*_=dKk~niNrjd#n-wvdTnOSEb&TMWg??o1-&LI=yDJ-mF>btEa8jD6a>9m&3yx7l|y)kZG=D z&2RlQC|Hi-bS!NEWvfMKwv)R;+(A!tnY!13R=;Ngln?3&9-0WSPX0yxV; z_&VC$k;-ErbTVh;3S6l|va{^4>|0d`2WJYONmC--CHZs+(r${{@RtqQw~EI80| zl&aMXQmT|tg_L68IkX*Y5nu<0_g&nh6P3Fc~!B8kxWKX0%z; zOLP(oVsbM~jr;wm>hJ>*N4a^9Vbt;tjwgTFe&4?mUui7e`5FMhdgH~+jWf}u&Z*psn1}n z8QfaVUubwPI=u(?kzQn@o;BH2QI z0(-6<8O^7Ag{N|)Wpn=MTVE2}9YQDn5o4l;TQTbD_g^bYgN6h#^{V@jY&wZNX^09N z_Kc=;HSV1Sa#=DyOyua=AyWUw;RwSuuq6X#{uah{kZXb?s(F#Avlh@Urs1V>SAXMJ zPt|{@yJq?YpfsOqGu&zph}BU!*)ecj&NM;Gy@R6piK7k0q%3P>Yo<5aMuuK|zi!Z* zMWjj~XE_^cbgjq1lD=DmOx;SX)60mWexC*h*P2!-Rj7DvGzRKBn+E8zOD#B*Y*u!F z0#h7>X&&}i`SU@&(4JGWs93EQu;f1}j#6Kw;r=*@?~M~ABM#mrN1;Lpp>!lOd21zx z9G>90*|FG?V~>7mp=JMp(-63|wQi8Waz>#Mr{X6}bI8$)q%u^$%#Mb_N&iV*9krgC zDeF65CIkBBLFcl-t~jt!n(h1Vn=Ey$b!QV(pZYwVq&&o&22LYWJ78Hw@vy;$8%0Mh zbgn*wM>D7UuWJ@V$}>Fle5v#UtlwxPTpQ`X8amr5*s|$J^Wgv-{(4SE8Yk8wgWZlJ z4Hmt)77^{8!H1ek7t8UW&hy1)4|xTqVT}un$2>Wp;*;A7@_)D5I!n$T z%~Apy<6jha1=<4A*~4$O?sO;IEw8P zqxE}flvf}YHpB2Ce|HeLHsrC|TE2L`+Bjt5Gb=l)vy4~@g%g)4 zB>C)9)wfz?0PoXnC;w-R2Hj4h|EmUm_7Ypa=cA?0fXgve6_RUhPg=#W-CyY3A700k z*_cy?s))mzm{X~ATgl*BL1I-k1Nq@k*#6107u`NLbr9W+5AV(-^!MOt5_~KV&W7|gFq!f7mrN2cz;-uKSvLGxk9{X zd@Fl=kn#iMVcfgh3I%M-ZFfX9=?V2Dh5)653nIc>n zZd@pRVsSnoGp?Ee1AXrtu|q*y{?8FZh14HbZ*V#oHKL%sAD+0!C}VoqQkCr7I=vf& zxucVZgG(}+A!v2%%L!iJF5wvR@C+V1KaC&4Y4}O8hQml(q`t<~Rs}t-iXQCzP6EE1 zsu*kQrZ`k|3nT~+0A%@W-?Hd+Un`8JjOxP1J7_(@;OOS{>=aTz%1V)=PmnS+LI?vO z^2?k>v$KTVs#-NULkE59x<<9@-VlzB-7oWj!hB<>G(4otEN3|Vm67O3Kkn)~r9eh-P`**kj z>;j=K+~$0U*$z-z=S%h@qTJxI#A{IK_Uv5)Y49q-9e%~&~%_K4ecR`(3t zs!yybKkynP2?c4>_aA2yQ#lN>qgzZ-_dkfx$Zi>!~F`WJ9UJr%gRYc(aDnh zpEW0(hFdAlz{oKG60qbz7;_^v+wqp>k5`{dbXqyosTYvS0$eewziv?!J=wm+)PN<> zG`++b8_URAr>K_~{}Kg&XfPnbH>X3NC2EwHxJymCAYO2^VUuo&ML`zql(J^ETgq{P ztqfWRc0VnkI>g{KaB&PQ<0gb}ilrjnthzdttHl_g0EtMC2Dze7Mtyq8kgc5t2oLAp z`Ari&fRB6B$kxeP=nwj%)b)*4(6{wi;Q9tFjeJ}p5mMcHc}jM9$^XgFf!G!s(T!0dDQZMIwF&AfPh~L#G zsjXE?e&MR^vv1N~{3SIHM=Z8vY5Xcs2c@OG?ojN*Ciw~!rP~b=URU|D;x+Kcv8h2i zUU++aGd0`SGGc;_q*?Rv&e}5`6>TBH)kt;Rcm{Oc@^efook6_+2ATdY=74C*0WI8kI<2-Q>*lr|aeC4m`&fC~_p~mbkb3fUk0pG7iH+3SPLDE3 zk*X(puKy({RrDi4Ak&YP*Wvb@{^*Wl-Bw@irgv}$T^&Q$3mLbm2qjlWD@*?##OeH9 zoxsPrEkhQvkqE>*rQH9oe?qU_jF?W5>Z+M~#|ojVIl&`M51*D1@=n5j0<6C6oU=-! zq>D9_v7wEs1(+&9rHKJo*cGf(3Ot)}=^C+GICL;{#UOjlBW5MizSe;JS<=LjB^{EGMx~26;VIpzAFx>s{j24Fw}MLw_XlyRgP>ww+w^H+q+6X> zX3>(#Z=kB>;j!}ppx`Aqiu}m`Q$V%j-kLE z_j-Cl)8nLz<5oIspgs@y3iq|+IH}&!NOm1Oic*7m^xf2esP$XWNLwWB^`IXJW9c&U zbtXsda^d*y3!4?F^I{pAIHSV5Mk|PZSg)5*1>u7@5p5AAYf!&qjxg))N5j0BOvwUbZ$hs z>(h92s;no5$MK-3AhEg#qeR*5wUs7sKtmI=1sN&13b%Iq*_?2FGDk9q*U3}q*F16M zn{t4sT;$)YTdxdhnT7EeG}*mzVP*RB(f8D4)%mtC+^|&E6N<>mOK?G3PRAF5W(Bo; zPdpwE>~QxM+VU;sIunQ@!_{He@bXi^YPwz)OlQKW={TnRku>)#?RG0k>)TF6;^t^o zFE;#E2dLc`bH-VTu<*5?01m1aK2ZmU$18oWwJNAb=cGUP=PBDWgh$rSS;slX^GbTZ zUxci3s}9}A%ovrncMg_Dc5u+%Yhi+G?2>LaNiQ$ok;?fh%NS7fFjskW$eh_zcs-yG zhvtm0GIR#ztO3QP?KvYrLxMB#PY$<^Ptk!zCOUGAq4H?|0hW|g?4$1S$1dlNqi9-J zBYB-}(s6m)jwW=0D|5gaH{n1v2RfC${Y@kBovQty>E9YbH9*!IFDUg59D`-k1KU-c zitu?E0}K-rO=k0{11FZzj}FtOjEYZlM6w}ejZ1Pz>kBl<|%C$o>F)wnH(Vpr?m^Z%8qG{Qz3T0dNB0UU5L{ui}}A4Re8 z>)A*DwHXwHx)(ASx5gF1PJgzZFdnPXT$e}$Y+Xm_1n9vH#Riz)+$n`YGcZBxxy-6E zJWPn!0O#Gq7Zs=1i7jZg#m!qAu-9!4r8mV699o#IzsVT7wHk%jBi)d+b(Rk84O~x3JTTuv`2Bo4LAzJ`{6Q^asH;`su8Jyl}E&kCV z37p<2-7RLEvkbQ#!*(migKedCMeVw(fim9ZkG2gK#3P0W%Alq^o>QdB0B|sZzZj?s z$;r2-B&1^@w5uC4c?E59m!ht;t(w8?8uos-#LY(KmQkSY2;IP8-aXNFp})xe<_Y9}QzsQTgNjZGP> z4|MU$L~L}HY&KEt$Ofk6!*-*fL9EGioj-}==q81g`b=Nj ziR+b_dKBNvObuTkl_x4)?b&&05XTE8?ZC< zvLZMzms^957#l>!ix*){rMltUG20T{4>b2SBBZ%>$_upz*xDZXYIwA^#}09H1oYEE z(h$Ihqc40Ut5omP?uOpf02EadJz!{gu%EDB^gz*O6z6T{R+t0aU-H!cKSf`M)r%7A zW(={?V%Wa6`-ayM4VwRd&FU8a|69&uCSq}P>=>4eopu47To4(GNis#I&D8(wJPJ<# zD7E0RZkA@cdI3qy8{XD-0 zmF`ztkWAtT<$|=()N+8HPxf)z@tzN__!d>Zk7aSlO>7Kd91&2!XH?`;lYz8~wyzkp z;C|pXOldH$Ll|Z6UKlLbXB4;dj78OU3mMsm0M3>1{Ey3MlQ>13_YKuCjP=UfE)_ox zAq#YOolq(?g9y~LHc7Xv3hUtwE{9K1jGy#K>cm}P-noMZr+UxE$80Y71@57x;<;+a z5Vgqj&jKS{vGGS&?ed?d5vs-rh_HqZ@F_YbmJFsC;^N$zDF>lt7k(^B*8D-cQREzQ zH8Yy?kxBj2$Dn;MRN4R86r|qL!K&syVud+|> zSM`##i4|s?Fks{8)N70`$H8UfA|-RQEkFfKyBf;J*o0vrQJYz4iHBg; zY_YoNGG`P3S3b(hiX2V@p6rIx;)96)%Sj9$y}tb$R}Q29NO%MNzw17#QDW5c0x?w0qVlb3GFg*ZFyKERdi@8)8n;v+ zmbVmRZWyA@fgJ@BA%9ojAy>7%2jhND3LSJrRQ%NVp&z^`r079w_b4C>zxhM?{2 zQm~M?a1GiVbqO^q@eDlc6D;*$^}IfG>7$>PJ;~Xe=br&sJEgkDo{a#Z) zBTTE3uZK4RwRiJ6Oafr?OY+o<)CGqe?YZ3{%#Tdfd*pw*F@+DjnD`qf^_^?sL$FAE zehGhwIfmcX&uJpOW8H)sf^fnQ+rDLcF7Wh`Tr?RQGdgKNS92J&;6Gvh{GnGtSfxG( zjl?C2&Yolo#EN~onI(D;zfC6fuQZn7eR4Fm$mc?33*YA?Ozln%B;hK8#+N)C+Y?n- z;8s3}x80F7u)^!~Rou#1=^A$K+roHM65>uyBiUSd@C;m?|NkvHKcZYx~E|-fxmN z)}I+g|4Wi$mcrS`*g%~UQ0KzXd(svv8;#}=8xcRmkVo;qZu&5+{}UxuGqcR4c|hHN z;B$e?78>b9A z5J1c{kXfL%_W{mfri3>?EEm&J3h==^)2i20m1` z^LWK#3;jVBu1srZ_S7IDX&VW>^J_i9gbFv&9f&cd z=*r_*7Sa-omKK$U2d)FaJCx53=?Vi|Qy5lg#jqahn!cvt?H*75e@d$OSU1_f)#Qyp zVeb*H;hAlj^vfc^v~L`L6JrI1RTa(l%OL#O?wUXnWsz*O+fW{ha?q~i^Z+7U4~q25 zcbrP19_1wV!x1ZBg}7tUBO8dsX+}DT$A`$Ysf~29U__K zxk8x*v6V^|hKg|8zBNl@Fb z7TNHAdvd0f)O+w(@-04-O3_|S3cc=D4AwHhT#(Gon=+y?@14+{^c{908}+jE6PT%z zW2Hu$VfWWpExF-`+wpFoG=p3h4po?>7EeQtm$S)VElTe|zaceCZZpbl;`Ek%va87Ld$5ZIvXn_DG|&^r2u7{Ty1Pv@LPKgL z+6hI}*J5Fp zb2+}pps{TQRMYF*9lY9*g1>UKdz+JZc+>2h(YzmV%4GuIB1rVPpJK9S^f5~EntbAS z-BHI?un}LfG2POTk`iB~!J)?atIWIQyJ$=`+V%M|5JBRB=yTqj_QKBRlYMqf<$$m#0On z+&p3w%m?~W_=3C?7sR{^?(c%|ntk=Z`@pvtHQlhr^-bX6=VavG9YA2xlddDFlExNX zicM8m6Hco}GsZ;f#Y$NwRW;vCb=}%$G1#e$&&Xt55YHaEZ(Rzit z&u;hK-@0d1D-M&9BRTd#y3#+jwfL8U3$Wz0+Re`q1ySM$`MTdn!wr1#Hw1Q6O$Rg) zi-dfErPGYCVJWM$v}uDZy}fC#IE@eWCVW#!RVA_hA0j zK<4BDSn?%5b{PxlBKP3L?6%Am=-gV!6!DD3vyx`|m%Ap^C9jLvoW~e~o$06AZ!Yv? z?HMbSSbssQP8bvAAoL0cuNAjrszao(X>e<}dQAq%&}n~ik?+0mqwyXl`2VAni(%l2 zDEL%Rm!_Is`Bl(E#4`opbCsU@c$8Wq6EB;^ShxDH@G2xwlA{Yl(-igmXS%e4T%3qH zac9eu=N^&}t3az|A0N)gQ%}$yv)Y0!8bGR6fTGF&6Se0lO*MzNUzPLVwZd|O5_iCP ziax;of*u9)$=var(ZP(3@2A|FtfSj_niSB4%OY7ZR-EPAjS@a-l6LCD_d;gD`Br~4 z{<&)+C5fb>;&X%0=LOmgmd`vjuf(*~pQff#W!^rIw9g#RwObyysYAz44iHWBecXz& zV_RSMRv&ut&N0{emk&$N!;iC`8&!xSb)hVHl>QkMb*sTW`J<0AbMkL-elE9!!p0a& zvO8bc;F05q-~6tIN$GH6|Lw!5i`&dVmbeZRmtycGUpbVRZk`;9BX^~vJtJD?)7~6Ra(+0Smt*&nYIL~)OqS3H*UyVhv;FAfNHshj1G!B;$?uFz=?jp^N`TneZMUdg8+bKIN zjOpP*n93clKXh;UVY>(~wD+|72WVBo1!WEUTCsLT!nmxRgab_k`qG!_4dm@C#w;bA zBLY` zH?J{M6m#)n?Zbx&l;*AJ`_W>yM*dtrq3)C7e5K4c=7u`2AkWC$i);Ny18A5;17p#h|ruG>(EOSKFVp zJ!nDMzkkQP&!OCQa@MMnkJoC@F!aBUDp|(t{53=ybePVSLn@~(k|5`K3Y28=ZP4X- z5;gXGklo7_a8;J^!vA48Md%71ILIJY*I&!XD%1A=W@&7CwPp4={d>g_72|Dn+FX3& zx~#54fHU=sZ5F#<;?Qk{aAs5_>t|=qzy66?G(cuq^Y4{L%SpIYnXK)+&r){nHcwJu zMzK)gztN|YO~$1%bGg$NU7wRScV&_cx!ZHB`dxUydB@k^$#w5gxvvjYWUt?7?6fFu{@PxmJGWa(1q3SdJ>I-dO9v_i?+97X zyfVK0yKta%aP%@SbHijaToGt{0PD;-3~!zMTf+>}cDpyg64$?YJ`xG6+Rj0aFAGzG z=CnmW`?-fE_3%T~#|;7X{wdS9Q_bf}su^XcR$u3ci$I4U*6gKA=%{$;v(K=M{Wl!V zJ}2>aZd=pfWz~LF5ifm$pF(Z97HW3yQZDJ=NpfNz}; zN!@e5R@z`Qq@(;gvCA?A`%FR{R*um z{AhWPSC_fPk%?5FSz0x7t!yptLQ^kR38ag8)JOBies!;}<9i#-{^f=j4b8@EX%NM+ z>1v9K^1dA@wVWe#8l+Sv&H1U{9b~CB^8E4Pcc`#^6m(pxpBzKMN*lty&m1k(bpg>wX(MIj+3&)bI zX|k6I>(jCN#7uJ`K77#-*Tp=&*beJ%J?LsqUpWr_K$Ue zC_gADGO@zvV1&M}NW#B+Yr{xc)VrHQSyb&JZuc6MN~Ir%#cC7PDnq(tOII2kqv(E( zu2EgsD9gQQOj}gky_N5qBhZX(+vr3xSg`zQcadwH!Cy#k!$w@+Vs>6*!~>mDA=s^g z?RtlQy2}5T5dC1HaKx56w;^MQJ8%@B@3o8;CISKNc;Aw#S1uzORs*x^K@T|j0l^0 zTT;8pusEP1Hqi6BS(@HK=4o?9i`V;7`^k-o%f|&ja=qD_MoX%FosSjsxbZ%umCKwZ zF9okM{!4p_2SNMtQ`p|G;ya}JzE}2{P>Ev2h8pZ{$@#PP!#Rt~o7_^F6X1~;jxo7? z6^_yXM<6{;R4k8NqW4&3=GT(c&AuI&WHTh2I4_ON7EB0^k{$5(CG+SK-{<=O-9C{=+&d)q5_`;EBJFviy z{J{fuM8hQ^90K3cI!ta}aFl=p#*;z(@Y6_XHgeG+^&*~9hZ#-PGr&{g#-8@KZB(}R z^jL;}v%?DO@heOtFl#%bkvO_nMf)#fV-nU$JyW68a^~#GA8k-k%{g7Q`FRF%veI6{ zd+A91glr;PDBZP2M3#Vp9C*|v#Tbiuo9CcK&YPEWfKJ;~8+HxeEu3COT3DGY ztu#V|*w^T^OeAe(!W-gtEQB2I6(D#Tn8b^FP@hJ5I6|Dk?k^dyHH(3l*;sKc9^A(I zm||t&M6I+ng?&AoxnqQPb*JrRQIg1+y>7~K7PY-m^QJWq_DW6sHvxGwS`JC%cmYp% zJkt^f9T!~^A=`Ji{8%}STIPL74MGX}tHk^LK^jc^kgx;aH}3GNeE8=ojVP}ggu(RV zt$E%U^OVuri%Jt&yIW@AZE&iC7(lq2X>=EK$t75sp5! z_RDGneJ*}o?eA3zTwaDX!*%FDR!&4k7(0)VT1;>3b*XptrDLO@VHBB&1<_7>ej~oTLEn%`~;tC%}r~>>E>Gm zr(0{@V>B%3mDd+9AgM4R*!5|eqK0sr9lJ7*tI@d$X6iT05&QichLV06(Ts>z-*+;v z2E53x(oKe-_u1NwQTfX2Z-_&(#^n$e?-)7IOijz<*21Tzk|K*vv%6#>_G>{plie}J z4Q?YE10@#XdDGY@pArWc268qDXfJ3Oac(s18Z-MD2b=>nx^@N+jMEb&<7BmfLSu0f z`HBZxlt^^AvHW=Y3L_idS=5NWzECAObd=kUH<|5YTfXzn(B|X2O&CXeSvgq)=w9h!9(48oVMjfjRX~znvh3;=-Vf>c-&2n3M2QwL5w{6wwGS+aApZu*x@Q36?Xng%; zz>kL)ntj7lgc=W@f;P)=Tu9vr#0;SJ+=Z~hOt{~v;O*?9k7-8@ebc1VYCfNZB&IPJ zGvSe7Qs3L)+=*_)UQ*tnSg?9*EXw*C_~DG+N)0~KB}5=yc@D$&oT_OTp5zSBvl(-W zXSqVk>ud^RQC#9THo!^F>I~E6Gc#sNpx48JOny~Dl5DR1mjuO}d$kT9`d7nf(t(|f}w^=XmnntE1kYZ$Gumw zt2fwrorWZx@!!?jH1a$`4y}GxLVq8Kf@}#&MEK&5k06jx*zq=HUcpQh+d;oY`G{>w znr2U_o5)n4q;*Eo7$?bNS*96})#@8elHV)-XLpn8Zl!P1^p;5Y#WH(KO6;O)YvUn6 zLFcHzJ437~K({GY`Rc5OU>Fs#zK{2vHN*mQ5b+IKa6xwD&w|{AIkK#5U{7y+Ai?PL z##MhVIIWXJVKT&X*2$+Fj-n{j@$TZW6>uw%CiLLJU1=fd6<2>W?I#pP(lV@1(ib|yD1zWu1 z7eOJ*e!$are17NQZGQ0nxfqXGY5BTIr-NhbsQ5;QGvaB*Y0c@fw3EpkA;1PfVUQes zB}-hrniac%A5GhGWYjx}ddP-n)X}*H<1ahe651D~?!kPVdkeoKem9z<-r|49HQF0g zmHXXRt5QmB+7~s2H!z&KIQCmO$&!xO{Cc`TD$}AF`W87*GavWIm?Ve43_ zo6Ot#AvB-Pfi*jvR3-)P(Ap04s_o4vXjTtead$x$GCQbg`HWK5U;m9!Pf`xB2(o;u zCc{kTWtr}p;8oKx#j!EDt*6-Zy|cNA8)YUClZX2%7Uy~pMJzS(xYo_g?pgjzLN3U- zYP50i@E3LYH8;ySv3E3&LX6WGD7F0yTD_93rmw9^Z_-GW`6(v0BM3)qUKDniT`4Yu z9tX=gawckKwVsAkDcyMYXURk9f`o?&r++qFIJ<9to!E6?D6*eHU#-u5{Dl7?X_e1a zkr)x|^NPB4XMz6(NbhCr5WWDVCVLDBc7%2Jvx0qYb`2A8v2^$WYS%mVEgB51_bX!Gfub$RS=I4RkinH5VLm3J6qj) z+Vj44VHBfrj+Df|;1;1zHosFb_Z!r#t_qI(&}FT>3OoCkvP@JJ0U(_C_x7aOztRts zhGzL9I~g6(7?h&50}vtPjhtsYVL;-8NLaRM=!-#HqQ#VrRyalxNxEbq!x~~k0P(|v z(}34V5i@~nQs}N}di%nVP1XD7<#J*b1f+`!wcGO!99N_H_3)e@!5b{=re zJ^v7;Jmt>u^w}87vach9?kJ0^=C-@D_iRN43VDlMj$bKq7nKxL+RoU94^vx|KmPnK znSWPtiA|Sn7AL@7*z&dsm~Xl+sq18lPT22J1Fhm4nqMMBDlKa(- z%xfay^uEn|)Z{(|@jMBUSqov_sS0=t@N=L`u1regb#Y8{Y7_Rx#M=3eN_9%9_K$Gq zd&2mH-F%he;s*0&JtEKHl@v-j0v4X7RqEi5{gr^%V36_w9^pK7IK*3zv(|b&oo8Fg|L}t zeIEbE!TV~!l|zTiS@$~6VRd^@NEY#MON8`aVrkwVB?>>bT2Tw44Fx425uYR0#}JbD zKX1&SMv|-Pw;{#A7z`jQ5X9bX+_=(^&_4Am)ovX#6%}PM7&$`2qToN@J#)R#PEY96 zLpf%Bkw8w(Y$qf(I^AwmH9qwvt+=itw!L23XbVszh}|RGfRXltjkdal-QYoLU6%Q? z<=}k__Y#m~-TPFBC{YqRCzS>B`Lw9~XNWgTaBR{R7tL-#2qwUVh?`8m@;q%W#rIoD zlE3T5>O^)TQ|0^M2K4y13M@3O4+pHV8Ny8RYbh^K(k9b;yW!(@?Yo9aW?Epca8k9R zI6~SC1xczIMMw~q@10w7!BLWF*53chNtQxbbZ>N)=D;zf%_3(00UK;Tc3_mudfoST zO^T+!;+Hd@xu5g-s7(9k$v=XBpDk9Y_Ywmm{UsIA^bhUpGj>3vwA~k5(Mn_=Rv=tqB_Woka^=sKQ@7G9D zFn%X;=(4_LW#P*f3e{YM`lzVuInK|Y|9%y>A#)PtwF}a&@mk7=g{Zr}Kd;{2U+A{6 z(kK)2F%5&LlCYGHmPmm@jEM3dmuS9o8wWSZ^dZAiTGI^U2X=_w7x56KWDVp@O!-_a zlqX_<>JjOn=Xj|%YLHxmNmP;cy{s0pzapu0`e%WKSRi9el#)?6$p-~X6z)F8c4vHkQkr`loURUw%S@)Jt{-q(XOfqlt!8<&*M@d8K z3)-+jmvfQ(>@UOQZ2WQ9rNb>W$YNhA6*FD1cQajbBdRHER$2|YibCpzIUWfL^Gp}>Q~SpUVSuZl?8N z;TxyC*6eLUx}DzT@CK7c8JME4Gan%dORF((9nyF3eq>~*r^v1!2`Z?$^wL*>#kBT= zQ{JdV(VMN#6`3kUM=St2Sd+k%w|9+8e+xSTkOgTUhBV{1P!+v?9oS(euTJUYZ-6Jv zySsqOnjZ5=%I-S%uMtv_P5yIOE;7?-d6bzG@6AFTJ@Q6#-K8nBV06rH2n$SN+pl>x zG~Vq4FD1#u+i1yL@g4CTyq)MkN3Ne+W=Q!+1xCyJ5Mm5_rnzvGZSK^a(8|IA5ARx3 zPee-jy(D`476%rJm_28*MC{u-6w4#fVzP7<6CRq6&q-5dq%Y=JBfh@G*PlSdf2S!G z^9+f=mAUzIq6RIQDS$i-I9vcK?cix_uAq0A)FYG9e`Lw3W?~}8aI6jQnInbce9reJ zN_W&Fg1+kWL<2N$=RqeL3z0qDf02Eo5ep@t)bPrru~%7-U7ya z-xBt+wy?L1;{-=e<-=!rz||V}P+vg3ndY&o4DqNEBuYPcgf3z91?o;v9}47s|GHUC z3tIAT=6^X$#%i+WUI>~bh?gEcM2pe7ARD%}98iew$4)y$-B|NrWK40;=~qJ;e#EKNZprJVs}EwH5V8$3+a!4*$uUPqzr64=P>6jFz0LM zn?q=soR~g=&}3`hpDPtRV)_(=De>R@iU0CMr}?7^`z#A?{HeUA06=D%oWBvruW{+1 z2c=HJK+-4AzS9c}mL7(mLNnIC5eHJ?6)WL#UauZ}69=IcHY`@9H`!EsgpD+@Mp;fm zZQ*Mf?lBNmPzYGPYWwhxgBQQ?^ihC%E>-3kJ{I4{UAHI}7r@@8* z2X__st573(C`ODK=OM+e8rs%I>_$-^5Gv_4h&IY`MLuHk2~N1Jul5f zK}*biL{MkEPQq=N-!YC(3hje6vE-Dbyt@92xVggpnf%9+TThhSJV@6~_??y8`C|uG z7}lKuGtC9xbJV%2nt8~>6f=Q9%5Xc$rIbQZEIrNwr$(S6Wg|(o8R}XyVkw`b+0~s`gE`AuByFvRny%nZMD(A zG)^F?yh^C$7id}-zlilv=)vhDFbKz8T$%$N*w0H8I?`s=5Rc^LDA+L}s3KYW!rGLH zeFj*@bfEsgYWSYS;HBKMZ>dPad}XVnwpINuzaYmnJC&^0fV^VGr>v2nM%BILC=-Al zVyLPHS%7tIP8iF0mtB@l_^HEEc9+njxv- z!UWC&bsJX3h+PMVYAH5>AH*@whO*XeA|IQE^-t970*6XonSEg_*17?{N2VkKt1r{# zc)Frhw3R=VC>a<=3l5XCPRQOMnB{;A)l{-H93uyq2x`DNe&fHr%AmSZ6JT)=MrI>H zttQ%%ST9~aKUoQFLhi`V6$TWnG-1NW7$u7i}k#Shi%xS_AZK)9{SxE z#fxv}y|*snCDj%D{RqRn`J>9<#N^MFCw^IMaar6yN7Yq6AT7e0_9-F1$|*&9zGZ`~ zylN5m8KK5~u?*1bnax2fsv?<%1L?>Rdg+|$y7s;0y!t^GYkUG?yDV|^T^jSletg(9 z#*YtkJEbhITxa5Ks_FN@Px>EIR+8d~>XJ1DjVMza1RHmnH?yKmPMx3yx*F*W6GuI zDaIvpuj6h%0rf4f{%cZe|6K=|EJ&(qYJNhdpeP5Q^3|uc>gl3*&lnRH&^a)lcp3rD z(EFN9&a4TePz1sFlyn0ph0Z`8&lq(5Z%C@?tsAkDUgr^EtfpUlJo+S>-Ra-?YMLh^aW;!~xrIF0RDXLweRY-Fb zG@X)kdk90f#i^h9a`AC3u|FAV=H@Y4To@?ZAW1s2j?A?WJF4n7&>{nF*thxD!Q?;W z-UZK>oqtKh6VY^rM4U|KpP-b0{DU8Q`m#PQUk|7CWesq-D<6NsDc*k=yWwmtATCpP z=5rH1PYrHsY#5dMyjZnL&Nk)Bu;#w}ng1p|)=5R&iPihRRE$Qi$q-pwMj$pq^w!Fo znaey)ot8X0GMEpZj^rm3%hOcv0_w3-C1eTDq{d6;CwIr2)8tMP{_xZCsZR?B#cRsR zUkqoOA_GD1O4B6pSE~)?zmk0M!cZO|h=v|0_mvA|S)kwGLpOjKbZ*B~^V2M*`kRZj zoMa)3%WTEPGUu}7)|E7P8#K!lXykm~;_fFpY~FhyR;m~;X3HZQot?k3XwUx-%=i!> zcx3Jz#GA3CCD&GXnzpNwL^4&rHR3a`EbC?Ts^)M0tBZ|*S=+LZH)qb{nZ)EZd4d7w z|A#a3r~fD0t|t3BmU#JxPgsJpUD^G`q{dz{ycum1LV#+&-*9LLM~v-p-U%_L!BS56 zH*e{kUYwG<0}L2^dEkA#w0{L8o)ThTjMFNI4FEF3Wsx5Xjm4BL#uEhOp%=^$k7Da$ z^ks;3`GDKY`2ACp-+9|cN()m+r7_fdND}mVo9C(wu`{SW56+zKJnPt4zF@Z83>TS}YwrJ7Cmz7Ek#@SV@s{od0B8|>ieoEma>sFDNB zm>q*>-go25BS?|?d$%VW95dj29iY9sSCqvVzQj_vShuqX>648p)N=G5dy#4&hQ7xy zPSFEU9Vfs3LM|v8Nl!hQ{6Rn*bFj|H)vggn$Bqe^JEFfHSuy% z_Lm0jut`bV_m^dQ=s=;zxcq~O3b)o1REQw%U}4&{W^xsHh*2hdMM!@rM=Lls=SRComa1w|d?*}~*#VoLdv_u62P8E~QBc%_eX^w*O_)3+{D zd!Q&9*PBmKZTeY>2`>W0y#+>I%Y+xzxpxU!iK8J;zjc<4=Y9MLpRZM=fRJI!lAmQGPKo}hf@ z=AEx)F#ACs-oU3a#Ji2gCT+^O`gS9b!(4zTYkN$ZA?6Ss$W?@9kTGdaRe}AiZl98G zDk7BQebq|S6h!X4&({)=kP&!q%GL(?>192 zHjamQzF6G|d(+~O$RU?G(}8c+OyfgbjowWg)%K3=BC9D8R4!Ss*z|@QW8|)+YZhQt zea3TEQV+U4Fmq}%-PHbml^p}f5&}!;hnAeI-HRQ3F6h3K{kO=wJ>SHM+ccu|XF@1z zPqpSBHtZTC;`KWEb=Yo2fZPvZF(BLMhS;JVmq^Zf3+vZ@fMVM=*a`U~CA8{EA#jN_ z2qemTt%BIh#JcV~5-2anTS}Gc8M5pFPR}UO(ZgKBLX?1G@G;pGR@3KLKOzni@HL+5 zrO1OmR(KduaPF$+h{HzHDfc`VBjCV8>)QfJKI(3OuF)N(DZ{Ch!H@%4A0@ohgI{}h z+B>q2wwJHD?dnoDW}oTY+ED8cYLEQOmhVi9_@yq`XJG%6d_&XoejOS+PzTiM+iNI7 z&DKZcCmriqRI%2YXp=SF`e2*-?PovL?aG4-{HZ*!bBVH!!LRvyN?U?d-4f?KAtK;2 za_;eA7(p1do}XLa-@tCD6bOusEA!Tm717)1_%7GgZ=LubAN@m7$KLim9H3nKyd(G6 z4b^Z~DC+|%L4zZG!ZE-{8;(Y*Tr+UzZVz+mf^%V?kE-^v9JKOcGQ^AxbXlY*sI%mG zKcG*t;vC4og)!g+2SBFFs}EsI%@{e!E-=vS6SYeV3W@D%`NH=kTc6P>z0sw+Tfha~ z@Wnx-)x7(7ja)ry=00Er62eXQJ)>;b`Z8?0)%8Q|MW_(1hz7Z-(LmocztFzioaHc@ z5;d*bL!XxPm3l^|3d#>$clzIF!OO7DUH#IC^Us6iRPW+gDxfN^h$YQI>dA^@5X!aj z+x5!km$gcNLLLemGDCOpfw723gtU58 ziirJ|cN`c<@l5w?`MkVWfAzL4(l;ySq$QBVqSz)Ux*k4(e+OwoOL_t9a7?BLqRJcc3;~Fv#d_ zR!K;Z74c-`L;06JQEtcPK-3o~{{zl>$VmC@!1Uyu~0Z7|p|Pe~t+<3CE%Qe_?&VIHr8em{WEX54r14 z?3gjk(;kDP=-C{%^HRbJ4%3fcCHd#Jt}%sEInq|TdD<08Gi@o`ny&A@gr#ouqSJy& zBRO*uIs`W%SG3BEIr;89Bfq_o26P(6`P8GZwwyzer_Qa%t*9LH9o3ik{&R1r5UX#> zVpV3K>nl9N)rZ|W;BQ3pLwomr8N_iSHrV=8opj6he-s{K+hyK}!HpB-PaGo`5Ux3(tSPLVP>Qga4sU5Xd!+p7{7H#5 z;}djbdE){?GS}O!oT~-t7_XwE1yzFoMA58cEhNO0*TksoZfTj_(H?jih?K(!Tjt5* zNkN_P#lXSfEz@RU1Z~TMB|Url-WVj9_Fr&ZOH&F;}Y16WU$(O@YR7ounz2XNX!69Eyj-aUUsKvznVmvTE_@o6ECFq#iy<%b7y>gNV zgxq8#4s}vnL;>5$%berFki2ukN%b4=&ikp;!%Rc*P zleG%oESKGpS1dOwp^^8?3-}D(zUhEu@tH(=T)dRf998`1O%8Yp5o%2|tMKL}m6 z&+MpHmGDUROqHWJ&=J&{p@PJmbxCto7VA7LM(X;!R$A6+ea73dal4C#*?YqHf4F|V zo$)lP*?6Y7RN65XDYMMDny%lGk}sQWM}%yhLb?qm-0=mgjrp7_>pQ~=>`Nm-AFsp1 zaCLDsMRc8lJYs|+(faLBU9kLcYvPq<``??~@vef+LidUE0;=%2pLo*E1^|_T2fdLz zVaoP~^h75@CXVPq(3cJYt&@h?^D#<)?QI|7&u+9p-vs)G>T;H!I1If&e3+s=nqmZc z7U5>~bcIYI_Befau?A&!_rjFe#_{5N5vu;$@4(XP4i#67V*3?ikTxHDH^w zKRLKBjiEcsiRT1l ziaVRrhHWPhos<;%fOC6T&bT=B;RV8-l4>587pc@iI&x~k)CDQc{1>ku%cKF74ZX4Q zg>Cj|Gb;PK<$BX$O-_2mv_0!!#AVXoyR?pj`{4q*ZFQJ}M`gWuq#*jw+;`a*rEsD~ ztcjk&OD;A#BzQ*a+F7zXuNwNS!stORf<4ZF&LXxG+JHT>=s5&(|GF-^VvH$ z0g>J`uYAl%=Rh~{qnf!3vg`u-_AvMPr>@WE#P=QjH<17PBZ8i*_8yqw%v00JG5r0I zje@84r)<#!B1nmWiAH$^-3c1at|k z7*V&qVS;ztInb&Od~?rO#q5c82{X^Qh}MsMuqbS@8zbYwX3j_D_Y|5(o%f?5tQQVqG}oiiS$TmCwK z$+KT3TI#*>X3Qk__YswPKJoD^b}^LR|G{r_FPV8%CqIj!s{u7C>47TEdkp6iOr7Ba86VB(b}bO$gh!vw z2HHCKM75@ZkWQGB^VWe9ygvvfl)l*oe|>AJauR8Zin*VL5`nJZZ!2tujfoB!0F{wg zDpZ;sdALXk16|SJg|XR|?vvhtuKN$sAXXAR-?iMIR|DlPOap~Pnuzgu1p+OxAO=Fz zej}9E!(KAFDn_#6!P=LP=4QTENqjMc{P1uV;GG_xpzJm* zBc%q%q>z+EkY4tCv$`>!zF;|GeBP!rWdT4;BrFydA?T8<5V{anA64mREa~u|5=K=? zw{=F;qq&CRIAZ@0AX3Hg5h4A-CbZBDnz9H55?z6yTT0B&PEw;D;LYmpv+m%Hbj4JT zNLFBKbYLu)x_mp%vo0y28*o6_S|JGeqCZrOVY)2&VLsU2|7EcGS%sXv+Ltm9Ifyk( zkLG(AOTRRjK}aSX(K(dx|GCpfPNH{tCg{M4QUtOB34K>pUrt7eR};mK^+7S8I@MF5 zC64rv7Gk%5wSX-azQ|G{Sqy7ZNvU~{=%I21yw^be%QnotPy&?Nly}Fyw3p`eFpo#X z?{--GE*BvuQ(Hs>Xnc`M!3`vLpLzf}@3spV3!zq(MW8sn<-~?@8oP0XWE>%Kf6!f6GChJy60(QPkIx$-s`ECo2xWW9Q#0D7xHZX=#A;#jmU8(ylWIJy#}ZWNZvU zh;X}{3RFj2(D~fh!)6Yg`^ed=$&btd`Ue{0ev-DIWQ-*86YR~^W$h8{DR`D*h^H^L zl4C(N1actOMSGALWFK%2sADz2vMkK2ufd0&gg@Lt$RLrc%g*CroUUZyt3IRU9tXQC z4BP|**ZX#Vhc9u{d*TFwyjj2AJWZo-FS*y{F&%DYZi^Hm;G^x?Y-t{Er8OLVp+`8V znwwPlI?`-DWVxLWvp^Wpxz-8e&dMeH-jIZnXvZDBM78^WzJN*@CY=HT&a?1Q`p;sE8i1!Bf_E?9$6ny-tIoZg ziVu1W2Tn)y5NveRRI0E(sr>!BrNVQBsH~U;lfdu=Fx>P-I|T*_sikvR8v2P0O1$`v z^Q{kAHCTGfvBd5`0m~{l=41^L%_L39*fa&$JQxM^lf0 z4zUp5zI#D09-4X85MN~5s(_~+q_S7X%XKsvY{-!D|zABrpzmY>dZ1y{Oi?F7~ozhTgEx~_U?26>zzd@%m1{H6b7D{ z$k6kSJDF8oo9*s--(a=gEJ#FXe-(#JifBi{`J03{k95XEp7Dx0@H1i_;~nvx#jKU@ zd5EcqUg;ppuIM5HGd%kIE)i25Z*+@G*C{R(Fmd!>8E4r5#X2Y@IOZ`rZ+{ofSYxgl z(=^qtKiy)r{@e^jA%zwiDf<|W#0lE1uqHlRfgq`v@p?zk!UYR5@fyfpXYZ*@X}!ci zl&;3r4Z3aOS+ua$-A1<3#8WU=+ zrYVnD=db8qx;Ib0o+@$}%K9HObHQ8xJM}(r{DZa=}JuV!Cz)dzZ~p=-(Fi{_gl3XF>cz4>W>@c~x*j zg>i80o1&Co2sS34?L?S&wzl?&lB9z(TVyeJCl+e_e2%muCMxY5b3I8Or}3?LH?7Kw z5OEb9yKm-#;PtW8BTr)OP!xi$0J?kwOTV)v2BUam?$%hb`T7udGjUCD8d~J4hfZ?k zuV0HIs%efL8MSga*b0+p!=m7`izs4qab>hAqNw}xi|XhT?-e!8^eTCjm^bJh46?~( z_c~%hIW32;1xUK%mGa|1(mU18y7#U^`YCc={^Ok1xNIR@r7Ut#I4LS=TFfXXV>#Yg zA7$ZX(QC*FWT8f$+rY*2B)Af+G--?piWqR8%c=8%4wRl;i^~3R9**R#$ z(P5s^UP0Zos*(-`R;xw^%8ZN#FDl6#Ma2zER`Rj>aY*HPhPu9Oq~k@ckn@5{*uTH_ z@C1P{Tt&jMq~IMu5p33^k51v<{9Su>_Ih>WWU^}d%Qa7;H5y*CqJF>x4NjBr%+8{k ztZr@R-xh7!i2lT#js4D0tAThrdtFIZt^Gvv>L_}TJThVY@Wj#Qh-mvcY@D(&ZUcJl z49pVf`ycL0g8aVbPkN%F0BuyF#*a=Sxj3o2G2V{27WJ$!Q_CTOoaSj-)Ml~XruDLD z0_@TYefEp>+0z3}!ocpXT4P{3llv9#2@RE0c4A3KoYC z{{Z`+vNFlCm-prgzZvwa)}oB_2QtL5-do>LhTkqVr!eUjuP8*((AsM>`k5sH{5Wy= zpv0^^G*3!Lxw7PPS;|BU;h1GI8~{3MlPb&iv5!zMV?S8j@kg(_$%HC#Hi@metKi%s zN!daPm^BYc??s@Ga}5olUKSdCsnldrk~Z;8Uv(b9j#A3Q%3r%k(L9)oOwMO!B)C1- z_tAQMBk?gJ@4aSKJ2Ul~KjB%p%hoslQ4*f3kyW_hwO5q;yE+zE#Xx~Zbr?L0MZ83X zJc^{{((5z_IQ#-*>$G}hkX<&}p}e}JeFSi_*Bmdr7n%&k>m_<%bZ68&FjTiXTB`<0 zaH0^iION3fm8?fzI~yFV*3`|U<_5{5yBtGxUna=U%_BX_&0M}Jb@yC)P>N2=zGqXb ze{0Jy#&7=5GMsF`j=aq?=L3V4$W{j3yiGre{raZ#O{;U!;;Bq#pyrk$ttdd+$QAcg zdUoO}u;N{)Qdv+<`^DHLK%hF_j@69`Mf zVKS(+m6kGMh`RK=_zPS_HJK7N^m0I(vlASyGAwsSdh7DhcU8IvwFcd08}LROpt*G) ztC(N`OAUKacNHxT-=)vno{}k$%$=|>(CB!2YUrm3apK1u(3sRvKm(;* zOdYLo(Aqm#eFFxa7IAJfqw651tJh^zy^2IHeJU7R{h5j(sio3YX7E4)2O`@jBVfap zpB)im!=b!@4d~U?y0eKWs}YgA<)fq(l^ zWHsea^6UALmwzO@`N!G0EN>DJI1s4%_GpeEP3w5&@LD?c1Rgz1?{*ZZ($3_hUy~XW zHguok1XyM@-xvMRW9 z+l;LoC?O5pT)0Q7#|HjyQQGTZNh1iJ@7^h?+22T&zaN21UF`by6l=k83Tb zDQeP80TwNnQ+HX@7vI`BvKFv9+U8(_FYz(XiCQ~}Uo9CyM?-!n3YY$T3xLmYrJzJ8 z_kXv0=YBfjI$N7``u0%N)>Y5M)^dNziPzX85H^&~ycm|_OYAPTENjo_FwlCL0ojVu zsUAG+N5Rat*;ks|8?8F-ZwtEpd0QA^AaI)>)r(&FsK*R^TMJHOp*YYnfY@9zI;t{} z5m8Utj828v!YOCFnRFi+=}TRsQ?qJ18k7Og04voR*4wxI#uBQZH*tcnnYEN$cdZ0C ze3R^dVIMP)6xT&jvA&J-3$kZU@5Bvle!Da_UZZG6f+`Uk$|SfOXcWUWB{c=Qn$Ukf zTGVxYAuIF3Zq2Us1r*J?S(;WAWPS|q)haVa3cqDjALU{C9x{IE3s8s2uciII$-NV% z;{ewNAOQu2L|x_IP9uE"-bpd==HLx&ei@t`EDOlN@@3%Pi^O#&mtdQdC(LDYib zW*{EUv$dlDXyjy0Q92OP)006eR50!9N3&)QbLA^H!Z)iH=a2sltk*#srUtk=0&OG>)d$b&ucsfm`n4&4N2KQUnYM*3d+Vi+7D$P=vp~M@4jbf!KKK1Yx~=#-@wFfWj@NDM2Y$ zje~pB8mGxCpz6ZKfa`R~K3vyio-(e`9!(+19O{3J_50vex}%e7Vd?$vc++GeSp?H8 z3v=GAedMxhZU#bMrx@O${!>!^NuQlFktuAz=+gp-TyK#%mQ4dhS1J7PuOi%(F$>4G zrB?g5g~~k2DYHh_fH^_rt#UsjduCdzP6Q<~bW>3e#eu++ESPME!Dk*Fu)40XJTbw) z&08$IV|jNUS`;)xm_XU!hluSDX6sXqU*O&b|B!I@VM$GYXKF+B>@pW7h;``6b1akgcHT9evO=9q@Tj>?G z89%f0j+Ki+TSGC!_np0hp%=kZlDdAL%1p(?r}Y@lV-{Sw?KI%*yIFis-&9n{3N(z2 zK^rpTmlEC|{Hyt2)yj)uc5~yHTi2v7d<$3P2j#Y^EH@?t^(e~?)&y8pk>lC9cHveZ zPdcOdqsxMuXSoFW5}8NGNR=T-_V(P|(Dl<>j7EkB4l~6cTLq6L!6l7v!9C2p0R4n{ zcL1yPz-B`;@`hk1SCQC6@|kr$`msFGO4%H1kd^2jcyY;1i_j5!f(}j$uiY#JvvYR0 zb2;P%OetSg>3{-Fw|F@G@`K;ha4|QjhqT!{MR|jHG`VlFVh=oXc=K9yOm}<<+y*My zCcL3@Pd|lJA`_Q9gKFn+*-ofE1z-ulwb~QZOJrTph(ai23nE!K>Q^yD*z0jm!z}l& zAU*<iSf z^Msd9Hw+ZaDQE}M<3)4r-cMq*Wq{zcWZ?bwC3%rS@S~Ao05-Aq2nQjQyFemN!i^z zOX_@%710X$iN@uF3at@1jR0_}L}+}F+37?RK5AK{1PkfnB{C(jiLF9z8tuXEo{lmgm$M?GR)e0=KYeOim<)PnRod-ElvS$1R5`l(VxQ4<$M15 zZRV?{Oc!=Vr`0Eu?ZAv-TRNwinf?WuH^NNqMgdn<%lWL0dQq^K>;_0y{`FYdj|WsA z!1!{mM!|DELrW_Uke^7>UpARkcwdGnI%`` zs7}{;#+@w+IZ%c;s7x#!$}Q`i31?1RR6SuN_?67Zv|W5y#B|N+s-&&5?m76@gE;^nv-5Wz? zirS-3BQunhO^hwI7QRSk@ZcvyEHo-inpVQc<@Z=^DCnW8P6Babsjnr|X9pHDGgPdF zei)}7S6T~*y6^)?`bm_seLU+#O-l&ToH!|$ zyWI?ht8$_&8G96>;{DrYB!kygB|4=u(0;*yFMih$fZ@epB0wt7nFmcI`DFf2g2R)= z33yuQnA!Cp8Z?c7{yUiK8po6&i?B^l0oVg7M1qo`1Xa9GCP*~PUJ;NNFQjNku&}7i zTWi}SBu8Mc*m&J4eExOjiPE&m+jNZZPaQl&T>F{#QHsg_!7~TQZQSlz9+HrTBrC^q z`f1ARK9}9tqPjefKAdjePZZ2nGi6@95IIz?IA9atbXD>5+aYVse`q#GPh#Sd1}|l$tb_Xmxm3odxg7o-4W{ij14cB(+l+1T~2`5skC*2i7hP zm)or3i3nQbUizqqMM93&(p@D(K_bJ0?)fK=-qd?qS{TA}Q$7I&`Dbfsh>C>+j7mE3d%-y=%f$U#jAg$u#t znz?;8ZT?Pryd$y*4;sk3BGbrw;n^X0>n?jl1IJxupW1{4=^AW-Id zI?IYgtGVBn`_DFhEc@B5IF*?A%u4m-&wcsU0Q5bAO72{Ao{9pFOR92zfI*Bb*64TEvXN z%EDm#d`WpruX>EfwB2~aq-~-HBrZ2DCjRkA5JD$N52i&QbFLZ%@_eh%85oy5be|<6 zOGXy|!^(>^No~)a8Ye_|hPVy@-{Qy0Oa7xFyeZI!oztCr)x46_iNUFj_ZIt8{^N<2 zk9mwBaWRlgChratIg)KVl@`l}JlH%%*f`9?T&vVqy@R5lDv$=HoP)6!=%ED`moIQE z13Q)sf4JlH1P#d+Ta_l2F*lRCzo2H{8UY7`vf26;2_-`cTM{Ipipf7X=VkDWSOp{` ztey8BhA&YSDO@_Y!f+lrl}3Jf@HEokrrNC>SGf177=1$wV7Xx-`OK~Dh;Jg)Y_z49EZBJD+IR1MP+0@4>^~fTuM=^K`3lKA-&BM)t!CDPfSEunKvK@O8#_bfa)y9$O zj{4L!WzC8AzBtHNUbjO@M;eSR1xq0_DUXTh*NLYbG@E&Aj*EMgDw_07Fo51lbxGHu zBDy1Y!sGnx76p!7^fLc!O2SybHs1Rk%Kj_geL=G=HzZno&hk%Yxr@8+UT= zChn(b#tX-f8&61&`OEZVznI`&+t({fHX1&#*I-Psf-K zIQ{(D>%&Yr^{lahz2`$(j^cjYG*U*ae4lRIR5P?34|Hkqse0^h1aD{mBw$c5qlM7C zoyAf(GyBnt8WRKO^Llu=B2Wd&4E>&bW3BxS9iP^1zD zcDit$?nLP-dDRVgN9#cS0;n9I;hqPFmRjN4&Gve(w{5l2y9?&bXbM){Mx6eZ92#O} z`&|?&%$7~p1z1MY-~(c5)v}Pz$zn6$SYpV3p1uS&n+h=mV;(V zc+l_N2OZ&z(*reiXPuHBTfbzYWO1DXNg0}4ATn&Ci+TAP8xDXFE{BW5)XV~+yiw`} zRO15^ogQAgCsz3X#4is=$at((a9NxMEiBXL`fyBIdAISJ&;5d7MTC~=QGR3QqKz@G zoaC)dP~%D#{sNHKbqV0DyuMB}pdzhXo|CAkG(vO7iCfh)AmggU%Et^_5Z@!05U4ou z+tp`388e~9nF;>8{wmoyGuI^x4D8ODChHj^;JuU#Tuk6A`u8(Lu*nejbeP=xt#9@A zNys&CNf`EspHMjoBEpIqAsSx@UIoxkYnxhnX$W`8!y6k9KVp1Mr{RtNUCRsgRhO1) zi~Jy!VKASF4Kw%$E5~eyhb<4A%`7ZQ2LnQWR*maY>?GX4@Yl+mnU7(X?*Va?x+e0N zuZtDJ;Y{iu77e<)ZDed?(x?+L;tG$3wX%V|D;+Dno+D6AG;~BD3@xpwx@;-vaw3Yf zt{4v93{|rSz!K*jir?hciq2Z_;lB_^KJ?1(kjKY#`EXs2j9+ljR5Y#IU*_IE?mW~r zL9YMWTb2I2y{^B9Gz{;HGV$`xEX3@71;Xk^ChUPS8%2{Ed6G;bRUtqrTe@j7VFjl0 z#*N8b&b-{8M@e;5NS(qjA~TPD{7RGg?fbVF?9I=ja34NZ|M)Yn{fOn!NE;`N9EU6Z z3MTQX^_T1HSqVk%#tWb33WY^nDic5-Kgaw$k38-4!yMwhDlAJe4F{4Hr`c2=Se?2h z+fG4$^qY3SsUkF(;?Fs`7lBevM4-dgCvHx*%(=f%zEC7icf6K}>JMNr@oF;oId z)zIVygFv(ixA8$R2&3GCkB+$@8h@N#%#Ui{4K`n zOzOv?L}o5F!Zf0G(@{CykNs7^3z&>?#7c>&N<8k5?PCKzRR%ns1^Ce`fH1%s%=!)Q z*_zJan3C4EiA{)4|MO4qq+!dh_gr1sZZlrmmNxA&Ly<%{UO)L5l5vc(s_>dL0#WQ{ zP;i4>4hum)o;ZRKy{v;=Y7|+AY_ZwoKOP4}0$p%RGJV(HEDBz0xp1U>&0_jwyZ7KOV@!3D!em5lRY8`W}J0GUr?{vZi z#f#4}{7XvVQM9sf@L6cp#UK;x9O0K? zs4x*4A9m>O1oLW0!$lT1u|rgT?>FcA~oXC5d*wxfdSvsi?oloB$M2=I0sk-Y8n){{-bMPefOi$MRA~-p`Vv z-Ejl5)|z)Z4dM`A(VHCc3 zeT$!9V1ncc6}E9nx4A6%l7*6HaF6A;_M>2<&bk7IP*HVL0I`Kk%dWkk08R+wIx3Ps!uQlkjF^58lXPlYU0rC&RJ}?+OU| z08-AO&!5mNRlKLuD}WQ-j!n(Je7+D{n!hflh&j3Ntft<0gmoTpP`F}^NOjhmr2ES$ zXlbW6P4qXqXnFJG(KwfUVp^hyjcI$h9ZzYC_yUfe)5Z!NJ4Oh|_uC*|caNFh0xkBu z(5s#Qex;qtp+wMh81-|$o+7Q6$jqlFO%_(aUoY#ws!EkS!5eKiY}#!E-58J3P!P*<69?OTFzpv)J&6hgICC=`mqB)X zh{tfA{2}Ezq~OCVd?t-|*u-*dQ zQMkDCQx?QPHia0;U1$?K;VLrWd&o72yBTLDM5yJ`yAsO{@0#9qP9S@Y%btE~6;A2z7;D8&W8#D`k#pI^ zR?Uj@QH%DZW2*GW2O}tY)}1IW>Esf~)p0$87%SR!w8Qz_Cev(2{eymX&I^o-3fjrR z5sibq6fS*?z=QFE=$f%Q6Ngz6Bn-Lw;3h+S9>Xm(WAB?LpYC3x|4|M9R*?*2vElJ# zQ*Hw5aLMGRY(=+bn&Pjm$9z{6*x+^|gW2$D2JBslD~d}C49`6KXk-kxNO6eZqn6xq zB)egy92}E6fFzioAq?fAIigVb>ZXsxkx!J{=zF^ITs5q0t}4+k?WC0$92BI)pCZw? zMoh0nXmMQNq}$p%j_i@ZgyU!@r@BoXl6VtLzXGe^jw zz^RJ>v5|h_N4a>J1VYL4b&pYIixZZSpr$3IJM=-g!u|Q!yTNsfgY=4P6&g4b?k2jg z>_Azvhoh*ab5X)9&4mcL&czPsz`9wHuhR{mYP5cK?ocD@W6C7NiG~$p_oJuv3eZOJ z*OBP$)|3qBnMVOP1k@OcZ1R@Ea0D89w-m&$dGfwCc-;Mt%sj-DNV7=@9n=o z$Dgv1-{C!?M_?ZRt zjWE)4MuJi3YoGzYwm%b+M-BrN=7o^j55@-_jyXal*LFvk=mr95PAJapOd7eW5)?DcOc)L`Nu{npkwd;4EnH}E*wy%B&Nc#>cu zDqeiG+QEVOA-y`yUH2v{M4XqgJPoD2SrbN?i~WV>jZ;hSs~Iy06Q z*ftV=1N0C`?;QpfKh8fWZpUKVoKuKVQmPT{xwV>RlxjN@SlfE&;Apl)p3*8Rro4q$ zo``66TdSx_dLqArY?o|nXOf9~2I!y>+kyRw;o~`ty-Z{J!v9ows66w)^+q_qs4wz+ z>qi$re$cO|ntlJGvP)JJcXGlH4H$43FU&pci^BgrM0dBCB9E-MPl4PfcnsdV*^12n zpz}UyxH(i3&_b?zCE@+(kswY+;X9@ioyqBlCCqXJeS$tVR-RYR*H5kzFj6NT=07qufUT9 z@VzQF=qTVj&t$cX8Pc6Zeg%8bU_LD|1~<0o)`7DO=_PnmMKb$z3ZNrGU#fz&KvuUV z3;Z~W8wLM4KGKN>zf|!Zc(I7s#o_>cijQ~JHn!a*{KNFNSE}HzgP$b61uqf-OcE=z zE)_pkjkqB2eQ5}83@kH_U0V1X}1g#9b*q7d}b!$5A18C4(rl0c+#2XmmIPi-EW_|@;Bm!R~ z4$$X0H|xRMnhW#JSTBQPWci1K(trg%Iedp*6oQ@gl&8;ydhO5cFigfHq6S$&!^06u1vKD}RFmbOZiwaWb&&*4Ww|{0h4$MCeWl6ZuLB z?7dnW>c;9%T=tuo2sH5J3gPo=eReU3(B%mrcNyw2CbA~T2Wf{AC|mJ_ZAj;A1I9W{@KM?|9oG&hSs)8)Q}L&%IJP&5g72P1}yw)6>@P1dgluh87Ig}+M_R! z3%Be-TS2X!N5#=LSh5Q zY6Gt9UKCJL|%~| z8O(Qg1X$*NXLY%BfRD$vuXO+n_+;=Mc2Nj=7Y|eF%Xo-)a!vH0z`l^-UN8IrRM3;b zH_$~O;7Nd_evp}e-*w1&9ddy~seolAut^|cQp=%tXu$$sM)(H1+yJW66N$!19lifp zWZhZeolU(g>J+rDh?cq&_Nw%~$!csfcK07WP*`5m?|$58q%ncety8pctuXN!_QW z_iS&uWX0`BAs!j!X|3A~ZmasyN8+2}?wPm2yLbG(xiHiw9HhmFzB zgF`U%d$G>nzXUI1MC{HO(<}3HL+-&Lk_#`}n*#jvZVgt+_nH6}_|n8T*rkY|cO354 zc%I|d26cR=Dr-i%MMkXgKq0XE4zZO{D=>E0jl$MMmo4JG1NlsWjJ%yk-DSS=o=02I zD&3djLi^5lD7d_5v&B}i4|B^Gw&2RN?Lx8r_MBuS+-LX30@&`8E!7K*;XPw{-}o(- zvK`WQf9I9wOA^ui^9+pB7IE{J~de9;R#cL52I;_m1#076sow;__g)X9bf&Uy*plm`)|5e$X$9 zh!Y-W*?}Enb2{Yfym(l->I+@bDkBzgv4;$+M}5=NC*_Z}P^_~j8lf_b65 z2j4Sm1?b~jue`0^?lD{&&!FY+Xgq1TzFe{ugo^%gl&ymF@UERp@qjN!rUZP4qqp#fDK2?xdfj61^LK}*38(6RsHm4dSY<;Y-mRj>Sk8%4J(F4u0< zOjo1e)Vc#-V89n&g080OFR*OZc*cJ3!R$3SWVX?zyk?w=u)U*a`64V{dN3$1L!E?w zg1)Dx+Ck@heVOgagOlJl265fl*}e2&ZtL7GQLRHKgYL6GfC4?~&c%hr;b4kE_YRGo zc2Xbdrp3N9*tNK?w9BQTTnIYcca803zyX{0%+@iGsfU+X{9%V(B)-dN*=Y1k;=6#$ zy64k%jFj>C(^uNSeKSD^$1>?`FK09H63d31J$9CuWP+C|BAb17Boh8}@ghojT6e6E zG2twgBJedf@zfgOL)Xgfk)W4L`~YQJ&_Cu}MB8T*Zbi}4eQ(pgo+Ja%vPxfb;KCQpX^IE?`X`a!|3prznv=xYVD zRqW0H-aq(5-En(-g`D&^#+LeV=-=zhE%!ChHQ{&-t}Ttv;G)dL@}b3L3)prc>^47H zq93Z)xOF!XR8Bm3P&o1*DC0YGaA7L&B#Mq-VsVRSEIKZ^{ODdZN`7WhEkap35A8xPQ&w*D+^^{@9yQb6 zVZn|2PH*>jC4=%KlpS$E9}F@mC%WifcarNY-xCXp!nEH3%~h)0F8aW^_CIE2GbHch z12?W--E)2kWoI7HXU^ryk6UWeq&<_Eo-rmKI~rW-$~~+{$`hSWHzk#-mvgNEc-wo32fPo^_N}p z{)|6u9=y~*5Y))x-*<0FO~Co~${lYQ>Lv0XIq2TK;b*#RaebojopQ5A#Y^ZYJTAHT zuId=xce>!n*(mo%;Mm;iJfT#3Cva@q#xll^0vGOb2koL8I>cJW7XFxRmrTHo3wn$2 zPf+%u0^L!*i=~Jj+>v#?9f{TTkF5Qi9g;`54|nCX7#!KraALDO?XF>Pw`l*hI-qj><{N@=wsxGMmjt62^so z(lV6qBxp84e@mH3@nXD8GAbiV-tA#6!gzA&m`KWBzeJXfkvgl!#Kv?lbA5*7~gGJ zghyJam$AqF+~9YVzk|L<_ds`)6U%TIP1|&v@jHG6Q_+pWw!o?&Zp%@hud`0J_uiPmX~b zJd^mwm$~Yhdyg08QJl7h;@D^gH?D@>qHnice1NhY9O$AvYu<{!$3`;+_L;=4|2W9z z(rIpBexS^>D_Qke(7}yMs`r#%LfMrL^d)6{Ippuzo{jX+Bqrsjx3pY;&3)BJ%1qu8 zW}tT|uD)U${Pg9ixtGw=a-c6MBle)TqWnx^ImSaP#6{eQPEnxUoiv6kqm3Qoz{a)R zJ00i0tvKBwOUDuXlJJv`Yir>Xg~1o_VRUsT{e3s|ZuXysl-d8T?s11V_8?2iONi zNAPRsh^Algh;t0t51QseaxUrK(Vo3Sq$eJ8Z2qq5`rtBs*655P@Ovz;e-OT-JzIyD zv^n$fz+;x5;_;X_^4gC}!}qM?xk;YOkbBaJxq3~wbWKz85?Yt91iI%O=c;7z!aw44 z4%MXR7F&vr@IC3#J-k#j{mlc9A6b8J)BB!u z6ta|enEX+U^EW%+_zqcW4s_4>do|-3M+$eoPc`t9q?WA{lknQAv(i zSOau2P7}YT8q44I8Huw%I}%ma65h+yk2R(C_-wnN)--0IA0v=!q&`_{9uat-|GkJ- zPWXUbYQE2pUOEP+lIm*-`P)^DH`Xr{ossWKH>))pI*H-15C`y+#oNL9N9T8;^-bvisqjD`_=KY zHw9vPND~178M@8PLT`EJvj7SMV>fmFa5DA^&t2%#kiQ?9u>&R|(2L9^4-= z#x6G+B(juFYGyHRzW@VlQ`_pMUP3vh73e|eY=ob-vT&>n21mMSy`Yd;&av0v!vXiZ z{uhY>W)Xa+2VlUD3Z8-=u%+N&Uojrj(4AlyBV00Oe2oj-sAJ@vZ|m%V~=unp)???R@@nuYh^ zkj&3`A%Rogrx}U*ZIxz6qP`+h$*REliP_{tc)elRMI7IC0KXjKM=%HM08fvY*f?0V zlX31t6x9`I-;u6Y0ejE*Bsy%=^w#GI$%edGmrJ16Qyas z#=)01jy4SA7sJaoilCnz;|YpmJbm3Inc|gWpkoNUbc`p-e9vL~&_R7bAxSW+6)#c> zdlHa4=0?Ggh+jfEn|S|F#O{3JD?d)Afxx88ph&}&v|o^5AKP~FakdrAKPeIqzE&je zEo59Xf?s1fA$j~_1soFkFTMCZ9t?@4;URfT+z*+8V}ZvnQw+70?T*obGJ{?k9t|0a zMsEjbX*kfkm+gc;)PkZLDUL43=<+}Llm1{DqZIL|-=OY0AWx9FAaBWBt>CxHjfEoG zxdUH}**Hedrp20biVd!VWcWt~{a3daUs5)Xe#B zgj>ehWWG}Tvh`9%)N!B6kUR1U{lP6>LWhd?$r#%$=%b43(E6s~#o-&b;4?>j)n{5S z3@M^R6**6`pVR>ZzBK$3mgCxBUx^**ZD-}WT7b(2?%4togYnbe&CjsoYefgqnX#mw z<)y{Wa-cvT3BQECr_=#`5;|5_L+oxi4#Fe)nQmN|!5vA&PJDssC^=0etGow?0QDL4 z1Kn59K{rq5&$c;-fxV)e=@Fuz>1I?<+P!7dE#H+oNXFHw89w?$V8D-jUt{qHut%}O z&7S=M1ry3o{_sk{e8_0~#!sdBqMaZ9Fy>#d>jy{ho0-*Q+(~j_WP%Z}8eXA+HkyWGced!W;=Yr@R-BgY+ zNHsx4M-qJ5>Ha|`nxDMn-+_0L3=H^=@3+`eaIkkRklVjeFxTrM+%k^P!>tbJA|A*o z)q~+c@ky#3;cuZR_>d{TSMa!JcWa2z*(~I*{GmRVw!Z0A3qTp^OMl=~RiG!`Fj~{2 zC)eRR1)xK{{KLqpul*r=iXwVyH%6FZU-|=I1>3%c_H) zQse53d*gGWV?LF}htQ7Jd*#8P=7;p?h?k*XL2-%ggL)hCb&5d2h+Y9V&5?}#O2K@D z>;8o*8d#hy;EaIPi=Bdj0bdIK3Cn#L+xNY;h3|MxiH!&B%Q6>pAp9j`NQBP4i1R_P zKI~g8w|H#d8e6fkIq|~|h4-wBAbc@SMc4}_q<3uxA1C|R zR*xbR6uAjcJZ=bX<&g>)B_F`JmHdL`TON7Y5nwlmNy@)s~K@ zyS>Dgj)NVHAH(iJ$K@5f?&sjg&t4H%&5_wDIf{)tymn(?yXDrOpxkG2Uu>PoZxqb+ zEA`F0m~3@+TO;vAH%I0!+=sJaS!#Xh!@%x0H&+e+4$7S>f!>Ag%kqPExdH~!%Yzx* zn3+@I&+Y&$=;aL&3yGId=mx6jqTTvBqS9`CtntvZQX4`dbV%>J zfUD0gW;tg^_%iif^GnA-OIe?toJrf6sl^ZT&fwu71u$ldQ^`L;xl1U}gV4!$yaL>H2wZ(spJ>D; zv&BpjiX+D>o>MWeA(30y{KS5p`cTJ#?E>#7DAyU$ zc;!I{bl&egeVlVHtfjv>?zKwi8u-%hlsgvT98@m8!1tUJTraU) zMzwv$ag@At34w;hSh3odJkk=a;Phiy?&7W{x_26U_woL@#x>DiELa-dVe@0)ca-mv z<0S_$cWrGSl{{5*IK#qm<|~xDZ%1O2TB;f9h)s6d00(}@`Fk*W-ac`8s%KsjMf#3& z2yFS{(KV9w_&((blr_T}dVX|gaDh+CKV!Mfi-ej#_pMFCGhVnS_i9A=qRbDE-l7Wi zgYR>F-95DDtZjKl-01EYz;?IS{RHJ4NuaxYu@M+k{#`BQ0<`+x>h$Ee*rfZ)@3ZKz zeMxpdbIi~leG}Y$jbb+gdVz&-u!`^n{YJLaFCSFpI^SWs3~4{OqZbD@KebCnUUS!B zX0)>R`0|LY?cRA$P|q%bj%mE}mlWyOD*j*p_{;zPPygkwfBAQR`Jevhe6sWM=YRhX z|Hps*_kaHN|NZBG|4;w&fBp5(|NI~S+kg43ydZ$oZ4LorRRNsfQ|3tr>V z)*k;NYdCAy_wFy!fJD^Fkh{N#azF2@S%`|9tR>C^Im zB>*jz_pAVcPkJzJm^27l>KtgEu-4bYx63j0FtzCMIj_WUR(a(pBO5Jx^qBW5eY5?& zBbpuZ`6Cj_klZlMead;}f>B6vp%sm$zmkGw?35+Rv1*hE&J&i47Jm0YPn&@@h!8t& zkg0=TnN(|)1nQY+;Zr4umO2Tv;U}ZKN|j_A?-yH0Boj7v>Ea5s;Zjoc@+jRv49?o2 z{@7h-bsE4qH*DQ06C)gNzlt}y*V$_A8`vPfm`!-A+$R)goDtlziW0q9#Zw+TmsEC& z2^EV`lz8#&&3)WIaOl1tTFY3lYi%{U6s|8e5J=U91aOZQR4Cl&b9eAz%SRMWkVR^Q<)hB)v znWC*M>@`b?QY!=Rr>ePCJrnkY>@xK@2()Q&gX6t3wT<#@Ap8u6qSRWXZ7 zp7Ep2LdA7l5#sFiRu4c(;nRghqbB^SXcacAB2s$68$BU?`+9kQDd7^&D>6A(DJbbK-Twp&_&JLvL{`nB{w>GN>8WF}jkj}C= zJ0&l1IlD+de5kQ%oP8gtl#4M>Q|OF>JWxO5EQU|>F2|t@tGb7k&xdeVUq%KRH{VM4 z3Apl*4}m;Uzhei?u6o~|T!3qLc*l1xsd(0Z>VeK%ijhUr(Rc+_gPv5X9WD>l&sdFS zXVR6|UmDNLIi1#T9DnY0#NpEG(DTy0!=E=IG!fFL(?&GjiG+G&cbZmCz+e3YCNrw! z*UXU42e1WwHS{v*ncMNnguqpuzhx^-Js|M|%aqf{0Q})}KIEBn!M1;*Gp*(J-p0HK zcw-Ge7lEV(bmn0^kQe-3L#*nu;XtQ4z|?we1By4huo}O>7<6Vy@=djQ&kOvj#2Yf{a+l~ZoM)oSo6j4ROmL9Xj zqvyD9h^9RG?1lJxEWaXVS_9kuiN+$;$fa*JY)J|1tO{pOEVT~#uIi+v&hBgflCzdQ zI{3PUg|!mvMjTY|ll81iWUiQP8D4y1l85vIIfr$tg~c=dj}lmGPYpcZ8=9+6?guW} zzxkwjbp#MV!!syTk$DG zV*|gEJ`WLS;p6Co)J&RB&QxgO;~Hq+%4OCGH7|agth4OrnLR6h9W|8V*C9qLexAIP(&vdzEgX;6ZWCmk zEtOs~PvlDG**0G1Y^CsZK3Pj2C!eii)`4v;ejEkY;?uW|Q|Zp*=h=8KJ|0iwWS2@f zyy&~cb;E%azphTO?AMJCQaqPK)IAQ;bJi6YT70~oBN$rzxDiB)XQ!yIQF-qW)51l1 zPM~?jvS0VbXz}AF8ZDl^m$kFlu@AJa#gV#S*9lqn*-BHF1WEB+fi&(+a_ni%$ogHwT)1mJhhkP>WB@@-oT#O+=4d8XFCzi!gB;yJiC?(|gb z*S(@zJY78p&0IQOH?3On<91jnJWT>uzDl!lnQmQ8>zJ?mceVI=Z?NRfwZU~6uw_55 zQP$#9Ww{<%is$C%aZ|MNnsr;X70*4`T(d3NuN%Cz_-rp4w}~tE>sE6seqF_G+2;&& zU9m28pLaRqvUx=wC_6o*@O4eU&r4(2i}gK$B4-kyMyrSgBh${i`NJ1LmyT=9|hqVD?YCQ=NC;Bd$4SpvEuVy za(?ASijS?>h2)fzma7`f8OFzdpBR#jkI9N%4Fnj4zN`@$2hmT6_vg*2cYfE=$OS*16^SPMsH@vYAPh z6wd@EyGgC|`9(k}e0|2yOV9oxu5NUySs!-P;?sxnj20i=@QPo1ec02{Iri)0pIUr2 zR`HA!zdna*#jj7TYVm2hbLo^9pVhW(KhxqfWf-$Zm+P6EX3vKd&tA~{uO$zbN1S2T z7nQyAEP*t{r)ixZj#jDxTi>OY?75a`d`er2kJs~z6F7r4$!TJnyjbmNL(LkjZu=R}dlq-$rIHcjk z2V2ir@nJtUFiY|5My~$bwA!CB(yex4s)+(n9*Os=PX3mcjh|jTP#*E()5+Ie;fg)b zTVvhhmiPRhwXIc(&%~#(HQ<_}eM$3dCzyfqh*i#&D9Mp}EuQ@Ar^nYEyt%NyB`MX+ z=>p{u&7L`(e=h~}I-*cH=4W;weegz-9w?7!@wZG`>JXe1pA9{EM2lznu`XqE;@L=* zN4$7;+~~I#K(Av)t^EEYjsLYSv{vka@`z=Bi6TFI&H>6JR{S+F^5OTc0Ob)cK5^m` zGSF)lZmf6~Km3dK+#KiY?3FV}wHel#HBcV0%sI#D^8wH?S6421jSFA=&Jv(JV!5*y za31gTPP5X zD8aSAntig3%_>+Yz956Z{2`z#V5Gtz4m9S zDf%3GPi+>iI^bzvGhhp6XV16;UXfvsv%i>-ZOB1eF5%G-4wVd4Y8@&b%`W7I5~0HB zi~LdX7V~6o`ZIJH(+Ms#tQ)(&QHe|RBbwkl6ka3*tE3J`)BVMB1>eovv)YW~Z?YUG{>r zb=czTG}pMiuQR1I@mn>f@m279aex8E1a<^Gu6{XUqTms;R^$5stS-63>nqpT_Gz zL~J03TPGG8d;Z7wJsaZl3c^nr2OBeWox0B&eq)MRy7Bj*)L1+4uo?Snq-9y0Y|IPz zXi)IlvZ15kGs{3Fdn;7tV3#Dp?CaCGBWKXHZfp78lO z=ZqQ>(Jgq|iN+3sIwQiupH@!j1h3(tqu?{iqsVM+`B^cmAf)F@YhbXY5?4E*`{!Bd zDATZ0zq2X*qwqe5arB|_-j{wJW(O#hfiadSDo~U33MbS2L~=UmDb4`x?qjZlq?4BuwiqI z7Ehy;m9YH4&tAOw0`8;PL@$B2*aWZHMD>kLUgJ~~o4n*;(T#!6?xf5rSFf;*%3Ifi2~oS^XdY@YUT&KYsM#EWOH+UUTuI&f?8$&y&7!{?BB zW20)FtBMJ%Cx(9K$g(2$KO~DV(9hJa9o}B$z1D9l@H+k)7)dH1mee zISi(hxMQA#bedci^T)4L=F>s3w6MoB{gJw~vg~P@tvKnk7k=3!cEZAB$QGL|k@f`44m(h)aj}R}j=IFxD zA-=G&Q9iigu+d-^I20Cj#JzsTmgDAl4(E%s@`CpBjf9*}NF0jeB$cI-{y3Bx{U8xbtGH_C6Q_;3i5xQk|z>N~sq zT0G*6Ry6zWts8PK63&wKQ1lsiqz7!6lJ#>G4`@u1C4Pg9(h_6_86D)b#m~sfA=#b> zReJy^#Y5<8-m0B8PnwOxbe%I}obBrz0^_J*=R_SRA3I0nI4#KmKks6gt2v_=F69{b?1J!u%#DA}G!x5f2IVsx` z&jN#S_8A*27&PE{!Q&PIMtl@F{k-twaj3bW$Lv6kYihNJdEmmTlR4mY5{fx5>^dF> zb<=cA8$sQ`XHLSqviSBh^EJxQ&KtO&u|@uqAX1@<+Dv%rnj zD9-kBBvrUeDW}f$CUJOtk{H{6rTf-!V*m{gecoYceBKFk#Al7)$6hJ317{7OqkE>h zdie)awcxQ-keel{+QI3L-03Tj(w)C>FDE%y1Pizg*H8WFvBFAvlxxUJ3 zwO3yP?d*f$u=9IoVWd8R(%8Mhap!y)t>M1;;9qCc1Sg*BGpJfee6O>!HpO8}Su02K zo7a(8LL9c_&5+0QqRP)i>#HA)o!cC@{AjEU)^|DB&@5w?1D79-+haKBCAa7d{pXVg z^^#EX;h#&eboD(vo>=$L|#gNWacZS zv-3Xc^eL3B_j$l~;Ea^-r+EYO1C7NhcHe*0>pH0*cDAt=E8!TIjz_{VF3Xk*jw656 z@n#86_K9kw^emWs_|JNq(BPi>h_P?zvZN}jWchAq;&Qo ze}un=$EL{#7S5(mEu4+WA6e;^!s)+0YWCn16UiTWbuXo7aquHAvLu>&!$0zpLc-ac z*?7mt-pu-Hq)i;zoXJNcEu77n^$|$>0J}49jYP)o%v&dq#ourFG^pkihv$pq7GJju zH+BrOajm{RYJVVWPo0lmvU9Dzd1>Xdb?uh#40?Qa2XM23?A6%1#uvUlKJpu@oowm3 z@$T2v26pt^d?`tk-!eI{!V9irm+d_HCa%}bg>8C#z1=F44Lz-I4YQ*s5BOhTufvUY zQ>vfv^@X2ZIw>nwct(4B^O=^~c4@rkVY@>f@X3Mw4zZV?C^E0NUrDaUl=rjOMl|w% z_S$$?!TZ_kFF$kT{p__7y}X~j=Jl3#=vvnF%apXd*TzBBy2!LM(@INq?Uaj@qif?D z5#C!})16rT@ZRd$$hLL6XVRgSUpIU5DRTWloZ*@UB9Bj#$A`b|11Vn~%zA#NuD;r( zyUOB|<-(vpYy zyLOmf9}q{cnwxo4nG>LX7s&!Xn=fAk~^6Xgt6Oyvag|DL__~8b1*? zZH*yqWqwEh0_y@a>6Q@-19a&gA04F&_4s6>w4oMXOP!s0a4mJVCc?Fx*O}?na$aky z$Fdc(89Qp$t!|Cl%>oVWx|W}H6#8|G&xpCltP?vKK}gvj;GI$HBwA)Ot&?b(Kr~Lf zj)QR>eR5d05e1olb|wR?9d?>s77shk?mK5!-{12qO!>sy)_S1P4%LMFJ*>R^%+Ndi zV!(;9uvh%?WfhKd?{1_s(~dhEuvS5vD>BIR{Qc&Ct5puhq5x?Ic3kg(#Dw-UX`{^z~+rbXOVzc z7M(=`R?j<=V3yB2li-i+^uMI1lvx3IV~+Qc&gzmDS4&S#NxNigRu=S=@}=ho8GJ;m z_Z;tUSxNB12@qF(wjhts`ydavaU*gvLgPZ@3^n9gMOGOk<{x@ILvJIk*O4}z1>Cqr z8E@%aqg=a(t}PF~{Ly$f{gIs|og;AUEa@DAV`oM>7aJgK%;+4n<*j$;SPHMbJI7Mk zcF@}Hp4nw*yL7(Vfa=i#ZfrzN6m~Y2W;&TfrTZdMplVv~L&ZdTsH6oRu&PNM1}{`U z8dCNwvH)ctV9#P>sr(}w@;dhiupzH=e*hc8I!h{fOVK&q%U-I^X+Abnbx!lKou_lk zhW$LPQ#RT6s#DrWz@2_NOH-FDn8|$h5qRhOP491WbGLH*T0=EXyhULhf3Z0!)A3~;OBnxJn(1Mi$qnZ z9ovlthjX-zC1}3=(z)xG-MpDHo1vD^@Y#mWo#OQlzVni{-oalRZ)x*DoT0IvoCi`h z-}%;&Emu6zFhYJI+2+0Rc5Xb;dHu(qMHB{t2} zAywV7!8849G-ABoBPcSl|Ip(Z`aV)>jvi^MCbib;ot&TwNjU*q5w31S%SdPSsnYDS z6jrKT0`6_+l+7;NOlXB{4uEy;_T~WCwQ+iv15Pf>mm2w!Rp?iKryuyCs&dn=q z=z!fG?0AWO1>K)P`q$r z&^6Or7NNH3EJAG#d6`AnwkAKOI{I+;GJwL&x}T07?#InmlVZ^wzv#;!9CY<50|zzLYv z>AY-f?j5F#Royc7Nch2aPIum7*{{YPHSlas6<#*^WO1&s>-d%}>z&&v@Omy?%OBxv z#D^oZ0-POrGMRl*t9&QQTNu}gj#P%?$*gLim?&srrEQ={4qj;St3tM+^i0USY z&nFSvXovWES7WZs$GbRLsp+r@t+6GRk2-X2L*`Um=QdO>bnjgHk=8N;XjH5`kP&ot zV)KSs^$F!~k)IJX)*kXerm4LLZms2q{6ep4<$-1y;`1Pxu99#?MvU}Zy(v=jPv&He z8On`IqqE4NBY-Ot8+TMNCCkPGEB-6#^UF;M%74DFRZ_Z@f5`%G=MtN|{<&pc)rx21 zX5(#9bbo2=L%xMg<3;w3)}>)uwozwFW5=3J2aS(KWwAV_k{*BKy$rpP^7soG!MgyL z3p8HfWY*SLSjrxxMsVa5nQwMuoyLjF%mlpXy!qheB2AabNAcKfx!0TG#`&wTm*VL} zQ*u7$M`V!OLX8IAy;`|tWgv=;i{7bkuZC~NHQl-QUOW;?E5@S;p+b6KP}4y4yuRfjYeesVZPQ_n0m2L(Ft&NjeIdt0&__mYLU+YMSu zxx}|RNg(jX4ZcXva;8ceIjpc{K| z;O+B8R$8-F$}-{1M+cmh;)dwP?Ih6lZWwgq{YCnWoIuvZx%R{-P=vQ+XP;$Z zsN_wGwGRgqI?1*Lr_E_d=YxhVc$Na$2XQu+p065dX3>k7IzhZsow;F#{_^iE{6PF{ zlw;i}YwA8rpzzX)lo`OYdW-N{=zWWKzOWxx{bGS*O!3gKADYew@$Vyg0@pnJc%r+PfCYO(BXboK&EC&^r;VQ)dt<Ora_>cjce>gyYc4vH0(ws16>EBuS z#@u(}xL4!l8Q44`nS0?Ib0j;RlPwxA^1xQ&RXT4AAI{h*1D(u>b2V}X1+N7!qk8hK z95WT~rMH^YY6VsN=jY}p4Vx<(okj^@N7nCBo6lU zG~l@#$_S$dCrU1t#9=>_1PXFA*) z;&I_(uQXG3ZAdSdclb?}3{^Q68~Qrorcq|r<7)@gcPK}`X4lyFh8ni)kifE1Fk)Cq-+h3jXL#aRx=@fSt=f{Ek*RXVm5N{O!3-- zwfK!Z(RA8&9MR6K3jg28uaq7TKGFFdk3)MF=&X8UNeI{Acxo$oyA8V6ZK8QC{Qzxhj+Y|4;uEGfh@On z(pOGF;JcbXhc_Gg;e&>~E|TVlbbaPyvje7=Y0%HD6kIx@#k0+$Qj+sxzHr(2lz2fq zU&XA#9g}JP(DB~PCp|~UB()!HHV&`U=Q;W0rlucg=aZh5PELxg}J5 zX2|U=Tn^&=KFG!=Ct0ko7RXtZj>aF6A-(2*CGmoKhvd_}W*N1TL6Gi(nyoxhL6Z4I z3tXPn$OLu$O|>(BZ}E$KUAXSZWB*Q)3^tF*^6G_e%zZbGb2YBCsmjr644m+ddEN3YUR1)-41>@jO`&t&*U@Aw5k!()YpP49Ua9-y5`OS?*^QM@+~+k9GVRG z_XK`kQn$RM>sS$Q>?TY9$bGB%BZ{OKejqNplH}8d2I=!XZ;~~_&!|k^cuUNAh8_`3 z?rnHEw)lmn>io`z}ymEsTN&qliRj%@3?!_jT3 zL*-rOFwrhE@8ohLg?nWe1s~i!{%%wyzLHmi&Mja5kT;NRPQYD`(u46ZJ%dORsJqk7 z6G6Gy(4?0hckGBqD-$oH6;1jkGJ6{b{LHSK-W%<232*ejc!A$+2^7b%@mhw3y;9_` zYePEq+Ob)xtf8Li{hlNnnyKEQaq?j*UTYGk^mIy<9*&(F=&5&U){)4x7o-EjsOQ3$ zO#>EbX@{;HY|3y{BK>Q+%)f0g6&-T0il(9VM&tgsWW7c?+p6Um`^{2SxzEs3^JIb| zBk^Of=T6oYzmcZ}I&C|SXh*%gpp$6g#EsbY;wO1hjgBY+d$i4Ju&W|yJN3j`A@ksWqq?TJpqe>||$i^+DWF3-%6kgCy%#M_xrN@Q6N%Pr<1fY~1r2BZu zR-q6b?-D(H`BozrkT-bdytY;aY>3~;n20Jxc z&{4{i-^{i=AKz)jUlKW$l+1LX;sI=t`$an)5t9}V86@=}Y+ zd8P3o{*26GUJb+&-@;D0vQ zrTH;h_)C(Ur3XiX&ca5h>ZQyr?ReUOmCV}FXy7f4dhtV{4f&;-8i4iCsnOzerqDST`N~FCr=zrm%0LY2s6C;jL}N){wL-b$`I#W%Moqa{I)$*(VsriiF^G6lRxR* z+w0ot>{sRRwrYv5B!`PSR|uPc6D()0zZ6q*%ro%aEeS`*1gk3aWK!7EF8Tmg?ih7M zv`rs@Hk92GeNC4%Y@>KzL#0DJU&is%(QADgCxonCuD=tWog{Y6r^m~8{V()BVs~A| zU;n^Y-p;*cyZw1^tgM=E&E+Bg1K?>FR6GIYbI4wN6jWWm6rbzw8V*#YysT#Fmw_8D zv}OrXKOuyIIzN!>%vN&Zb-?l6w(N(e zE@^@~eM-5Em!7QX3-&Uq6(4-Fg)7Bd@f4#*PNx@8IcZF?(vNv`Mw(fQF9Vd_20Y^P z-AwPmDRv%RHKy^2;HnzF%g9$yJvc{SJ(%wrd-VI;uWJtu@$(*F=A#VLrXzSaz6~2F zPsnuSg&&BkexXIX^j%s}?62T92z!e}37SbpCR^myhhhoNKL?su?8BmI*Ays9!#mTzr+L zd^@{YDBOmak~5#Z-&1BtAG^{Lm-;lO@>!6;RD_`O^z%Of-&jO>eSy(cjXG$!lKytSJB)GL5kN zEO^#e#9#P{cj2|iC^Zb@n;e=I)AHj|8}^HTom}3QT*mPO6UIEZ5p(Yg8fD}>bBSc9oPkdb@uC@)YWpo zv=7vFNsHfL7F)49x*r9p4mHbuSGg-kq2zABBVznRsz<aFLvDPZIE#@arXn@AD6g|c zm7{%(Q0j2{G9=(bN{HtM0%atdbc zB3^&Izn3imY>CSRNXt9as3}OVO9=u$$Um8Q7?VZs-vC4(b~?U9)4|_ z`=xPt=p7TShxA&w_{7}NvjGAe%7z+m9B+bE~^`u&ptz%J<0b;`EXr!%qZLR zAyl}?s${ioDe9`_@!~t47Byxki`|rp{&$E7%Rb>~{`@gfVlV%X;v}1`vl-Nx`<#oV z!Y1E`xP7iWU||X+nCed*+n~<^xWnH?*pJC=)Nrgz@65zK7ZZE-bw9Ra=XieZ^d$G9BCF^334vu=t#7MQeTW=_bova4<3#1fY16 zLg!6NRk6%>sdj4jXppfqi6#Tshi{32MS^I5B5=RV7J4P1NCD|^%I;*Y!2hBBH_)y$ z`p=8<cG-@f3A&34spxmb&j$Z$&@P52`;Guh*oQ4Eb~*> zzw5{?+T{BmYfYW}L6-g=Ynl;-%8i3D&g7v@A7<7_JSRdH_*Tg6$J8tdU8m&*_IcXs z!A1J2G|^ywqTs@i-Vph}u3>Vaq~q8NR+7_MY2spcY&UmNIg>%OHLER|b9LYw#-(|f zfu8bGY7HvT$m=ZORk&@ggKE%6vH*yNG6fl|giCq}oJ3UO7gYFYp3b$a{0i{kVcmK8 zW@b6-uoo?BtHHE;LQZa$K!QCd?yC?in9yBp%%%;=aMV_FqfyV4-HX4Q=X3p6>M0{f zUB9Of?7llEqgiu1P2*`#lqFRq5bHZL@^EbQwtiV97k>85|JoXC3$cS zCe4?2qQf68DK!-{=CJ9>DTR+6g;pyzBk~ES??rT<-c{)3)r9e7+lcfx&Jar zsy2f%g^YaN$-+M0L8Fl%(vSUU$K|7L@*nu8!BiFTqM|U=)%FMTstV z$C_bop}!}s9K}x@yq^2)Js50rRyR+Ewjef8TTEE#FID`Q8chv3JJfHyp|hBeRaZk% zcR%nL-aLs6I;>qthOr3l;f+310|-kqWzYG8<0b3v8pW{}YsTG2kO-f|nJ`+0Sh8QV zqq_JtYkG?kL~DGEZg+4LNfI>U6Rt{8y(yVGf7#*iC?QIBri=d~(K9h9eH$d1szklGR6Qha;sf01`m%-G+!Dw0JE z$JT=YyV7on?js9B(Rh&!e7j(z7z6e1DOE-!8`RMAGC6yZXnOY(dpkC_^NiD07 zelmY7m;DuY@+aREg59oyqWY66WFuyLp-{a;1q|DH+4st4XnYa|9uXvVy|0T40ntv} zOI5a=(*<04XL6+rud|xm&(Jt-DRI-aj!rS{eGWz->YsLIwTzHMLlfQ3^T+3Kv(v6S zQv3^0s_`A{;&63~Z7trp;@>R}Jp79}BeD_;{sc=NW_ZjZ{yI*T5G66vAR#L4+H%j6 zKj*8Kj$OIWfPR^y6kC5|Gvk&sTR93!Qd$aiHHT{mrD(FXhvbfXTkl@wer_DdS_BJ0-ZWLZ7xFKyMbN{X(C{d2UjV zX96iBXx|il>R34&Xf1pkLeZTfv00M&#^*wRK_$ssC~pVZ(iF-RS(Ro@Gs8gVaHb5~u^#BS{S6%zL0 z`ly~>m~!TzaUK%1p|EBrPXIYE-K{N4nf6>lc(EEa!RLz{lWt|G2-al^N$jlt73a@0 zU-~i+_cEy?Hv^BESg(9$mkU4eWhhZJ5xWIFw5l=l(GTdWzdtYV#u~mNb+0XM0yZ3t z@|Egn$`3~NGwB>dftiKs19d~MkEM5qL?mO}Z`=cXpYmZJXRmCdr8U*G^I)lfhm@ru zy0~9gt8(K$GrtA%uc`E8lHbIlH(1Mh<|nwJI=iB+cu! z^^%f2gJ^ouRSYTmmB^?yRmxt;UaNhNyPi1|*6K!6Q7iI@J-4M6MzP**J5XR$?ALLGZKnO^MTfzO z3jQUxC}-yF{l4SrK9@m=U^kVj8TgY#w$2luI86Qdo3*U4-@?6Lcwgtf+*j^RslxtB z_J3$}g^si<@)Ie!tw{)l7S7<9eqD({yMH1|!KNQ%q`Sw;KPl>Q;KZt*YMb;hoifu| z&O|-ip;Nr`#PQzF+IJuouqJMjo9nU3P={Vh7jCTaqfB zmj%~OmcGX1nG1gseOO`rAxo346lXMw3TIoRT>SucV-c2>BGfbq7oRNV-_ZKAIP&{= zTI06~Goq}ZRyn@9%pb%QBxK_7LiTexZJ-Rl_D0>ld)M5GrHPz~Iker!rN_)Vf2-w; zWs;{k*ph`Qe$+166=#8a>hWPG^6G@QBfxq$?N)2PZBY4>o79bsA9ziWaEu9e@$y(kB!v?a8fKMNwSmhB@%szBbI!Je_N83RG58uL8_&8)4hlaA8CN**aQ!$z%F zx)Mh!a`mqxiHOzc*~|A-Qg30~7M1A}gBYICgX{)cn`tbAHyMLko=Re`oz#(^O+WMF?y{+oymLotcZ~ zO)sFn4&Mr7*S{A18OSbQRmvj*dss_Z+V4Cd7iguNTx`?J!yGIlpvVXOQ)enA!ErAkZxvGP(O5r!K~yV z!&*_LCRu&ac5PU9+GD$&BEN7eoLsV#3^c%2>l##asOlbH#vPfAbI8lLOY2~TYmw1h z7udB1UnPlj^^4K2zY{5?R$-)t&!F(Q%H2tSHc<@7{3dh37>lCG82HkI7i;FI8A*5c z#_*R4S3Ph2>qt+>b~eQ20b{;tq>HEdJCu zH`7%O2iT5Lr+V3H6G3f1MCYXs6Tu%@jK(_-^Me>BeJ0);iyygb@GMdGr<3?s7E42N zH)6VUj(jOw336f>H$*Q3VTrTmsyP^|1jpdd17t3wDbQM2B!3+FC2?)iCu(hEldB>7 zrKTlUVFwi;=K(+iZqKZ~6IqO&+8EI2f*mo?E^!$e3g4vA9zx7%g zCtvs`4~19y&v$^3>dtIDTmka_EN-fdjK8VKL9??|omb{7!5X1(6R+AhGrhhn%r?|= z_n0n3Tu{!MYz52%+BPmReJ(|VA`Bg~iF`I{r&xhI<5ykG4O5N1syXQdu2~{E10G#F zY5;_&E+L$u2Op4;OIQr~*&3K-pVD)ld>NDyTWvJh;Y`!3CDTkN94NclojRw%VHRHb z>o6s7^GN+b8&T5rI`af0#BR{!zKPsim5rd5U6QqM7};ZH_r>sY9(IWLb^mS&`Oi-M zz8iPcD`?g3ZI%%5n9^-qG6EQ|k|YdLl8jdioYj<#*S=HCONvroxAAiL`Ch;*oTU;z zbn>LYt#UTdpoY4!F1YMo(Ah>UJSnumJla!6zQLfh$t%yHykp4sRh&KGw?3aA?`C;M zs*_CoQVDW&JlGEh@pi! zYWArzN~Y|RiPAZ*)VCXRs`*43BLxoX?#j*PNOjt%;6Ec(T{oEQ%A;H2vt?-3cD!X- z3M{3g{P(B_6~4R*A5SDmW&^8+Q=W0KaCgnqUQPh=7-orqhK@oI%rOGc7B)Kxyj@3RX=ij~fkH@%Z`nqnS^m>)u#VTo;C2rP+m23%i8Zt9d zFjN~ZZVe^rNB-r{Oh-Q9@>-47urw`Nf%yG;W4o&SS2F$$YV99CR_xJI>B|h`>?BZV zGU#l{5bxdJn?UgTTeF4J8yglX33uuxopH_Hm^sUYS^l$L*D2?Ml~zCPAuTAaPoePd zXHn-maCW5k_L~LZX>>|v4`g0k@o*=IRFI`YzGv{a!XAW0n;TFQ&wBUf$5i{>g+%4R zxPoa<3n|>+VcuVoRrrVE2`TLGHK}>3L*Pw4lggT&Lh6a2J>{8u;j?N`)u=VwMNBJ%45IzU9 z`v%%(34NF_X{(Z(`FE4)VM#iM|9Pyu_rl%kKye+*7R_HKAzV4*Ze@pRE?D3MqEG|5 zBRT_jiH9&kA1WW7sr>WcVFk1Xlu_N$Vv{XB>;ihQvqI-@cN8${`%{jg2~)-1pch?F z+MZp8o8t(36=Uz0@UCC7jhVhl6lzouQ{tjTq0KH#O8a>!;(v+|L$<8I;vdjD3V3r3 z70``L#^95&ql603l=Vi2v)Up=;Pe!h_L-z8BA=!|7#uE3tp=*M#|Wt<5vF zFT=5#NAQaRY|%+HjxecZxB<#b30{f(r1~+g{8()20_iUNaz#NjcdF^8Z+@yawN$^9 ztkN=8t&AN$l5!PRc=qX8rjZc3%wnSBR3KTmr3{{s;^cZKjE_aHf;6G(7|K5+o#XIu zwA3rgaur02$SkffN{_yD4#Kb>3;>o)On(Uy%J@j$F@%!a6#Ccw^F(loP7VNiAutB| z1IU63_PA>lNV>!GhLwJBzMn7yL!I8wnekw|)Lcp?rfvb|WRk{NUT~Lrz$09|HyVc~ zkx*TLkI;arduAsAb9(#niK{<|By8z-tKvj<*4-`q-4e8am{ek3L7`P{b+9vee8OZ{ zwe3}ruK&TTWI2h&Jq}d+-ApqHaHWCS^L_3`(7aqQv2Z#1~ zLGzIfD|QC`CL>F#`+pK;D`R@xPO)l3ZrGM)B=D>4jIR+weQ$P%nYbuEMa4@SRyy*n zR;4z~vWrm+n{yJ)!%c>scB~no`J8IQ;=z;J$CVtpVs;QZ<*0Sol+xIllz(?P$0a_;!m)4_)J#_MVnK? zE7zk~@z@Ea)TV9BVFm8ArN_+fPpy-N>#sk}Y@YUNSRHXfOw<9Me8_Z*{G1fzHw2&S zgE;KX>O~5nu<*e_wsdr#3`N_Fjb1@b@{QjR8ETtcI7-%D9(nWossV$dz=_k;nZtbM zb{LI8l8MZTaM-Bl3aM4@g6e06(X8q!AmHbYh?cf0A@dU>AY{o0Qy+-?J24p7x9|1uaz4`RDhlbWC zp>V$E_G4Qp6&&fPmbn@GezK1Lo(-NCnoL?wO`vCqAC~;hx0ZQ{^J~z|Ae38vH*x1a zRva<~XlVTxz2*Tof_H4y%IB!SgdGO5N>M@GIY9D#+UTDGojz|Wd#C-lhn#gc9E{TT zwG_wsOmL<9r}rrkr<_**&NJ?W{!SfFw)t3VRD8Uh+5E9Z#Kc^0IlOrp`K3%j0$S9( ztWEOCwb_JSw^aUFdqJRG>QZ_o%#41J@4qq}o@l9z|Kcx| zmo#q=f173UpdKi&3T^D{FtJE*%dpwzebZ%DFp!kVugyjR|r7u$Dct)B0`wMwI++6-{OE@wE_gKmHW!wKQ`uEFa z4(}+>j32FxNY}5>qYw;!*!0sWe~rXx+W+CSQRqEsE5IECtQ{)@=MKtJN@?9o&<9Db{&?h9N(1M)F-D9=KuGgc*nhX4Lo=T4%uswfR?Jf(g-%CdZH_*n^E;{UPi%j@EVI8TeGQ6l_b zap>g{VxZ4KLbMJqn0ZHDP%mk7C{`Y2?#r^Z4k2a5oz!b`5JID0A246n8b&$1gV`#} zY^1JMeb9gJJeul==)Gv#_GVdBz#ea#;)%&0&oS&eFaSQv3fDO`)le|^npKybThjsk z@GQ???&4LBytdfU>qP>xtKBavlSPe&gSEAdp~k`w`k5aa)f7xzIA5lc)DQ$?*aG!c z#*a!+FF(#tpLqsY>00r7U`eO7Ziq8t#C^*)X_#YBk*fb2AM@czD<;(JpYFO!Ijqv< zYoZ>KW<>p>r|6Nv&{8!w8E$U2oy_4~YCq^Jj(fBoLBhE5#{XnRBDq!-P2gqg;WW9n zj$5U*{Ax6($Kjv`wiAvo_k@WeC_hQfFk1p#;lDHORxjXPq?RF+-nA@+P#s52PmyK% zJu6sW^|G+)&ec;1XhCkuneo_bzro*OECWw>S~z83uhi-yoaPS*=Encna+BiEyAgFjgQINcF}kTqRvoZuA2YOdcXnW1k}l zj{@^NyUA7{W~M||mg3;yr-1er=o=qP8VwjF_oCt>R?Z*lMW5}dy=dGHnS06h zsrwDy*0q|ntz3IXo;w|*=)M@+xzf^K;#^MK2DVw}Lw&9Wm}`x{Ob2d{sYwM=A49)l zJP({~Qd$|uMZq!!8x{w)*Bg+IdgKb*x@{!L7z-YwWE1goU(?MnT#^N-!RBdPFE$_i zVON*rPrON3}xf+V)S8)xiqv{!c9){e$00DT&tXR{Wtm!y?)#v}>-c z$U9SufB1K@m_vU z-AMp;RrUS}Z(nji6N(VM%|!IG{+RM5BBN9bh;(^~K7RigYEo`vQRb_5L1Apr|Ju?hu|!=+@VOSXm5LpYBxmg7P36HgRnVA zqd>ep*VMml&WQ=+*N{0Ot7bBVnqdjdzOp$mHva=#s_^Wo`7sYrE}z@IW?pl?g#Dy< z;&?sU-ZcSzv_y1V)EOE*)@;vnv`Zm4>0^>0^pb8nub;I)fmGFDAYCZatP90J1aa;6 z?-n2CxzQuD#3$~IOB7b+d}(j@dn7)qZt|jarGUtb;y~Yj5m?OfuZsdVn>f`GCvu3s zwrMV``o`GAVVLiT<<3J!b>fjLMaSi@JAHZJ8=~1PMxSOejzWLizhV%D2W}r3!`dj$ za!3YYA}|V7Gt!x~p%?As4lUST&@JL$r;)DEI@51*x2~!*f z$EQu&bWQUP-V;7Y`HM(hH9h5KRC3nYA9r+ad_LFeg(CLRMCgldDH}Ui`j|2YCB_aF zzQvRixQfW`%#4l&j_KG%fw_;ii+hJQ#8?+MFrh3dj~RU^Y?b(3h=1LL3%U%P!zSq~ zj;>%)Qr~@f;CjNxoNF!tQPoW-$CH!rQMR7JDl-*a#hR~7J#nJgXEeXhn4DDCcBefE zCaW}h%>&sK<2Ky;ntOUcl$YG_sV%3vTNqdIhSam~XOIie?2!QmiNrtqkEu}-jfEM< z8)%eSmn{Agnle+Oy@!2EH$Cd zHLiu^=(n%n+}<{SOZHsR`tcY6gZ=n+ybH1wS=1C`!#r`(+W$p(ekh19Oxd}#l^m7Rwsrys{Y050Q@ zj$C}~xYpqR$s=<>$>8NeksWQGd@Nu%LV4HpRKd{qmJQV#S>T?%5vw$jG8iP3hJkr_ z&>-Sop3Ye%MgqXn19x1Ou!0WtPMzR*r&_@nz8}E}3vbsQuX$mLgtk z&D8oj+q8C*w{2O9kh2qh|Jeqoj@2N&tw%#ytND6bv1%%*w+g}J*=h-ldRE4WeN5tg z*57N-0gHhK>1XY~C+pSLXwlYQlT80S+|)2Qe4au}IA#wlH-E~{;>wwk1xXQo_wHy` zXfn0ec*9m99WY74V!wL-GJR1*v|+k)eEl%OSD{sj2Ay!lC<0l-7!XuXm8grINnwu_ zxwYG2?ODp+YilNRL`P!skFAIPaPgf779|2o5*-5OQ8Z=0l7qTpG>!F_(&lnAlTdGi zCtvRuUM|FHEyWTOoUn?Ed+vjjRnnu1`kMSlk&8i_^^9RPhojKK;b}JxX%w)_o60p| zHR|k&g*wt;=KHm-aA{A4rP8| zGX3&bM?C;2BU|CD&loa&q*#-(xwh7LFc<}qA#NR|QbeP?so>jIjvm8ph3@d_?)h0F zcT^JErkh}2k-K88?8bnoWd~krZ%4`wY$O&t<5XXrwfx?HA7uD<8VSdB6NTan>&~h- zAB3A3D=Hae3a!+ACxv#2oCZ|UlivzqKmvG3Bc{xrqALh=k2=unh9ilOfQm}T{po`0 z0uofMOfeaw$cZ8pm4whBO)D1)L$Xxggo7CEAO4T0>FZ?ei})b>NvDc)_I2`p7KFPg z@t^n5;|+Td4=3s+!NU`T?*$Yc6_o>Y!lpVBhhG{{}lVF^U z0(8GPsTLOfuZaZv9E%4z!Se` zErI#vjQaGrGJgC**%p@N&P#LFt0}3i?nWWuNrf#x4jW9$t-mmK8`$1ls+#M>JnRKC zd=G7=l-{4V+VVt)zyGnLZDR6udh@^CbYt7^?YlPtEoJs8WDTgp$CbAz)XZj8;dt1f zGqkP(UVpAFcZue4sh}WN#9$yfU-c^@Mz86pOSB8O9vyuOKjp}1$3|t4(6#M3{;k`O z-u}K};y~4(@=*M9jt&mlvVy8h(YGzKxR6!<3=COiQf3(v|E%2+N*J!{d~rXpMIpde z+l{$nQkn2NFF0`$A-JGTX&v-6+{M1eZ-lGr8l{^#6omwCVjPK^GAIQNC9Ng54Q6hj zbUk*_OSnpA<{3?Hm>RmFN%GL*8ArFu><+T%nF6cb8sv`tiviD_Q~?CJy$!BHWdzd> ztK*fu1{Al*GSyj~sF$a`5)p|vky+&l3M6xPe@0N#DRN#GhWuopZ@2+Jdd-SfMpn}J zId3LyeMp)%HL!R}ELV#fRS&mm%>UgbN$Cb+h4Jz;JQ5_0L3aU4cAxRYb|vNAdz&^!AN3p>syI%rS0Z)MW*oiUy~c z^?JQ&G$)w-FwUc!2@1uIIDNHATTPc@eN5@!f0PSAY@RuQ<%@ggnE{M#lbykoICX`h zjS_m~N8R?h5IZOkb3xoMAt#6~(f|{#i&XXZ{E^v{6yH4IUK3!%u1KVqcBf6reNhVm zOJrP5ukEs+Q1`^WdEW7s;u^VP#W?O=YvQ5`Ca8ZgHjDNUr~RV9b$BQZwLL{9zqnkV zdQe->M(e-WQGRSsp|ucYjdsX0xBln-jcV%v(Bd3Xc};nU287CTH`;?p&B;^#V|nqt z-+@)`yMvqoT+R7n)6t}?MmlT>qblxe%f}aE$CTOs4%W@=xFr#Vde{{4@kxQ=_fkmF5i91e;UEC-+A=mdkYr$NLUug>Y1RA$T!a&#sQKPA_19u z{hR8#I`5e+{BW(l{qHdm<%Q=#A?T{hV_I^Cmt7Nd5RCM&2JjH`s95xl1uj6_FodUe?=KZ+9OlD+ltX)*Pl zb~DiI0I``hYTn*%@|p$wzIk%kmB?5>nzF@sISlPEF|k5iT6shnJQJhUfE4OKnhm-&;*Q-d*hIA=c=e8r)Jso%sIp41*;_IZsi-jd)q zs<8Lsx=*AI&$<$B{cmwEvlQ!Qliojv{u(tkB2`UDl3_IW;;N-K7S2d81(8%P+E}7z zV!flUnCBx^9|)ZV=~k9i)=?CV6i7y5&f;o{c~Ye(ir-IIfk+EgA91a&>-N(HCY>hV zx?fQn`A)@|Sq+T8Oru;dd;w#8gj&}Ty#52g*In2WX*=Ki8c8qlu8x8VT^o1gt0uL^ zyKS_w^R!XbRc)=ToEo0n@XhtIxkGh zueoWd#UOopbIij(j$*e(AyM-05xy>&hwG%YjQCjF{{s2w0>R#`BEzyv-}cZ5Mu(-qCJ{u=gfg-}9czh3U`!7ucLt`n}a$3V+lZ^U@O zreByGd%a4Ux#-v@v7BcmX?}nFU|6cO{O25Ve$vQ!SLhP$>YI5Tp2tWowwi#2_8r(i z_fIQ*qC}B%i-#!bkFs2+E?@2pJl>%*i=6rJ+6@AMFU-Yt-Uh_{GWA)FB?qAXx7?5B zLW)SiBBFCSSz`~4Hfe!bWnyXJn?`=kcBx#rd;ecx%7$3piy1 zjq2C#{C0r7yLHsbPE(!N3;JuM75HWNYg_Gqu5Fr&CCJt1IZA_}(6;_j4sDY9`Pg?cD+o$2y-+N{6xsZWYBux+b|LG5mg2^-yrs zM_l?fcKC$=Elqi}`dj5qjR=CfnJq%nq*@_VYSz{ph4ndnkERm283TMEvbY;OH&cS< zgK2MhvB;oSFlZku84Qcp37zdIkszeq-4@Z|P;Y2NUb}siq^}yL#H6Z+^*2ro8%dnW z!^$sTu!7x8IxdKksTwGfjV44C!{o>Jn2OcJT-iQcgjE?+W-JY;o}!)ZB_dy!Em<1xHv!)X8}S za^MV`BA2p7IlY1_lu_w*{Xd_sB|P~d&I@^D{?nqF(zMpl5J|a^u0MNYWX!lSUjxF6 z3v*W}yI!WP*)mpB%n%4DwgFftK53)+(|tRBo&C=Qh=N1VZ{%q5Bt^M(Iizi zd1w1?%MUH97JpDVf+R41L23O^%R>4uNqlQh@^UvAYCn-T*ml@+Ri+J}Z5IOC_|Ot0 ztzv$iPurs=g%XvvB&{vZ&g`rzMG_#(bfU_YLR}k6S7K&|Ss!u*tE~Kpa}FEUaIt?) zK~}t)^DP?10_Pb*;vp%_mV!47W8T@uJL%L$)L7cbQXsCM&<>N9hn3xX92++2Z##Dq z9(a`9vT`g zTI|ZEb_ng<{VXAdcaxVF3Bsmiq`A#x zpnEn*YO(SDT;%qNY$@95wcCE&J|gIFVNl=mLpKQ)yaW>57(<96tF5tu!gS+t#K{ibur4*A>N){L%H4j1i1?dU<-O1Z)O1m# zSh15133V93V*vAavkq?WW$KD39u^mtJv(`CQn0+M>E!V4O!@tju{ElKQ;*MCBwVnEIrLfuiOE(Y_z?2%ISx z0Lr){$v?uWR0s)Q*iaLrV4X9e{dpz?{(k%pmIi1XRRMZ=yDYage>1qhrmpqwixws6&N&al^Il&5EMfn>1ocWsM~4ATIe2rHu= zTN~5`LD~&^PHgjU8>oMFr4l4Xw#hF9vs<_d=LER?B9rYl? zVnX3Wiw&dyUf#AF72~AKtugq;oO5HB;ftVn`a1jK*Uec@nPTr&&>3IMlQKrC%L>~l zrY3muj4~t8OM>$ms5f#~tcoO)M*fgvQw~kSi>y$F z*tE)W7)7{|uY>_{EA3qdp6STAP-PvrU^;d)^CPrIl%2SW&M3Hc>~30KG_TXlo!{FUS@K<{opb71 zZy1T6$NG_@Fx7bj=;Lh0IEzTL=X-(uLA++qxCo&4`zf!(atDoV9WtLPKw;vj35%m{ z!?h?mM>+jAz!R(C59hS79f7w4W8o}s;^=GVdT zia&g)xC?l8o6Xl9C)DR~UOox$z7%*DuSq{{(MM1Cf>R0X--|LLTEbHSW%7SJoVdD0 z>TH&4!o@p58W*;+c&N4^c3QYnVo4wweyu_5b!C&ztvz2anl%ZNIg)FK-0+zO9*BzW zT|!-VC4cXLZnf`zHK5@OB`%);JlP%%s+>CqI=~m33pia|5>^^)5R<%rH%R2^Ey`4! z6Wo&ngOmvdO0i%gq_nqQ?hru2c0+&R4ycmexMq~-yZL~G8o6bTJw*jqJD~95B~M?~ z8RDC88>ON`_v)>TiF9A+RWLh|_k!fT^z3-d`>DAX zMg47P9@Oo+oaIM|4qAOb|@EORlz4Qw4F#s$6 z*}@S84!?>J3ab~ga+iJyS{gvQ_6zlZ$^6w`R|=|PC)lhwH$?|d1|_kO|GnRjEn=|+ zw=$aqB5n#|o5K~uz^`baWM^2QJQ^qy9c)>|p|thVFuQxduS+y!GLo!98&}supzS=Y z^f|iC^$5bsAIJGT?9TQQ^59Z(Z~x`&)%|zeZvj*TQ=!D+vj(;KBmiMLDKuu9ef z@Ab~3R;dB7sY=0dB0g^gIB#s#^+>3~_UG^a@au$s2Uw{)oF3t3aGUcSKXnX}Y-`^5 zdya(x2F#$|(yL0ICSCd~l)85v+hLc4sa*D7S8?Uo7!&FoOi%$!;<{v=Vf#bq=FJMD z@D$BmhDTL*HR$#E%0DHjKsX)-)pAHDxV9&fC>(=Y3^I|I2N*A z?NUc#a=Kk!=2^Zqv2^qvvK1I@X#+E?m(Uw6~a~MjEf!{+t^v*$&k)+v=Rx*DDhEv z>h^Oqd7>x{O3^c7D2SODz$$ogT z>XxBh)6zOtF>d;0d=ArVE}K(q48-;`FHs&vH~AtcUBH!?O}DUlO^|;j+Y~ASwr9#6 zBS*DG1KkKXR_^$>65e|Eo+gL^R?qa|9lFfIA^}aF?msYgFLv^Ai}rO>{arDL2wB56 z{af!pLJyCfj3usoo3(?*o>0G61+IrH;zfXSm@gGt-h+IU&uEUu`y2io(LWAm;3 zUtCH1lJM!PB`t9Fvy%C(|K0GzL4LC{P->XJKvUi?us84|0Wtd;c@SkM`(r3P zeC+}6k{kY;QL>!pR{dRs|{>0xwAmrN>kgN|4bhmYmHfJv7Z=!iTp1cGs zQ^EM{bZ51-j#^)@{yuZxGe_pmLSyoQdhXCG{v>W{pC?a&-T60>vX`?hBx6I*&sr*- zXJ(_60(wfMcc(X?=c^Ul_K~f`=S8hcpZtvHpmGGUzJd?q;NfEO&baC5v#okrd^AIa zM)qPZ19N%_9uf20@5Aml|3vCUN+U3r^AIXS`gzff9@DiL%e@F0p}N+mGb^v(cW?*d zbIcvq3!N>O86bj^-HJye14flmWYaC^^(3a>ns#BgD z|Hfa4OUDd~Xa824czq>F4L?9}ZfVE-cE;3L=~;Kz{Y9po`g=dj!Iq_jltOk=Bh#n5=JAZDyjFz6j0mI1 zVb%!98*ol=l7VOV;5fubt*ZnUc9&iy*+>wGjS|=>f6u}kpZe_cw3ysm z2_*ZC2r@H@g~F^@E{Ikn3;mLoPr7QWS(4U1Id?wj13c0ME92id&75<$s}R`t00g4n z!y$`fxA9~BL&reCz=QEcLL)TFedEh$A?N&<^eo@uH+ke*kXXx_%}Bas?}R%pJk&PF zf1k1a*4*Q5UvnEUQX4;NdWJA=BX2Z(a3Ug_8-kkIcM4QCpLj?k;!gAd0=q|#-=6AD zt{o1U`&zv!=PmV9D!lVH{O{E66?KpUYuf}wxAh-o&K=$N*nFP8xCq<*F>mx)_tY9e zGsRXQ2!F2scz>N5(0(6MUO|KJe1-&^hp)Bjg@;2&(Irnr%7tT5Y@uuI&*$2^KC{1R zD@JbkI~F+(i?xd{H@vet2VaUk3817Oa-LH1J?gc_-jaPC+r?)zDs1`eqwlXDapQA; zI(+8yRQZgU&U)T)^?BSH_j$U&g*J&)&L4@@2lFeu>ulJ&U*cZK&XY6qb3b_A20DwS$zeg1b zcC81N9}Y~M}18U96bM6Q>~7*EuE7JurZ=>Cj*MvtBBXZ)GZR^5GI1@zC( zab@>DHqtA}w~H|w{_Jlzno(xAjCQ1V-B%jzY-!Z{bs1&Qm0g!mX-fLBjXV1${Qng*e<;7vJe6PZ`&U->x%%E0t&{pE#(C6lP4cSbw`O?N=G*RVlOLPOmK*-qL2NWn z?KknK5mx+pA!LKc=l2El55baclAFM{bp&krRK`y(pWM`ubMJfhnfj4MNY~x9*P<@wL>?{$f%6CC|wpXF1=j z>mMiqd-?mMq>O(x2<$a^oY)`cUCP1a@mlE@KMw*6_$T#fP`#^s;B}_Y#JpJjXFC35X{V5bn?;+|CqyvHUIV z0>~$_TOD8S7tO9^BDh(`J4$@K1H`l5gxe>BFUr59a5p}6{&89N(^|zrd_20^IJL6j ztO&4VNdQkpXqv1Ph$m$O9?KJM(*vG#NVpxg@mUkVWBkVTRr2rhveMmX3O2tfaf995 z0_-LhU}yM-)9w+h3P|~|a z^|!kX;?@A$^02{)BEi8bChHx)kcUM_CfSpW;#kvEY6(!tu48G1PYudwR zNrA@2gNDso1HJ1u$-5FG?yLvn#ybdSo{7GeAHN}-&72)N==1Vz(HC=$?}UHBr#j^@ zdrfgZd-02Tx6GGSY&fgZa3ZS7XR?HQvVbQ{nm%)_?r5e2u*m`TM7w9YWu|~~xTl1; z3zMNF#0S2(R;UU;lYE^ttA-IlDT@eY_ z_Je3t#|B)Ru9HBd*O~rsuy#IBCGi7S z_kk+tqW7Z_i*pG``{0ydR>cRWlCGup!D(35iTdEQ$zQ&Im}Obfq&1R$j=70H#@yh? zn2Rbe`fVZ7JjoGe^x|5I_!wrlKn_kpc^6rrndF;$9EcRn<(x7ajp zDg*Glfg>K>BWL_+ht+Pr`YQ+NTl#{IuC>N>SG~RQaG*0+a zn`KG-no#nb?2k#Ew421wo|D6t;aSJ^BQwCKDbD%jB0u?;aAzJL8?NHXzYQmE0&Haf zwrv1*5CS}!a1I2`lhc|eDXrmmRxydFrIS|xc3J`0*#lq)Lc_@g03S?0G2h~eVX#VK zwZ#*w0P~;|lg&P{S2Po24QGP}FuKKfdP~RA3!eU?4>`yGeb&4BbJ`DpJ^!$*;&Fe% z?Erm}oUj1#v=f9M(AY2}?tmeDwBP5NrlIF524qRV0DB^a@KL_vG%*A6sl|jlY6y4O z0G_xZoUM?!0r3>e;A?qGu_S!d*^Qhy1NsCS;i%;VTCLT@S+h)_0iH-BoIPr~`tsum zL7+(tHa$V;#;&?OTt|f0Z$k0GyIiC+a?+{2OPkn>WSi`Op%Z7 z1$$ZhaYFjx)-dfYsFL=UaEENOr~7PnpF@(la>4=Pvq%-kImu}898G|ZIhz1+XNibI zm=QixEp2=`EGAgjI<0Dt>i1HR333bp;<%`D;ArVZ^*ne5@;NCe^64GWv; zGl^0F4Vf;jNwTkLI6WG`j$VLyNPnphq|={)WpkL(9+`<_1`kX z^jpO~{Z_L~zXdq^;v5Dvdv+55yIvQZrb_v4t3FBhf-BIS?jyeWxjd9$#TLN!{=iGc zyV?5%Ys?LQkZ-U&7scgAgReTem>@296uzz9&BX-8N1L*YH#{T1s_94y{RWRAn?{~Q zG{R6FMIOeYU2zvqV0Ympc5mz=zS`IOI)cYCyN|iuMDmH7at@c-u&=7S%o2^uEa2%l2Vay= z`EB}?U!rmO1#v%`B6#9y^Q9!QAzyWIwI&wKDA`IzdL{8r638dJ-QOSaxwzY2dHS^4 z*UhZ(ef9iY9bh-J#FG5eEZ#7pxa|eX=!}o?1LZY;lussTb&?4Hc1(gciAlm|R=df3 zuMTNO`CU9Q3G4~VR?^KZu_w$xeAbVn3`R|uHBF+d#V48wN4LoaPReg4NHa_DOtqwu zd;Gm0dfZaY>uE)v^7{ArwmO_J0G7l7;C?6!G>MNMG~od(i4PEWcmV9^0NDQ3aAE`C zkuJwbY=Da1=>fZMj0hIZl9g_WnI1KD4A}kH4rv@qKy#pcVyVRwN-%0-3B+g6GL272 zK$#S*W=SN$pb4cC&%-vbz(g2`KkdGx@rke=bwZ4A#~9%cXIhpuCnq329d@2>Eb@7F zpc{l+2NFlpVUG4!Ki7~L7Vj0gwJFv7`*SLS*33V9^VH*`RCfM^Yz}BbaDTnZ@RNO6^PCNUHj@K;)M?rQ_gMn*_+|m(52GzMo`yU0tD5P!8=oXt zkANlz(xV<*fp9M^&{#=;ZF$3sj*|ibwjX57Wvcl;1+XLoHcOfwVzGTed?vc9=rg?0 zWmP>15bTl+X!ce0BtU?9(4@asQHMsO`O2N7*wX4%X`V@mEuD-A@I%3M$mB_oeysj# ztF&LR63L#;lH_T49W%KT;91V@?btz+QGw-PnUhgl#U#{bNj?Smu@dWql1)LHO`fe2 zNRP>@@+FsAd|is9Qh<5PB+?!;d9;0h5-H)%bVZZH*AB$#G22@v@0RM5c7fcbu;C=# zCP~f(_-Wi_9^hCC^qC$g`CN+&6DY8GVs)=vRMF`nEFbsL9@~ zW0E&WJAMJSeSw5ENlu3eW#>!ySbf*ruX+SslGTAFX`S$)sWnZij{It{r0Sk)QgvG< zshU`xi?^{q=DIFkay2OLCrjf48;xVWwMnvW-IJ^Vek|Y0o%9Rb&JaNI&}5yE-&F$& zCRaCia&>cOClAukC|wm#vTh?zvM!oQ$~EXD-<;-mcTn723@3@c}4o~O~)adYem<0kt9f3kn8pT>j4X9-LFJRYQBN6pe8SnglhRxHwBG=; z*GxulC8s}ZWhSQ+KKz>v=Fk@C53*U_3KOWJV!A7HN$=otS8 zajyo5$NvdGpm)`dl1nDJB`}EQF{f2rYk}JM2#vH%$N+s}hVTRJ6E!67umRkaa`07u zS4zYkA;j~r+Uf|dh!WTTU*4&k@B@~_AK?d9O9Zz3gkZVIL?DPK1PONx5WCSAZ||p9(VqTd&OHzpQVtvTXqsZVDZ9& zGVZ_$*J?0sHwGT}ywPU0ye|xpxX(KfKTy+06`^0f-bW8aQ&VH7s{Uq;gKjA4!y|mf(qdYHpf~_wTOtcYh z8`s^2iMEClYyjH^4JXt9wgo_ygj$Oy(n$P>#!lQc3AKh3X#m?*0k$hOoOlA5HAytV zgc458l4t^$7cQ{@s zLwO$$eUP}9j&M6b)1ZJAj9MudC_cS~{H?z%$XEBz;;-r%eOJ zeab--O`AsYb{N33y&;^nOn(L9>8}VsSk?4bHQQ;g0G?H>;n@LZE# zTAOsR06Q=M9>Z))dQ0enivA)6O*O&W?1^2VN$?VWuzU$fkWWAojhDp2zDG4$yD%u0x%VvaGR_iFiZt+IQ|YSad^Pv@r2t|n?4>7uwxkD z0}}ffj2V9?eB`$rcJtkl47%j7TfzfaQXvT+n%xKTJ0_#$%Ad&Tx%%4_DE?4>%~y#h z&?W)Z?1?9U**6kREuBM4!|Q|+V<63TnHVeaJbr`uPw0WTBd=jUeH)g=ToZY1t_eND z9ea(ZtJVTy5kg!ZJoutdf)(YpAc)JDgu8?izgug>H80_NHg~g3@Qk`kJBTB_`hoYf zK;pZ;f-64UT9f$G0;|Q`6cdf_^&0|Jf$N59J{{Qm4!cR$1eAc$Y#M^Zo_OV#2mi}S{ zjOsi@@Kc$U#rcVp^roMb@jU~?pEln3pEh2Mlhc5xxritKfjW5z1H&c(qWmo3wj^oq ziN=jQ;uwZ$*+F~~U_ZDDJHR$^J#U)q2huh$z_xG0NqxIwtpl_;af3l#=^eTxYAJ;wC+V z?zO@v0x%)fR#Z_gN91B4mSoA+(5)2B-+PnjvTE*Dir|OatxJ*2*<&Vg8eX}RH(@D~ zI6-_gFBT3XU&EStt|}&N!l22UggbHel#(}F$D~b=ei(Pv#YZ2+{V?ugu1T5EaAC=T zNH5W(($X-kt7B-omN?sxS>bG>VHS!d)IoP)T(q!4(~e6nso>$~}j z8VZ6v=={J$aFyQ-3N$`(8Tm!YTeN9mzkx!yzwm|lfxP#F zBfnZxUxYEfTh04Hf`@&VP6r4!){Y$qO~!-CejVfN^nMURy6b1q@A$e@{yA7s{>KB; z`zKh3exb>4tv1ce_swv{YH(74fj)lP7Vx<_jG7Vz zEOB4JQ<|DRB?#bI>0S3J6D2<0+k;N|ARN~tZ;J&><_w`tkb4*?ey|{kr8*?f)mt?# zdrRQo;}l#e-aj{mxV@%n(k%l#(#4*Jv&BVBq(%IW_?JU`DBhEuLBks;8j^@nPRpOhZd7vlzSQO+{__yz2}M zIqhX>GyCy^^Dsa=l3mI4g#g>F;Z!pvvc;22Ks+_F#r>2EbkT1w5}X>@Bq@;qdodbL zi3APx)drksYGl)-MgooB8wjJOL^ew*WWz~!0JB+AAVHNB$Yx1_B=K44%`c`v7RwaK zW|;yB;(k6SGQF=kad)Vc=SH#!W-#Z{+aR3l3U4X>x zDoHD+fwXr;AnjTrxDFHbLeWob@h!1_s<4m*V zX>GFQA(&?xN6J;=bv3;0|G^h{H`s9mu#MhuJOf~>Vt7pe$>;!k{QW>jBQ^urFs?Om-)!mD-h zamcW&4v^{vEKmEc%6P9jG^^d+Ge((}J>{z}w&%<0L$lG36VxBWR?egS{71Ia(t zU-k6k7t+VQDoiUC59r;)4$VsMeH_v2)NbfkE2KigtWpaJALGkv>#*M8Mf;WBPdG>$ zA1_6GWl2qiQIieZ(Nb#Lq1;mwIjiWW#h|&ji3C4##HRQo{FdoYwl2M=x|iPBQTC8& z;sx&}&r=e@Q})}4xk5AYOFX6R&#=psvSA(Zbxz(6(6IM}U23LNX!Uc_qoP>xmsC!; zmyd9-2;k|@>n!n>veQECQao0(c6D-|n`A{Vkap#FJDBclb3vS*z$L*|hka4)jg> zv6_#Gmn1Z&1AThzOW<;~$|+eAz>{kTcX$V1jpIXm#JyI;^VDbM$&o_ODk%%#r#7n* z(m2AXe*8+>#B-WHnGYtL)Ympn(+8ub>mz(@u&-baCt8`DP4u8~ZXizrCEN)#_-gnZ zT7Z0-IKrJ3Tg#+YpiiuU_<=Tl)ExFz$+Uc+Od__~lhE5_Y4`xE zM8dw>N%SzKG@ug3>2#L>d!GsLfl-n%LHsezbs>@gTRNEzES^+HIQvR^*Je)&1eg~{p-J=iH!ooE zljoY-PcFfTNn0?V>`99ym+pGZ$y*@p)Cw@pCr>j$I!AvdS=McG7QhdqEbciet2If+ z>e)}qD)Gr!c|Nez9;iZeZcNW zY+ZbNA@HV)%?LBiK_uZ0QNkUgJ!-m7iSKjDxn*cpb&_&>PT62be5rG{be}Dr+<=TIan--8Z4I9w&#?`cVL2KaKO{U0)0|@@O532+I!eMWC8f;9qU~6Oylkb z>q4axfHo-wpiR2r9yYZA;74?C${aXZdStV#;wc@VOU_6@_w>j>^9YdDz9}`WdMXXT zPt`XapP6aFrvw$vbk0(J%QSP)QmW76&9=ZCF|-BdV3g#aS}tBNH4fxcF8r)9*!L&O&J1r=H7NO}&i#YULEnHru^KRiTrXaxDZ-uQ z5mypIe3UGH=WWUF$~)l_d>}3Rg0vGT!CF1RrHV5a;s;Z5$^v?)8iHrkeWK1ZG^pGW zaVHOwcjF18Ivb!k8ZzPCEQwcONnC=sk5LKcF})K7Y4>R`=FNSCUK+H=-p!{~gvSX$ z-Umb^?|Ozf%O_`nd~y)r>0*`9%lmxNDSY>jm;qq>9vPAp9B1`(v)9}+y=rMde+ z5cjd7;1>5n^^Dw+k+^#-5OItaGIw=(i-gb#EP z1B%a*mU;asL?7All;~C_6&l5P^-{8cCdH;l%`G9Nrt)eB6TmiDo+T`GGLQHWKafvx zYWk!OfNfwHHKnP=Q<^~BhcGZF-#!31X{pKGl!J6iQ%k#-CTV+8OQ$daJVWjdb4z6c zar+%iKZS|#1Nu~^rgxv(x=&#$=_yP-=oF?FPhkR>-6#*tL6@ZD9yI3`nw4C8J)ZDt z7+!k3i3~cgwS9xH@)=e5)?(*-6hQB91cEZD55#U0fHpq3KyB>RJy#!G5bSUVX}d2B znz95+rY?Pa_r6)u#}=a54U>-6gRZ$G)e6XyGeDUn4WN10cVlN=(wwyB$uKnLSiMw# z7=85&A6kHQlc#_@1r-dCic0vn#;%M{Ei&qAfaJ9{SL$*bAa%KyE@jyy>qL_rVMac( z00a2M0^rp4CQpiO#gk%T%ryUmk6-LQ>hlWFC5=OyC7HT)@nMBXI8zh;4C>X6*;_Py z`jXJB;>qkF&UsDE!ClFX4ti)(+-tGPMs+e zOz&@a8}#9iOK9ZBrP>E(qtM(wt03uz)t4fZFSV2O7=0^AIj4y9s$h0vt%>i4NqTeX zTrC#7rQICr3oa-1DZSQoQziGs1xtLH(6oFlp5usy{U{E|lV5>6ty;6BRRi(lv=&ba zXgI+Ou>BUu6J0GXQ4$}AZkq8>!tIMiKTZd*qp0EZ9tC?V`}%#K-DoFkxI92CB(75} z7Jom$59rl35WSiPgb&!&9-ubb%`&bC02^pGi{dK2j1NuOOm&m!RX34Fg_Fcp@(^az zs3?)N9vb49DjSTmE~*bKKFhkd8QRW*GS1%!voASOlejV)!ejJW3|-)R{l34#;WrI2 zZYBGRBWlc0TP(16oe7GoOJLkC2HIBcv3xe_850X4Wztmc9f9}I>xQz_zXamH<9;svh10L;k7=Nh0m9wXHmXdo*((-Iq z?US@%w%Y1=)DriSM0{mWGJDx8_xP(>RvnY#np}IAJNc@k-u*JVY-2tRwu)<)a;I5G zO-7XNyB}yfV)@-|RJxglwNXhYB~{UpCFvIIo_yP;NxGHzu4E#)4Xk|%kNPy(YMP{N znQe291b(yYZ1T>&8eUtEF~LfnEDuvv`+`d9I0$KGJ$4JED8Q=f8K+tHDWxcoI1j2l zKy<88$B-NQ6pLCt_xdxV#a>e@N<|+jWy~#V+|>`uVqP~`D1MM8ebI*HXF2v!^|B2X z=kV}R7Rsjrwimd$xBQl9{I;Mw%@Xu(`U&@u*sILE-71>KQ6JfkX7oGWDDBm*FV{?= z;IE-rysNi$B-|Em9aAV^R2!H^Jy6niZ}L$kL{ zR&iasR3*?QWvNxyD;{akRHc?qQEDTm)rB!rs|ddb@4nQjR&DhZE3iPS6^I|Kh7U<- zl~ToeuG#VQs8hvi)Tv?sKb2WlZ_1d(mzbGy1@I%-H)(0zSLF8+ z$|_TkdYUOnhF9*?qk^X#@!8a?>ifRuNYQLKwGmh{Xp8IGyU8o5C8-l`cL~1C$*)8p zC3VFe>66!iMn`2xpG-~i&Uc_@PB;KhmL>dvCwUX(lQ)B}W=P^B{J;)6r6aTDGy`aK zHjdLxis;2niU92s#3ep44DfSJ)?iH&*-B0u)-(qWm?o@mrTGcu>-Tk+&)*CoI9}h< z8579k^(`K!2iQJucwOtbJduxz6;ko}rise~JcCvxPjk{b#^D=|zk`l?K1ODYyEjX` zJuIsQ;_ZYVSRmfs^znAXD|?(BbdR$)OPrm=(PPHhTii$0w#>eIQ-gvpT8_7a{E_Rq z3@LK<$-1x*th6e)yx>*q2jXrn0rrj`V7-?JVHu3Z)O|6+{e2Li@%tGG_5mH};xwTD zt0LzKWe2$A9={R(jxVcm3wxhFIBO7%(*}&{wL|gIW@}IUZHr-9b5L@lJ-+?M}c+{b|={2~VNk_vCN4q4Gf_O4%v-|bwclJfc992bpg_SE{M*bS>z>Cq-_V&sTswIUQJhkO1Pz^&p;PPq_WD=M=97*sBCA zde!2vEUR?$78uA~!iQy9k6TJf8D=U;4?3O{e4)v9u}7WC12hr^CG*H=lw9W&7t2k$ z4fk9LcV_eby+z3>RU~fbu=vJq1A};qOpB+;fOvc?_^ORh<%WL4y;7}w>PC+mmjw1C zaS)%WD*V<#eQ-o`jSIIjenLUI`-q5W;@V)FWM;yjYOYI?KB?77!tTlXiAF5Bk|aXF zWC@XCnNX-PClWxKEi<{cXF9pIX%Zl<<3va+ldcNHlMWl7NbtsRwM=@p-bYSbMYvtH zY0_8#Y|{Wse6Pjh8vxri8jcG9d3*ry6kNg`2u<&OI_N&jTH>>+z%Flmm5~*GtKqXw zeR0MY2}nHk320J?nkGRE;)y20Jz2n0D;l2&A$-)|CObad;yHEG)Be3Rm=>USnOct5 z5npW?C+_WG&MPFp?`yL00N8#2$|U&%d$PZ2R%No4X!dL+0G=roiR}owq$B{Iy+rGh zy#&AqcFbm?b@cHDm@zTm(kVkdX7&;w&D_~bfX%a+ApE&@>tdujfxS|lTAL)G);+rh z7&RG)a95$G$^HOfr&Q1}`HJwF>+aRbS1mp}1j5~n5I*W`9y$4~l+Ve`uq=kp$qcb) zci*E+a}8ZJfrTaC&#poNim>HPAr-{sR!0M6&u(OW|WlF>^ZRjm=`0N zr^ie)05i&w1>x)gez*z#lKfSJPNxB|_vJn2^ynb|P-Su5>E+t!lhw?!_{E%i0Q~Ta zO`6BdaY$>J#8`0Jc738VoydjnzUV9hu)~O0+$IukXGDDHOB;I~4C_uDXkvE6<7Qwav44MV(sXE`G z_yLXYkYv=wQ*UvDX7{}fkdAYJG*2|H0W*qkG>dOU^q6U40xwHCj#MP+RY3Z{F>-+b z#+1jAadU1d@p2d+S-oTjxLVguiEwmN!>hELk6~G+I^GNW%eZf|OF>k|-3KTWX9s2M zUo@!w3#OXbXk`)_K;!c;q_HcJ{DC^|K!_(n20U&yB)_jnf(&NmjSi{foettp_1C3M zw8F5gje8TCl$#U858TgZEu^K}7UD_NgB23?gwLYv#`IaW=yy2j!0>7sAJCC9?nHpa zoe04PQ%zC<)!lM5OS?K3C+8D312?|7J{aQjm$ zlk5k|B>j;xUMWz<25xpA`$u}!F-Z}0OjhhEB`E^AlL|<)hRKLcl7!eK$%mk!pESUj z$&*cVmIQd_voC*gB&jkcuZ2#QY+aHh0iFr%gC<3`ihkq)(@)}T?&M8?#}ju4 zO*RGTSh3_-+eh*Ynn(a}OWr00umT>3UwpY?Dus@e>(S6cvu}qdV zyhKqRH)_mnqLX8RWbC+0C&M;LIyZnH(_A&VXSCwRq%cXhxs!7No^{*Zd~$A9V$mfB zVx=!aa=egzdMK{glL@F0Z+0Xd|AU}Ym|Sk$r@@-%p`x{-)VhO zp3RdiO!D6XV%5j3ujIGIO&V@E=~mucRoe#+geQJLJ}y`{b8OtM3lX!fl#odg9>Tbr7!?$(%S+!`a!K9Ky`GxY%ku%tCc{9*Pj+oFd} z0N0czfE!NywqbHQDqXfk$^%|f@hJ9^$@R{mZLO0Y4z4Td+o~0+(NehHb+o)nFT(18SMtyADm>(QE|^{63p3aZyjYCYHM`@XRv zykIYXA1UYN8qs7_pila1`Xne2Pl6)cegW!a>jm`A7eM3NXhh@dXox?puo^8r5AdhC zX?1*dNb01C0h+{n)A(e9X#ACO(%#p)5I;~SEkzIOTNE^`zfw;0emN83yeP9(t6_7< zA)3uGr@R9^N^a6QhEhLUu-yq@8?52@Ho%@gzy~CreGbZ2SBeJ%{^kh*uHPnPoVAII zwUR#jB6j^4AmVX7&?ZHt=~Gl1PVE5LB^Ah1BS8E>NB!y*(&%l4g!{FG#y8&>zXNz& zX3w8fK0ut6nL5$pDF|(X+)oD6OcbVqu4N7a5SOzeE*lTNl%k}6l6RU%TwaOz z!MHlTwEVUv>1PR^QA=7&73o!XUr{Dqgps%d5XN+=0CG33B+c`25QDV)R>8G;E-NI? zV>-4$+M!J_Yv{lxRUFxbJG2p3kin=9Z4@8fWr20=T*^YT!K}Os84T(~K=6U@y1tE$ z>!7Z0h_ins&y4(%`BV20f4J`^{tU?tM;j#35W6#t@GWMNXaGKn>#+1!CvWaa^|qyr z-9NK#xEwq5gj-3Vu?ZUXCYab?z1|@1^#*vzOGo#5Anx}&(V*UvBF^_oU51HfdmE1=`h}&Sz?naWtg^_qlP_v{2fimtRVbIi? zW=XAS*j*&4m|_FsY{rzDmi7Szk*CyvxI+LY>Mjx{n%dFgliZ6vO=Pp=2m%I86G`Hu z%bt=Zw}Udt%B_r#CV@RkxmofvwbHVLEPckaN?-o*^1FuOC4VR zV(gmjv)286*(^1&SeF)0kVbrEk86Oqows#KTL!S#2uOHBDPJJ%6$S2@Pq}(}JD5;< zyQWEgA#ukYm@#<=XxO^y7w##B|iX(G8@a&QCB?a4%n0L2tQcWv@0afwn+~j@l~B9NT5k^Bl(95Z#0il7kFx6 zE%&6~vgB-ZK^lk5yR2bVr*{H!cCpFfZGb%28T!S^rl)Fpzx<-TV73W8rL;~k=sk;X zr8B2^pv!b%aJrZ5UWbRXyC!k#PPj7!;r4jIlY@KMq+k-CVfS2+R14zClFgoM2(ZHj z;Dae;dkupoy){j?*CcKyYw@(9AfD7gxTC3Q(uX#j&<2)-Fo?6+v%N0qiQp!mSS6f& zDc78PO0&BLn(U(+&qZH3LY4nC5ro^4b$9iaLJZ=mxP-e>0G=vGxFZDcY#JM%q(Zpe zwbY+OxE4<p9qf#2v{s&`f$A{80{aqC~29byt;hB9!j?W>Z z%4#e(jWi)YVnCej;wRc+U;2Vvvm2ImRL2vEKmB(TfBMUYAB@TdbH7JZa=%BoJ2=E2 z{i@XGGwPwejNNSqzdk1&R1)y0o65JzRw*MTxA7KlHb zW|>o3G8E@geKC*3-I5KyOe#H@@Xf%vksWwd#w{7ZM=3AL_?q3qlGnhfQ`zs|xy%LL zq-}P~E{f+AnP6)O(hdTEZA8QCkZu`4+UEg+E3f%1gT!reAm{n$+fYQ}Hgd*Xr=R={ zKl0@}LNKVe_(QYKRCh&~{$a*V{6I-IWAZ)dn9NT2W6*WSs!oZfl#CCnp=plzYOths z7&JM&SIIpv**!U2H2W`0_(XsV?4DWp?!E4r34T~$)!kcsBKM&q;uA?#-jdu~ndEkW zA9i1r@wqUloV<48goid%|FNPMDm!=Vyzr0%=DKv%BF@` z9uwN6pA%Z~)T!3|UK@6g&S5|XU3E-BlILv;oq7aMe8b+)Wc9|gSEY@8(CPevCiQ`E zJ519jRRcWIRb~7@VzgQ2I^8ymnzTu{E#Jc?4+1MFzKPJ!gukwHo*4DhSRhFd72i&4`}Rr&8~Py)nzNjy{tgvRRU$Q z?IPT(-84R}Cz|*$(D;}O}@Yyi+sPTAUPbq8hRI-AndH_5I-c%Vk1?jQN?nzS* zT099J;8~<%$&RDN({jW7li}fVc-*}%KY9w{rlV z0BLm+9{}62iNz5Q;`T5SKbTYsMbo6e2AYIlizoU3_PP>_^ACt0=$^u2@pYXNtId+` z8U{_Qg7_F_^Y>e-Q;(SdZj!XcFlGXn@G(HSUTRj;C$NDgkxlsc#vV_%9BxE@wPb1> z;g0S$f)B`HStp~kI@6F6KCZo)etOI@!lV>nNlqbroNs4OP66>0xteRfCJu9*69_n# z4}Cp6$O9+s9yew3vIfDmQ2weTiQ8>}#c>0$mkG#o9MIx9i3Rbb0>E_?M5CsaY=hfj#@x7SDc_#O0XPo)HSSauct6csd2 zC2NvYGJx%OprJ6tQ=6J5wFzian_4_=B#5U95kA`N7DyFp_Oy|}l4{f9DK-U9(g)aW zB*0_GO~Xm~t;*#5W=YBi@oaZMoZV~oQcaWGuJ1DM{f1LJ!0tu`S1os22;$DZBNbhs zgDE9zfHuh*&F(gdlu6oX@uUr4_pv@G>F2coyGx=$-6oMZvP@Dc6(=XPij$N;e8~4c zJWUelm@Wx)^sNn5{wf9TV}x%}b8{a<;%-e4w|$#N2TCX|QO50JprxA-z;iPRaUM5! zawNac)~7S-e|8&Bim&ZnPG?4Z-K+X^hG@jr&dx>7HB$y8BQ_@>`d7OO68*B*$5NwPf75S=?a*dAyj& zpX;&C$s0C6nta~s`z&hIU)Awh6yjs~-O0Rpj?ETRP8-xp zP8&q{!}J@?W6%xeTrlM#?8}@cgTkn3ddoCZT?}t52cvpZ9TTkLM~N?axGrL6gRcs( zd$2e7f~%zYB4xyvLG!Xwf*l8SRXop9125*yV=yUf14-698NS&U_kX1fFA z=tNV#TKb>_dI^izWgpW4Wv!&q%`D9tZlV*djR!Ev9c_;CnRuXE%lDuobvil+rup|+}ph;n% zWExk%lfwvqsZwf_Ru0*&FjE(P>@otR7{e4yt zcgaR^EeGM=G69WmoDn>R-*t51BXXBAVDUbO;Dc55jZt7vwP~7M*CCkM^NLOo_Y)5q z)Mqe+I|=~Lx3RP)<*KeM!uN(F!@||N3|n{K@(`WaeHur&lX*s6(}{CA!8TbB>Xw_x z6J{_~e-R$#?Rrh0I0M)|2Jk4ed!(yGq}N24SZxy54$?3o4C13ot!W|{43H3R8f8b) z(WM3^ns^6tiJ~}@y8z8hSHrjfAwFwVQ%!yVZQL0T&+1_=Si<*ZN`e3y7cx@Eg$(Hr z7SMey4Ljjc+Mwkp&$N;$lb}o*)gE*b4ba>}ep4pz@dXxlX)tKMTck%HwNSpxEqr6o z^Cl7xJ<#}wfM|xjMomKLQT3*Ev$XiI7w#|8ki7Tnh1O#qML`!v0O zq4}f+!8}ugnmtto;F(Ybr1v{CYP!g#NtFQD0S2(W4pdK(Xz_HB01tVoo-VS)C%FTR zOE;;#Rh-;TI4<7g_8v4nWV1|euS4-XCe%~yy@d=5z+SqBld1dM{+86+;z^|-o~+j5 z3TF?h#n{>n`&Wx6t2LY~1+e|4;K@b+=>pUpG->Fl}norUN;K>(+d;U$I zpl&!p3NVu-Mq$jvXtN|n0d^P>i;WI=f|PKV>ZVU)R`5h)v&^0j#97H4!@;0FZ&L$Y ztLHm)!uJ%L)`{-OIrRdKAHxs6K6FS$GW{9@iPIi69T>p2Bfw5D!0lB6)f4T6J5C9o zQ7f6IYWA=R1Axb1y8)77dP<3zCdn=mtnM#Wg9Xwe!i@Y=G7(?ffYf9d^tsflcxp8$ zla{ill#UXV$^MdPp2My#lj7c5rZMeN)0hH0-d<~(4gtt{@sjXiO376)CGA=69=1*? z6{3|?UcZa4v6OZghD~yVVUyhmf4IS_O$tzJldc*@P10+VrP~IUgCI*I13D&063#K7 zrX5Co`qJXUlWI%%sh-6$tvtY-AEr+N^3hzbx2$TO)lB+XasQrT$98U65&WF#vZ%AK z=+(l3?A;fN+n1={%CI-y@j z^-};CH7TXfXp>TUO1{2By2L$zWoB9ibGJ7%s|nohA#Sf}`edwFV4Z4G7U8oXdlK@) zXkzDO@hEjuWRbwaL6~D{m~E6fm|i~&a$em9LD%~Oj*pWA!*}B7=$PHgN5A$qWsf?S3TVw zW?HKe+yx@dsIz-&@>?&6pXdWix;@07N-o-@fomlvd$tYIk&!t1!4#tMy(vThKV5QB zF;7;1sNXNhVOikS>OL(dX(xw_%tPd)ihIDI{3V#C-Ay}!Mfi0!>GRHDR{pS=JUTuugWBcx9UmZpi6Q%h#&Y%k~OHF zPP%E5!~vc)DsS{@q^4BaHw`%`pQKOt!!)b2C+W8~%0*;$pAx`oq!IuLuU+;AApJD& zx_G|)nK9SENHsCbDxG4|x-akK9LmPvMd!tgo6EYWJ)Y*T>cF`-5CTnX)Y zPT?t%+0q!^NFE`*Xp-aKaBtE$pQ&B#LQ{4Ke`e`*)a>9}$9tCEV>dg3eh8W;3G%yb zrn$5!xZ)){f)-CD0rn`<;{Hw*v8OhGxXljiN%kOa4*>CW&xDWsZi3`Y5KnR>{9xE5 zu+}n}2WZki249vt_sGd++Wny|ed&#?kjQRz62dTSVi?p+Cs#BRI4wRQ0^(1bEtAdb zZ(*`I{1Uz`RbB`oOY$ZPjpMWLio^B{YeJ`^64H3 zcam&%veyIgRPq*2B?s8)9aysK0z9R;Y2xu9u9YL*Q^-hs)~QUE+63~cHmyy{N5NAN z07f12c(%-q@__n zI;4BlhmaCRNh>Yg-QC?W7~PB_w)Yjg-{ z-FZjNF~d`6b9T+iN6Xq;a_4$qA^29faxx)uu(;w*Dc^dIz_O}GWt7uh| z@ef}HJUYFyqu>DNdPEQ?5zO>)!$O*z0R zL0PK9bwY)@c;J4WP=!|nhU$YR<3N(mbW4)H*U7^Za1Cmu8wEz7lvM5Gl4h>I6r%rC z9*Tz(^+T=nlBPxcSKI}a>@BPngdRI{an*kvCcY2kIghK~VC?pFBrm_-?1mHQQ73IY zEdChArDxsA_&2O7PKxWr_skz;Fp51!zHn~`a=4#c6r6uf4{#zC(7W_8&_c0?RgK#H zXDpu-_`aLN@h4RKS9|eP_BXPxIib$)sIIp|;=iLc-79#ZV}~TQ#&y-EktV7FF%`4G z?K2|yF&n9r$#+jSw>jY~#0Ckqd&j-+?y-1HuOCK`(}Y*?luEN4vB&kVdW3as_8Jt-`q)D;^%j0erF@y8PJAG zRnHz_X6}C^PXU7A+k)@S&k}0I9qZv%sZ8`+)^m9M)x0LvisC?U=?v5)2)t0hk$EiS z?oH`POaIwN@g7`(LOCNDw@73ffm@W5Sf7WJ%K2N!I_=dc#|OpjllFd7cwNgw6BWGl z<;S;9+!CQ+xd;C&7mZxaOezy;t^FSEQe$%*D1f-!^?u?9w)NQ-D<7?UR)-2K$Ge1A z0t(#67L+eX5BFmIC6(2yKo)qogGtcsksVad$2i$3pcS6a>lcDF{XCF2t-_BK`0$u3 zsyZfFYdY9pJ-*unQeAHem49qyz-#obDhq9W+_`7EZ|ySLB`*<0I-bLiFOjY=l~0I| zsAdUnBDV6ewwq8bB%I&-tLwy*y{S2x)T~->_tZx@Q~?D%!7Dym+N7saEycg(dOjdd zJj29)($6*@OT?w1TVjSHFySR>rzHGj{@@dlN|a3^j$jdf5^xc@ut{9B*~Ri{#aQ`y zQ+JT}G*H!l0dK+ND$>UZH$BV^Bmi2Q>`@DrDDl0XI9G3tWwRVMAB8xRrh&a^QN97 zLZNntF@y%&VyS!Ow#bie2Yc+fommS$`h5vKAZ^`Qtt5da$?QY*6dyjv6~Gt)Yr>G- z@Lto~#cyw#r8us)6j%|9_;pe9buH&J+}%fC99P8o?HHj;-kPv#AT4tb8-~I4%^kM_ zL-p7?gXOOlIh#El0n7OotU@DEVs)8hp)EUpE$ktAnZ~5xZYRg>$gc^X%K$T*ava)n z{KZYm>7Ce->PZzR0mkf1=q(?AJAk}+5cGz?lh3&-r;7-;6%dnaOBIeXNw{bc;dA`^ z7LbDDRtMS%ylG3q~yVq?QsS6uU?kth)K6KZO|(g3VegD5zM&SzIMa8IQ_;y z{}!>_Xc3D4T2-NiD|+CU@|QQ0L&16MGe0%r^biZtxT#CHkW(E!i{$x&Fq>!Cy}~bw zpQkqc>ylh*rTuqawhI)+U2C@VRjXevU0)pBH-4%!`N8wW>+VaJ3`hNBM~Lv+kvCnP zpm+h#vsJr2g6N0FjOqzQJ(q6gz2+s6jg!0VRGrN39y4ln;&NX9X$gmYaP4v&kzcxJ zhVZI3)FcfvIQb;&RC5z{a9RE#yYBj7@p1&0*Zp9)E!_*DxY@_|0~7eEq<;FnY~}i| z3`Q|PW<&g7+3#=oX^{72!q1C^Vz(g&7=bOs{_{zOOtQj7oUT$Gxo3)UX;C`~e*+I9 z&PAf2fo2e|$6p?jjbx~!;`%!SUdIJ-0%A)O+M^l`yk{KT8G&UcHw^PRzl-ZR+n*KVz=(nXcJT{$R?_ z`3J`tpU@&K<9!6AJ74;U_5ISyr=K$4M~FNRW46rvL!87>bL4fmI`?GmL!uX9Il;Zp z>H&HZk4d^Utn?%j^42x!O%!si5b=-v4T1D33iwZQ(a~-!zgQ=L;ihfP-)ig{OPZU% zb+x$oTkNH})q1%X%Sx+V><&R5XKoQ7JA%WDS;siH zu7MFeeg!^fB@jQs@YF}65UYI>z@yA+gH33{GZl;R%_;hLqzlo7NN?lxRH{A$o{8$C z&y|kB;`+Ez$2|j>n#>IsaleHm33!~Jb8>1hP+%mP>2$u;viE}f7#8Dk*IL(KXA8g| zW2Zf>X7ul?dBz-SEzz0UdoHZ4e*pgvPHZjaC%@W5i69U(Jd$Q~NDS{? z4@U;@i%0~l3PRU{)EGxzTX*7rul2oMWfFS)Yi+{U{S-*}#5Hgn^vY(-Ri?GWGt!x4 z{rHrsPON=n7Vw?-@c{GghH~4c`z6gN-qIMJ)TdQ6{wwH9hm`xG?Om-!yY}~7zE2X0 z;IA&*zf(vFb%E#I0QXauxjBD~(I3$`P24x6K3C58Nt`UG+8(42gr~m12fP+n>SXMv zISGz2yt)Cc+KiLB`-AX=;z+NUod2Ys>Q4RV z7S?y9x2&43uSo2YbFTsM!_JN=PpE%qf#rE|qzLS9Q zoIMsFR2GVzlw=bc;8ob%m6tntKp1sm^Cv&Oz?Y9UG9^+58IXNb9yP5nX?+B(@;9m@ z_!SbB$W8p#uHH0iLXlva{ACv<1(PXpRp(U{nIn zDa%s}2_#Hsq?I2#JMlD&(;+g9Z!ou*CbssggQxn*y6pVQ!*g5_X7z-jr458xNiuEq zLO(YA%8JxuN^~KEyHScj&lYIb6>M2DyJhPo=etUKFJ9dDhqn96)I}*sP$-YRTDbo? zPMO60)4h@ReXhi%bO z%cD0SRLTq7#k`GvKQson^LQ$@Ep>714VVb9{R-Cl$y+I61>QOu2&b&1Reelw<)Iz{ zs>Z)cxu;}JyiTl`=W2JWiJLa_HQ{C@`eJ)6uD^;k;m}|BZfWk3N zUj&O2(%5&=*iTJAt{s?XVKQc2KA0BR%aoQForWV`P`hihqD<6red8EH74U3_AbID} z9KjiqY29?4*A71*1Mau1@tNM+^n*D&L z;ozD50LhqQ!(&}eFIqB_o7WX)Xg!G`;z2XC^zsmKImNOg?X&)>MSqKiRQ95k@@#6N zC;*;kS{4Ek_>~!ihwykCo{zENg+=W5urEj8`p+`^$rl6AdZ7L@cbV{yN+ypCbF#&IK=qrX9ad>xAaO z#XD^2EAT`Of9&?MTsJ?Y>SKGHt2Kg)roEQ8-0T(bZN+jvTjY# zSO!^rDqZKsDK}V!px)&z6WG}!K)E{Qu-OF*Q00i5KkG~ z3z@jnF9G3{(P+2Myra%9}ZC{JbbFmKqZyYcp&w~AX~+X@JSa7@fSYRSP+sv)2;aGW-97Z z3fv^>Y9x-{bn2AU>10d{Uiw9HeXll!RL7sOq&?1&Py(TdJUx8+60w-=rAi{kt`{J& zzQ`4>?ccK8{WTNkQ2UegHc$10RDjfr3T&b}Ugz*@ZEFhU|7A)PrR-cl{x)QO{)**nHSA+p)`Wp>&_U171Y?X{nd} ze{uD`Z14ykQPcM*`Bf%B7yHxdGp{@H2 z@S!@Pjrd^iFQj#BcuWx1=76Ul;)b>Ze9s3+$5XbF$ z+roiIbBU{ooqojST2}VPt`7}7KRuVEM?i(rP zPuP40w8hkZ zwYi$YLWVy2zh}`sc;AliYbxA@y2wM#a-|IEdq}UH@R%|WH*)LEx_*Jna|Q{Ry6~8o zZEl}LcH6z_^i<#A=LXl>`s_Qxpl3E;VJ?D|)JpdlPNx;yX)1hS9NKK(Rmo2uDYa{G zJUPq-u=BbST8MGGvNZfPq|qf#8wEW!w62{+ii6yQb^F zIM7rS*ea6aQNuYYu=}d!R||#)2Q;W%pX|q)r48cQq9JaDtOm;%l8qr zkFp2aRHUoOrwuSFvK)P4oww1PO3Ss>iu;=K0-v;;fZAk-u0v4OVbQfx%Oi~uNBxRZ zrTW>NBp_1!YF#_iQU3|Ds`wvJM~Gc`?khZ;dAf9mRv6DKU-M5mo4=1lfMe6U(;11< zy>_sax^;8}&hjK{->Ew@_qnuFPfNdm8okLMGUFVRXaDy6v&UeF=>U6X;k}GPA*sgq zfM3tmt(Qx@PeP3ifgWEFG`oWo(;hVv}ixQQ; z!s8wU^0M+b_BW(H?HYN{GFywU$!??PQfJM1o5Kk$5zs^Yu}L9s?b>xNTR@5{;Tad# zn(o3k)px}6my{+;Ev^IBbuP3`xmB}SUuc_jD`)YQ9_vYR36D3+KzqbYd`s`wVl~T=(n2hZCRq?aQ6<`1{_+m?ACT=;FWU`I3_aWbR7-i zHYR-4T`fb8p!fBmiP7wM-ntq!NpIx3s8#*&5UFgR0smcpJs`0ciB&9DUImWwc~wU0 z5`8~_o7D_kYTAl$2ps~afZ3i3I6v)+ZZk^fSz0-;`f1**GQS?8`|}2kQdGX&Obp+l zwkn7JfrSF0Kj^W5a`k|UZ>q)uS2wlA^uBF5jd&489@dKk;E@q9n#lRR2ew< z`b^qpHlSa8O5RUDL9ME1%Dm2_Rj=&v%Ol^qpN=vw)5Xu@**?1@*YkUx#*UwwfMLF?lB2ZQ|Dn&XgX_h710eBt|>7H$Xow z#EygVtP4@X`Jzt;>G&wyjr7o~eWgA|u`(Xj_@06q+Y6wBgcm6<0RnL^=*zguZE{!l zqHgqFZR8G%cNl@rRQSG${wa0k+*CE+rKjqvzOT4H0%^%d6+SIsmsMRNF;i3jUTPxD18u?mZ#lHsX?_h%nZ z-_<1i*k8`Gv&3g=$s)|CPyNI>uCg|~5qC!6gy}L8zh}ndXT3eepZZe#xcX=Z`DHq! zyhNi8-9Bg2$-)5++qBQkIPxrdn?mlp|M&ihrrgW>yN02XXHCjoNo(T8rTuWis_It8 z_mho1!KVA$FTxMFLe?x-^9jAao|VE5xF||Q+Sv@JVz#-NaLK^&^br>ksdl*$(Y@B6 zig?mAK^{2~J%5AhwesJVh=(oh0`0+bm}1$QY;u@uT{eNO9PxZKWjSN|+EXW;7a5fB z35H^(k){0!hVE>!wF$=4m#_;J-YS@Zk7+zHy?0Z{D#*KPjOtig1|_{}#CGG0J{0_5 zT897Kdjy2|9~>8ZS!Rq`7mg8zF3v)OFsL%f?Nps`BH36p{HW=19YWqnWYFf}ne}?Q z9CB#G$BFT+Q9vfuvFbe25OJk+Rvco%*^c=%_12NH^M>F|LQ?_R0o?qEBwZIFg%As+ z#vAIao9RGcNt;nnlyXKC8EM;2S5JYkq_B+VI#iqPJH$D8MpTc$mn~Y#k!I8;%OarQ zr(>Ew56z!u$K-b9HrvQs5|A+hdOzz;T`sRFB6_0NK5I_5qAK+3 z>}eM5oQL^ec-@eaqxQytkHED2ERb>i{Z7eus*A>nS)xxY%Dxq?x=1UYwOU3w4>5}{ z?sZdxoz9tGGOt|x$C(n0AefW-Eb2QF4$kV^Erw#-r^cP%VZyNfQ}S=|g{f3(TXKy8 znjPbH%)drm5J&H30}6oZ1vzVh?>ZNX3ztvv*HQR52GpxvfC%B`0~9_wAaAXAbw}4* ziz-^8)%2c3h-d626+I4NfiL#K_nKH1C*G4dVX%!=#dF}q_#NaS=8yG!?|6l1Z>r;{ zlGl7V8_6|^q!oA~>v<&eZZ~s%A^A37*XlJ-@F_vl{yMqeJCU-Q$hXi_{>*HvDswb2 z6ucg~QV@R{WaYsd&EqFPF@lel6-m`5zC->KC&*tAm&$NPiDuv&xYGsv_aj5%w^ZlC zU%zUZ%-5rt^?O#23(eB<9H%sR7tpsaR>6hCL#DcHMPb zBgSkvaqu~@%i9pwN#@tJu7rW$EUn?Y#vO8d2Ec9%4Go2kidX6lGBti;E%EUy%MXLC0I_Fh zUA$QI<()C+ZYgF7mH<*Gf{kGO?sD7wnz3->Hq4}P+ih7H7R z^q^cCj*KOe;{bwuC(Xk*@nH+FTp$?w4bIIR>k|BD^D40 zhyR<;OnGL1~V70%Vqb|5edRYCHGUb z=nL@@qEyiq@J@B7sjmXhXSxR=x8%#>hDF zCp(Mn%&mLA=VUzqV+bJ3hr*~-LxR3`rh(Z z?1@^Dk8tUK}i8|5gREhM}#;NWn#Hi>?!>X0Cw*w)HR*(SQIZ=N`IjJ#?c zwocSB^1K_hf^$b-ra7ZsGb?9}Q@2HW_0vwy<-k}(C>lECQ;Eq0H=+b@b`f)mqz>T4 z=ag6!2K}{2lD`Gg)@_gVG|nBX^}%A!$Gz9uV2QEU24}5iVwXRns~ifqTbg-W@8qpd z>Ru@BOu?L1y>oHEtrFDrbubEZt7LSFY5eJc`zC^*htaKNu5j5TPdMmg3$&DZ{TDS5 zwF*nR;OZQMpyt61)R4nWLoCX*B8;KKH_>NF6oo$E+d{_-`P4j8xDOt+ZR2@mdA9** z3bhndkY+j$?cu*1*ow)las62EPKtW&4v<+>0_Is93@&=g@u&`bBD9L)5WRaC86Ac` z@s>D(z}T$s?qVW(6z`bnQcED1x|3EE0+;szGvqoShQaK#p|=q!-6RW0l#tX(C82e$Tk{}*8 zx3?=vZJ1+TY@aIioa7|r&ORRrpc7q%Al=uHh?5=U?X`1rb2DniYuDfm*cU23;Bat; zu`)Co+eaudU@5(t(+!u5$2X1+8&UWAVoU%|Q>J8$2I+>h79%^AyAzA~jyM03=&W4R zjGkeMFv`iwYLQ2D9i0df^^*NvS3x(hdl@0El%@2dA|CBzAAOEGk98VG_=%}Ui~8XS zw|%4h7%0CkIb*73t*fB6hH)=Ksdj!U8fH8g8 z3uep|1l5N%w3`QGQAur$GUw}c^!x72VjeIoybQJXv}44uqOCid=c>neax&JRUb}8^ zQEg8)b8NwP)M{F;q!s-;qOlBGrGDh0G68|tJG98#G%NYMg7iEA~xL2~V5hubEAiZS|+M*7P=s<&jf*y4iM zg_qmBK!pvRl@pJF8K3lgB#2e;sLrQOTR)s(;x3gCLmzC3-xd25qK>Gs}X}+|6s)9bDM?`hcIk{1rwyst|=hb{aHC4^ z%+~NqCZ4_1UggD-%Y!JS%Ab##z)t(q925P*sZ{ z55>Q57rH4V=Ynk`>;X98YL%SSAnDLU>v`#a(P$orzqXi(0{)ApXf6Z4$eXN;y-$xw z{~%f}AAF-X_fLp0HH?2rA@ZhkQH6Dvr!^KC*Q4@vc#cmf?q3?aDe|$%{V-;W!y-1z zZg*-A@j%%14(E$!3Rw?%<7&f=qt}}F#KWJX6@EAX{p{;i`#xs`7f=1lk9!D{Uw(TC z>|IuiXAk_R?OGk^=d~v%Q}lmQv1-818`un!pQCruyZ>qZ5j)xaeZzFy zRqTI-Qqlspl9fb_|5NKuEyyVYKiIMk`TzQot8pcn#r!k5JGG$*7xfom!>DD2|JjhK zRz7%TI_3x%@-KgWU0|orQ)kc{0l0X$*Z}Lp?E{&A#lY#DJO=jK+kY1ZKXjqP{fs;T zHl$2fY=r)H$Jt8eue?G1^u=+?|Ek>m9j?lcrz5&4aJRc!ueeh~)>o69-KcT(WCbr` z$7usC0{*X56S7(I%@$|b{dTT6IkIqld2t1MF01PbDDuZt7|vWzmvNRh-h%y8D|_~5 z6W6MmT6EqD{}a({j;oZFwb0FfCE>dcnPoVLc)PeV<5FxQ@f9?YSS0wpY(dTTe+|u1 z$W++(soUI#al>Z$MOCB9R}L{VSM!iK__Oendvh+qH-ZjL>^LK^A>44~-&Vd>f%}R$ zXqoKfnv%r2a8PZ6CtSoHFFWx}jBbb8-cEtyVCZ$g;$!dT1Ruvt`rbD&7+04wyFEy1LtPj{Fb?364MoP=0zrsQ z-$iK;W_%Mot?66f0N_gjf=vKhMAYIpy152%aW{6ilGT1AY3{q%^IhrpbK@!u$$+dDbM+?Vqj{ZC|jj3M01Hl+I3CA0FNGBfy)<%u;;u&b|c!$nj2JOY&>Px?sn8tF14X>4SUuYd&i7Dox`3jfiVk1=jX;42mU>RzjTRnuuBF* z1!TlA(6VnIVB=eY)swj%WB|Q48slzn)4K=bfs2WWo69%235wPn$D0RVOP*oEf%qo9`ed zKYAxK_dEY_&ReDZ(*IrvvoVBOe;u2?$-0EUd~EHpLU)tnAN}>Q3@7i<{$%gdg}XNk z2UYEUvujgY1NoGRJ{lKX+F`uDO*%J^YS%oiS4;+MUy|k6)&BD z64Nokx5*o^7rOgRh>w0M7MW#j5;4&k*1LE{_PKE{ru_8mwuB%i*-}(0`iO$Gw!y=V z8#!H!;1@=0OZ-&f?^6Pb1YY!sa60;Q?a0#z`Ri%0YsIIT1a^|n#%G{yK7pd&O5u|Y zd=bH03f5YhPo(y^UNe7&rl*$?Q?jW#KKO>$6A@uOAymQRxqH5%2Vot|FRfP`; zR(XNbt6H?nY=VwCqUCUR zeqL8;jLDh!A{FvC-K(cJFc%FxGy5#wWFRlIYI$_vlw7yTtW_@Bu*+mmHfG(Nt#_6; zI-U9RBHvszZkF3{tANb^RY1%^J?vvi=@KA74Vswv3ys4HWgKo1Iq1uUw}E5cF^^i@ zy^^V}|K+OW5%uf6)e7Bg5Uh{Lnl1nSk*!gog7lEs+ss6XqJT_uaOSM-el534wr<|i zS>JE&kB6#U3n4koM?~zBzN_4Ei8~tRP~d4?!J}4bPKc)WLiC5>#!PNg3CazrrRbcI z1J(F9^7Fal=2eNQgQ=4VLM|oz1J-XapW1;iA2q7vX}TOv-9cuQ4_%&uS7$ z1GPj)!ThtFLGS_RTlvDk$rCYLSmcDL;j~hkPEYv8jXbKVN0%-=y!o>9qW_0eoI_je z>94e9j*K&jtUE!gOpruIkZ;$XC7#DvWI`=Ja9J#6<{HmG$ ztZ3?de_*nN#G2bm3cH#MZdzIWdsG=CDB346>BVF@GS=8jXuZS(r!19ZtAP!~a+Qdt zQ_XHs8>(9B!{`i~QXG_c7P<(mz5CxI?XAMyYwx^0Of77vw(Z;?!WFCLu8zYOp7s-O zX)agbEA6Rd0RFU^&W4jOvKOo`q}I4OlH4dJvu?2k2Np}b3cbe&n9E1Wm?fm#sll1 zm~-Kni=(z}*Jn&{Old6YJT=;Lr7sc@u*oUTo$ii08UVC**B}I<{d_(F>E;|Wdqft?T6`Gq2=}K zS-cxsp}od7j;&*iuSJI;Bi=12o^Vg+QOlo6o6Fc6gY|2jm}8smr8$Q^G?*`4({ z2!KTaV*I9RYVQ1*FiViu1sb3jWZ1jC6+JgKwml-AJ-*~j0fS}uT`{RXE&;{ONlRiF z^?P4>c1;1!#~c_uU#X&`0aiIf=*)}`bf)%aaJ$tufOm2O_6xCKFf323a)biZ25#( zBU0Lkm;Zrh!Z0rR4gKw8;q4Xdp6Du8^oMl_v*(KDcuce2K4uKmCAS*yE@#1XGyky* zJ8Y9J%W~r1h&{Jzh*@&hlA`{gcEz?jPJA&)X$uCG+F zapHeqw3mt9NrFwj`UB0iuT7{8FqdLXB`-3sF$-;H)+MORqno)W9P@MeZJX&9ojJo0 z?20i)R}r->4BkJymKn>1Y*gX5e9=yFJ#Sut*=X~5y4wGuW7_u&2ywW7V$!T zUu2bKAM8bx2CrD5s6ISnfOw9%`(KtZU;GGxBWg%bB73gFWye082sD7!37p;}t0u8` z!$TRp-1hmkTXxrkKmG~XKVgftE=zHeKTGaSdY2m%mbJU`aPzcG|0ywa+Nr zp$pHL=LI$%?&P;-M5k*2GhyZn4Ag!)=iWQxGd70d7j#Xoaj*E>Rx|}e-eXH7kGcN*6I z{Le{%4w3-KuzzVJC3i7a#J$SO9sa&?>qz zEH6iV^|kEmer(B&&(zC8)}oeuadLMpflzFIb=8Ravyk7riHaou73bzF?X7yBK#zQC zEuLVMiOznS?J2l%f!?$W(WEg{oi7>^{XT4h8_2RDR@C0%$C#LX0(uR*vd)L^i zd?xW*Pog|?zB{)08y`aFw`iKg;r`bw$4Ds0)R*TAUYN;O35;)t|8lt#e!!CTd+#}Z zPo)pI8}d9ljSQyv-H{A($-`ZL7-Q}C&z+(xg`Bf*hN*&OIGf~4dk!O&@XxB1`{(b8 z4?ce?AbjT&?Ylz!`bydKqrfv0UD=4=;Wo1W3C-JE1`aJ0*7Pxj}{!fycIpaY^bfCGHB<&x6EFFI} z=-pO#fl-OT>Yn__x#Qo5%bUVEcvL6AB^^%HT^e1NLF&H;lze+MkObQ>bsmceM3r$=|`czC+jOV{#b)lXDgMM zFE<=!gZLt4OC@r?gmhVjA{mU=!_W0}wheggb6z`k&K@YjzDoH!rRiu`J>D73JoGdB zRR%b#MOt0%Q4+5%k!{}SL@vzj58ff9l?B!yhMOzNi;q=m>T3tY3Z_SR+CyotE=H3IRPl!f|% zy2xnhK{^$S>QEuxS;YupMy9*JBdpm@0|2=c>1^ozuFJ(PMbKG>?}Pt`p-hwUD#t!h z%tp`vK-H8a$$5_Vjwp-|9FgzljA$B67TA2YS^j+fJsyCnc=b{5AB7k$!7pERhi2ky z2j6}_&)O%6j1t_YWWRjrKl_s72WC)2lO)u>TNFt3IbcS=HGOfk|6#=6(q6fZQ4$@N z<&1;(uX>j$#GzfO+V$y#aa<2qqo2N2mnv>*r`eH#e9BS?9_66W)BMF=3wEiVDU0&h{)A@ROOP& z*>7ecEM;lG{zib-rDQ{|IE}W!DUkp^nk_l?!7zkBfF# 0 and size & (size - 1) == 0, "subspace cardinality") + return size.bit_length() - 1 + + +def step(gate, current, paid): + if gate[0] == "warp": + register = gate[1] + if register in current: + need(current[register] == span(tuple(gate[3])), "warp entry") + current[register] = span(tuple(gate[4])) + return + registers = gate[1:3] if gate[0] == "add" else gate[1:2] + for register in registers: + if register in current: + space = span(tuple(gate[-1])) + need(current[register] <= space, "monotone four-register frame") + delta = dimension(space) - dimension(current[register]) + if delta: + paid[delta] += 1 + current[register] = space + + +def census(word): + need(not set(REGISTERS) & set(word["centers"]), "no omitted centre-path charge") + need( + len(word["A"]) <= 4100 + and len(word["B"]) <= 1900 + and len(word["restore"]) <= 204 + and len(word["warps"]) <= 72, + "fixed-word bounds", + ) + current = {r: span((word["ports"][r],)) for r in REGISTERS} + paid = Counter() + for gate in word["A"]: + step(gate, current, paid) + warps = {} + for record in word["warps"]: + warps.setdefault(record[0], []).append(record) + for index in range(len(word["B"]) + 1): + for record in warps.get(index, []): + step(["warp", record[1], None, record[3], record[4]], current, paid) + if index < len(word["B"]): + step(word["B"][index], current, paid) + before = {str(r): dimension(current[r]) for r in REGISTERS} + for gate in word["restore"]: + step(gate, current, paid) + full = span(tuple(1 << i for i in range(9))) + for register in REGISTERS: + delta = 9 - dimension(current[register]) + if delta: + paid[delta] += 1 + current[register] = full + return {str(rank): count for rank, count in sorted(paid.items())}, before diff --git a/research/rank7-shared-restore-fanin/reproduce.py b/research/rank7-shared-restore-fanin/reproduce.py new file mode 100644 index 0000000000..7a0a52dc29 --- /dev/null +++ b/research/rank7-shared-restore-fanin/reproduce.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Run the unchanged PR3015 release recipe with the explicit R1+R2 edit list. + +Credit Jeremy Kothe, Marius-Paul Dumitrean, Mason Hale, Jeremy Diviney and +all retained source authors. No predecessor file or acceptance gate is edited. +""" + +import argparse +import contextlib +import gzip +import io +import json +import os +import shutil +import signal +import subprocess +import sys +import tarfile +import time +from fractions import Fraction +from pathlib import Path, PurePosixPath + +import rewrite as rw +import verify as v + +HEAD = "e244296debb45fe6f4da84d29e4d64fbab55fda0" +PREFIX = "research/rank7-joint-endframes-restore-edit" +MANIFEST = "5e113822c0c36ee7dd9366578fbaf5daa108b8c51e37f4d10eda25dd6ed52cae" +NAMES = [ + "export-pr2894", + "export-pr2833", + "fresh-retained-bootstrap", + "four-kernel-stage", + "preload-stage", + "parent-paired-stage", + "paired-extension-stage", + "rank7-overlay-stage", + "declared-edit-stage", + "derive-closed-adapters", + "fresh-current-native", + "complete-admission", +] + + +def authenticate_tree(path): + files = list(path.rglob("*")) + rw.need( + len(files) <= 10000 and not any(p.is_symlink() for p in files), + "bounded regular source tree", + ) + actual = { + p.relative_to(path).as_posix(): v.digest(p) + for p in files + if p.is_file() and p != path / "MANIFEST.json" + } + rw.need(actual == v.read(path / "MANIFEST.json"), "complete source inventory") + + +def export(repo, out): + result = subprocess.run( + ["git", "-C", str(repo), "archive", HEAD, PREFIX], + capture_output=True, + check=True, + timeout=60, + ) + rw.need(len(result.stdout) < 10_000_000, "bounded source export") + out.mkdir() + with tarfile.open(fileobj=io.BytesIO(result.stdout)) as archive: + members = archive.getmembers() + rw.need(len(members) <= 256, "bounded package entries") + for member in members: + name = PurePosixPath(member.name) + rw.need(not name.is_absolute() and ".." not in name.parts, "archive path") + rw.need(member.isfile() or member.isdir(), "regular archive entries") + if member.isdir(): + continue + rw.need(name.is_relative_to(PurePosixPath(PREFIX)), "exact package prefix") + target = out / name.relative_to(PurePosixPath(PREFIX)) + target.parent.mkdir(parents=True, exist_ok=True) + stream = archive.extractfile(member) + rw.need(stream is not None, "source stream") + with stream: + target.write_bytes(stream.read()) + rw.need(v.digest(out / "MANIFEST.json") == MANIFEST, "exact PR3015 manifest") + authenticate_tree(out) + + +def parameters(source, work): + """Only declared data change. Both stage programs remain byte-identical.""" + out = work / "parameters" + (out / "edits").mkdir(parents=True) + (out / "data").mkdir() + frames = v.load(v.PARENT / "vendor/preload_move.py", "release_frames") + edits = {} + for variant in ("base", "extra"): + words = v.words(variant, frames) + old, new = words["parent"], words["R1R2"] + rw.need( + v.canonical(new) + == v.read(v.PACKAGE / "evidence/FINITE.json")["variants"][variant]["R1R2"][ + "canonical_sha256" + ], + "release word equals checked finite word", + ) + edits[variant] = rw.stage_spec(old, new) + shutil.copy2( + source / f"data/WORD-{variant}.json.gz", + out / f"data/WORD-{variant}.json.gz", + ) + payload = json.dumps(new, sort_keys=True, separators=(",", ":")).encode() + (out / f"edits/FINAL-WORD-{variant}.json.gz").write_bytes( + gzip.compress(payload, compresslevel=1, mtime=0) + ) + v.save( + out / "edits/EDITS.json", + { + "edits": edits, + "declared": {"local_profile": rw.LOCAL, "width_inventory": rw.INVENTORY}, + }, + ) + for name in ("declared_edits.py", "edits_review.py"): + shutil.copy2(source / "edits" / name, out / "edits" / name) + pins = { + p.relative_to(out).as_posix(): v.digest(p) + for p in sorted((out / "edits").iterdir()) + } + v.save(out / "EDIT-PINS.json", pins) + return out + + +def stage(name, command, work, env, stages): + log, started = work / (name + ".log"), time.monotonic() + with log.open("w") as stream: + process = subprocess.Popen( + command, + cwd=work, + env=env, + stdin=subprocess.DEVNULL, + stdout=stream, + stderr=subprocess.STDOUT, + start_new_session=True, + ) + try: + code = process.wait(timeout=1800) + finally: + try: + os.killpg(process.pid, signal.SIGTERM) + process.wait(timeout=5) + except ProcessLookupError: + pass + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + process.wait(timeout=5) + with contextlib.suppress(ProcessLookupError): + os.killpg(process.pid, signal.SIGKILL) + stages.append( + { + "stage": name, + "exit_code": code, + "seconds": time.monotonic() - started, + "log_sha256": v.digest(log), + } + ) + v.save(work / "STAGES.json", stages) + rw.need(code == 0, "failed " + name + "; see " + str(log)) + print("PASS", name, flush=True) + + +def retarget(recipe, parameters): + changes = [] + for name, command in recipe: + if name == "declared-edit-stage": + flag, value = "--local-package", str(parameters) + elif name in ("derive-closed-adapters", "complete-admission"): + flag, value = "--source-profile", "rank7-shared-restore-fanin" + else: + continue + index = command.index(flag) + 1 + changes.append( + {"stage": name, "flag": flag, "old": command[index], "new": value} + ) + command[index] = value + if name == "derive-closed-adapters": + index = command.index("--source-commit") + 1 + changes.append( + { + "stage": name, + "flag": "--source-commit", + "old": command[index], + "new": value, + } + ) + command[index] = value + rw.need(len(changes) == 4, "only explicit stage data and source labels change") + return changes + + +def check_admission(work, source): + run = work / "run" + admission = v.read(run / "candidate/RESULT.json") + receipt_path = run / "candidate/release/RELEASE-RECEIPT.json" + receipt = v.read(receipt_path) + rw.need( + admission["status"] == "PASS_REPLICA_ORDER_FILL_DERIVATIVE_COMPLETE_RELEASE", + "full admission", + ) + rw.need(receipt["status"] == "PASS_RELEASE", "modern outer release") + rw.need( + {int(k): n for k, n in admission["profile"].items()} == v.EXPECTED, + "complete R1+R2 bill", + ) + rw.need( + admission["fill_sha256"] == v.digest(source / "allocation/FILL.json.gz"), + "unchanged literal fill", + ) + rw.need( + admission["order_sha256"] == v.digest(source / "allocation/ORDER.json"), + "unchanged order", + ) + rw.need( + admission["dispatch_sha256"] == v.digest(source / "allocation/DISPATCH.json"), + "unchanged dispatch", + ) + rw.need( + admission["release_receipt_sha256"] == v.digest(receipt_path), "release binding" + ) + rw.need( + admission["package_manifest_sha256"] == receipt["manifest_sha256"], + "same admitted package", + ) + rw.need( + Fraction(admission["kappa"]) == Fraction(receipt["kappa_decimal"]), + "same released endpoint", + ) + finite = v.read(v.PACKAGE / "evidence/FINITE.json") + rw.need( + Fraction(admission["kappa"]) > Fraction(finite["moment"]["PR3030_root"][1]), + "gain beyond PR3030", + ) + return admission, receipt_path, finite + + +def check_source(work, source, admission, finite): + run = work / "run" + edited = run / "source-edits" + authenticate_tree(edited) + authenticate_tree(source) + manifest = v.digest(edited / "MANIFEST.json") + native = v.read(run / "native/NATIVE-RECEIPT.json") + rw.need( + native["manifest_sha256"] == admission["source_manifest_sha256"] == manifest, + "exact new source", + ) + rw.need( + v.digest(run / "native/NATIVE-RECEIPT.json") + == admission["native_receipt_sha256"], + "native binding", + ) + rw.need(native["fresh_current_provider_count"] == 2, "both fresh providers") + for variant in ("base", "extra"): + path = edited / f"new/borrow/words/BORROW-WORD-43{variant}.json.gz" + rw.need( + v.canonical(v.read(path)) + == finite["variants"][variant]["R1R2"]["canonical_sha256"], + "actual checked word", + ) + rw.need( + native["providers"][variant]["word_sha256"] == v.digest(path), + "native exact word", + ) + return manifest + + +def check(work, source, stages): + admission, receipt_path, finite = check_admission(work, source) + manifest = check_source(work, source, admission, finite) + rw.need( + [s["stage"] for s in stages] == ["source-preflight", *NAMES], + "all source stages", + ) + rw.need(all(s["exit_code"] == 0 for s in stages), "successful complete recipe") + return { + "status": "PASS_SHARED_RESTORE_COMPLETE_RELEASE", + "kappa": admission["kappa"], + "source_manifest_sha256": manifest, + "admission_sha256": v.digest(work / "run/candidate/RESULT.json"), + "release_receipt_sha256": v.digest(receipt_path), + "fresh_retained_bootstrap": True, + "profile": v.EXPECTED, + "scope": "Conditional finite release; inherited theorem hypotheses remain.", + } + + +def environment(work): + env = dict( + os.environ, + PYTHONDONTWRITEBYTECODE="1", + PYTHONPYCACHEPREFIX=str(work / "bytecode"), + OPENBLAS_NUM_THREADS="1", + OMP_NUM_THREADS="1", + PYTHONINTMAXSTRDIGITS="0", + ) + for name in ( + "PYTHONPATH", + "PYTHONOPTIMIZE", + "WITNESS_SPEC", + "WITNESS_RECORD", + "WITNESS_DISCOVER", + ): + env.pop(name, None) + return env + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--repo", type=Path, required=True) + parser.add_argument("--work", type=Path, required=True) + parser.add_argument("--dry-run", action="store_true") + args = parser.parse_args() + work = args.work.resolve() + rw.need( + os.name == "posix" and sys.flags.optimize == 0, + "POSIX and enabled inherited assertions", + ) + rw.need( + not work.exists() and not work.is_relative_to(v.ROOT), + "fresh external workspace", + ) + v.authenticate() + work.mkdir(parents=True) + sys.dont_write_bytecode, sys.pycache_prefix = True, str(work / "bytecode") + source = work / "pr3015" + export(args.repo.resolve(), source) + data = parameters(source, work) + env = environment(work) + stages = [] + command = [ + sys.executable, + "-B", + str(source / "reproduce.py"), + "--repo", + str(args.repo.resolve()), + "--work", + str(work / "run"), + "--jobs", + "1", + "--dry-run", + ] + stage("source-preflight", command, work, env, stages) + recipe = v.read(work / "run/PREFLIGHT.json")["commands"] + rw.need([name for name, _ in recipe] == NAMES, "exact complete predecessor recipe") + v.save( + work / "RECIPE.json", {"commands": recipe, "changes": retarget(recipe, data)} + ) + if args.dry_run: + print("PREFLIGHT_ONLY_NOT_A_RELEASE", flush=True) + return + for name, command in recipe: + stage(name, command, work, env, stages) + result = check(work, source, stages) + v.save(work / "RESULT.json", result) + print(result["status"], result["kappa"], flush=True) + + +if __name__ == "__main__": + main() diff --git a/research/rank7-shared-restore-fanin/rewrite.py b/research/rank7-shared-restore-fanin/rewrite.py new file mode 100644 index 0000000000..c83002bc0d --- /dev/null +++ b/research/rank7-shared-restore-fanin/rewrite.py @@ -0,0 +1,96 @@ +# SPDX-License-Identifier: Apache-2.0 +"""One shared dirty-source covector across two separated restore consumers.""" + +import copy + +LOW = [256, 128, 64, 34, 17, 11, 4] +FULL = [256, 128, 64, 32, 16, 8, 4, 2, 1] +HIGH = [256, 128, 64, 34, 16, 10, 4, 1] +LOCAL = {"1": 2441, "2": 708, "3": 232, "4": 108, "5": 18, "8": 8} +INVENTORY = {"4": 26, "5": 2, "6": 16, "7": 52, "8": 99, "9": 213} + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def r1(word, specification, variant): + """Apply Jeremy Kothe's literal R1, retaining its exact source preimage.""" + edit = specification["edits"][variant][0] + need(len(specification["edits"][variant]) == 1, "one credited R1 edit") + need( + (edit["section"], edit["start"], edit["stop"]) == ("restore", 178, 180), + "R1 source address", + ) + need(word["restore"][178:180] == edit["old"], "R1 literal preimage") + changed = copy.deepcopy(word) + changed["restore"][178:180] = copy.deepcopy(edit["new"]) + return changed + + +def r2(word): + """Aggregate X40-2*X54, use it twice, and restore both dirty sources.""" + old = word["restore"] + need(len(old) in (203, 204), "bounded parent or R1 restore") + expected = { + 162: ["add", 18, 40, 1, 1], + 163: ["add", 18, 54, -2, 1], + 175: ["add", 22, 40, 1, 1], + 177: ["add", 22, 54, -2, 1], + } + for index, gate in expected.items(): + need(old[index] == gate + [HIGH], "literal R2 preimage at " + str(index)) + need( + old[176] == ["add", 22, 45, -1, 1, HIGH], "literal commuting consumer preimage" + ) + # Only these four source contacts may occur after the aggregation point. + contacts = [ + i for i in range(162, len(old)) if any(r in (40, 54) for r in old[i][1:3]) + ] + need(contacts == list(expected), "no intervening source observer or writer") + changed = copy.deepcopy(word) + gates = [copy.deepcopy(g) for i, g in enumerate(old) if i not in (163, 177)] + gates.insert(162, ["add", 40, 54, -2, 1, LOW.copy()]) + gates.append(["add", 40, 54, 2, 1, FULL.copy()]) + changed["restore"] = gates + need(len(gates) == len(old), "R2 preserves scalar gate count") + return changed + + +def finish(word, original, frames): + """Re-derive both paid profiles and the complete inverse cleanup.""" + profile, inventory = frames.frame_report(word) + need(inventory == INVENTORY, "unchanged helper widths") + word["report"]["local_profile"] = profile + word["report"]["width_inventory"] = inventory + forward = copy.deepcopy(word) + forward["A"] = forward["A"][forward["prelude_events"] :] + word["cleanup"] = frames.derive_cleanup(forward, frames.restored_of(original)) + changes = {key for key in original if original[key] != word[key]} + need(changes <= {"restore", "report", "cleanup"}, "only declared sections change") + need(len(word["helper_final"]) == 91, "all private buffers retained") + return word + + +def stage_spec(original, composed): + """Encode R1+R2 for PR3015's unchanged declared-edit source builder.""" + # The combined hunk is necessary because R2's second deletion adjoins R1. + return [ + { + "id": "R1+R2-shared-consumers", + "section": "restore", + "start": 162, + "stop": 180, + "old": original["restore"][162:180], + "new": composed["restore"][162:180], + }, + { + "id": "R2-full-source-restoration", + "section": "restore", + "start": 203, + "stop": 203, + "old": [], + "new": [composed["restore"][-1]], + }, + ] diff --git a/research/rank7-shared-restore-fanin/test_verify.py b/research/rank7-shared-restore-fanin/test_verify.py new file mode 100644 index 0000000000..34fdef928d --- /dev/null +++ b/research/rank7-shared-restore-fanin/test_verify.py @@ -0,0 +1,129 @@ +# SPDX-License-Identifier: Apache-2.0 +"""Behavioral controls for the exact source rewrite and release recipe.""" + +import copy +import unittest +from unittest.mock import patch + +import frame_trace +import reproduce +import rewrite as rw +import verify as v + + +class SharedRestoreTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + v.authenticate() + cls.parent = v.read(v.PARENT / "data/WORD-base.json.gz") + cls.specification = v.read(v.PACKAGE / "vendor/R1.json") + cls.frames = v.load(v.PARENT / "vendor/preload_move.py", "test_bound_frames") + + def test_dirty_sources_and_targets(self): + self.assertEqual( + v.scalar_identity(), + [ + ["1", "0", "0", "0"], + ["0", "1", "0", "0"], + ["1", "-2", "1", "0"], + ["1", "-2", "0", "1"], + ], + ) + + def test_both_literal_providers(self): + for variant in ("base", "extra"): + candidates = v.words(variant, self.frames) + self.assertEqual(candidates["R1R2"]["report"]["local_profile"], rw.LOCAL) + self.assertEqual(len(candidates["R1"]["restore"]), 204) + self.assertEqual(len(candidates["R1R2"]["restore"]), 204) + self.assertEqual(len(candidates["R1R2"]["helper_final"]), 91) + self.assertEqual(len(candidates["R1"]["cleanup"]), 5208) + self.assertEqual(len(candidates["R1R2"]["cleanup"]), 5208) + for key in ( + "A", + "B", + "warps", + "compensation", + "helper_final", + "start_extra", + ): + self.assertEqual(candidates["R1R2"][key], candidates["parent"][key]) + + def test_frame_gain_and_bad_high_frame(self): + r1 = rw.r1(self.parent, self.specification, "base") + candidate = rw.r2(r1) + old, entry = frame_trace.census(r1) + new, new_entry = frame_trace.census(candidate) + self.assertEqual(entry, new_entry) + self.assertEqual(new["1"] - old["1"], -2) + self.assertEqual(new["2"] - old["2"], 1) + candidate["restore"][162][-1] = rw.HIGH + too_expensive, _ = frame_trace.census(candidate) + self.assertEqual(too_expensive, old) + + def test_source_addressed_order_refused(self): + composed = rw.r2(rw.r1(self.parent, self.specification, "base")) + # R2 shifts R1's original address. Refuse that order instead of silently + # reinterpreting a source-addressed edit on a different word. + self.assertEqual(len(composed["restore"]), 204) + with self.assertRaisesRegex(ValueError, "R1 literal preimage"): + rw.r1(rw.r2(self.parent), self.specification, "base") + + def test_changed_preimages_refused(self): + for index, field, value in ((162, 3, -1), (163, -1, rw.FULL), (177, 2, 55)): + mutant = copy.deepcopy(self.parent) + mutant["restore"][index][field] = value + with self.assertRaisesRegex(ValueError, "literal R2 preimage"): + rw.r2(mutant) + + def test_consumer_observer_refused(self): + mutant = copy.deepcopy(self.parent) + mutant["restore"][176] = ["add", 45, 22, 1, 1, rw.HIGH] + with self.assertRaisesRegex(ValueError, "commuting consumer"): + rw.r2(mutant) + + def test_hidden_source_contact_refused(self): + mutant = copy.deepcopy(self.parent) + mutant["restore"][164] = ["add", 18, 54, 1, 1, rw.HIGH] + with self.assertRaisesRegex(ValueError, "observer"): + rw.r2(mutant) + + def test_declared_stage_reconstructs_exact_restore(self): + original = self.parent + composed = rw.r2(rw.r1(original, self.specification, "base")) + actual = copy.deepcopy(original["restore"]) + edits = rw.stage_spec(original, composed) + for edit in sorted(edits, key=lambda item: -item["start"]): + self.assertEqual(actual[edit["start"] : edit["stop"]], edit["old"]) + actual[edit["start"] : edit["stop"]] = edit["new"] + self.assertEqual(actual, composed["restore"]) + + def test_source_pin_failure(self): + with ( + patch.object(v, "digest", return_value="0" * 64), + self.assertRaisesRegex(ValueError, "source pin"), + ): + v.authenticate() + + def test_only_declared_recipe_arguments_change(self): + recipe = [ + ["declared-edit-stage", ["builder", "--local-package", "original"]], + [ + "derive-closed-adapters", + ["derive", "--source-profile", "old", "--source-commit", "old"], + ], + [ + "complete-admission", + ["admit", "--source-profile", "old", "--fill", "unchanged"], + ], + ] + changes = reproduce.retarget(recipe, v.PACKAGE) + self.assertEqual(len(changes), 4) + self.assertEqual(recipe[-1][1][-2:], ["--fill", "unchanged"]) + self.assertEqual(recipe[-1][1][2], "rank7-shared-restore-fanin") + with self.assertRaisesRegex(ValueError, "four|explicit"): + reproduce.retarget([], v.PACKAGE) + + +if __name__ == "__main__": + unittest.main() diff --git a/research/rank7-shared-restore-fanin/vendor/PR3015-CREDITS.md b/research/rank7-shared-restore-fanin/vendor/PR3015-CREDITS.md new file mode 100644 index 0000000000..3b6022cd64 --- /dev/null +++ b/research/rank7-shared-restore-fanin/vendor/PR3015-CREDITS.md @@ -0,0 +1,17 @@ +# Credits + +- **PR #2908, Jeremy Diviney**: the paired input/output extraction, its compensation rule `C*S`, the exact two-sided certificate (`structure.py`, vendored unchanged) and the closed-adapter admission chain. +- **PR #2917, Mason Hale**: the nine paired extractions and 82-endpoint words under PR2942, the refit/compose producer model that stage 2 follows, the T74 chronology (ORDER/DISPATCH), the allocation checker, moment auditor, extension stage and adapter derivation reused here. +- **PR #2957 / #2948 / #2966, Jeremy Kothe (jeremykothe2)**: the fourteen declared exactness-preserving gate rewrites in five classes (R-retime, A3779-cut-start-read, PM-carrier-lender-entry, B-carrier-retime, A-commuting-swap) and their pure applier (`vendor/declared_rewrites.py`, vendored unchanged); stage 3 composes exactly these rewrites onto this package's stage-2 word (`data/REWRITES-2957.json`, re-addressed with exact preimages). PR2966 composed the same rewrites onto our PR2942 words. +- **PR #2969, Dugongue**: the PR2942 + PR2957 composition at T370 and its cap-level headline nomination, this package's comparator and moment baseline (`allocation/baseline/`). Our stage 3 composes the same fourteen rewrites, here onto the stage-2 word. +- **PR #2918 (research/helper408-rank7-pairing), RossRichardson**: the fixed-cut rank-seven obstruction for helper408; this package's census of fresh rank-7 extractions reproduces it exactly and is consistent with it. +- **PR #2894 / #2833, Jeremy Kothe**: the preload re-synthesis supplier, the frame accounting and inverse-reverse cleanup (`vendor/preload_move.py`), the source materializer and the inherited supplier lineage. +- **PR #2857 / #2848, Yiyang Lu (Lyy-iiis)**: the shared-kernel words, the staged native/overlay tooling and the chronological flow model and realization (edge colouring) used to construct the allocation; PR2843 (Marius-Paul Dumitrean) is that flow model's starting point. +- **PR #2863 / #2839, Dugongue**: the packing lineage and the PR2839 owner engine. +- **Tekalign**: the independent owner/chronology checker (`allocation/vendor/independent_owners.py`) and admission tooling. +- **icekylinx**: the exact free-operator auditor retained as `vendor/audit_local.py` (PR2833). +- **themilkman216**: the observation that a cap-level allocation of these inventories needs a T whose basic counts are integral, which the allocation's degenerate-face step builds on. +- **Gareth Davidson (bitplane), PR #1995 / #2013**: the fixed-word terminal-subspace bounds that frame stage 1's scope; earlier rank-seven helper ends on other words are in `research/complex-rank7-end-pair`, `research/k8-rank7-composition` and the PR1090/PR1104 lineage (credited there). +- **PR #2930 / #2942, Marius-Paul Dumitrean**: the cap allocation of PR2917's words, the four normal-45 extractions under these words, the relaxation tools and the overlay/producer conventions reused here. +- **New here (Marius-Paul Dumitrean, with substantial AI assistance from Anthropic Claude via Claude Code)**: the codimension-2 census on paired-extraction words, the joint end-frame lowering of 22 restored helpers in five groups (stage 1), the five further extractions it makes profitable (stage 2), the exact composition with PR2957's rewrites (stage 3), the producer and local verification for all three stages, the overlay stage `rank7-joint-endframes` with its rebuild guards, the adapter generalization to six width classes, the literal T74 allocation of the changed inventory, its relaxation certificates and recorded gap, and the complete fresh replay. +- **New here (Jeremy Kothe (jeremykothe2), with AI assistance; edit found by our Stack2979 search)**: the declared literal edit stage (`edits/`, `tools/build_edits.py`) with its independent review, the edit R1 on PR #2979's restore section, the re-derived paid profile and cap certificate. PR #2979 (mdumitrean) is the base and is credited first for everything else. diff --git a/research/rank7-shared-restore-fanin/vendor/PR3015-NOTICE b/research/rank7-shared-restore-fanin/vendor/PR3015-NOTICE new file mode 100644 index 0000000000..70a09b472e --- /dev/null +++ b/research/rank7-shared-restore-fanin/vendor/PR3015-NOTICE @@ -0,0 +1,28 @@ +research/rank7-joint-endframes +Copyright 2026 Marius-Paul Dumitrean. Licensed under the Apache License, Version 2.0. +Prepared with substantial AI assistance (Anthropic Claude, via Claude Code). + +This package retains, byte-identical, Apache-2.0 files from: PR #2942 (Marius-Paul Dumitrean, head +a027b0f6fdb0ab2b42ba10fc31b53960166bf2bf, research/paired-extension-normal45): data/PARENT-base.json.gz and +data/PARENT-extra.json.gz (its data/WORD-*.json.gz), comparators/PR2942-CLAIM.json and tools/wordedit.py; PR #2917 +(Mason Hale, head 224bd5e56041c40078ff6b5fa7393733a215de5c, research/paired-helper-extension): structure.py (Jeremy +Diviney's PR2908 two-sided certificate checker), vendor/audit_local.py (PR2833's independent exact auditor, icekylinx +attribution), vendor/preload_move.py (Jeremy Kothe's PR2894 frame accounting and cleanup), allocation/ORDER.json, +allocation/DISPATCH.json and allocation/vendor/ (independent_owners.py: Tekalign's independent owner checker as vendored +by PR2839/PR2917; PLAN.json.gz, TEMPLATE.json.gz); PR #2957 (Jeremy Kothe, head b74b25f3ccc84c16e1a801d73b2f47e5ea764c78, +research/paired-extension-cap-fill-swaps): vendor/declared_rewrites.py (the pure applier of the fourteen declared +rewrites) and comparators/PR2957-CLAIM.json; PR #2966 (Jeremy Kothe, head e62d3eb9005117d82a9babcfa937ecc53237c490, +research/paired-extension-normal45-rewrites): comparators/PR2966-CLAIM.json; PR #2969 (Dugongue, head +e2ca469b08385d3d5e29a918d66dbefaf889e9f3, research/paired-swap-normal45): allocation/baseline/ (its CLAIM.json and its +allocation ORDER.json and PROFILE.json); and PR #2930 (head 81f3b5d12977eba09e06fbff729167d59faabe90): tools/relax.py, +tools/root.py, tools/relax_exact.py. +data/REWRITES-2957.json is Jeremy Kothe's PR2957 rewrite list, re-addressed to this package's stage-2 word with exact +preimages (every entry keeps a credit field). producer.py follows PR2917's producer.py (Mason Hale) for its paired steps; +verify.py, check_allocation.py, check_cap.py, run_registered.py and reproduce.py adapt our PR2942 versions of PR2917's and +PR2930's; tools/audit_allocation_moment.py is PR2917's exact moment auditor with only its authenticated baseline changed (to +the PR2969 headline); tools/derive_adapters.py generalizes PR2917's adapter derivation (PR2908, Jeremy Diviney); +tools/build_overlay.py follows the overlay conventions of PR2908's and PR2917's builders. construction/allocation/ retains +the flow model of PR2857/PR2843 (Yiyang Lu, Marius-Paul Dumitrean) as adapted for this allocation. All original notices of +the exported predecessor packages remain in force. + +Derived work (Apache-2.0): this package is PR #2979's (Marius-Paul Dumitrean, head be191346, research/rank7-joint-endframes) package, retained byte-identical except for the files named in README.md, plus a declared literal edit stage by Jeremy Kothe (jeremykothe2), with AI assistance: edits/ (declared_edits.py, edits_review.py, EDITS.json, FINAL-WORD-*.json.gz), tools/build_edits.py, EDIT-PINS.json, comparators/PR2979-CLAIM.json, and the edits to reproduce.py, run_registered.py, check_allocation.py, check_cap.py, allocation/PROFILE.json, allocation/PROVIDERS.json, certificates/RELAX-CAP.json, CLAIM.json, PINS.json and the release contract files (RELEASE.json, verify_release.py, verify_manifest.py). PR #2979's own evidence is kept under evidence/pr2979/. diff --git a/research/rank7-shared-restore-fanin/vendor/PR3030-FINITE.json b/research/rank7-shared-restore-fanin/vendor/PR3030-FINITE.json new file mode 100644 index 0000000000..0ddf2aba46 --- /dev/null +++ b/research/rank7-shared-restore-fanin/vendor/PR3030-FINITE.json @@ -0,0 +1,94 @@ +{ + "calls": 6660, + "idle": { + "1": 173160, + "3": 49617, + "48": 281903, + "5": 17205 + }, + "live": 663040, + "moment": { + "exchange_sign": { + "delta": { + "1": 20, + "14": -10, + "3": 17, + "48": 3, + "5": -15 + }, + "factored_f_derivative_upper": "-9740691/100000", + "saving_interval": "0 < b <= 1/100" + }, + "gain_over_previous_root": [ + "15520213124915363/10000000000000000000000000", + "3104042624983073/2000000000000000000000000" + ], + "previous_released_kappa": "17291512039830184429979999999999999999999998999999999999999999999999/10000000000000000000000000000000000000000000000000000000000000000000000", + "r1_cap": { + "cap_lower": "345830551200866186907/200000000000000000000000", + "cap_upper": "17291527560043309345351/10000000000000000000000000", + "idle_per_replica": { + "1": "234", + "3": "1341/20", + "48": "7619/20", + "5": "93/4" + }, + "invariant": { + "cap_requires_T_multiple_of": 20, + "first_multiple_of_74": 740, + "identity": "20*N_[9,9,9,9,9]@48 = 1341*T", + "scope": "Pattern integrality; chronological sufficiency is not asserted." + }, + "minimum_slack_lower": "330765675305227204675371142393288108400151493175513616739741339618653761718041326298111057624781171125553985546713931380045589238715164684519680158082564740064663626585139779201278666945976271879210312552348945421842669479860034347625742282914882395550466970485099678801067095436401756055414599223858358045300620622572136335593899309576755132023072924000625232706202289892486468856482758190936016483225256005340027972594846416378903928488242877276718725872416334489569899876284894464567074525397636741615414416512178272514355557374077726632979830127341350785520875007989552785927437863408466173223802409362040928161903300682009368388022327606117750186058531177130486222532353473629990336123001666673453285550918689932752488873889800407408618663032684827164043100388063145568074124864004671327888352440148634170348081682763216459720440600473567758633447479756936881069232841299315182009213270746341095947229872623984953305659320971822234633628503084874050627189372339056880769747466281694324513868890186542568399493669814325528063369943581616724732903252851537556934617596147852096403830386971101932076078846509096157094005135661650016075760947032213965707873129939184689263987243478656040906464411334211690007822733347623898160446742448648210266592497727349409694316897300189398121201087445724945334874140855821854415515276641951455907807350241364838774433095096175333305053290637933525897282705413481161097167181637390050045065310941579633986151479433320996941088323147696390012023269/81041342522688389710889387537294203079509119498590816677390723091620647310394495647029073126180702147730052952998589633954567841435821298786820185301991996265365431464176659884385965729599723770208940372607986728020752670720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "patterns": 2551, + "strict_patterns": 2539, + "tight_patterns": 12 + }, + "root": [ + "345830551200866186907/200000000000000000000000", + "17291527560043309345351/10000000000000000000000000" + ] + }, + "physical": 663549, + "profile": { + "1": 16443540, + "2": 4708620, + "3": 1594737, + "4": 719280, + "48": 281903, + "5": 137085, + "8": 53280 + }, + "rank_mass": 48165120, + "replicas": 740, + "roles": 2717280, + "scope": "Finite composed allocation and moment; fresh release is separate.", + "status": "PASS_T740_R1_FINITE", + "stock": { + "buffers": 91, + "group_order_times_physical_bit_length": 2647, + "live": 663040, + "namespaces": { + "centers": [ + 663040, + 663048 + ], + "coefficients": [ + 663547, + 663549 + ], + "tableau": [ + 663048, + 663456 + ], + "zero_buffers": [ + 663456, + 663547 + ] + }, + "payload": 2048, + "physical": 663549, + "reserve": 1512, + "stock_l2_bits": 1324 + } +} diff --git a/research/rank7-shared-restore-fanin/vendor/R1.json b/research/rank7-shared-restore-fanin/vendor/R1.json new file mode 100644 index 0000000000..90894fc659 --- /dev/null +++ b/research/rank7-shared-restore-fanin/vendor/R1.json @@ -0,0 +1,216 @@ +{ + "declared": { + "local_profile": { + "1": 2443, + "2": 707, + "3": 232, + "4": 108, + "5": 18, + "8": 8 + }, + "width_inventory": { + "4": 26, + "5": 2, + "6": 16, + "7": 52, + "8": 99, + "9": 213 + } + }, + "edits": { + "base": [ + { + "id": "R1", + "new": [ + [ + "add", + 61, + 63, + 1, + 1, + [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + ], + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 61, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ] + ], + "old": [ + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "section": "restore", + "start": 178, + "stop": 180 + } + ], + "extra": [ + { + "id": "R1", + "new": [ + [ + "add", + 61, + 63, + 1, + 1, + [ + 256, + 128, + 64, + 35, + 16, + 11, + 5 + ] + ], + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 61, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 32, + 16, + 8, + 4, + 2, + 1 + ] + ] + ], + "old": [ + [ + "add", + 22, + 61, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ], + [ + "add", + 22, + 63, + -1, + 1, + [ + 256, + 128, + 64, + 34, + 16, + 10, + 4, + 1 + ] + ] + ], + "section": "restore", + "start": 178, + "stop": 180 + } + ] + } +} \ No newline at end of file diff --git a/research/rank7-shared-restore-fanin/verify.py b/research/rank7-shared-restore-fanin/verify.py new file mode 100644 index 0000000000..08412ada94 --- /dev/null +++ b/research/rank7-shared-restore-fanin/verify.py @@ -0,0 +1,388 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Rebuild R2 and its R1 composition, audit actual words, certify full moments.""" + +import argparse +import copy +import gzip +import hashlib +import importlib.util +import json +import subprocess +import sys +import tempfile +from fractions import Fraction +from pathlib import Path + +import frame_trace +import rewrite as rw + +PACKAGE = Path(__file__).resolve().parent +ROOT = PACKAGE.parents[1] +PARENT = ROOT / "research/rank7-joint-endframes" +EXPECTED = {1: 1643016, 2: 471528, 3: 159468, 4: 71928, 5: 13716, 8: 5328, 48: 28190} + + +def read(path): + raw = path.read_bytes() + rw.need(len(raw) <= 2_000_000, "bounded input bytes") + return json.loads(gzip.decompress(raw) if path.suffix == ".gz" else raw) + + +def save(path, value): + path.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n") + + +def canonical(value): + return hashlib.sha256( + json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + ).hexdigest() + + +def digest(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def authenticate(): + pins = read(PACKAGE / "SOURCES.json")["files"] + rw.need(len(pins) <= 16, "bounded dependency inventory") + for entry in pins: + if entry["usage"] == "input": + rw.need( + digest(ROOT / entry["path"]) == entry["sha256"], + "source pin: " + entry["path"], + ) + vendor = read(PACKAGE / "VENDOR.json") + rw.need(len(vendor) <= 4, "bounded retained sources") + for entry in vendor: + rw.need(digest(PACKAGE / entry["path"]) == entry["sha256"], "retained pin") + + +def load(path, name): + # Callers authenticate every external module before loading it. + spec = importlib.util.spec_from_file_location(name, path) + rw.need(spec is not None and spec.loader is not None, "source module") + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def words(variant, frames): + original = read(PARENT / f"data/WORD-{variant}.json.gz") + r1 = rw.r1(original, read(PACKAGE / "vendor/R1.json"), variant) + candidates = { + "parent": copy.deepcopy(original), + "R1": r1, + "R2": rw.r2(original), + "R1R2": rw.r2(r1), + } + expected = { + "parent": {"1": 2445, "2": 706}, + "R1": {"1": 2443, "2": 707}, + "R2": {"1": 2443, "2": 707}, + "R1R2": {"1": 2441, "2": 708}, + } + for name, word in candidates.items(): + rw.finish(word, original, frames) + profile = {**rw.LOCAL, **expected[name]} + rw.need(word["report"]["local_profile"] == profile, "exact local bill") + return candidates + + +def scalar_identity(): + """Independent four-register Q matrix check, not a frame-engine result.""" + rows = [[Fraction(i == j) for j in range(4)] for i in range(4)] + original = copy.deepcopy(rows) + for target in (2, 3): + original[target] = [ + a + b - 2 * c + for a, b, c in zip(original[target], original[0], original[1], strict=True) + ] + for target, source, coefficient in ((0, 1, -2), (2, 0, 1), (3, 0, 1), (0, 1, 2)): + rows[target] = [ + a + coefficient * b for a, b in zip(rows[target], rows[source], strict=True) + ] + rw.need(rows == original, "dirty-source/target matrix identity") + rw.need(rows[:2] == [[1, 0, 0, 0], [0, 1, 0, 0]], "both sources restored") + return [[str(x) for x in row] for row in rows] + + +def restore_matrix(word): + """Exact scalar action of every literal restore gate on all 704 inputs.""" + rw.need(len(word["restore"]) <= 204, "bounded restore matrix") + rows = [{i: Fraction(1)} for i in range(704)] + for gate in word["restore"]: + target = gate[1] + rw.need(0 <= target < 704, "restore target") + if gate[0] == "add": + source, coefficient = gate[2], Fraction(gate[3], gate[4]) + rw.need(0 <= source < 704 and target != source, "restore source") + for column, value in tuple(rows[source].items()): + total = rows[target].get(column, 0) + coefficient * value + if total: + rows[target][column] = total + else: + rows[target].pop(column, None) + else: + rw.need(gate[0] == "scale", "restore scalar opcode") + coefficient = Fraction(gate[2], gate[3]) + rw.need(coefficient != 0, "invertible restore scale") + rows[target] = {c: coefficient * x for c, x in rows[target].items()} + return rows + + +def audit(word, label, work, accepted=True, reason=None): + path, output = work / (label + ".json.gz"), work / (label + ".audit.json") + payload = json.dumps(word, sort_keys=True, separators=(",", ":")).encode() + path.write_bytes(gzip.compress(payload, compresslevel=1, mtime=0)) + command = [ + sys.executable, + "-I", + "-B", + "-X", + "pycache_prefix=" + str(work / "audit-bytecode"), + str(PARENT / "vendor/audit_local.py"), + "--word", + str(path), + "--output", + str(output), + ] + with (work / (label + ".log")).open("w") as log: + result = subprocess.run( + command, stdout=log, stderr=subprocess.STDOUT, timeout=30, check=False + ) + if not accepted: + rw.need(result.returncode != 0, "mutant accepted: " + label) + text = (work / (label + ".log")).read_text() + rw.need( + reason is not None and reason in text, "actual mutation rejection reason" + ) + return "rejected" + rw.need(result.returncode == 0, "failed actual word audit: " + label) + report = read(output) + rw.need(report["status"] == "PASS_INDEPENDENT_EXACT_BORROWING_WORD", "audit status") + rw.need( + report["checked_columns"] == 632 and report["zero_buffers"] == 91, + "all dirty columns and private buffers", + ) + rw.need( + report["orientations"] == {"forward": "PASS", "dual": "PASS"}, + "both orientations", + ) + return { + "canonical_sha256": canonical(word), + "local_profile": report["local_profile"], + "width_inventory": report["width_inventory"], + "checked_columns": 632, + "orientations": report["orientations"], + "zero_buffers": 91, + } + + +def controls(candidate, original, variant, work): + labels = [] + for name in ( + "omit-aggregate", + "wrong-aggregate", + "omit-undo", + "wrong-undo", + "frame-too-small", + "stale-cleanup", + "stale-profile", + ): + mutant = copy.deepcopy(candidate) + if name == "omit-aggregate": + del mutant["restore"][162] + elif name == "wrong-aggregate": + mutant["restore"][162][3] = -1 + elif name == "omit-undo": + mutant["restore"].pop() + elif name == "wrong-undo": + mutant["restore"][-1][3] = -2 + elif name == "frame-too-small": + mutant["restore"][162][-1] = rw.LOW[:-1] + elif name == "stale-cleanup": + mutant["cleanup"] = copy.deepcopy(original["cleanup"]) + else: + mutant["report"]["local_profile"] = copy.deepcopy( + original["report"]["local_profile"] + ) + rw.need(mutant != candidate, "effective rejection control") + if name in ("omit-aggregate", "wrong-aggregate", "omit-undo", "wrong-undo"): + rw.need( + restore_matrix(mutant) != restore_matrix(candidate), + "independent scalar-equivalence control", + ) + reason = "explicit cleanup differs" + if name == "frame-too-small": + reason = "frame not monotone" + elif name == "stale-profile": + reason = "paid profile mismatch" + audit(mutant, variant + "-" + name, work, accepted=False, reason=reason) + labels.append(name) + # A coefficient-preserving but semantically invalid intervening read must + # fail the rewriter boundary, before any generated word is accepted. + mutant = copy.deepcopy(original) + mutant["restore"][164] = ["add", 18, 40, 1, 1, rw.FULL] + try: + rw.r2(mutant) + except ValueError as error: + rw.need("observer" in str(error), "contact guard rejects the actual obligation") + else: + raise ValueError("intervening source observer accepted") + return labels + ["intervening-source-observer"] + + +def moment(): + root = load(PARENT / "tools/root.py", "source_bound_moment") + parent = {int(k): n for k, n in read(PARENT / "allocation/PROFILE.json").items()} + r1 = {**parent, 1: parent[1] - 1332, 2: parent[2] + 666} + rw.need( + {**parent, 1: parent[1] - 2664, 2: parent[2] + 1332} == EXPECTED, + "complete bill", + ) + lower, upper = root.kappa_from_profile(EXPECTED, 74) + r1_lower, r1_upper = root.kappa_from_profile(r1, 74) + previous = read(PACKAGE / "vendor/PR3030-FINITE.json") + previous_profile = {int(k): n for k, n in previous["profile"].items()} + previous_cap_lower, previous_cap_upper = root.kappa_from_profile( + previous_profile, 740 + ) + rw.need( + [str(previous_cap_lower), str(previous_cap_upper)] + == previous["moment"]["root"], + "pinned T740 comparison", + ) + rw.need( + lower > previous_cap_upper > r1_upper, + "strict gain beyond current published T740 candidate", + ) + rw.need(root.rank_mass(EXPECTED) == 74 * 65088, "complete rank mass") + return { + "T": 74, + "calls": 666, + "profile": EXPECTED, + "rank_mass": 74 * 65088, + "root": [str(lower), str(upper)], + "R1_root": [str(r1_lower), str(r1_upper)], + "PR3030_root": [str(previous_cap_lower), str(previous_cap_upper)], + "gain_over_PR3030": [ + str(lower - previous_cap_upper), + str(upper - previous_cap_lower), + ], + "packing_relaxation": packing_ceiling(root, lower, upper), + } + + +def packing_ceiling(root, lower, upper): + local = {int(r): n for r, n in rw.LOCAL.items()} + idle_mass = 65088 - 9 * sum(r * n for r, n in local.items()) + rw.need( + idle_mass == 18837 and 2 * 51**2 < 73**2 <= 2 * 52**2, + "coverage and halving cap", + ) + relaxed = {r: 9 * n for r, n in local.items()} + relaxed[51] = Fraction(idle_mass, 51) + cap_lower, cap_upper = root.kappa_from_profile(relaxed, 1) + rw.need(upper < cap_lower, "favorable packing ceiling, not a feasible invoice") + return { + "maximum_idle_rank": 51, + "idle_mass_per_call": "2093", + "root": [str(cap_lower), str(cap_upper)], + "fraction_realized": [str(lower / cap_upper), str(upper / cap_lower)], + "scope": ( + "Coverage/halving relaxation in the moment variable; " + "not a packing construction." + ), + } + + +def run(work): + authenticate() + sys.dont_write_bytecode = True + sys.pycache_prefix = str(work / "module-bytecode") + frames = load(PARENT / "vendor/preload_move.py", "source_bound_frames") + reports = {} + for variant in ("base", "extra"): + candidates = words(variant, frames) + expected_restore = restore_matrix(candidates["parent"]) + rw.need( + all( + restore_matrix(word) == expected_restore for word in candidates.values() + ), + "all literal restore operators agree on every scalar input", + ) + reports[variant] = { + name: audit(word, variant + "-" + name, work) + for name, word in candidates.items() + } + reports[variant]["restore_matrix_sha256"] = canonical( + [sorted((c, str(x)) for c, x in row.items()) for row in expected_restore] + ) + reports[variant]["controls"] = controls( + candidates["R1R2"], candidates["parent"], variant, work + ) + before, entrance = frame_trace.census(candidates["R1"]) + after, new_entrance = frame_trace.census(candidates["R1R2"]) + delta = { + r: after.get(r, 0) - before.get(r, 0) for r in set(before) | set(after) + } + rw.need( + {r: n for r, n in delta.items() if n} == {"1": -2, "2": 1}, + "separate four-register set-span census", + ) + rw.need(entrance == new_entrance, "same restore-entry frames") + reports[variant]["frame_census"] = { + "R1": before, + "R1R2": after, + "restore_entry": entrance, + } + return { + "status": "PASS_SHARED_RESTORE_FANIN", + "variants": reports, + "scalar_matrix": scalar_identity(), + "moment": moment(), + "scope": ( + "Finite exact words and full fixed-allocation moment; " + "native/admission release is separate." + ), + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--work", type=Path, help="fresh external directory; retained on failure" + ) + parser.add_argument( + "--record", + action="store_true", + help="write evidence/FINITE.json after validation", + ) + args = parser.parse_args() + if args.work: + work = args.work.resolve() + rw.need( + not work.exists() and not work.is_relative_to(ROOT), + "fresh external work directory", + ) + work.mkdir(parents=True) + result = run(work) + save(work / "RESULT.json", result) + else: + with tempfile.TemporaryDirectory(prefix="shared-restore-") as directory: + result = run(Path(directory)) + result = json.loads(json.dumps(result, sort_keys=True)) + if args.record: + (PACKAGE / "evidence").mkdir(exist_ok=True) + save(PACKAGE / "evidence/FINITE.json", result) + else: + rw.need( + result == read(PACKAGE / "evidence/FINITE.json"), + "published deterministic evidence", + ) + print(result["status"], "local=2441,708,232,108,18,8 controls=16", flush=True) + + +if __name__ == "__main__": + main() diff --git a/research/rank7-shared-restore-fanin/verify_release.py b/research/rank7-shared-restore-fanin/verify_release.py new file mode 100644 index 0000000000..04eea38a09 --- /dev/null +++ b/research/rank7-shared-restore-fanin/verify_release.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Check retained release bindings, not a substitute for a fresh native replay.""" + +import copy +from fractions import Fraction + +import reproduce +import rewrite as rw +import verify as v + +REQUIRED = { + "RESULT.json", + "ADMISSION-RESULT.json", + "NATIVE-RECEIPT.json", + "RELEASE-RECEIPT.json", + "SOURCE-MANIFEST.json", + "EDIT-DERIVATION.json", + "STAGES.json", + "RECIPE.json", + "WORD-base.json.gz", + "WORD-extra.json.gz", + "INVOICE.json.gz", +} + + +def load(): + directory = v.PACKAGE / "evidence" + bindings = v.read(directory / "BINDINGS.json") + allowed = REQUIRED | {"ENVIRONMENT.json", "ADMISSION-STAGES.json"} + allowed |= { + "logs/" + name + ".log.txt" for name in ["source-preflight", *reproduce.NAMES] + } + rw.need(REQUIRED <= set(bindings) <= allowed, "closed retained evidence inventory") + hashes = {} + for name, expected in bindings.items(): + path = directory / name + rw.need(not path.is_symlink() and path.is_file(), "regular retained evidence") + hashes[name] = v.digest(path) + rw.need(hashes[name] == expected, "retained evidence hash: " + name) + records = { + name: v.read(directory / name) for name in REQUIRED if not name.endswith(".gz") + } + records["words"] = { + variant: v.read(directory / f"WORD-{variant}.json.gz") + for variant in ("base", "extra") + } + records["invoice"] = v.read(directory / "INVOICE.json.gz") + return records, hashes + + +def validate_bindings(records, hashes): + result = records["RESULT.json"] + admission, native = records["ADMISSION-RESULT.json"], records["NATIVE-RECEIPT.json"] + release = records["RELEASE-RECEIPT.json"] + derivation = records["EDIT-DERIVATION.json"] + rw.need( + result["status"] == "PASS_SHARED_RESTORE_COMPLETE_RELEASE", "composed release" + ) + rw.need( + admission["status"] == "PASS_REPLICA_ORDER_FILL_DERIVATIVE_COMPLETE_RELEASE", + "admission", + ) + rw.need( + native["status"] + == "PASS_COMPOSED_FRESH_NATIVE_PROVIDERS_AND_AUTHENTICATED_CACHE", + "native status", + ) + rw.need(native["fresh_current_provider_count"] == 2, "both fresh providers") + rw.need(release["status"] == "PASS_RELEASE", "outer release") + rw.need(result["fresh_retained_bootstrap"] is True, "fresh retained bootstrap") + source = hashes["SOURCE-MANIFEST.json"] + rw.need( + result["source_manifest_sha256"] + == admission["source_manifest_sha256"] + == native["manifest_sha256"] + == derivation["manifest_sha256"] + == source, + "same actual source", + ) + rw.need( + admission["source_profile"] == "rank7-shared-restore-fanin", "new source label" + ) + rw.need( + admission["native_receipt_sha256"] == hashes["NATIVE-RECEIPT.json"], + "native binding", + ) + rw.need( + admission["release_receipt_sha256"] + == result["release_receipt_sha256"] + == hashes["RELEASE-RECEIPT.json"], + "outer binding", + ) + rw.need( + result["admission_sha256"] == hashes["ADMISSION-RESULT.json"], + "admission binding", + ) + rw.need( + admission["package_manifest_sha256"] == release["manifest_sha256"], + "admitted package", + ) + + +def validate_endpoint(records): + result, admission = records["RESULT.json"], records["ADMISSION-RESULT.json"] + release = records["RELEASE-RECEIPT.json"] + rw.need( + {int(k): n for k, n in admission["profile"].items()} == v.EXPECTED, + "full paid profile", + ) + rw.need( + {int(k): n for k, n in result["profile"].items()} == v.EXPECTED, + "same complete bill", + ) + rw.need( + admission["replicas"] == 74 and admission["actual_expected_helpers"] == 408, + "T74 helper census", + ) + finite = v.read(v.PACKAGE / "evidence/FINITE.json") + lower = Fraction(finite["moment"]["root"][0]) + expected = ( + Fraction((lower * 10**24).__floor__(), 10**24) + - Fraction(1, 10**46) + - Fraction(1, 10**70) + ) + rw.need( + Fraction(result["kappa"]) + == Fraction(admission["kappa"]) + == Fraction(release["kappa_decimal"]) + == expected, + "exact strict released endpoint", + ) + return finite, expected + + +def validate(records, hashes): + validate_bindings(records, hashes) + finite, expected = validate_endpoint(records) + validate_invoice(records["invoice"]) + validate_words( + records, + hashes, + finite, + records["NATIVE-RECEIPT.json"], + records["SOURCE-MANIFEST.json"], + ) + stages = records["STAGES.json"] + rw.need( + [s["stage"] for s in stages] == ["source-preflight", *reproduce.NAMES], + "complete fresh stages", + ) + for entry in stages: + rw.need(entry["exit_code"] == 0, "successful actual stage") + name = "logs/" + entry["stage"] + ".log.txt" + rw.need(hashes[name] == entry["log_sha256"], "actual stage log binding") + return str(expected) + + +def validate_words(records, hashes, finite, native, manifest): + for variant in ("base", "extra"): + word = records["words"][variant] + rw.need( + v.canonical(word) + == finite["variants"][variant]["R1R2"]["canonical_sha256"], + "retained word equals the regenerated semantic payload", + ) + name = f"new/borrow/words/BORROW-WORD-43{variant}.json.gz" + rw.need( + native["providers"][variant]["word_sha256"] + == manifest[name] + == hashes[f"WORD-{variant}.json.gz"], + "native word and compiled source binding", + ) + rw.need(len(word["helper_final"]) == 91, "all private buffers") + rw.need(word["report"]["local_profile"] == rw.LOCAL, "actual local bill") + rw.need(word["report"]["width_inventory"] == rw.INVENTORY, "unchanged widths") + + +def validate_invoice(invoice): + rw.need( + invoice["status"] + == "PASS_INDEPENDENT_MIXED_ASYNC_SCALAR_PREFIX_AND_FINITE_INVOICE", + "actual emitted-program invoice", + ) + rw.need( + invoice["physical"] == 66813 + and invoice["live"] == 66304 + and invoice["private_zero_buffers"] == 91, + "all physical families and buffers", + ) + local = {int(r): n for r, n in invoice["selected_local_paid_profile"].items()} + rw.need( + local == {int(r): 666 * n for r, n in rw.LOCAL.items()}, + "actual paid local calls", + ) + rw.need( + invoice["complete_invocation_sweeps"] == invoice["bridge_sweeps"] == 666, + "all invocation and bridge sweeps", + ) + block = invoice["blocknorm"] + rw.need( + block["physical_families"] == 66813 and block["stock_l2_bits"] == 1322, + "actual stock bound", + ) + rw.need( + block["local_actual_prefix_bits"] == 93 + and invoice["global_prefix_bits"] == block["actual_prefix_bits"] == 1475, + "actual local/global prefixes", + ) + rw.need( + block["required_reserve_bits"] + == 1510 + <= invoice["charged_prefix_bits"] + == block["retained_payload_bits"] + == 2048, + "charged prefix allowance", + ) + checks = invoice["strict_checks"] + rw.need( + len(checks) == 9 and all(value is True for value in checks.values()), + "all strict finite invoice checks", + ) + + +def controls(records, hashes): + names = [ + "native-count", + "paid-profile", + "stale-kappa", + "source-manifest", + "native-word", + "missing-stage", + "derivation", + "private-buffer", + "prefix", + "missing-sweep", + ] + for name in names: + mutant = copy.deepcopy(records) + if name == "native-count": + mutant["NATIVE-RECEIPT.json"]["fresh_current_provider_count"] = 1 + elif name == "paid-profile": + mutant["ADMISSION-RESULT.json"]["profile"]["1"] += 1 + elif name == "stale-kappa": + mutant["RESULT.json"]["kappa"] = "0.001729152756004330934535" + elif name == "source-manifest": + mutant["ADMISSION-RESULT.json"]["source_manifest_sha256"] = "0" * 64 + elif name == "native-word": + mutant["NATIVE-RECEIPT.json"]["providers"]["base"]["word_sha256"] = "0" * 64 + elif name == "missing-stage": + mutant["STAGES.json"].pop(3) + elif name == "derivation": + mutant["EDIT-DERIVATION.json"]["manifest_sha256"] = "0" * 64 + elif name == "private-buffer": + mutant["invoice"]["private_zero_buffers"] = 90 + elif name == "prefix": + mutant["invoice"]["charged_prefix_bits"] = 1474 + else: + mutant["invoice"]["bridge_sweeps"] = 665 + try: + validate(mutant, hashes) + except ValueError: + continue + raise ValueError("accepted release mutant: " + name) + return len(names) + + +def main(): + v.authenticate() + records, hashes = load() + kappa = validate(records, hashes) + count = controls(records, hashes) + print("PASS_SHARED_RESTORE_RECORDED_RELEASE", kappa, "controls=" + str(count)) + + +if __name__ == "__main__": + main()