diff --git a/system/public/whistlegraph.org/stars.html b/system/public/whistlegraph.org/stars.html
index 68a57c6cb..8276743ab 100644
--- a/system/public/whistlegraph.org/stars.html
+++ b/system/public/whistlegraph.org/stars.html
@@ -59,6 +59,7 @@
@media (prefers-reduced-motion:reduce){ #card{transition:none} }
+
diff --git a/system/public/whistlegraph.org/tv.html b/system/public/whistlegraph.org/tv.html
index 6b60a18d0..8bbbb8224 100644
--- a/system/public/whistlegraph.org/tv.html
+++ b/system/public/whistlegraph.org/tv.html
@@ -68,6 +68,7 @@
body.tv #qr{width:140px;height:140px}
body.tv #bar{display:none}
+
diff --git a/system/public/whistlegraph.org/wild.html b/system/public/whistlegraph.org/wild.html
index 2efc529d7..b096c679f 100644
--- a/system/public/whistlegraph.org/wild.html
+++ b/system/public/whistlegraph.org/wild.html
@@ -61,6 +61,7 @@
footer{max-width:760px;margin:30px auto 0;font:12px/1.7 var(--mono);color:var(--dim)}
footer a{color:var(--dim)}
+
diff --git a/system/tests/visit-tracking-browser.test.mjs b/system/tests/visit-tracking-browser.test.mjs
new file mode 100644
index 000000000..fa4e0d333
--- /dev/null
+++ b/system/tests/visit-tracking-browser.test.mjs
@@ -0,0 +1,59 @@
+import test from "node:test";
+import assert from "node:assert/strict";
+import { readFile } from "node:fs/promises";
+import { chromium } from "playwright";
+
+test("browser funnel, automation, privacy opt-out, private SPA routes and duplicate installation", async () => {
+ const browser = await chromium.launch({ headless: true, channel: process.env.PLAYWRIGHT_CHANNEL });
+ try {
+ const context = await browser.newContext();
+ const received = [];
+ await context.route("**/*", async route => {
+ const url = new URL(route.request().url());
+ if (url.pathname === "/api/visit-track") {
+ received.push(JSON.parse(route.request().postData()));
+ return route.fulfill({ status: 204, headers: { "Access-Control-Allow-Origin": "*" } });
+ }
+ if (/\/visit-(tracker|model)\.mjs$/.test(url.pathname)) {
+ const name = url.pathname.split("/").at(-1);
+ return route.fulfill({ contentType: "text/javascript", body: await readFile(new URL(`../public/aesthetic.computer/lib/${name}`, import.meta.url), "utf8"), headers: { "Access-Control-Allow-Origin": "*" } });
+ }
+ return route.fulfill({ contentType: "text/html", body: `play ` });
+ });
+ const page = await context.newPage();
+ await page.clock.install();
+ await page.goto("https://nopaint.art/");
+ await page.waitForFunction(() => !!window.acVisits);
+ await page.waitForTimeout(50);
+ assert.equal(received.length, 1);
+ assert.equal(received[0].automated, true);
+ await page.evaluate(() => window.dispatchEvent(new KeyboardEvent("keydown", { key: "a" })));
+ await page.waitForTimeout(50);
+ assert.equal(received.length, 1, "synthetic input is ignored");
+ await page.locator("input").fill("secret");
+ assert.equal(received.length, 1, "form input is ignored");
+ await page.locator("button").click();
+ await page.waitForTimeout(50);
+ assert.ok(received.some(row => row.interacted));
+ await page.clock.runFor(11000);
+ await page.waitForTimeout(50);
+ assert.ok(received.some(row => row.interacted && row.activeSeconds >= 10));
+ const ids = new Set(received.map(row => row.id));
+ assert.equal(ids.size, 1);
+ assert.ok(!JSON.stringify(received).includes("secret"));
+ await page.evaluate(async () => (await import("https://aesthetic.computer/aesthetic.computer/lib/visit-tracker.mjs")).startVisitTracker());
+ await page.evaluate(() => history.pushState({}, "", "/mail"));
+ await page.clock.runFor(2000);
+ const count = received.length;
+ await page.locator("button").click();
+ await page.clock.runFor(11000);
+ assert.equal(received.length, count, "private SPA routes stop sending");
+ const optedOut = await context.newPage();
+ await optedOut.addInitScript(() => Object.defineProperty(navigator, "globalPrivacyControl", { value: true }));
+ await optedOut.goto("https://jas.life/");
+ await optedOut.waitForTimeout(100);
+ assert.equal(await optedOut.evaluate(() => !!window.acVisits), false);
+ assert.equal(received.length, count);
+ await context.close();
+ } finally { await browser.close(); }
+});
diff --git a/system/tests/visit-tracking.test.mjs b/system/tests/visit-tracking.test.mjs
new file mode 100644
index 000000000..ebcc0c372
--- /dev/null
+++ b/system/tests/visit-tracking.test.mjs
@@ -0,0 +1,53 @@
+import test from "node:test";
+import assert from "node:assert/strict";
+import { randomUUID } from "node:crypto";
+import { validateVisit, visitUpdate, visitProperty, visitSurface, automatedVisit } from "../public/aesthetic.computer/lib/visit-model.mjs";
+import { handler } from "../netlify/functions/visit-track.mjs";
+
+const snapshot = () => ({ version: 1, id: randomUUID(), surface: "home",
+ activeSeconds: 10, interacted: true, automated: false,
+ inputs: ["pointer"], actions: ["link_followed"] });
+
+test("property identity comes from a reviewed HTTPS origin, not submitted data", () => {
+ const value = snapshot();
+ assert.equal(validateVisit({ ...value, property: "jas.life" }, "https://nopaint.art").property, "nopaint.art");
+ for (const origin of ["null", "http://nopaint.art", "https://nopaint.art:8888", "https://nopaint.art.evil.test", "https://mail.aesthetic.computer"])
+ assert.equal(validateVisit(value, origin), null);
+ assert.equal(visitProperty("www.whistlegraph.org"), "whistlegraph.org");
+});
+
+test("private routes are excluded and arbitrary URLs never enter stored data", () => {
+ for (const path of ["/mail", "/admin.html", "/chat~private", "/wallet/index.html", "/%61dmin", "/account/reset"])
+ assert.equal(visitSurface(path), null, path);
+ const value = validateVisit({ ...snapshot(), email: "private", path: "/secret", text: "private" }, "https://jas.life");
+ assert.ok(!JSON.stringify(visitUpdate(value)).includes("private"));
+});
+
+test("only bounded signals pass and bot evidence cannot be cleared", () => {
+ const value = snapshot();
+ for (const bad of [{ actions: ["anything"] }, { inputs: ["password"] }, { activeSeconds: 999 }, { interacted: false }, { id: "not-a-uuid" }])
+ assert.equal(validateVisit({ ...value, ...bad }, "https://oskiewar.com"), null);
+ const bot = validateVisit(value, "https://oskiewar.com", "HeadlessChrome");
+ assert.equal(bot.automated, true);
+ assert.equal(visitUpdate(bot).$max.automated, true);
+ assert.equal(automatedVisit({}, "?offline-render"), true);
+});
+
+test("cumulative updates preserve milestones and expire after 35 days", () => {
+ const now = new Date("2026-09-23T00:00:00Z");
+ const update = visitUpdate(validateVisit(snapshot(), "https://jas.life"), now);
+ assert.equal(update.$max.engaged, true);
+ assert.equal(update.$max["actions.link_followed"], true);
+ assert.equal(+update.$setOnInsert.expiresAt - +now, 35 * 86400000);
+ assert.equal(update.$min.startedAt, now);
+ assert.equal(update.$set, undefined);
+});
+
+test("collector rejects invalid requests before opening the database", async () => {
+ for (const event of [
+ { httpMethod: "GET" },
+ { httpMethod: "POST", body: "{" },
+ { httpMethod: "POST", body: "x".repeat(2049) },
+ { httpMethod: "POST", body: JSON.stringify(snapshot()), headers: { origin: "https://evil.test" } },
+ ]) assert.ok((await handler(event)).statusCode >= 400);
+});
diff --git a/toolchain/analytics/VISITS.md b/toolchain/analytics/VISITS.md
new file mode 100644
index 000000000..7ac180fe0
--- /dev/null
+++ b/toolchain/analytics/VISITS.md
@@ -0,0 +1,132 @@
+# Public website interaction model
+
+The first-party collector is `POST https://aesthetic.computer/api/visit-track`.
+The browser module and reviewed host catalog live in
+`system/public/aesthetic.computer/lib/visit-{tracker,model}.mjs`.
+This supplements Cloudflare request/byte totals, boots, piece logs and stored
+replays. It does not export operational records to PostHog.
+
+## What the next 72-hour report can say
+
+| Measure | Definition |
+| --- | --- |
+| Visit | One visible top-level page load, or new SPA pathname, with a random in-memory ID |
+| Interacted visit | Visible-page trusted pointer/touch/keyboard input outside form fields, or a pressed gamepad button |
+| Engaged visit | An interacted visit with at least 10 seconds of accumulated visible time |
+| Action visit | At least one occurrence of a reviewed action during that visit |
+| Known automation | WebDriver, recognizable bot UA, explicit render query, or `window.acAutomation = true` |
+| Unknown audience | A non-automated visit without interaction evidence |
+
+“Likely human” means non-automated + interacted; it is not proof of personhood.
+An automation framework can generate trusted events. Untagged automation may
+remain. IPs are not counted as people. No cross-page retention, unique-user,
+cross-domain journey or conversion-attribution claims can be made from these
+ephemeral IDs. A returning person loading three pages produces three visits.
+
+Visible-time lower-bound buckets are 0, 10, 30, 60, 180 and 600 seconds.
+This is foreground display time, not proof of attention. Polling gaps are
+capped at two seconds so sleep/suspension does not fabricate engagement.
+All actions are boolean per visit, not totals of clicks, rounds or downloads.
+Download clicks do not prove completed downloads. Canvas interaction does not
+prove a saved painting. Media starts count only after interaction.
+
+## Actions
+
+Common pages record `link_followed`, `download_clicked`, `canvas_interacted`
+and `media_started`, with no destination URL, canvas content or media name.
+Oskiewar additionally records `round_started`, `round_completed` (successful
+replay upload), and `match_completed` (uploaded final score reaches five).
+These are interaction-qualified, per-visit milestones; the existing replay
+collection remains the authority for round totals. A failed upload will not
+produce a completion milestone even if the player finished the round.
+
+Product code can call `window.acVisits?.action(name)` for a reviewed action.
+New actions must be added to the shared allowlist with a documented success
+condition and a test. Do not infer publish/purchase/account success from clicks.
+
+## Storage and privacy
+
+`network-visits` stores one document per property + random visit UUID. A
+cumulative snapshot with Mongo `$max` and a unique `_id` preserves milestones
+despite retries or out-of-order delivery. Automation can be upgraded to true,
+never downgraded. A TTL on `expiresAt` expires rows after 35 days; there is no
+permanent raw-event stream. Dates come from the server, not the client clock.
+The property comes from the HTTPS Origin allowlist, never a submitted hostname.
+An origin header and self-reported events are not cryptographic proof of human
+activity. The collector rejects unreviewed values and oversized bodies and
+uses a bounded, in-memory rate guard (240 requests/minute/source).
+
+No stored IP, user agent, account/handle, referrer, URL, query string, page text,
+form value, key or pointer coordinate. The transient rate-limit digest is
+process-salted, expires after one minute and never leaves memory. Requests omit
+credentials and referrers. No tracking cookies or browser storage are used.
+DNT, GPC, `window.acVisitTrackingDisabled = true`, private routes and embedded
+frames suppress collection. The disclosure is `/network-privacy.html`.
+
+Render/test harnesses should set `window.acAutomation = true` before loading
+the module, or append `?ac-automation=1`. Existing `social-preview`,
+`offline-render` and `jev-vs-jev` parameters also mark automation. Headless
+browser QA must remain automated in production verification.
+
+## Readout
+
+On Lith:
+
+```sh
+cd /opt/ac/system
+node --env-file=.env ../toolchain/analytics/visits-report.mjs --hours 72
+```
+
+Optional `--end 2026-09-26T20:00:00Z` makes a report reproducible. Rows group by
+property, automation classification and broad surface. Report automation
+separately; subtract interacted from visits for unknown audience. The sum of
+visible-time buckets is a lower bound, not exact duration. Compare with edge
+requests to describe crawler/polling volume, but never subtract these different
+instruments to invent a bot count. A report is grouped by visit start: later
+milestones can update an earlier cohort. `lastSeenAt` is available for live use.
+
+The earliest retained event indicates available history, not deployment time.
+Check the deployment/coverage record before interpreting a zero. Archived
+aggregate reports may be kept without visit IDs. No retrospective backfill is
+possible for the period before installation.
+
+## Coverage
+
+The shared AC shell covers AC, notepat.com, nopaint.art, laklok.com and mime.ac
+when those domains serve it. Static entry pages cover Whistlegraph, Jas,
+KidLisp, Prompt, Aesel, Just Another System, Quiltnet and the public AC paper,
+giving, bills, pop, NFT and language front doors. Oskiewar uses its standalone
+shell. Sotce uses its function-generated HTML. Client domains on the same DNS
+account (false.work, danzballet.studio, regarde.io, drvkforlife.com) are not
+included in the studio measurement catalog without explicit client scope.
+www aliases roll up to the same property. Reviewed public subdomains are
+explicit; unlisted hosts are denied. Archived RDP painting pages and other
+static documents without the script are not automatically covered.
+
+Known deployment boundaries discovered September 23, 2026:
+
+- menuband.app `/` redirects to the App Store: no browser visit can fire on
+ the redirect. Its hosted support/advanced pages are instrumented. App usage
+ and App Store downloads are separate instruments.
+- Client regarde.io is on Cloudflare Pages, outside the Lith deploy.
+- Client drvkforlife.com is on Shopify, outside the Lith deploy.
+- wipppps.world currently serves an external site despite old Lith routing.
+- aesthetic.direct and digitpain.com did not answer the initial HTTPS probe;
+ local entry sources are prepared, but live coverage is not assumed.
+
+The domain allowlist is not a deployment-completion list. Run the coverage
+audit after shipping; external deployments require their own source/control
+path. Cloudflare's account inventory and Porkbun's registrar inventory were
+both consulted; neither alone is a complete list of public web properties.
+
+## Verification
+
+```sh
+node --test system/tests/visit-tracking.test.mjs
+PLAYWRIGHT_CHANNEL=chrome node --test system/tests/visit-tracking-browser.test.mjs
+```
+
+The browser check exercises trusted versus synthetic input, form exclusion,
+engagement, duplicate installation, private SPA navigation and GPC. Production
+checks should use marked automation and verify database milestones as well as
+HTTP responses. Do not label a 204 alone as verified measurement.
diff --git a/toolchain/analytics/visits-coverage.mjs b/toolchain/analytics/visits-coverage.mjs
new file mode 100644
index 000000000..93e4d54bb
--- /dev/null
+++ b/toolchain/analytics/visits-coverage.mjs
@@ -0,0 +1,15 @@
+#!/usr/bin/env node
+import { VISIT_PROPERTIES } from "../../system/public/aesthetic.computer/lib/visit-model.mjs";
+const domains = Object.keys(VISIT_PROPERTIES);
+const rows = [];
+for (let i = 0; i < domains.length; i += 4) {
+ await Promise.all(domains.slice(i, i + 4).map(async property => {
+ try {
+ const response = await fetch(`https://${property}/`, { signal: AbortSignal.timeout(15000) });
+ const html = await response.text();
+ rows.push({ property, status: response.status, destination: new URL(response.url).hostname,
+ installed: response.ok && html.includes('/visit-tracker.mjs') });
+ } catch { rows.push({ property, installed: false, error: "HTTPS probe failed" }); }
+ }));
+}
+console.log(JSON.stringify({ checkedAt: new Date(), rows: rows.sort((a, b) => a.property.localeCompare(b.property)) }, null, 2));
diff --git a/toolchain/analytics/visits-report.mjs b/toolchain/analytics/visits-report.mjs
new file mode 100644
index 000000000..f722ff104
--- /dev/null
+++ b/toolchain/analytics/visits-report.mjs
@@ -0,0 +1,27 @@
+#!/usr/bin/env node
+// Run on Lith: cd /opt/ac/system && node --env-file=.env ../toolchain/analytics/visits-report.mjs --hours 72
+import { connect, closePool } from "../../system/backend/database.mjs";
+import { VISIT_COLLECTION, RETENTION_DAYS, visitReportPipeline } from "../../system/public/aesthetic.computer/lib/visit-model.mjs";
+const args = process.argv.slice(2);
+const value = name => args[args.indexOf(name) + 1];
+const hours = args.includes("--hours") ? Number(value("--hours")) : 72;
+const end = args.includes("--end") ? new Date(value("--end")) : new Date();
+if (!Number.isFinite(hours) || hours <= 0 || hours > RETENTION_DAYS * 24 || !Number.isFinite(+end))
+ throw new Error(`Use --hours 1..${RETENTION_DAYS * 24} and optional --end ISO-date`);
+const start = new Date(+end - hours * 3600000);
+const { db } = await connect();
+try {
+ const collection = db.collection(VISIT_COLLECTION);
+ const rows = await collection.aggregate(visitReportPipeline(start, end), { maxTimeMS: 20000 }).toArray();
+ const periods = await collection.aggregate(visitReportPipeline(start, end, true), { maxTimeMS: 20000 }).toArray();
+ const first = await collection.find({}, { projection: { startedAt: 1 } }).sort({ startedAt: 1 }).limit(1).next();
+ console.log(JSON.stringify({ format: "ac.network-visits.v1", start, end,
+ earliestRetainedVisit: first?.startedAt || null, retentionDays: RETENTION_DAYS,
+ unit: "page visits, not unique people",
+ audience: rows.filter(row => !row._id.automated).map(row => ({ ...row, unknownAudience: row.visits - row.interacted })),
+ automation: rows.filter(row => row._id.automated),
+ periods: periods.map(row => ({ ...row,
+ start: new Date(+start + row._id.period * 86400000),
+ end: new Date(Math.min(+end, +start + (row._id.period + 1) * 86400000)) })),
+ }, null, 2));
+} finally { await closePool(); }
diff --git a/xbox/live/mac-test.html b/xbox/live/mac-test.html
index f2ed5c36d..79f0d4a93 100644
--- a/xbox/live/mac-test.html
+++ b/xbox/live/mac-test.html
@@ -199,6 +199,7 @@
#account-panel #account-redirect:hover { background: none; color: #f3f6ff; }
#account-panel.working #account-field { opacity: .6; }
+
@@ -1127,6 +1128,12 @@
method: "POST", headers: { "content-type": "application/json" }, body: payload,
});
if (!response.ok) throw new Error(`upload returned ${response.status}`);
+ globalThis.acVisits?.action("round_completed");
+ try {
+ const demo = JSON.parse(payload);
+ if (Array.isArray(demo.finalRoundWins) && Math.max(...demo.finalRoundWins) >= 5)
+ globalThis.acVisits?.action("match_completed");
+ } catch { /* telemetry must never interrupt gameplay */ }
return true;
} catch (error) {
telemetry("REPLAY_WEB_ERROR", error.message);
@@ -1564,9 +1571,12 @@
// Actions raised before it lands wait in a short queue.
let analyticsReady = false;
const analyticsQueue = [];
- const analytics = (action, properties) => jevDemo ? false : analyticsReady
- ? captureOskiewarAction(action, properties)
- : analyticsQueue.push([action, properties]) > 0;
+ const analytics = (action, properties) => {
+ if (action === "match_started") globalThis.acVisits?.action("round_started");
+ return jevDemo ? false : analyticsReady
+ ? captureOskiewarAction(action, properties)
+ : analyticsQueue.push([action, properties]) > 0;
+ };
if (!jevDemo) fetch("/api/product-analytics-config", { cache: "no-store" })
.then((response) => response.ok ? response.json() : null)
.catch(() => null)
diff --git a/xbox/live/privacy.html b/xbox/live/privacy.html
index c9f2121bd..e2bab207a 100644
--- a/xbox/live/privacy.html
+++ b/xbox/live/privacy.html
@@ -56,12 +56,11 @@
privacy
- oskiewar · last updated 9 September 2026
+ oskiewar · last updated 23 September 2026
- oskiewar has no accounts, no sign-in and no advertising. It never asks for
- your name, your email or your location, and there is no profile of you to
- build because the game does not know who you are.
+ oskiewar can be played without signing in. Optional account features,
+ round recordings, and website measurements are described below.
What leaves your machine
@@ -91,29 +90,30 @@
- What never leaves
+ Website visits
- There is no analytics SDK, no advertising identifier, no third-party
- tracker, and no cross-app or cross-site tracking of any kind. oskiewar does
- not read your files, your contacts, your camera, your microphone or your
- location. Nothing is sold or shared with a data broker, because nothing
- about you is collected in the first place.
+ We count page visits, visible-time buckets, interaction types and gameplay
+ milestones using a random ID kept only for the current page visit. No
+ cookies, account identity, raw inputs, full URLs or page content are sent
+ by this visit tracker. Records expire after 35 days. Known automated
+ browsers are reported separately; these counts are not unique people.
+ Do Not Track and Global Privacy Control disable this tracker.
+ See network measurement details .
- Children
+ Other services
- The game is safe for children to play and collects nothing from anyone
- regardless of age. Because it asks for no personal information at all, there
- is none to handle differently.
+ Optional sign-in uses our account service. Existing product analytics and
+ gameplay recordings are separate from anonymous visit measurements. We
+ do not sell this information to data brokers. Avoid putting personal
+ information in public fighter names or shared rounds.
Your say
- Since there is no account and nothing identifying you, there is no personal
- record to request or delete. If you would like a round recording removed,
- write to
- mail@aesthetic.computer and say
- which room it was in.
+ For account or round-recording questions, write to
+ mail@aesthetic.computer .
+ Include the public round address if you want a recording removed.
Changes
diff --git a/xbox/live/social/manifest.json b/xbox/live/social/manifest.json
index 4b65d0133..315a9856d 100644
--- a/xbox/live/social/manifest.json
+++ b/xbox/live/social/manifest.json
@@ -1,7 +1,7 @@
{
"format": "ac.oskiewar.social-preview",
"version": 2,
- "build": "652e36c5bd858457",
+ "build": "1eb81564ca3cdb35",
"theme": "light",
"imageWidth": 1200,
"imageHeight": 630,
diff --git a/xbox/live/social/oskiewar-title.jpg b/xbox/live/social/oskiewar-title.jpg
index 98b33ea73e28fc19ca7e57c963b60b69ba5a0cec..1b13d5a0af673d6c1105131cfa7a26f03e75c1fe 100644
GIT binary patch
literal 61861
zcmex=3)=m5zjCKnfgXdIZ4f#KUVkm(EzmvwQd!6(d_l3JY1z`*cfiVEYE(!^9W?*1UVPIg;NJnBPA+eJS
zia_dn7#J9Aa&t;Sc7fc($iTqBlbRPA%)r3F!N9;E!%)l+#Nf{01oA&f0Ruz+A_fMF
zuM7;#6A)raGZ`4Rw=ytD+(L+{EMQ>ZZ((5Ab{-*y2$O=uqC~KHEDQ_`OlfHh44;-W
zFz`k)FbH2@VBm@d%P}x8;BcD)*lq3%`3(6C=?pmxsSFAXo(y>m$qaf73JgXJ1`LJ_
zX8&(9I5RLYGJ+5j1TeEQg8&-~3o|P_8#_A)b8vEVa&T~Qu(NaVa&d9<@bK`kbMo=?
z^6-J!AVV0Ln3$NEnc0|`*?2hEIY25%!~YL32y!r$v20*wRAOKfWMmd({C|W&j)9SZ
ziJ1`uVBTftWM$*vVqs~?U}9uuWM$!CW@BMx1tkoS
z<$|niLW+ig!j6fB>`ILj7j8UwQN-vWhp4hs&<7Rcq9*60x6Jy4Uex^TO$U4S<&+xyF1lv+u+}s6
zp42&yCn3GcUZvS7ZbzO()|P~=l6B&JYxgng+S{0rJ@T*SpPp88&baT>!S>5H^F<|i
z`+V9o7VO`5pLt#3kriwDRwn0HU0bEK?8Ltm->Cs-7&6aAUn)9gROG-=NU3j{EUvFS
zIWxNDuzUEtXoH!rUQJeAdpL8x?XCG4=1XsGH1Z4*ohX0q#f{xLS7Il6-jOydmu(FV
zFSj^!}>;9dSi+4R2R$5nU
zU#~uC*TS9`H?Pg#87cj!KV0eSorw;H*H_=VI@L#Y+C6dAc~2jtEcD*IT&gmkQ)gek
z?E51OJZ_+371M*xG6f%>FW$Q%3?8*=Sx;=Z2iO<)mfqPSmgI6tDRQ)Yz
zVd?a(%ANOg-jvWoXN$swzA8fvZBwdz8k)a-4?Pue3g>^y?C}adrr;PoO{{s
z@;jNYO%{LdUFX$ZH!ECQ(&x{lY4cW|KGXXzDSVsn)R>O$)0?
zw97f+`bKM2WeW0k=k8zC`Q}A(k*?6;q8C@E`}j-mP+GP7Ptt9kuC9H0u3_)Ge=HBS
ze|Nn9OwymC7x87><~eJ;W=Ty8aa!ju@;qr(-n=V!PRi93*vhZC
zAhT<}%EdqHRWHf3aa!Itvkl%VT9ns)GSpSeZeCe^=$qRmdA}D2@~ywH@9tT*hp+a2
zx#OA~)-#(k=k$Mu?Gd#m6GCn)7p>R2c3U+5%$3laDUJUY2ku+a7aAP3b*e|efiu8ech6A6dZd7TR_9MgEPqzot%|_PbSPrHW{vrMbIl@DDBhkdTlNS663?
z%$Wx;lL<9MLat|A&y)Sn5cJ7<+3bR=@v^e}Zbs{FSGrPu?D~=G#xo}e-->t=GWEr~
zc_AzBF4|u4^J27O-`a?v?z!$Qo-clxzFS!;t!p=XWl+qdpZlInudWfiDUedqP#
z%XVy2T@rC=(WbuD3d^If{!4XzsdVh7v@e%d-Qn3
z`p{?Y#cIFvHz`T<6nFV4e~_9o?eLLxD;G};y&ZSgvpQ>c*{Z6o0;`ICt$g)%d;gc|
zwKan0!*-u5{}-RUaq)}UDU1C#hXo#=bNl=I^hbWX%5R$
zO{O)00e7}vU+wy6)xEgq-+qX!UG#-8h?>
zvn&@*vRpWG#g8Y+6VFzMn!CFCb#=|V{6(X=;ojw1r#ELOHA}8rw)%=JBcK?N?v^+OuV|WY_*!FBIjScy2@Y5%E94YD>LN=ho=d
z-CxM)tDV-}-L-V7;teYrCy)w(3=zo9`DL-nf15+1#A7F7LI{
z!@j2K@RnC9@6uYN92gjT=GM#whx8@;R)oHCTasd0`E5mP(z{jpr5(L}UAlKx`nqye
zO}Sty_rz_ZaP6Jd->33ln;cxsXJBf#J9?{?gyfWzjYSczo0@X1H@jTdA
zO+KMFZB4Y!#{2Kg^0pQPhMI-D-Tn65ci(Tzy>Vslu9W+Jf05TBc=$g9mn7fJv>9jX
zTqoarFA~9KuV&cqnzLoseVr?pD(y|S_PvjrWGghc*UePO_G0{Yqc=D2JP&lW51lmY
z?B1!;y{EZme>iS0XZz0Z-Qhp0CGS4&*}(9?1%I=XIpn%+#_=D;7uPJdIkoCfyX+C&
z$#>TYD=F<&YVG=(EwyUSCF{JftyVkFWe2ZXz*_O`^|#)T%c}XjRf#ogwxxZqipVOq
zzRNRbb#K&Dm!hDpFRyMb)hRB^cg@icue%+peOd1Ki;dp0y4&vh%c}B_smZ>(H#y7l#oDZWF3E!DTwR{u&ujPnxcbKD
z@{6-geyYt0x&GwGS034?xxC4@elN8vHCzl{;hJ1)I&AHf^5iq^M4r-KM=+rJ_NZ-ja=FN)
zBWs`cKhpU)rTY7hho7EoJg#|Zg--Rh`)zNu1&*z~`PS4r=jPN`Pi{rtl*xbh?v2Nt
z^;L`1l~eLp>^Z$@r}@X&u7@V;b?5F4_uVu7ZttyC*3L^02QOr2)mb*bI7UwXv(Bg5
zzb|c;Se29_EYrgc9NmfDd+TfOiC6lA~$W_>%xhDK%_f_wY?+-uIJ}fUVHDZ}!
z-OByZD>EKWD_uFwGD{;%_Dp}1yW2I>m^o|9-IkqHQu^v@FL(N#z4+$vxF;K)hJH47
zDplIqv!doI$E_Tx*UHUt)CZmmMU$S{b-N9)BP>c!tNPnSz_X%yR$Yn6|6nn^YKuOMc(PX
z2wAb^Xjgh%)WQ8sM+dTnL-^=jd|9dzA9X+-&T2U
zZ@j7c)Z|*=gH>O&0#|C8hN+5O_TRaVmx1xi5u(d66op*(emmZAxgM4r!Ow4|sn)bO
zUuS7}IO-Erfbb^bO
zw*I+y#9uVNNHb;fp`4bkN4b^m>{6XwukNY|tJ&Iy{@SPaZ|au!*$Y((lxQ(dCflT>q^kMw?>dAH2!_L+4#
z8_#oxZuxXs|8wl=@OQ_0eYd?@vEuF3@X}cA?3p3c|#s)aOBt%
z@1WU-UWCTp-70AHebtJ0uKv7p_r1L~*A-@cv@h$;iv2qS
zcC5|)+^%yeXWDE(y=^m!X8c@v$+b9cCK82djkV&+qARZt&28_2@Lr#@#n0%eJ|&K+Q0bwYnJ?X
ztF<+!UNKhQ8OF7&>VvK9quCzU*1f!*`-k^{w2|i;W2Ri2MYpOgcC4?LjuA_k)f?*h
z%j$E*;#$*J{du8Fb_SjL6}7GC$JV`njI;x*K3T4QtM+MU-MKPE~a`?3_?p9HqHLkw<&$-)&hTbjr>*$EM7`{^Wro|WaMV}@!FgJcdN%xd1#95b!Fw-O{a^JMFUe8bWXnJHBV+$*RPDgsP`g8Ut*_n^Jz_fs~Ued
zbj=*2$FFy1-VdC3FXdU*;CHNu~YB7exZFj&3#tE%I?f!jS}z2&*WIaiOm+s5|I8)6q$H$rJ5A|c#h1|6HeCe^|RGW}eQ{9_Mi{_cH
zI&9Oq?bQ+YQ&&UcI+a!}dVA@_k9}_*U$DFM+qY?Ra3ObG&S~j8+fGkaJysRDIBEaa
ziK?zTYlXoXqSXOqWZ@=29+8War
za<}u$)zGJ*QH8pP`}S#;+;5N*o$hM#Y+B#E$EvfUdAD88TUE4OX6Ynz!_6|H_%F1zyuyU+e@m$I+z@-unmX`z0<<;s#h@~n@WKJL~m
z$!hl4p?p}iX;Po{JYUaWX%9n%rSFBVd0#TIc&BK2nA3|Jo%{Vl?@Fy&5t_E(?;2kJ
zBfDMRNlcL{?6>w_YZ)@*&bOnBSI$;m(PVYp;pL5I-Y2H|x!hHJckfDkaJl|#zUyx?
zAHSAcbGbTi!jq|nQTbtYKXa}c?_JaMn0wyKFx_u1IcvhLQ(}M4ez1Glk&83FS$#M>
zp-|y%%D&9nw#8;%$75FMiI$e~EnBg=jjhNO*RmaQ-7T|pS=HI|2A*q(6fJ+ZN2bWf2UyV
z^{E2;K0RFOUw4W3XZ1XOjbE`Fd)HmN=futB>;3P=G5<$57=+m2WACJu3ru|#8DBX1u}fCYo3w7#)XLd!i`>@ue!D$Y`uh9a?MWXaCG^5FjVz63gk_do
zUbCs`XUf`XcT2aPx%qOH^35=F^#{8bPYf;zTcu?w8WzcW*wRd@z
z?KEP$v?<(G#^c1Sbs<@1W?NUx-g)|>P0Z@Irn{mdvsW!{;&?JEb52j6nQ6@Po#81i
zF0WRteq%m25wZJCZ}sDF)4tFT*;7Sp0!8^GnzE-=
z_f<~zxzKyu%k;Owg&XV69C<(0EM%Y44ejb_hNrco&z@SbE^D>Sz4DxAZ=O7hoyu!5
zAy-E8mFZ{ZH78$wvtFt7krKyO*|{kPhR^I+`D1?i?jDbyvTvTL
zpIs{BnJy(?x_<33Bdyyx-(8=rewM8z8T9sQ<-C(o&sOhRzh>qB(AQTky;`+&-Kt5I
zPbOt9E86EN_q2H4)7Yz_;j31y-}2|+S6B5ZHAT6J4UAuYl&rt`K5AE=s>Pa_N<~pY
z%SD?s1J^#8v~r7Sww3baRjVU@mBjwBs#9G!_3F1G!xdR2=269FOZp~jU3v8@BlW%L
z$Ftt9zTW=QvoELmecpdFYSrwbWxp3KidY%3?sJg;k-5t@vg{FHkmySwE#VPT&9uJm
z(luRP(f#c)XJ2Z0W}V3{d=k<T3J!427ll{t@`yE#ns;40;CR%$zn0FcvhR6kn7=w6
zynS!Y%5y^h8Mb-;@himGbxL(kirXP^2P>X&l!
zobU7-PrtA1v9~LIe!Fh>+imv_1$$r0j<;N;t9x|%oKN4>`^7$r-n%Hd`c>JtiA_7Y
zC(S-yZddy@{h-dteV+3d=qzsUv)W?Zc~|^+$?fnpVY5wR=QT-}2;EV1i=KP;*o})H
zLN=!dSw@}Py(TxS#C?6^&)DBQI@jNNE?c+hxzWL3++|qRyqt9I`Joh^DoUr#kp{_^weG=0p
zPe!--Z8q5xqZ9INSNGO))v0=akIGE-FA;cudcU@4WpG{C5A`?8cXI2W+cD#U-LSOHv
z!FGAi=FXXL_{`I|F!LK%?x*-CDM?)~yST99{c^o8yZ7#W+MQZ9ZQHKp#oCsEi)Ouf
z8Z3SJT+tQ78S5e{t51HgOJH0Ub8_}3bJ5SQw+Z{*>3MH+^2qw_-*aYvul=03z+K<<
z_J4+3qJp*Ydsgmxe`@=ZkpB!fk6v_pZZ&`PuIGWgQNf4ST)tD4Zn~1?gTuEg*H0Y%
zeLj16RN3N*mgTJ{`l{Ydyvo=l-yXHMOwy5@<
zYl-mJ7grizzt<5snqFbMJa|L(In(+DO|O$qWTbD4S+U$TVzuV7-ixP&C)%f;DW0{z
zY0g4*Nlm@Sk3H8I^}fhnwDY2Ku)lI@)56|q=GzaxEz0YfzgOh1k6G;k^MB`R>&n`n
ziEfI~*>vRBUaJ#Yaz~=SuAHqt+4J-!)mXC^$F~aZIqSA_t=pS*XQpMDhI(i!39U8f
z%-j5B>8fdMt1KT(@Y4Qw;j*AVl5NND&(}m
zJJRLYwq+%uS^AaIQb;&rwH1
zt~;yT`SbOwPFz>lm#@jL{vvs=|0Yj!>=K*cuirm&Qn+z8cl!heX*Gt-Szo8d7Ou6N
z$5Yj`?(NhRgDmu2lKKp)_tjqx|wHPsr*_c*#j#byFMhDUrH0!_V|i{+QrNcO
zkSnHAouMJ$t)ga5PTO8r`DE(v)s@p{m*+hVjf`R1;e&s040|dgAj&>ZPIE`xsyFW+
z%PU{1nictS!|N}fpIB9f{o8OgI;Ch|l-T}1Z*{u9X^UTf@}z2!>D$ml)AMfy9#C!H
zV%&D?jn~c#QJ-cfPkY*Vf9ksTIp$`j)hj1PtynF+?@iCEzO40rXzB53)o!IXyR}4pv;7Ju?^w3Ou8x2G
z_~`dNNgLa4;n
z%{nJ?f4q&_c{zIJ>m_~j{Bn10Ptv=scXC&C?LMt6g{P7h|H7MDtFufm^=4?QeA+bm
z(M~(t*DDxgd>$NpT54|n_uIji#{#-#g)2heY-jNwQv9UqJQAxj-H3BSs&f^
z%!|-loLpiVrd{?ls!M8WwQbtEx78}ivsHpjYviS8J$b$9tC{Y*RL`eHhM|k4x_Oo{
z`0aXsBX;#H$(XIbMCV0+zLS~aR=IGF=aZ|`er&(F(z~d4^}V9)Q!Ueza&Fw&bG~|;
zrF8JuN4wkB?32lkG|+kNZKOFZrAvD1Dz8&kPgZmof-rHXMX9$#8vGh{ry?HlHrZaDTEOB+y
zq_h2xzZ3>UugIKvl2=7=tHg<0^PXfWRsVhFbv=98rfAIZ_hu5nMc_cWgNYBy(=b#_N)+Xb+W#A?A($Ht+tGd>?nNMT;?Y7{t)`sdGj~~AK>+kSJ
ze%abGa}$%*C$w8F-2`*roj1zTHu8L0_;|)nyPcK}f{S!laZbk7HVo_Vo1YIfQ3>F0c-S$@x|Ur(L(r>^(*n>}AAYe#*}d-1eSuY7g+Q`gvuRorj>
zGkh!0EZg)SgDe7W6OXdwx@1ROTkf`1P*6~Kk&>9Stx$K@%E0&O
zeU`;G&$sQHYg%P)y5+82PsXV^OF2FFexI>z-g{P=)Phs#qTe#gjFMxdt_44@{2R-+
z__a&N-}ONURy+2YzS_TH>!B}yy^7XrFAI4e*Y$2~_SN>>h6rU*(cPjg{g$zJukTu`
z-92;XIe*>l)9!aCFcg_mlzdrZYZqEoto$+Uq1(>$PbX?^TBYKyr5w8H!lk|Sx1P0j
z%&lF0vD|m9$lCi`Li2NFr?-3GzNxiTZQ;JVXZKxHx^i3VqF{Lbp4H;3W`DhTe_D2V
z*Ty=HhoM#dC+B3=9b7Xr>_5X&oo}nB{j&@8l)3$*-c$U}{Db_P?xrubq{iG){YOiSx7{=K;MPhi3MT=z3q7c4lH$Dj3|!R%|b
z?nT4k_4i!fTfMy~yQyMjuB+*{-*+GFESr^ic5}-6T&v9Bn5Q`%tAG8TUv{Oq?8W?*
zb*J}-y8i2$Rn@XFH}Hqi+ZXrRv$u)~z6{d;cYXfC(+SM$&tG_S;NO|My_a6L?YsYd
z;+geVLboYTjq1HO?Y`Hlj(Hj@?=O3`SA5w$uE>>f{~6M@UFWf3Pu*@IcYT@T%J5fT
zLz0xf)EI0pb&X4X(z>_ywtACdB75?MzPB337sV@o4$gS}?bg<-`L9-*zn`4Ikg7;o
zQ&8g0X2UHBVV3X8Z?D~UI(J$2eAC!kZ_NdrYqNHqdcHSsMaQ+Bp`leuTE7{LTxK@t0Go|CY{w^-Q8fbpgJZ^U0oR=SFrJvMUBlC_ySB25COzxg^+FPxwzuk3m
zYQHmVxhq^!w994rx)qHv-TO{--dm)lANpeDTiqE;^3I=A|IjD2J5;vnip{3u?a7sL
z)34sT8C$ZVZx(y#@see;%&gqsZh!Ur?L_fatG;}j7XDBCpV)tffBQ52|1$_&{?G8M
z>*=F^CY`(MOfFtLaHXU?{zIJN#%=cuY>rEuS(|ljZ`PXa7TJrFEMu-bi@5VH^jY%d
z)SKnWlaH?I+%9zt`yw=W!od>
z_Su&mKG_@WvpiG6OVoV(=F7Wf!lci{RhYLQ{NQF)Ty!pgLExDKR;NG&8Gpp;O}XZs
z>YAJDB2rRPXjS=qo=cyGa+da-@0L}jD>_!K+AAo){M~YKr`?S>=^ugnuSOP~4cc&e
zV!){%S~=H3CVebeI(3qn`B5E{wG%I#xNf~#38wo=o%Z_D0xmWAzGSr(qR_g2v&J3s5g8?60UvvXC~^=YLk
zt)8!bZ(6!#dGWokch48C4-MB^HPQUmUhB#{)xG)???kh|C=R?OCEvGWexl>QuxqLM
zqB85l|E2wz{BE27zl+zoL0=zjm<
z(AeyGch*kbI<@$ulu?-JIp3%EX9m`Un&0F#5!fDeXLZn2-81ROzgTZhwPlZfF>9-A
zVC>FaxqGj(Y@Tx6_W5bcCk!l-_l}2_nSMK!Aaa{H3C
z_0wgK-g##0jnv*JsT*1DuUzLco!{)EW7VPJ+jfP`ajHj3*(K+nT5G;4ZMkv$sooOf
z?T0c{l8Wri7cHK(JNJ#==gsW>xA-pXlhWK&sqym7%&C(WUaQ%3?D+d%dXJ^ltu~5=
z-aWE%%S7#|<=NZrhOSe~G3AJL-Lb~>tgQM==8I?FoepnWt#@h4e+HdP$D*FiI(_)t
zmh0+g^?DejpU0A4gfR*i?ms4GdZ3->r`)ns!_aFNZrqd!x%SI;+Pc@_CcRx;8BzQ6
zYx?v4*{pT93{G3=BX!ih>aly!^7CJ}ZmE=W3{|pfI)3hD&W^KI#pNYaKJ2Vi30r*k
zy!Nei6JM>qXy!6!cTz>$m(7pwon3nE=AXr^7x>
zNt4O4ZO==3?^fR``+MWnj4OXrI3IPaPs-`bw%BszYqR^?TZj9deS=M7cRkIUJ9XRa
zts>pLx%1X`_4O^{lv?p@?>d*bu6go1gZ-YJGZjldINL-oMo#spTq9##?4;VY(`92%
zWPUM@d8Mg)>vc*x5?AB_>gg9!LJw$+K-JO@}=+U5`GTv~t;|
z28Ktq4AcaS3kofdJQF|otvjyx&%e*S(`7duKdaLBb?M59RqiZ?%OlmQ_l9lU8(Mp!
zYXzsY+_J1R`^6Eg_q9%~`(h?jcG&CJ>DEJ=Li)HOX3btbXZ0UJ;Z>^^DQT@z^w?8Z
zw&ZE;a?^62Xo=jz{0~1)UL7@WtL^y!<*e<~yn6puXiPm@v`yt{NpF$%-`=#zN3ToY
z>c3Swebd7^LFYR%b9b%ODtyDaY27F7%1W(uU9(j_=iN&?^5jYP+~C}wQ*TWv+@^8s
zn5opYWhXjjE2-~TmsNG_U1sz?+xKt3+Zw;vec|xxovYun7|Ina`Tfgs-CX7Sf9_b=
zAG(~mbi-{>uj|p$B};pi+9YQ6rsTTZ6cn@(_{I1k<)-U?-i=pc)=ixdaN*L%c%4hT
z)3yql|9!RZiQno6t+DFrS2tg|G*wIF`;se(qE9BpvrMx4;8n$bGykZ)XatYsJoBW>
zJ<<}ps=lqNd9`g{-|J}h5U+*qtXS0>JJm{Ycj5Bz#r|7XZ0HJWd@1jAZ7XNy
zuF`O;iN62BCVMWql|SFKZ`mQnRj>1E&8EMMef6KgS4QYcbfTwn%894Rch+SGicbx!
zdjH~
zeXI<3TQ$G5GGnT_KVR3%A1lw6mYrGeW16gexz=S%&<#^&&Q&?$QeK(AUuCUG$+F|x
zRlYvlStT!fVtA_Ww<6Qpkb65Wz0)|nW!A%If!oS2O*@}m-gW5M>bFw4ny$w!9$m`c
zFH?BY_??-Z*p3Z5%1R3T^RIT9%*(NQD-+i1wEfVzk5|pEl)rkNoW89pT;C}7>c!Q!
zA1vEZFDml!s>6?^$tqoLtL2U_dt0RM>gxK@)gUV7)V)59e?T7%jq#o
zcG&$mSv2WW-Pfu2s&tQj%C5`qjb3jy>x7=z>a9AZTS^10XKBqyNwTw)+IMZ|I#<{4
zn%_kwZ^#}u_3O=YnPd2DyHw|z>1Jn(FH5(2Y46^)Rm^L(_Wb=nO`gq?OZmO`b>;q9
ziFv92dLynjt>p9h^ZDAA>a|+G*3GY!y*1^Y{Ka)E*J*xV#=z#JLtb{3`Ok1G|JYo8
zCK;vs#cG>ReTr_`c%v}7IK|DoWcQWNX7ePjo~f>!oPKJ>vsFch-kxjFEZ%avqu$r<
z;;YrZEdK(R-?99DEvqi{o^+qDb@bCq`Wx?gOBv0ddUCg_r_9xxr&1SsUYXTo5i+YK
zW~R_fKk?YsN1s%mJy-p#y!%>6?EC5NpNnJOi5gi&b+x*N-i%kCT9q^J?&R9uDNJW2
zmTc&-^xQrzTk7b_FTd=Uf1SQ_WmcZC%bKRXrkSf=b+`KTdpvA1Tcovm-gi?grB!OL
zH@(T*?k8fgYjd=gwpK;Ly1rSH)P1%8Gfa_Y`ee9b)#^ft~E@`U4hS?KRr?WW(j3
zI_0a(LYK%s^4RcM?a!(wE_Z_uR#hzAC}_@H^6A2d?cJCB{(Z`>pL)^bNoYv8bEJ*;
zruA{LH!mMvc31eoG*7Rhdri}Wot6};_4Qc4!#OzP&ZoS)fZ^4l~tI`Qq{9Z+Doa=ZzuW#n6-WpHY
zQ?hriYc1DWq_yt%^7gKZ=?9OfaksvTYkwN%>$>gsx*w*c+fw#ky6(2V@ypqK>pLsv
zZPKo+ob@c{+s?Jcp)wsya=*S=;jgxt`&l@EVUwYwX&YPI&vZ}%P^eE7+hiD}PnmEX~NR=X!$ev!8GN>KFHzPn6o
zXMO7R$k@s>vGdO#JKo&nsM)8va`&D3rgrCSYTE>(?(V~?!M>>sj7NTvm!+}jvh?1v
zd26!318$kV)2=d-^VY>LEV{8#%B!vXMA!AAtJl{3zI;h}a$b39)uOE(yKN&sZkZOZ
zth;w_)K_J#KfKh~tNCm7{rC%Czc2dF;5_Ba*|Xu%T~m)+9G;W;W8ZW8
zmg-F(E-@O^v$^E!ynU;KOXHdN
z=4xJ<)FKvbeL3*T+8o{I<&~yfg^{@*ynnxox&5I3z4>|FTlG18i}rcOs`{+-_w;7T
z*7dD<_j|%&snVLhxQ;8|Rwl^KoZEhN`S=OJq=0>z=xyOrH
z&)&V7yYH{ly5H|^eDg~`nV@>w_tN9M?az+A1)bl!8`G`+I6yknHE8mcU}9|H+`|WT(H{tmwkJUmtCA+me}cSzyE&M
z{{H9Z_CIH=9rZtajI($1tvmOneCzM7y&7BJ^nwlv(vYr(5}m?zPCd(#iYpuMNAd
zeXBoTXX*##?OA`nJiTA`JGi*So~P{8&TwHV_B5BGZSPm@cp_A!W%^P&J6fmfYFx*P
z6LY_cXrnuC%V)3PW6SBWq8`s!W~B@JN?}jJN>ArZCCd$t!hz`
zlasz@U1xdo=J}(WM%=72AyxWo#W~d$rUdSs@?-1Y6YFPn+C-el3Y68+bVyPsJ6zXJ1`6ee1XK`sW+F*PXm~VU^#7bK)=8hqDFV
z`YJ9uRcGhgS*l@cSr7L9tL!OXGvzC<-#62*vpUxG&wbbVDp+&k!{1$}@286kU;CT7
z$vM2>*s6uO%k4HDHrLLZb~HX{<=T*tPhH_!9@mwWr>^)`Y`VVgla=cCbh|_O%}*cv
zX9!+rYmvkMUR(cuS>QiY(buZy0^%cz|1GMtxVc
zleurMZVj@GH@W1oqU*cmtJP0?Egr}C=@+vd*+IKByKbl;muj+bw
zrqKJiEAgz6Qn%7}u3B4Du(e9>nZWGJFY*r8eoje!8gsg^oZ07k&bz1057u_eFP`*r
z`jgTL5rwO3GWsSxEM8UR>MtBvWm!3Wc5297iIqEdPI{mGoG1Hexm0ns>PgAq<-ZJW
zzOA?%E7C1`?LULH;O1+FukO8yc)76nk&A1%QR*|lxRCp4uePWA?)%KUSNG?`PddSy
zA2;95XOdA&tV(y(DcxFTW%uoULEfwF(Nj)sx_V{R?rR}6=j-*&UR_g`-gnk1onh@{
z^?7Sq7BbRz~UMuHGTzuMphMD_jSZV|vJ-S}#
z+tr*iHB!6lRz01%s_*H_iBmb=v)mO;DcAp6SyK~k5xI6=ru&K39T6)|%xY-?Rz9kdIQ=m?Y*oT^Zrkd}==6OTcX3v4
zU$kVR$K9PXo_vU%UbfRlJk|O9eQ~qpWo{*&x~_-6cv5?RK8{7$!)jS-7c=a{(YtJ>Px-;LD`ziX4SslDf}!
zTwgqE#q3aju|F~?u`_;d72WhSw&-L@)_3bn!#%4u26@faIrrjp?#UM&v)8wnN-M|B
zTfMEQbayfP%310Cuk{$qj~1`cI$saV#-N{c-TYZ-qCT&%a!u{VIF?
zEz!DFUOCySD~nFr>1$8FvMnb5U;a&Ar!OHc+1o;1cIcX9yR9i-dAZ(WrRN2jk&TD*8gliMoG_1P1}7cFmp7xI4Hsk&>k&U)+*
z%9yt6dcf_{tUkSH-k&FKRmnOn%RB3-^dVb&_T|0H{rBwKEf}@x+Q-h-S??xBZJjOh
zSF-s1gK3=6p^ouhU%S@b3_5zxsw2g3&BWDLMeU2;btUcE8X6XEth)E`vJXGy8XS+r
z_WY@e+tGCS*I(T$r&q7DI=sB(?X-1UKbVP}%=Mpo@p4S$=IJx>#q-+rm9Pr|Jmr7
zx?b$l=JVX#vl-;q^}J+TSh#xa+RL_zi@LnGNPE_u%uXs^^JA&KU%Jl|*Y{eoyOb63
z-WBaGy}7n%iR{*`UY|o=u2ZjiD|RU&qbz9umGs@L?^pPr6+IWf>zIcP`?s2x{~6MsOQA0G3c{qJ`_
z-`oETOLCnv-_>_~*Kqwc<+{FQ>GXcplgWJ!%r&nUNxv07z30#a<`{iX^-|UKjQc{4
ztTZoLt(^OLwV?cOz3`llmDfvscTM469OAd_C7Y(t-=8bre3`iJ<*D7<*wouMAJ{E-
zM`!w3zmvUXtKRRKzxPWM@YF`6-@b*W}4P^X`omo1*7B
zm4p}RuKjZM+p?2q1Lkq;lY4tr$)w}iJMQyO&OQ0EH-6(y?wfjFMc>Z}zp}4^vC4+S
zeNX6z)7^!ghyVF5x11`Rty8J1yr6p9-&~oMuU!L${+-$A(OVsU0B?-$-!
zEBW@Q@9e9KqjGnN8cKB^-sM@^Z+bPgd};-*0Tja@d9jZ39$hh?opSdt?=h8G;%_&-
z*{8AcO-Ss;;2SHJ`7APd^x@~?`ys0?uk{UCc4e{Zl^aGX_<+O*1Jsny*|Y0X1`@r=1Sg&zk6)C
zuS`2BtCcLdS5)-S($8jUhx68l2ZpYm^VH?0^4#!MZ|0WY6b-eNn!eZQ>9y@WOV1Y6
z9X@bxYFXB_&Ml>D*Iv^+FWmKF=~;bNl}jHS7(8T)7?0g?D!cshTUVCramj5r-bcpz
z&MObP78>j+BeHgC*V<}{=US_O#&mVFKTg8p1Avrx^tG2!g_1*4zS3LKkdERg1&FeYJCUtw!s7i>C&P
zADM7Y=eNVnB|Dy{Udv5glJjo;`8=^XVKb9EH!0h!d&r!6S2Q^HVa|%K*{f{NyxjI`
ze$eRyTEE+D>T>EGH_q2C*%Y%bBzIR#%JiQnvtDgqG51`2)k)?54F4HAFWl!p)z+q+
zDq?cw<2DV=8#fjw*GODjcB1q5ME)yVj#+pL7)^^#o4(e(`>*S+vz>_rW}EG_EH^jR{U6BhSr%{tnt
zJnwz@skwi1e%HQSHc{sLs#RahPF@rgT48Nlu>Yy|Hg3@x*1O&Bo~?SfH@t4I
z*UX(4|4rO>CHQku`9~|e-0e^AikjcpBzNHV=S_MiVg+XYJ#Qn{)upad#~Y!&D&c0;
zx^sT-)73Yg*eiVC@>TJtb!lh2A6&eCfJx=PLDkG<75_Fp5U&Z>+7fVot(EC_
z&6zUU({II|yEV%GvU_TT52{=`$(ir!Sw3NM-1xvMoFmHoBdygmhl%VQ^evGooWEj1~2Rw;Hi4*YoHxbm!TtMai_vLL@++NLw{JxsQ44u#eJYD*l8s%b==v;|(;>Xerml526;EC9
zerl+>Yq{B7LD5oWkB4`)R-4SaTed@`e#xisv$boArFwHFT|M>kYM@}KpxH!0;Ts+E
zE|+Ua^~PO#R`l^_fxSzu?92My+pn)}_m9*avaInm9#ZCcdw
zMZ2epu1VTi^=5a8zijvPH?|kHWyq)Qn|R@*+o|Yv?ioJIUMd}xR$H}l$KI=RKCPCz
zd+)~6K9gsDX`9pxLn{TA^rjtuenr}JI@jWov+J)||J^RO>|JG8xYedr7E>jO^XsY;
z6YZ6D-gui^UU_P_)mu;Hi^AW&r{uflZ(a5Fm(s#e*J-s&t8WDsm^a@Rjha`ORom6P
zN^57}%D{kkp&wk`F0XpG*UZ&l)M?A9eHXp2HGTdix8d&`jihtGwnsWvPnrLpVS)eL
zu4`sb_O9RdT