From 0f0ef96ea394722ff102ccd500602baf03d53b4f Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Sun, 20 Sep 2026 16:24:14 +0900 Subject: [PATCH 01/11] fix(usage): restrict legacy -main provider collapse to Codex labels A -main suffix was stripped from ANY provider name, so a configured provider like openrouter-main silently merged into openrouter in usage summaries and pricing fallback. Restrict the compatibility mapping to the known Codex provider labels (openai/chatgpt/openai-multi-main), matching codexAccountProviders. (cherry picked from commit 89a927228c3e30f330f313ab8b2af37199892afd) --- src/providers/label.ts | 11 ++++++++--- tests/usage/usage-cost.test.ts | 6 +++--- tests/usage/usage-provider-label.test.ts | 10 ++++++++-- tests/usage/usage-summary.test.ts | 10 ++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/providers/label.ts b/src/providers/label.ts index 38b472a1a05..10f1a09e705 100644 --- a/src/providers/label.ts +++ b/src/providers/label.ts @@ -5,6 +5,8 @@ export function canonicalUsageProviderLabel(provider: string): string { return provider === "chatgpt" || provider === "openai-multi" ? "openai" : provider; } +const LEGACY_MAIN_ACCOUNT_PROVIDER_LABELS = new Set(["openai-main", "chatgpt-main", "openai-multi-main"]); + export function usesApiKeyAccount(provider: Pick): boolean { return provider.authMode === "key" || (provider.authMode === undefined && !!provider._apiKeyAttempt?.reference); @@ -29,11 +31,14 @@ export function baseProviderLabel(provider: string): string { const cut = provider.lastIndexOf("-"); if (cut <= 0) return canonicalUsageProviderLabel(provider); const suffix = provider.slice(cut + 1); - // `-main` is the legacy log label for the main Codex account (MAIN_CODEX_ACCOUNT_ID). New entries - // log under the base provider name, but historical `-main` entries must still collapse. + // `-main` was the legacy log label for the main Codex account (MAIN_CODEX_ACCOUNT_ID). Restrict + // that compatibility mapping to the known Codex provider labels so configured providers whose + // names naturally end in `-main` remain distinct. // ChatGPT auth-pool and OpenAI passthrough are the same Codex/OpenAI usage surface, so display // summaries normalize them to one `openai` row after recognized main/pool suffixes are removed. - if (suffix === "main") return canonicalUsageProviderLabel(provider.slice(0, cut)); + if (LEGACY_MAIN_ACCOUNT_PROVIDER_LABELS.has(provider)) { + return canonicalUsageProviderLabel(provider.slice(0, cut)); + } return CODEX_ACCOUNT_LOG_LABEL_RE.test(suffix) ? canonicalUsageProviderLabel(provider.slice(0, cut)) : provider; } diff --git a/tests/usage/usage-cost.test.ts b/tests/usage/usage-cost.test.ts index dffe93f2ab2..5eebe22de26 100644 --- a/tests/usage/usage-cost.test.ts +++ b/tests/usage/usage-cost.test.ts @@ -1510,13 +1510,13 @@ describe("Codex account pricing identity", () => { } }); - test("only recognized historical phex and main suffixes retain the existing fallback", () => { + test("only recognized historical phex suffixes retain the existing fallback", () => { refreshUserCostOverlays(config([])); const custom = { ...row, provider: "legacy" }; - for (const provider of ["legacy-pabcdef", "legacy-main"]) { + for (const provider of ["legacy-pabcdef"]) { expect(resolveMatchedPrice(provider, modelId, [custom], [])?.cost4).toEqual(RATE); } - for (const provider of ["legacy-unknown", "legacy-pABCDEF", "legacy-pabcde", "legacy-oabcdef", "legacy-__main__"]) { + for (const provider of ["legacy-unknown", "legacy-pABCDEF", "legacy-pabcde", "legacy-oabcdef", "legacy-__main__", "legacy-main"]) { expect(resolveMatchedPrice(provider, modelId, [custom], [])).toBeNull(); } }); diff --git a/tests/usage/usage-provider-label.test.ts b/tests/usage/usage-provider-label.test.ts index 66fefefe9a9..e5a12bdaee9 100644 --- a/tests/usage/usage-provider-label.test.ts +++ b/tests/usage/usage-provider-label.test.ts @@ -25,9 +25,15 @@ describe("baseProviderLabel", () => { expect(baseProviderLabel("anthropic-pabc123")).toBe("anthropic"); }); - test("strips the legacy -main suffix so historical main-account rows aggregate", () => { + test("keeps configured provider names ending in -main distinct", () => { + expect(baseProviderLabel("openrouter-main")).toBe("openrouter-main"); + expect(baseProviderLabel("azure-main")).toBe("azure-main"); + }); + + test("strips the legacy -main suffix from the known Codex provider labels", () => { expect(baseProviderLabel("openai-main")).toBe("openai"); - expect(baseProviderLabel("codex-main")).toBe("codex"); + expect(baseProviderLabel("chatgpt-main")).toBe("openai"); + expect(baseProviderLabel("openai-multi-main")).toBe("openai"); }); test("keeps suffixes that do not match the pool log-label shape", () => { diff --git a/tests/usage/usage-summary.test.ts b/tests/usage/usage-summary.test.ts index c109d861f4d..066797f7911 100644 --- a/tests/usage/usage-summary.test.ts +++ b/tests/usage/usage-summary.test.ts @@ -1186,6 +1186,16 @@ describe("summarizeUsage", () => { ]); }); + test("keeps configured providers ending in -main in distinct usage rows", () => { + const entries: PersistedUsageEntry[] = [ + entry({ ts: FIXED_NOW - 1, provider: "openrouter", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 4, outputTokens: 1 }, totalTokens: 5 }), + entry({ ts: FIXED_NOW - 2, provider: "openrouter-main", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 2, outputTokens: 1 }, totalTokens: 3 }), + ]; + const sum = summarizeUsage(entries, "30d", FIXED_NOW); + expect(sum.providers.map(provider => provider.provider).sort()).toEqual(["openrouter", "openrouter-main"]); + expect(sum.models.map(model => model.provider).sort()).toEqual(["openrouter", "openrouter-main"]); + }); + test("keeps one logical combo request while attributing both physical attempts", () => { const combo = entry({ ts: FIXED_NOW - 1, From 83514c382ffea6a835b6e2be6140b8e6c4622573 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Sun, 20 Sep 2026 15:20:31 +0900 Subject: [PATCH 02/11] fix(cli): mark access-key usage unavailable when attribution is absent Without attributionSince the server is reporting an empty or unreadable usage log, but the table still rendered 0 totals and never-used markers that are indistinguishable from real data. Show an unavailable marker spanning the usage columns instead, matching the ambiguous-union precedent. (cherry picked from commit 3c3f14b5f7c5aa9fb0db19449a89310a67b230f2) --- src/cli/access.ts | 7 ++++--- tests/cli/cli-dto-fidelity.test.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/cli/access.ts b/src/cli/access.ts index 9cc0ec091a2..d8663aa6251 100644 --- a/src/cli/access.ts +++ b/src/cli/access.ts @@ -38,6 +38,7 @@ const USAGE = `Usage: */ function formatKeyRows(payload: Record, keys: Array>): string[] { const cells: string[][] = [["ID", "NAME", "PREFIX", "REQ 7D", "TOTAL", "LAST USED"]]; + const usageAvailable = typeof payload.attributionSince === "string"; for (const entry of keys) { const usage = (entry.usage ?? {}) as Record; const ambiguous = usage.ambiguous === true; @@ -47,9 +48,9 @@ function formatKeyRows(payload: Record, keys: Array Math.max(...cells.map(row => (row[column] ?? "").length))); diff --git a/tests/cli/cli-dto-fidelity.test.ts b/tests/cli/cli-dto-fidelity.test.ts index 67cc148795a..4a45a8127a6 100644 --- a/tests/cli/cli-dto-fidelity.test.ts +++ b/tests/cli/cli-dto-fidelity.test.ts @@ -216,6 +216,7 @@ describe("#2705 access key usage columns", () => { id: "k_9f2a", name: "ci-runner", prefix: "ocx_data_abc...", usage: { requests7d: 1204, totalRequests: 18330, lastUsedAt: "2026-08-27T04:11:00Z" }, }], + attributionSince: "2026-07-29T00:00:00Z", }); expect(out).toContain("REQ 7D"); expect(out).toContain("1,204"); @@ -229,6 +230,7 @@ describe("#2705 access key usage columns", () => { // use is the dangerous answer for someone deciding what to delete. const out = await listOutput({ keys: [{ id: "k_11bd", name: "laptop", prefix: "ocx_data_def...", usage: { ambiguous: true } }], + attributionSince: "2026-07-29T00:00:00Z", }); expect(out).toContain("ambiguous"); expect(out).not.toMatch(/\b0\b/); @@ -237,10 +239,20 @@ describe("#2705 access key usage columns", () => { test("a never-used key says never rather than showing an empty cell", async () => { const out = await listOutput({ keys: [{ id: "k_new", name: "fresh", prefix: "ocx_data_ghi...", usage: { requests7d: 0, totalRequests: 0 } }], + attributionSince: "2026-08-29T00:00:00Z", }); expect(out).toContain("never"); }); + test("unavailable attribution does not report zero usage or never used", async () => { + const out = await listOutput({ + keys: [{ id: "k_unknown", name: "unknown", prefix: "ocx_data_jkl...", usage: { requests7d: 0, totalRequests: 0 } }], + }); + expect(out).toContain("unavailable"); + expect(out).not.toMatch(/\b0\b/); + expect(out).not.toContain("never"); + }); + test("dataset-level attribution and truncation print ONCE as a footer", async () => { // They describe the usage log, not a key. Without attributionSince an absent lastUsedAt is // unreadable: "never used" and "nothing attributable yet" look identical. From 138069331fc2c0f487c39d4fe272b48c8ffb076d Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 08:47:40 +0900 Subject: [PATCH 03/11] fix(cli): treat a malformed attributionSince as unavailable typeof === 'string' accepted any value, so a malformed attributionSince made usageAvailable true and printed usage cells plus an 'attribution since' footer. Parse once, derive availability from the validated result, and reuse it for the footer. Covers the malformed-string regression. (cherry picked from commit e7584c39a769f76e332c0e96a18a8166166bb246) --- src/cli/access.ts | 12 +++++++++--- tests/cli/cli-dto-fidelity.test.ts | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/cli/access.ts b/src/cli/access.ts index d8663aa6251..dc541db5ce2 100644 --- a/src/cli/access.ts +++ b/src/cli/access.ts @@ -38,7 +38,13 @@ const USAGE = `Usage: */ function formatKeyRows(payload: Record, keys: Array>): string[] { const cells: string[][] = [["ID", "NAME", "PREFIX", "REQ 7D", "TOTAL", "LAST USED"]]; - const usageAvailable = typeof payload.attributionSince === "string"; + // A string that does not parse is not attribution data: treat it like an absent + // field so malformed payloads still render "unavailable" instead of usage values. + const attributionSince = typeof payload.attributionSince === "string" + && !Number.isNaN(Date.parse(payload.attributionSince)) + ? payload.attributionSince + : undefined; + const usageAvailable = attributionSince !== undefined; for (const entry of keys) { const usage = (entry.usage ?? {}) as Record; const ambiguous = usage.ambiguous === true; @@ -56,8 +62,8 @@ function formatKeyRows(payload: Record, keys: Array Math.max(...cells.map(row => (row[column] ?? "").length))); const lines = cells.map(row => row.map((cell, i) => (cell ?? "").padEnd(widths[i]!)).join(" ").trimEnd()); const footer: string[] = []; - if (typeof payload.attributionSince === "string") { - footer.push(`attribution since ${payload.attributionSince}`); + if (attributionSince !== undefined) { + footer.push(`attribution since ${attributionSince}`); } if (payload.historyTruncated === true) { footer.push("older history truncated"); diff --git a/tests/cli/cli-dto-fidelity.test.ts b/tests/cli/cli-dto-fidelity.test.ts index 4a45a8127a6..9cfca772c69 100644 --- a/tests/cli/cli-dto-fidelity.test.ts +++ b/tests/cli/cli-dto-fidelity.test.ts @@ -253,6 +253,16 @@ describe("#2705 access key usage columns", () => { expect(out).not.toContain("never"); }); + test("a malformed attributionSince string stays unavailable", async () => { + const out = await listOutput({ + keys: [{ id: "k_bad", name: "bad", prefix: "ocx_data_mno...", usage: { requests7d: 0, totalRequests: 0 } }], + attributionSince: "not-a-timestamp", + }); + expect(out).toContain("unavailable"); + expect(out).not.toContain("attribution since"); + expect(out).not.toMatch(/\b0\b/); + }); + test("dataset-level attribution and truncation print ONCE as a footer", async () => { // They describe the usage log, not a key. Without attributionSince an absent lastUsedAt is // unreadable: "never used" and "nothing attributable yet" look identical. From 5563577fc2e5a308fee995d12cfbc8956f9ea4a2 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Sun, 20 Sep 2026 13:30:25 +0900 Subject: [PATCH 04/11] fix(gui): keep the app-server status read alive across Models tab switches (cherry picked from commit 9e6870db8de95894c35456a3267c612918bc297b) --- gui/src/pages/Models.tsx | 3 +-- gui/tests/models-status-toast.test.tsx | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gui/src/pages/Models.tsx b/gui/src/pages/Models.tsx index 7d099bd877f..0dabe8ea505 100644 --- a/gui/src/pages/Models.tsx +++ b/gui/src/pages/Models.tsx @@ -296,9 +296,8 @@ export default function Models({ apiBase, restartEpoch = 0, catalogSyncedAt, rep pickerFlight.current?.controller.abort(); pickerFlight.current?.clear(); pickerFlight.current = null; - cancelAppServerRead(); }; - }, [apiBase, catalogActive, cancelAppServerRead]); + }, [apiBase, catalogActive]); useLayoutEffect(() => { // Pin inferred Custom before any late GET can switch mode and unmount its draft. if (catalogActive && pickerDraft === null && pickerMode === "custom") setPickerDraft("custom"); diff --git a/gui/tests/models-status-toast.test.tsx b/gui/tests/models-status-toast.test.tsx index 66bb641359c..0622e41023a 100644 --- a/gui/tests/models-status-toast.test.tsx +++ b/gui/tests/models-status-toast.test.tsx @@ -613,6 +613,31 @@ test("leaving Models aborts its pending picker save", async () => { expect(container.querySelector(".action-toast")).toBeNull(); }); +test("changing Models tabs preserves the pending app-server status read", async () => { + const baseFetch = globalThis.fetch; + let statusSignal: AbortSignal | null | undefined; + let releaseStatus!: (response: Response) => void; + globalThis.fetch = (async (input, init) => { + if (String(input).endsWith("/api/system/codex-app-server")) { + statusSignal = init?.signal; + return new Promise(resolve => { releaseStatus = resolve; }); + } + return baseFetch(input, init); + }) as typeof fetch; + + await mountModelsForRefreshWarning(); + await waitForModelsFeedback(() => releaseStatus !== undefined); + const combosTab = [...container.querySelectorAll('[role="tab"]')] + .find(button => button.textContent?.startsWith("Combos")); + expect(combosTab).toBeDefined(); + await act(async () => { combosTab!.click(); }); + + expect(statusSignal?.aborted).toBe(false); + await act(async () => { releaseStatus(Response.json({ state: "stale", runningCount: 1 })); }); + await waitForModelsFeedback(() => container.querySelector(".codex-stale-banner") !== null); + expect(container.querySelector(".codex-stale-banner")).not.toBeNull(); +}); + function holdPostSaveAppServerRead() { const baseFetch = globalThis.fetch; From c8a9d1a75ef71d136355412624beb0cc53c83c43 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Sun, 20 Sep 2026 13:30:25 +0900 Subject: [PATCH 05/11] fix(usage): bound persisted requestedModel selectors Selectors are not length-bound at admission, so persist over-long values as a bounded prefix + sha256 digest of the full selector and encode the request-history requested_model filter input identically. Two selectors sharing the bounded prefix stay distinguishable instead of colliding on a truncated prefix. (cherry picked from commit e3d0f9b6ea193f0d9be760ad3bd918a49a4cd937) --- src/routing/history/indexer.ts | 5 ++- src/usage/log.ts | 29 +++++++++++++++- tests/usage/request-history-index.test.ts | 23 +++++++++++++ tests/usage/usage-log.test.ts | 42 +++++++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/routing/history/indexer.ts b/src/routing/history/indexer.ts index 186860fa943..3ac745ebfba 100644 --- a/src/routing/history/indexer.ts +++ b/src/routing/history/indexer.ts @@ -22,6 +22,7 @@ import { getConfigDir } from "../../config"; import { recordOwnedConfigPath } from "../../lib/config-ownership"; import { currentUsageLogRevision, + encodePersistedRequestedModel, normalizeUsageEntryForTest, usageLogPath, type PersistedUsageEntry, @@ -510,7 +511,9 @@ function queryRows( }; if (filters.provider !== undefined) add("provider = ?", filters.provider); if (filters.model !== undefined) add("model = ?", filters.model); - if (filters.requestedModel !== undefined) add("requested_model = ?", filters.requestedModel); + // Rows store the bounded encoded form, so the lookup value must be encoded the + // same way — short selectors encode to themselves and still match verbatim. + if (filters.requestedModel !== undefined) add("requested_model = ?", encodePersistedRequestedModel(filters.requestedModel)); if (filters.status !== undefined) add("status = ?", filters.status); if (filters.conversationId !== undefined) add("conversation_id = ?", filters.conversationId); if (filters.surface !== undefined) add("surface = ?", filters.surface); diff --git a/src/usage/log.ts b/src/usage/log.ts index 6955db2073a..bf54a0727f3 100644 --- a/src/usage/log.ts +++ b/src/usage/log.ts @@ -222,8 +222,33 @@ export interface PersistedRequestSpend extends RequestSpendTotals { } const MAX_PERSISTED_MOVE_REASONS = 8; +// Model selectors are NOT length-bound at admission: configured and discovered +// model ids reach MODEL_DISCOVERY_MAX_MODEL_ID_LENGTH, and the wire `model` +// field is raw client input. Persisting a plain prefix would merge selectors +// that share it, so over-long selectors persist as prefix + a digest of the +// FULL selector — bounded, deterministic, and still exact-matchable. +const MAX_PERSISTED_REQUESTED_MODEL_LEN = 130; +const REQUESTED_MODEL_DIGEST_HEX_LEN = 16; const LOGICAL_REQUEST_ID_RE = /^[A-Za-z0-9_.:-]{1,64}$/; +/** + * Persisted form of the wire model selector. Selectors within the bound persist + * verbatim; longer selectors persist as a prefix plus a short digest of the full + * value, so two distinct selectors that share the prefix never collapse into one + * persisted identity. Exact-match readers (`requested_model = ?`) must encode + * lookup input through this same function. Idempotent — encoded forms fit the + * bound — which matters because rows are normalized again on read. + */ +export function encodePersistedRequestedModel(selector: string): string { + if (selector.length <= MAX_PERSISTED_REQUESTED_MODEL_LEN) return selector; + const digest = createHash("sha256") + .update(selector) + .digest("hex") + .slice(0, REQUESTED_MODEL_DIGEST_HEX_LEN); + const prefixLen = MAX_PERSISTED_REQUESTED_MODEL_LEN - REQUESTED_MODEL_DIGEST_HEX_LEN - 1; + return `${selector.slice(0, prefixLen)}~${digest}`; +} + export function isLogicalRequestId(value: unknown): value is string { return typeof value === "string" && LOGICAL_REQUEST_ID_RE.test(value); } @@ -856,7 +881,9 @@ function normalizeUsageEntry(entry: PersistedUsageEntry): PersistedUsageEntry { ? { conversationId: entry.conversationId.trim().slice(0, 128) } : {}), ...(entry.resolvedModel ? { resolvedModel: entry.resolvedModel } : {}), - ...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}), + ...(typeof entry.requestedModel === "string" && entry.requestedModel + ? { requestedModel: encodePersistedRequestedModel(entry.requestedModel) } + : {}), ...(shadowCallRewrittenFrom ? { shadowCallRewrittenFrom } : {}), ...(typeof entry.requestedEffort === "string" && entry.requestedEffort ? { requestedEffort: capMetadataString(entry.requestedEffort) } diff --git a/tests/usage/request-history-index.test.ts b/tests/usage/request-history-index.test.ts index 240fd391c59..c376d6ae7fb 100644 --- a/tests/usage/request-history-index.test.ts +++ b/tests/usage/request-history-index.test.ts @@ -300,6 +300,29 @@ describe("request-history index (RI-02)", () => { expect(byRange.rows.map(row => row.requestId)).toEqual(["f2"]); }); + test("requestedModel filter matches the encoded form of over-long selectors", async () => { + // Two valid selectors sharing the first 130 chars must stay distinguishable: + // the persisted form is prefix + digest, and the filter encodes identically. + const sharedPrefix = `a/${"m".repeat(200)}`; + const selectorA = `${sharedPrefix}-alpha`; + const selectorB = `${sharedPrefix}-omega`; + appendUsageEntry(entry("sel-a", 1000, "a", "m1", { requestedModel: selectorA })); + appendUsageEntry(entry("sel-b", 2000, "a", "m1", { requestedModel: selectorB })); + + const pageA = await queryRequestHistory({ requestedModel: selectorA }, undefined, 10); + expect(pageA.rows.map(row => row.requestId)).toEqual(["sel-a"]); + const pageB = await queryRequestHistory({ requestedModel: selectorB }, undefined, 10); + expect(pageB.rows.map(row => row.requestId)).toEqual(["sel-b"]); + + // Rows surface the bounded persisted form; filtering by that displayed value + // round-trips because the encoding is idempotent. + const persistedA = pageA.rows[0]!.requestedModel!; + expect(persistedA).not.toBe(selectorA); + expect(persistedA.length).toBeLessThanOrEqual(130); + const roundTrip = await queryRequestHistory({ requestedModel: persistedA }, undefined, 10); + expect(roundTrip.rows.map(row => row.requestId)).toEqual(["sel-a"]); + }); + test("row-by-id returns the canonical entry and unknown ids 404 through the API", async () => { appendUsageEntry(entry("target-id", 1234)); const row = await requestHistoryRowById("target-id"); diff --git a/tests/usage/usage-log.test.ts b/tests/usage/usage-log.test.ts index 02c3b346750..fc43c30931e 100644 --- a/tests/usage/usage-log.test.ts +++ b/tests/usage/usage-log.test.ts @@ -6,6 +6,7 @@ import { join } from "node:path"; import { appendUsageEntry, currentUsageLogRevision, + encodePersistedRequestedModel, normalizeUsageEntryForTest, normalizeClaudeCompatibilityUsageLog, normalizePersistedUsageRow, @@ -150,6 +151,47 @@ describe("usage log", () => { expect(normalized.attempts).toEqual([]); }); + test("bounds requested model selectors before appending usage rows", () => { + const requestedModel = `policy/${"x".repeat(1024 * 1024)}`; + appendUsageEntry({ + requestId: "ocx-bounded-selector", + timestamp: 1, + provider: "unknown", + model: "unknown", + requestedModel, + status: 404, + durationMs: 1, + usageStatus: "unreported", + }); + + const raw = readFileSync(usageLogPath(), "utf8"); + const persisted = JSON.parse(raw) as PersistedUsageEntry; + expect(persisted.requestedModel).toBe(encodePersistedRequestedModel(requestedModel)); + expect(persisted.requestedModel!.length).toBeLessThanOrEqual(130); + expect(raw.length).toBeLessThan(1024); + }); + + test("keeps over-long selectors that share the bounded prefix distinguishable", () => { + // Selectors are not length-bound at admission, so two valid selectors can + // agree past the persistence bound; they must not collapse into one identity. + const sharedPrefix = `provider/${"m".repeat(200)}`; + const selectorA = `${sharedPrefix}-alpha`; + const selectorB = `${sharedPrefix}-omega`; + expect(selectorA.slice(0, 130)).toBe(selectorB.slice(0, 130)); + + const encodedA = encodePersistedRequestedModel(selectorA); + const encodedB = encodePersistedRequestedModel(selectorB); + expect(encodedA).not.toBe(encodedB); + expect(encodedA.length).toBeLessThanOrEqual(130); + expect(encodedB.length).toBeLessThanOrEqual(130); + + // Short selectors persist verbatim, and re-normalizing a persisted row is a + // no-op — normalizeUsageEntry also runs on every read. + const short = "provider/model"; + expect(encodePersistedRequestedModel(short)).toBe(short); + expect(encodePersistedRequestedModel(encodedA)).toBe(encodedA); + }); + test("preserves only valid non-PII Codex account log labels", () => { const normalized = normalizeUsageEntryForTest({ requestId: "ocx-account-label", From 823a7d2d9f1142c9b04ea56f770b0755e9626489 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Mon, 21 Sep 2026 01:24:19 +0900 Subject: [PATCH 06/11] fix(spend): enforce ceilings on native chat sends (cherry picked from commit 347204ff33e42bba7781e7b057443ea9808e9d06) --- src/server/chat-completions.ts | 11 +++++++++- src/server/chat-native.ts | 15 +++++++++++++ structure/transports/responses.md | 4 +++- .../chat-completions-endpoint.test.ts | 22 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/server/chat-completions.ts b/src/server/chat-completions.ts index 3cb6c9a3798..c21c6e66a3a 100644 --- a/src/server/chat-completions.ts +++ b/src/server/chat-completions.ts @@ -199,7 +199,16 @@ async function handleChatCompletionsWithBudget( } // Combos must enter the Responses routing path so child selection, forced default // effort, failover, and per-attempt telemetry run before any native Chat send. - if (!route.combo && !effortRow && isNativeChatRouteEligible(route, chatBody, config)) chatNativeRoute = route; + if (!route.combo && !effortRow && isNativeChatRouteEligible(route, chatBody, config)) { + chatNativeRoute = route; + if (logCtx.usageLogInputTokens === undefined) { + logCtx.usageLogInputTokens = Math.max(1, estimateTokens(JSON.stringify(chatBody.messages ?? []), requestedModel)); + } + const outputCeiling = chatBody.max_completion_tokens ?? chatBody.max_tokens; + if (typeof outputCeiling === "number" && outputCeiling > 0) { + logCtx.spendOutputCeilingTokens = Math.trunc(outputCeiling); + } + } } catch (err) { if (err instanceof AdmissionModelDeniedError) { logCtx.requestedModel = requestedModel; diff --git a/src/server/chat-native.ts b/src/server/chat-native.ts index 71ef323ebf5..4d759fbef5d 100644 --- a/src/server/chat-native.ts +++ b/src/server/chat-native.ts @@ -48,6 +48,7 @@ import { transientRetryPolicyFor, } from "../providers/key-failover"; import { fastPolicyForModel } from "../providers/service-tier"; +import { stampApiKeyAccountLabel } from "../providers/label"; import { providerApiKeySelectionIsCurrent, resolveCurrentProviderApiKeyTransport } from "../providers/api-key-selection"; import { enrichOpenCodeZenFreeTierMessage } from "../providers/opencode-zen-rate-limit"; import type { OcxProviderTransport } from "../providers/xai-transport"; @@ -68,12 +69,16 @@ import { } from "./request-log"; import { jsonCompletionSse, nativeChatSse, structuredError, usageFromChat } from "./chat-native-sse"; import { registerTurn, unregisterTurn } from "./lifecycle"; +import { attachRequestSpendTracker } from "./responses/request-spend"; +import { workflowRefusalResponse } from "./workflow-refusal"; type Rec = Record; const MAX_NATIVE_CHAT_JSON_BYTES = 32 * 1024 * 1024; const MAX_NATIVE_CHAT_ERROR_BYTES = 64 * 1024; +class NativeChatSpendRefusal extends Error {} + const chatEffortSnapshots = new WeakMap {}); } catch { /* already closed */ } activeProvider = rotated; + stampApiKeyAccountLabel(logCtx, route.providerName, activeProvider); activeAdapter = createOpenAIChatAdapter(activeProvider); releaseRetainedRequest(); activeRequest = buildActiveRequest(); @@ -443,6 +453,11 @@ export async function handleNativeChatCompletions(options: HandleNativeChatOptio cleanupAbort(); upstream.abort(); if (req.signal.aborted) return fail(499, "Client cancelled request", "client_cancelled"); + if (error instanceof NativeChatSpendRefusal) { + const refusal = workflowRefusalResponse("workflow-spend-exhausted", logCtx); + finishLog(429); + return refusal; + } if (isTranslatorBudgetExceededError(error)) { return fail(413, "request translation buffer exceeded the safe limit", "request_too_large", "translation_buffer_limit"); } diff --git a/structure/transports/responses.md b/structure/transports/responses.md index a82e8f8cb08..e6fac914d34 100644 --- a/structure/transports/responses.md +++ b/structure/transports/responses.md @@ -1229,7 +1229,9 @@ target's own recovery decision, while the physical-send total is what binds ever The request's send budget bounds how many times it may reach upstream; the spend ledger bounds what those sends may cost, and it is the only bound here that survives a restart. Its production caller is `request-spend.ts`, installed on the execution budget at genuine ingress in `core.ts` -and parked on the log context so `addFinalRequestLog` can settle it. +and parked on the log context so `addFinalRequestLog` can settle it. Native Chat installs the +same tracker before its independent physical-send ladder and charges it immediately before each +dispatch, so taking that fast path cannot bypass root, identity, or provider-pool ceilings. It books by observing the budget's own send counter rather than by being called from each dispatch site. That counter moves exactly once per physical send — a reservation increments it, a diff --git a/tests/responses/chat-completions-endpoint.test.ts b/tests/responses/chat-completions-endpoint.test.ts index b87b3177779..034230a2109 100644 --- a/tests/responses/chat-completions-endpoint.test.ts +++ b/tests/responses/chat-completions-endpoint.test.ts @@ -170,6 +170,28 @@ function mockConfig(baseUrl: string, providerOverrides: Partial { + takeSpendHome(); + const upstream = mockChatUpstreamCapturing(); + const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); + config.spend = { pool: { maxTokens: 1 } }; + saveConfig(config); + const server = startServer(0); + try { + const response = await fetch(new URL("/v1/chat/completions", server.url), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }] }), + }); + expect(response.status).toBe(429); + expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); + expect(upstream.captured).toHaveLength(0); + } finally { + await server.stop(true); + upstream.server.stop(true); + } +}); + type StreamedToolCall = { index?: number; id?: string; From 22ee5166026fd20f0f413e5ba6a15a2b02e98881 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:02:52 +0900 Subject: [PATCH 07/11] fix(usage): preserve observation and native reservation boundaries --- src/server/chat-completions.ts | 4 ++- structure/gui-and-management-api.md | 5 +++ structure/transports/responses.md | 4 +-- .../chat-completions-endpoint.test.ts | 23 +++++++++++++ tests/usage/usage-provider-label.test.ts | 34 +++++++++++++++++++ tests/usage/usage-summary.test.ts | 10 ------ 6 files changed, 67 insertions(+), 13 deletions(-) diff --git a/src/server/chat-completions.ts b/src/server/chat-completions.ts index c21c6e66a3a..083428f295d 100644 --- a/src/server/chat-completions.ts +++ b/src/server/chat-completions.ts @@ -202,7 +202,9 @@ async function handleChatCompletionsWithBudget( if (!route.combo && !effortRow && isNativeChatRouteEligible(route, chatBody, config)) { chatNativeRoute = route; if (logCtx.usageLogInputTokens === undefined) { - logCtx.usageLogInputTokens = Math.max(1, estimateTokens(JSON.stringify(chatBody.messages ?? []), requestedModel)); + const parts = [JSON.stringify(chatBody.messages ?? [])]; + if (chatBody.tools !== undefined) parts.push(JSON.stringify(chatBody.tools)); + logCtx.usageLogInputTokens = Math.max(1, estimateTokens(parts.join("\n"), requestedModel)); } const outputCeiling = chatBody.max_completion_tokens ?? chatBody.max_tokens; if (typeof outputCeiling === "number" && outputCeiling > 0) { diff --git a/structure/gui-and-management-api.md b/structure/gui-and-management-api.md index 5be71c0bfbc..cf29e4494b2 100644 --- a/structure/gui-and-management-api.md +++ b/structure/gui-and-management-api.md @@ -541,6 +541,11 @@ status, so an unexpected management response cannot add raw upstream material. > Decision record: [ADR-0078](decisions/ADR-0078-usage-accounting.md) `src/usage/log.ts` writes append-only JSONL to `~/.opencodex/usage.jsonl` with file mode `0o600` +Requested selectors longer than 130 characters persist as a prefix plus a digest of the complete +selector; the request-history exact-match filter applies the same idempotent encoding. Serving-model +identities remain unchanged. Only historical Codex `openai`, `chatgpt` and `openai-multi` main labels +collapse for reporting; configured provider names ending in `-main` remain separate. CLI access-key +usage is unavailable without a valid attribution timestamp, rather than a measured zero or never-used key. inside an owner-only `0o700` directory. Consecutive appends reuse the directory and permission check for at most one second; the first append at or after that boundary attempts to reapply both modes, and an `ENOENT` append invalidates the cache and recreates the path immediately. This is a diff --git a/structure/transports/responses.md b/structure/transports/responses.md index e6fac914d34..ad8aaebde34 100644 --- a/structure/transports/responses.md +++ b/structure/transports/responses.md @@ -1233,8 +1233,8 @@ and parked on the log context so `addFinalRequestLog` can settle it. Native Chat same tracker before its independent physical-send ladder and charges it immediately before each dispatch, so taking that fast path cannot bypass root, identity, or provider-pool ceilings. -It books by observing the budget's own send counter rather than by being called from each -dispatch site. That counter moves exactly once per physical send — a reservation increments it, a +The Responses path books by observing its budget's own send counter rather than calling each +dispatch site; Native Chat directly charges messages, tool definitions and the output ceiling. That counter moves exactly once per physical send — a reservation increments it, a refund decrements it, and an externally reported send settles against a booking already counted — so one ledger entry per increment is one entry per send, and a dispatch path added later cannot forget to book. The previous attempt at this wiring shipped the whole reserve/dispatch/settle diff --git a/tests/responses/chat-completions-endpoint.test.ts b/tests/responses/chat-completions-endpoint.test.ts index 034230a2109..4345464bb5d 100644 --- a/tests/responses/chat-completions-endpoint.test.ts +++ b/tests/responses/chat-completions-endpoint.test.ts @@ -192,6 +192,29 @@ test("native Chat refuses a physical send that exceeds the configured pool spend } }); +test("native Chat includes tool definitions in its pre-dispatch spend reservation", async () => { + takeSpendHome(); + const upstream = mockChatUpstreamCapturing(); + const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); + config.spend = { pool: { maxTokens: 500 } }; + saveConfig(config); + const server = startServer(0); + try { + const response = await fetch(new URL("/v1/chat/completions", server.url), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }], + max_tokens: 1, tools: [{ type: "function", function: { name: "large_tool", description: "large schema ".repeat(2_000), parameters: { type: "object" } } }] }), + }); + expect(response.status).toBe(429); + expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); + expect(upstream.captured).toHaveLength(0); + } finally { + await server.stop(true); + upstream.server.stop(true); + } +}); + type StreamedToolCall = { index?: number; id?: string; diff --git a/tests/usage/usage-provider-label.test.ts b/tests/usage/usage-provider-label.test.ts index e5a12bdaee9..3627efbd727 100644 --- a/tests/usage/usage-provider-label.test.ts +++ b/tests/usage/usage-provider-label.test.ts @@ -1,7 +1,41 @@ import { describe, expect, test } from "bun:test"; import { baseProviderLabel } from "../../src/providers/label"; +import { summarizeUsage } from "../../src/usage/summary"; +import type { PersistedUsageEntry } from "../../src/usage/log"; + +const FIXED_NOW = Date.UTC(2026, 5, 28, 12, 0, 0); +function entry(overrides: Partial & { ts: number }): PersistedUsageEntry { + const { ts, ...rest } = overrides; + return { + requestId: rest.requestId ?? `req-${ts}`, + timestamp: ts, + provider: rest.provider ?? "openai", + model: rest.model ?? "gpt-5.5", + status: rest.status ?? 200, + durationMs: rest.durationMs ?? 10, + usageStatus: rest.usageStatus ?? "unreported", + ...(rest.surface === "claude" ? { surface: rest.surface } : {}), + ...(rest.accountLogLabel !== undefined ? { accountLogLabel: rest.accountLogLabel } : {}), + ...(rest.resolvedModel !== undefined ? { resolvedModel: rest.resolvedModel } : {}), + ...(rest.usage ? { usage: rest.usage } : {}), + ...(rest.totalTokens !== undefined ? { totalTokens: rest.totalTokens } : {}), + ...(rest.attempts ? { attempts: rest.attempts } : {}), + ...(rest.apiKeyId !== undefined ? { apiKeyId: rest.apiKeyId } : {}), + ...(rest.routeDecision ? { routeDecision: rest.routeDecision } : {}), + }; +} describe("baseProviderLabel", () => { + test("keeps configured providers ending in -main in distinct usage rows", () => { + const entries: PersistedUsageEntry[] = [ + entry({ ts: FIXED_NOW - 1, provider: "openrouter", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 4, outputTokens: 1 }, totalTokens: 5 }), + entry({ ts: FIXED_NOW - 2, provider: "openrouter-main", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 2, outputTokens: 1 }, totalTokens: 3 }), + ]; + const sum = summarizeUsage(entries, "30d", FIXED_NOW); + expect(sum.providers.map(provider => provider.provider).sort()).toEqual(["openrouter", "openrouter-main"]); + expect(sum.models.map(model => model.provider).sort()).toEqual(["openrouter", "openrouter-main"]); + }); + test("returns the input when there is no pool suffix", () => { expect(baseProviderLabel("openai")).toBe("openai"); expect(baseProviderLabel("anthropic")).toBe("anthropic"); diff --git a/tests/usage/usage-summary.test.ts b/tests/usage/usage-summary.test.ts index 066797f7911..c109d861f4d 100644 --- a/tests/usage/usage-summary.test.ts +++ b/tests/usage/usage-summary.test.ts @@ -1186,16 +1186,6 @@ describe("summarizeUsage", () => { ]); }); - test("keeps configured providers ending in -main in distinct usage rows", () => { - const entries: PersistedUsageEntry[] = [ - entry({ ts: FIXED_NOW - 1, provider: "openrouter", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 4, outputTokens: 1 }, totalTokens: 5 }), - entry({ ts: FIXED_NOW - 2, provider: "openrouter-main", model: "shared-model", usageStatus: "reported", usage: { inputTokens: 2, outputTokens: 1 }, totalTokens: 3 }), - ]; - const sum = summarizeUsage(entries, "30d", FIXED_NOW); - expect(sum.providers.map(provider => provider.provider).sort()).toEqual(["openrouter", "openrouter-main"]); - expect(sum.models.map(model => model.provider).sort()).toEqual(["openrouter", "openrouter-main"]); - }); - test("keeps one logical combo request while attributing both physical attempts", () => { const combo = entry({ ts: FIXED_NOW - 1, From 1a8d5f7ded55b82093bb053cd10dd3bb092ea4c1 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:17:34 +0900 Subject: [PATCH 08/11] test(usage): isolate native spend regressions within file caps --- scripts/test-layout/layout.json | 1 + structure/gui-and-management-api.md | 4 +- tests/fixtures/test-layout-expected.json | 1 + .../chat-completions-endpoint.test.ts | 45 ------- tests/responses/chat-native-spend.test.ts | 116 ++++++++++++++++++ 5 files changed, 121 insertions(+), 46 deletions(-) create mode 100644 tests/responses/chat-native-spend.test.ts diff --git a/scripts/test-layout/layout.json b/scripts/test-layout/layout.json index 7117b4679ea..ce5d2bf714b 100644 --- a/scripts/test-layout/layout.json +++ b/scripts/test-layout/layout.json @@ -335,6 +335,7 @@ "catalog-zero-credit-picker.test.ts": "codex-integration", "chat-completions-deferred-tools.test.ts": "responses", "chat-completions-endpoint.test.ts": "responses", + "chat-native-spend.test.ts": "responses", "chat-conversation-affinity.test.ts": "responses", "chat-inbound-reasoning-none.test.ts": "responses", "chat-inbound-reasoning-replay.test.ts": "responses", diff --git a/structure/gui-and-management-api.md b/structure/gui-and-management-api.md index cf29e4494b2..b202ddc583f 100644 --- a/structure/gui-and-management-api.md +++ b/structure/gui-and-management-api.md @@ -540,12 +540,12 @@ status, so an unexpected management response cannot add raw upstream material. > Decision record: [ADR-0078](decisions/ADR-0078-usage-accounting.md) -`src/usage/log.ts` writes append-only JSONL to `~/.opencodex/usage.jsonl` with file mode `0o600` Requested selectors longer than 130 characters persist as a prefix plus a digest of the complete selector; the request-history exact-match filter applies the same idempotent encoding. Serving-model identities remain unchanged. Only historical Codex `openai`, `chatgpt` and `openai-multi` main labels collapse for reporting; configured provider names ending in `-main` remain separate. CLI access-key usage is unavailable without a valid attribution timestamp, rather than a measured zero or never-used key. +`src/usage/log.ts` writes append-only JSONL to `~/.opencodex/usage.jsonl` with file mode `0o600` inside an owner-only `0o700` directory. Consecutive appends reuse the directory and permission check for at most one second; the first append at or after that boundary attempts to reapply both modes, and an `ENOENT` append invalidates the cache and recreates the path immediately. This is a @@ -744,6 +744,8 @@ converge the Codex catalog once and return its disposition. The Models UI owns a picker data resource so failure cannot erase the ordinary model inventory; Apply publishes through the resource's generation fence, and Most used reads usage only on explicit Apply. Stored mode survives availability drift, while complete/native custom orders await explicit replacement. +The Models app-server status read is owned by its API-base/restart effect, not the picker tab; +switching to Combos preserves a pending read and its existing stale-state banner. The shared atomic replacement publisher also identifies explicit Remote Workspace file writes as `remote-workspace`. Remote Workspace uses a separate, explicitly enabled server surface with structural WebSocket callbacks and awaited per-server cleanup; [its contract](remote-workspace.md) owns that integration and records its isolated owner and support limits. diff --git a/tests/fixtures/test-layout-expected.json b/tests/fixtures/test-layout-expected.json index 1fd592857c0..5dd8523cb18 100644 --- a/tests/fixtures/test-layout-expected.json +++ b/tests/fixtures/test-layout-expected.json @@ -166,6 +166,7 @@ "catalog-zero-credit-picker.test.ts": "codex-integration", "chat-completions-deferred-tools.test.ts": "responses", "chat-completions-endpoint.test.ts": "responses", + "chat-native-spend.test.ts": "responses", "chat-conversation-affinity.test.ts": "responses", "chat-inbound-reasoning-none.test.ts": "responses", "chat-inbound-reasoning-replay.test.ts": "responses", diff --git a/tests/responses/chat-completions-endpoint.test.ts b/tests/responses/chat-completions-endpoint.test.ts index 4345464bb5d..b87b3177779 100644 --- a/tests/responses/chat-completions-endpoint.test.ts +++ b/tests/responses/chat-completions-endpoint.test.ts @@ -170,51 +170,6 @@ function mockConfig(baseUrl: string, providerOverrides: Partial { - takeSpendHome(); - const upstream = mockChatUpstreamCapturing(); - const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); - config.spend = { pool: { maxTokens: 1 } }; - saveConfig(config); - const server = startServer(0); - try { - const response = await fetch(new URL("/v1/chat/completions", server.url), { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }] }), - }); - expect(response.status).toBe(429); - expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); - expect(upstream.captured).toHaveLength(0); - } finally { - await server.stop(true); - upstream.server.stop(true); - } -}); - -test("native Chat includes tool definitions in its pre-dispatch spend reservation", async () => { - takeSpendHome(); - const upstream = mockChatUpstreamCapturing(); - const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); - config.spend = { pool: { maxTokens: 500 } }; - saveConfig(config); - const server = startServer(0); - try { - const response = await fetch(new URL("/v1/chat/completions", server.url), { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }], - max_tokens: 1, tools: [{ type: "function", function: { name: "large_tool", description: "large schema ".repeat(2_000), parameters: { type: "object" } } }] }), - }); - expect(response.status).toBe(429); - expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); - expect(upstream.captured).toHaveLength(0); - } finally { - await server.stop(true); - upstream.server.stop(true); - } -}); - type StreamedToolCall = { index?: number; id?: string; diff --git a/tests/responses/chat-native-spend.test.ts b/tests/responses/chat-native-spend.test.ts new file mode 100644 index 00000000000..c0cbf627b0f --- /dev/null +++ b/tests/responses/chat-native-spend.test.ts @@ -0,0 +1,116 @@ +import { afterEach, beforeEach, expect, test } from "bun:test"; +import { mkdtempSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { saveConfig } from "../../src/config"; +import { startServer } from "../../src/server"; +import type { OcxConfig, OcxProviderConfig } from "../../src/types"; +import { acquireOwnedSpendHome } from "../helpers/owned-spend-home"; +import { installIsolatedCodexHome, type IsolatedCodexHome } from "../helpers/isolated-codex-home"; +import { removeTreeWithRetry } from "../helpers/remove-tree"; +import { resetProviderRequestPacingForTest } from "../../src/providers/request-pacing"; + +let previousHome: string | undefined; +let testDir = ""; +let isolatedCodexHome: IsolatedCodexHome | null = null; +let releaseSpendHome: (() => void) | undefined; +const takeSpendHome = (): void => { releaseSpendHome ??= acquireOwnedSpendHome(); }; +beforeEach(() => { + previousHome = process.env.OPENCODEX_HOME; + isolatedCodexHome = installIsolatedCodexHome("ocx-chat-spend-"); + testDir = mkdtempSync(join(tmpdir(), "ocx-chat-spend-")); + process.env.OPENCODEX_HOME = testDir; +}); +afterEach(() => { + releaseSpendHome?.(); + releaseSpendHome = undefined; + resetProviderRequestPacingForTest(); + if (previousHome === undefined) delete process.env.OPENCODEX_HOME; + else process.env.OPENCODEX_HOME = previousHome; + isolatedCodexHome?.restore(); + isolatedCodexHome = null; + if (testDir) removeTreeWithRetry(testDir); +}); + +function mockChatUpstreamCapturing() { + const captured: Array> = []; + const server = Bun.serve({ + port: 0, + async fetch(req) { + const url = new URL(req.url); + if (!url.pathname.endsWith("/chat/completions")) { + return Response.json({ error: { message: `unexpected path ${url.pathname}` } }, { status: 404 }); + } + try { captured.push(await req.json() as Record); } catch { /* keep streaming */ } + const frames = [ + `data: ${JSON.stringify({ choices: [{ index: 0, delta: { role: "assistant", content: "Hello" } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ index: 0, delta: { content: " from mock" } }] })}\n\n`, + `data: ${JSON.stringify({ choices: [{ index: 0, delta: {}, finish_reason: "stop" }], usage: { prompt_tokens: 12, completion_tokens: 3 } })}\n\n`, + "data: [DONE]\n\n", + ]; + return new Response(frames.join(""), { headers: { "Content-Type": "text/event-stream" } }); + }, + }); + return { server, captured }; +} + +function mockConfig(baseUrl: string, providerOverrides: Partial = {}): OcxConfig { + return { + port: 0, + defaultProvider: "mock", + providers: { + mock: { + adapter: "openai-chat", + baseUrl, + apiKey: "k", + allowPrivateNetwork: true, + ...providerOverrides, + }, + }, + } as OcxConfig; +} + +test("native Chat refuses a physical send that exceeds the configured pool spend ceiling", async () => { + takeSpendHome(); + const upstream = mockChatUpstreamCapturing(); + const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); + config.spend = { pool: { maxTokens: 1 } }; + saveConfig(config); + const server = startServer(0); + try { + const response = await fetch(new URL("/v1/chat/completions", server.url), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }] }), + }); + expect(response.status).toBe(429); + expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); + expect(upstream.captured).toHaveLength(0); + } finally { + await server.stop(true); + upstream.server.stop(true); + } +}); + +test("native Chat includes tool definitions in its pre-dispatch spend reservation", async () => { + takeSpendHome(); + const upstream = mockChatUpstreamCapturing(); + const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); + config.spend = { pool: { maxTokens: 500 } }; + saveConfig(config); + const server = startServer(0); + try { + const response = await fetch(new URL("/v1/chat/completions", server.url), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ model: "mock/test-model", messages: [{ role: "user", content: "hello" }], + max_tokens: 1, tools: [{ type: "function", function: { name: "large_tool", description: "large schema ".repeat(2_000), parameters: { type: "object" } } }] }), + }); + expect(response.status).toBe(429); + expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); + expect(upstream.captured).toHaveLength(0); + } finally { + await server.stop(true); + upstream.server.stop(true); + } +}); From 2241d03f4474dbea9b3a466b4d510350a8628c2f Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:35:17 +0900 Subject: [PATCH 09/11] test(usage): drain fixture owners before removing Windows homes --- tests/responses/chat-native-spend.test.ts | 43 ++++++++++++++++------- tests/usage/request-history-index.test.ts | 7 +++- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/tests/responses/chat-native-spend.test.ts b/tests/responses/chat-native-spend.test.ts index c0cbf627b0f..0fd9f5f2920 100644 --- a/tests/responses/chat-native-spend.test.ts +++ b/tests/responses/chat-native-spend.test.ts @@ -3,9 +3,12 @@ import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { saveConfig } from "../../src/config"; +import { flushConfigDirHardeningForTests } from "../../src/config/paths"; +import { flushNativeMainStartupReleases } from "../../src/codex/native-profile-startup"; import { startServer } from "../../src/server"; import type { OcxConfig, OcxProviderConfig } from "../../src/types"; -import { acquireOwnedSpendHome } from "../helpers/owned-spend-home"; +import { spendLedgerOwnerSnapshot } from "../../src/lib/spend-ledger-owner"; +import { flushWindowsSecretAclReapsBeforeRemoval } from "../../src/lib/windows-secret-acl"; import { installIsolatedCodexHome, type IsolatedCodexHome } from "../helpers/isolated-codex-home"; import { removeTreeWithRetry } from "../helpers/remove-tree"; import { resetProviderRequestPacingForTest } from "../../src/providers/request-pacing"; @@ -13,17 +16,34 @@ import { resetProviderRequestPacingForTest } from "../../src/providers/request-p let previousHome: string | undefined; let testDir = ""; let isolatedCodexHome: IsolatedCodexHome | null = null; -let releaseSpendHome: (() => void) | undefined; -const takeSpendHome = (): void => { releaseSpendHome ??= acquireOwnedSpendHome(); }; +let activeServer: ReturnType | undefined; +let activeUpstream: ReturnType | undefined; +let stopping: Promise | undefined; +function stopFixtureServers(): Promise { + // A timed-out body and its afterEach join one owner instead of racing two stops. + return stopping ??= (async () => { + try { await activeServer?.stop(true); } + finally { await activeUpstream?.stop(true); } + })(); +} beforeEach(() => { + activeServer = undefined; + activeUpstream = undefined; + stopping = undefined; previousHome = process.env.OPENCODEX_HOME; isolatedCodexHome = installIsolatedCodexHome("ocx-chat-spend-"); testDir = mkdtempSync(join(tmpdir(), "ocx-chat-spend-")); process.env.OPENCODEX_HOME = testDir; }); -afterEach(() => { - releaseSpendHome?.(); - releaseSpendHome = undefined; +afterEach(async () => { + await stopFixtureServers(); + // Stop background owners before removing the home they can still harden/open. + await flushNativeMainStartupReleases(); + await flushConfigDirHardeningForTests(); + // A caller-facing ACL timeout is not evidence that its child released the path. + await flushWindowsSecretAclReapsBeforeRemoval(testDir); + if (isolatedCodexHome) await flushWindowsSecretAclReapsBeforeRemoval(isolatedCodexHome.path); + expect(spendLedgerOwnerSnapshot().ownership).toBe("unheld"); resetProviderRequestPacingForTest(); if (previousHome === undefined) delete process.env.OPENCODEX_HOME; else process.env.OPENCODEX_HOME = previousHome; @@ -51,6 +71,7 @@ function mockChatUpstreamCapturing() { return new Response(frames.join(""), { headers: { "Content-Type": "text/event-stream" } }); }, }); + activeUpstream = server; return { server, captured }; } @@ -71,12 +92,12 @@ function mockConfig(baseUrl: string, providerOverrides: Partial { - takeSpendHome(); const upstream = mockChatUpstreamCapturing(); const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); config.spend = { pool: { maxTokens: 1 } }; saveConfig(config); const server = startServer(0); + activeServer = server; try { const response = await fetch(new URL("/v1/chat/completions", server.url), { method: "POST", @@ -87,18 +108,17 @@ test("native Chat refuses a physical send that exceeds the configured pool spend expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); expect(upstream.captured).toHaveLength(0); } finally { - await server.stop(true); - upstream.server.stop(true); + await stopFixtureServers(); } }); test("native Chat includes tool definitions in its pre-dispatch spend reservation", async () => { - takeSpendHome(); const upstream = mockChatUpstreamCapturing(); const config = mockConfig(`${upstream.server.url.toString().replace(/\/$/, "")}/v1`); config.spend = { pool: { maxTokens: 500 } }; saveConfig(config); const server = startServer(0); + activeServer = server; try { const response = await fetch(new URL("/v1/chat/completions", server.url), { method: "POST", @@ -110,7 +130,6 @@ test("native Chat includes tool definitions in its pre-dispatch spend reservatio expect(response.headers.get("x-opencodex-local-refusal")).toBe("workflow_spend_exhausted"); expect(upstream.captured).toHaveLength(0); } finally { - await server.stop(true); - upstream.server.stop(true); + await stopFixtureServers(); } }); diff --git a/tests/usage/request-history-index.test.ts b/tests/usage/request-history-index.test.ts index c376d6ae7fb..72d4226eadd 100644 --- a/tests/usage/request-history-index.test.ts +++ b/tests/usage/request-history-index.test.ts @@ -31,6 +31,8 @@ import { import { InvalidCursorError } from "../../src/routing/history/cursor"; import { HISTORY_DB_FILENAME } from "../../src/routing/history/schema"; import { getConfigDir } from "../../src/config"; +import { flushConfigDirHardeningForTests } from "../../src/config/paths"; +import { flushWindowsSecretAclReapsBeforeRemoval } from "../../src/lib/windows-secret-acl"; import type { OcxConfig } from "../../src/types"; import { removeTreeWithRetry } from "../helpers/remove-tree"; @@ -72,8 +74,11 @@ beforeEach(() => { closeRequestHistoryIndex(); }); -afterEach(() => { +afterEach(async () => { closeRequestHistoryIndex(); + // Management/config reads may still own a Windows ACL child after the query ends. + await flushConfigDirHardeningForTests(); + await flushWindowsSecretAclReapsBeforeRemoval(testDir); if (previousHome === undefined) delete process.env.OPENCODEX_HOME; else process.env.OPENCODEX_HOME = previousHome; if (testDir) removeTreeWithRetry(testDir); From ddfef1320b00bffe23239acadf10769eacf38050 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:56:34 +0900 Subject: [PATCH 10/11] test(usage): batch canonical pagination fixture writes --- tests/usage/request-history-index.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/usage/request-history-index.test.ts b/tests/usage/request-history-index.test.ts index 72d4226eadd..c141350ac2b 100644 --- a/tests/usage/request-history-index.test.ts +++ b/tests/usage/request-history-index.test.ts @@ -15,6 +15,7 @@ import { handleManagementAPI } from "../../src/server/management-api"; import { ManagementRequest } from "../helpers/management-auth"; import { appendUsageEntry, + normalizeUsageEntryForTest, resetUsageReadCacheForTests, usageLogPath, type PersistedUsageEntry, @@ -168,7 +169,12 @@ describe("request-history index (RI-02)", () => { test("large history indexes fully and paginates without duplicates or misses", async () => { const rows = seedRows(1500, 10_000); - for (const row of rows) appendUsageEntry(row); + // Exercise all 1,500 indexed rows and 15 pages without timing 1,500 filesystem opens. + // This is byte-for-byte the append writer's normalization + JSON + LF representation; + // the incremental-append cases above continue to exercise appendUsageEntry itself. + writeFileSync(usageLogPath(), rows.map(row => `${JSON.stringify(normalizeUsageEntryForTest(row))}\n`).join(""), { + encoding: "utf-8", mode: 0o600, + }); const seen = new Set(); let cursor: string | undefined; let pages = 0; From d3589638a877530f89c111d3dba69d7a76908939 Mon Sep 17 00:00:00 2001 From: luvs01 <27862058+luvs01@users.noreply.github.com> Date: Tue, 22 Sep 2026 23:00:45 +0900 Subject: [PATCH 11/11] docs(pr): capture Models tab status with synthetic data --- .github/pr-assets/260922-models-tab-status.png | Bin 0 -> 120612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/pr-assets/260922-models-tab-status.png diff --git a/.github/pr-assets/260922-models-tab-status.png b/.github/pr-assets/260922-models-tab-status.png new file mode 100644 index 0000000000000000000000000000000000000000..cf10d22d635528d4b851be038b88b0210dc9e2e7 GIT binary patch literal 120612 zcmV*sKtsQYP)k^000mGNkl?vDjcK4in@0Tyh{`@5O?#|B4mUGVh&g?mN^x;_x zp@32fBp~zMm*=D~q_z+uDFu>@-5ebgobt*jN(yaTTC7onjDEDLkncD$9mY#>e-{T6O64)bpwtU3O_9voO4MS_w#oy{@rqwba2)T;)k4W&!PE zq!x3=PB_GvMIJh7xQmu`6(I2}Q92-;C~8UGnUINy#?o#?98;Tj14h0N#>x^8tdAM~ zF!jC+)+nQ$v8Gb=$l81{#Yk!~71CzuQO>`n6{}9UwT4*le{5CR#J{vy^W~m@oq4N; z?TZDv&NmM54y&r%ca=S(VO6ZGzL+K}qeh|Qtvelsb!X7cz(l)<{)qtHE1Btxs!Kd) zoJC>|lGVx{G-vAFRiRYM7*-xOE}$@6hLg%UtQ0rbO)Fte6*q?bQuG2GV_+MX#9_3Y z1k=xECCGj<0Z!vp+S)UPs?iI3YZoyGi!wSU9oLM{-gE;u<6tf@;YhEH+e*MWZp?)W z>l<&~-S$~!z2 zKTYTepyft@T%oKMCDZ6yH`+055TqbSE)-3JTLB5zh*WKc1A+PkHW)SmVY>+(axpe+ zFg`dLivwCrVVdY5*2DmG3~FgAVflMOs#WM#1oex;y^}Rh9^4XJ8T!|6&RgD-mQ`}4 z8n`Vb%k?we32cy=S!Aash*BXk70i5vRtC5%g*O%|6xVH4>uayqUeai*kp8OBB1?wR z;40|C1|v#kfn+vllrzIDvcd8{VKx{JA?!N^{JN1(O^pA*Q9+H-N(xv{O5xI7#nc&g zO3BEI(rd1WTLq&I6|}hlNLfMcC>wV=R1hoznwAeKFHL|A*xka>jv_=2Ga9vB6(sdhX&vG-y0_maBSYm))B}aF0MM|z3 zd!!CgEYJrjBNuoL%-j*my_eaFA;?;j&Xa!HO_*gBwgqX+!=hN)$p~w8 zd017dyfDxbx3t--jT;$;=*bjOEQ~FM@SG?{r*eJbWO*$N8w@O}@xulc=b0@Q6d^+B zt*BBgnhAs^*e`fs_~>g=fPc6_h9cP2w7FO^xvc)L|n})uty2Lxp*qT*jrzkMVReuYm<%!P*`6ggDVL1{z zP&ID`jzF58f?_p*p~0w6>#40FoM43Vrhw4`nDijV7^9Su4Qv(_fzW4q(Bt8~|FlmJ zqI`mnoNAT0vAk5AMv5?a8RPBNEqQ%oiPoceL6-*n|F@GGV z{Ca*hs<@vlY_27IathqhYRZ|+w&;RDCaW=0qKCXw`ir$ES;?Y?c2_`TgXO32*&q;O z@U&K%+<^0GR8V8oW`Ld|U_AwhZwjqE0b^@uhzdGft^SNq1_(Q!6yd6 zWORm7oi_!DutBJkiV_<{+h{Grj*{}(VB=C<;vEE*lv2=|4YH511=*m_n*4EPwq|%_ z&k=Cl@NPIdn?+eJ7vxPHHjDbFW`y7_U#-Qe1SUP0#&BFS0(nDVH=0T}F96uX-xcT1 zCp{(6*vUO_gv9hGjGen;C%10sOKpc4bZn1-m8ArWK3O;1SyD+w!-qJ|s-G$7+!d8x zsk$pl_peh&_y-y}x}{pvE!A(8YBh{Wh;+h=U{u-nw*uX2r6X!W$#H%f z`RpO(X+1Z`!t_aeos3&z>Xqzy9~+j!9yP3!qW%!Ma%CMca7G~pC71+1J*YsK3k+Q? zRnWt-P%*M;`&z?nP)T~?Z;^@b6t!)ou|dTc0@pPes`m_`5NkCxX(SMg5Zq%Dw%%|` z&=s&<(&UZR9LoywR1m~Hq5>NPP6-AB>#~obZKB|Ki-|83HQKgggAiqd=;^T?@@WZl zV1rr{SZuJVDgSW?(<5dvHfRwfY+N-x1OL%MX-=`xX;|R8Cf|s1b%H+gi92bn5^#q- zL{xl3LMz92mIH&ZS(Hl;f<=x!-(o(OUUWzg@@HFfs^Yh_qNlrbv1Iwsd<;50D4w7D zvXU`8Ec%?};sW;Q5AP+5VZejW#>mR}e{D1&QXhmj$;CmE7~lCRFqv4Zr2V4)aEUuw zg{~!xtCC8)-PMqmWxOC#&fkfU$(0=gc1;iZUl?tHuApD0c%RvW1sJ}{Sxeq5$`pmz zpzDl)I2*Km7p5jO?9APPAQdd+an$ER(1HO%!yW(t1Fr$B)PfWKS~4;Z1aR_rPQxe_ z1mJ@EmQ;`rvYA(fDL;YL&o)s=dW8&hWP?6;Wwt^3NmnJf)Rqlu&8^s=(|3QxsMw=} zEHMky8J`V$TUebT;&Qy@HL3jW-!+ifGMG!rzgq;ZZ`PdxV6SxO-6CPuZDJ-6I3Yoj zVVEEacT5k4J&blBF+G@E=c-MRWeud9koy7l$vHE|6~x0MzI{t|(YqLey}O^t{lX!# ziW%-Uj>(KmU_4Thil3GIH*E~z4uuknJDcjbToYJAni3_HOY+ePP4k4GYktKhX!I$% z_$5+mX=~V(YLOnSeU>fM@gAQZbmeNb9Q6Z4wwb^NRX@vhC~Pn^za({NSiyt&lh5sbXIq1HkPO1z?|t>=pL6O_Zlz;F2bfOAL$+I(l*Z zut6_S4zfYM2_!r^=sMQ)SJJ8E7wrg5{DUuPvnYR`!gMxevna5OAB1%q7%r>O@`Llu z7q)yzNDngF!V)psgQ;(%Xi1+ia(2Z5+KTCpk5|S3(AS)eGc1z6gtuME?IJgPpd*y? zFH_Z4)lizLkaU`g3e(mK z!#ZrW{wy}6&ME{KiRnQWp*tIau?@39CDSTk%Dp6WlnsW?TEPM6pAEK23@Y$?F`67_ zq?169cpye)3{wU(88{Uj#2!)T{{9#?EbbK~Y!ii~hX#ucpD6Hzc5E=^*XKL#6dec~ zOnrkQtK>cZZR+=-Z6#djSLhTvhddf zLNWxOlZ+Y~_$r|#Bx;Vp8nJY=k>zZ4YMdg~C+Ex|tjpDhq!gBaMA9A<-#9rjBy8)T@U#wdhPj8JP52u_@o$^*fm z6or6bZ49a4uo8ndodEXvE99boXbw@3*&qPFi`6DMZP}o&2Mj&+)TOdP)$b3`v+f}X zKM_%miONm29hCg4Y{0ZET|y+@)$SvO-~G# z{c^}d%_JpmQ%ZrqY!vfj08kSE^tD-o@2ava4wDVK?AJRFq_DvdwX?^+E>-fc4x(+h z?jYD}DTNJ|qa@K1ga8|4rmX3cHv%kyx1nNhph32wa31jQWmpO^?4B*03N(+na9>Js zqc(OvOFOaKK13lfVMAG>t@gmk_W_v5Sd5{PiUx0_LMMW%I##NvRBGStxKbs`m1T+x zo!e6vfL0F>4g_AzVKaXzCij&L4XV$XjkIW?W=w8N82qH+SCZ!#&`~0EJa*_${OFdm zYQdR|`y72dxLtP|tHNecfUcWGJM9$p!ff6r2P!yjgQjm~2Lo&n zYgJ>y2Hi32^pk@oF~Fvqt|tLDh`_%{CNNN?6_*Wy1BVTAv+4d02QWMbqi+_4PVbUo zeTL+pngEET2dycBz(z``oT0CbX;a*&jhyN*akCjR$G(gR-3o_HDek1}PVhD(V=U0; z!tTyORbrWEF79z>uP}0}DsEaO6{SNB_+*g~musXvK-ktqdK-U7BDVb@4PLQZ*o-gB zWEz$QQ4bR#4`XEIp(iD%@-My^b3-(Z0f(G0b};F|@OWD5fvF8&;bXr#$gcs%oN}cb z<%}v{4}`7jcG5G1)f!-Voj?Lbc}r!S2SPc(EDwaCP(gkaef9#7zDE?GZDKHGnY6>e$s={E{wzUU_Z!gFvGzj$>yoR zw;;ND+v@Nfs;1WM>jv%mo)T@g^`nLT_zX)v7~$;TW-V;LA3KUG5XMR+s^}nLBZ*=u zW}7mW!FC@|rVlD2#FnaIo|I&d!~@N!@LL560=)GP zq?15sZqEm9((~M`j?yhdQ7Y)t1BMC$N>jx?E(p+KkEnhvjvojzNfqSOTC4_4D(KOn z;6sBTvO$I(_^JoY1|h@-A)Xs#?mKv0{lEwep!q3y-_> zU_WT17-6{4SjJ+6#bG7LbOnW@c+qaS9SHnXRsV3WjZRfk`xc1Lf=WDdwc{RLFw7M& z+||{NV!4ri_tNkwEZypo(Y%Mw`bRcpg|e(~1gKL&04*f>h871SKj64wthv zyPQEx46r2>>Qc=Qd1w1LY7)x8Xq9U|Md_K_VNp(18tt!@9kY0~vPYlc@Nk zgZ0^?>9WV-6!YjH*aa-NDY{_yoZ~78%&iTU4T8r8#oH_F>4hmTOU2(FWZ9-@rA4i+ z+-sR47PgC!kuf;5T7zStXZ%2Qs_Lt8NG}`nVW)BTBej$_%EWd&DoGF1N)2SWDCgh) zVfwGUl3K>=5eTiMn42Ff0V-TzGZ~`p4iQD5kXK0tP? z+rmL{|Ee>?l37%p8N3^o*2GAHz+SFllNz6QjVgj>agRJxEY>*jJGzxvkhL#)TH&P-n z3(shV{_zxu?@>_Va4?Pyx_To?RD>44Ghvqm-YiewNBaP4iN}Bz>JXH*LdwjlK5APu9rz&hqp)>b z72WXG&1yWzc3a1UySgWm&pyuE;T7P&{=|L{jgqx;_YS)FD5w$xEoF-V*EZQQ+tv?} zTzT8KSg)D%pvMNSS{a=;i?YgE)`Zxg5?mT(=Lk|5Ah=;)Jr5Xc&>s)1Z3P|_1eprT zF=$IF$iGK4kQlV3`$-Ifldvk_Wb>H#9!oKV$eU3@Kb!y#8+4q4C>v}zq`?LqJzQ?E z4I2c3-V|37vp^udW+6k{nDdLv1}g>4STX*)CEzTc*k(~-d5EMAy^=Jl5 zyjc`@h-?u2-K~y&rYuk^DVKB<-%$*jvmPDq>+%mt~obK6%8rU5$J|8HE@f zCL2`)o-fs@YCJ(nMc88bEQ-Dg>)RtK{k}9P9c|vhW8W5TLlIT$iewQL*e}{~r6-L^ zn@KRqrlh>{n?>6_IyeY6SPPGO^baBf)8t+tjRb-b?56QR068THn7li*tVh1eY}FqX z1Zc5G6u@UhV5QoSQ`_hSmHakQhCKMk8PB64Y%pb;sAftETsGKPDvBI`Qg@0X__JR- z1HiFCr~4)wtOku|gJ>(UUGeufqBFl7ql~h_#Lc44+_9^?=(tN+on9Dj8>Nan7JUNj zHV-f{6w2#r@i7^Uo*5*lfu#p+canr!s*+MpN1GZK5n2RHdV)U^g}>WWdm{pTq`zUd`QNacN2yHV9tQ z%yTb|4XW0^L7(=kgJ69xd*q5UvTBRwB?H3h$ts1q-oKy9k9%M*iI6aui zw0XqXATU2Wf$k?GELH%6A%OspvM;m{WqBY#ASGDOgpwoIKB*u;=y5?MQ9%{xLe03` zKyerAxp|2i_%Ps07A7$WUF=g9$7;f;RWsGBU;- z3YIWPVXhy6EmCyxL3t;PhSDgr#FbG@D@$+k8)fPizH9A~)JU}|u8~IDB*q{JCBsk0 z`A>`W2Z;m(xDH13BvNrLrlf{U+$vjT{Zh<+(SWvuszBF*?#Z_XQf4tNJ?MOlze@%Z z7B1gk6?MB;Kgu$|n*KpNZV8b<;CWymu4-h0JP>#)n6Nt(xCfBBP(dd95!)lmccgaS zEi@|A6N3zG;M}oIbAf)N9?cT>BofFCS|zqufoI{2OE;t0^k-0Pu!;4po?1sn3pVJL z0N2e%#y!xinXS#+t=P??%*sKK=b~wg?jaM{L5UD*j*N%)2?nLpSm13>t*@gdj}NyM z-cJxa=_NYR(rp_NKADj*cywNJV#B_kwG(X(;s6~C8lIH+HX4ko;t-}Z30QO|lYT4@ zV5$}OPhz8vBGJ|CS1k?6gXBa?H5f{r301@qutNV zsRVPX6&v)O88yP%L_ydE667)PVB!wTA zh`&EZWP{)crfd^s9)v^amK#iAgE*FKkV)CK{*ejs`9q@+J3TsRcR}B(VWv81v#6J@ z1PE>x4Gf)CSU2)CSOpMF4@yLlVX&NaPC~`fgUO^z>Sq6%MT=t0(j+ zNDP#MwjMy$SM@+J92;r7Oyf$5e}_5@62p+vSpgcsqcyci?{4g-sHD?-<&u&lyP@U# zMH5U)WYW?j>31{?b2$kE*>`$SWP?6z$wp!{h5l8IRMQ>>q3T-#2?U1+a=L0h8RUTg zq1~a(J7ZwjR1koDk7)YKW1yrZQv8jkVkr|9-6mT3(~=Ep_Q7yA5ZIu^u9Ddxi~$>D zS#;`;OqibN5^qA2*r5F#Aj}49tBOk@+9Ou_UVlW%PyT1A|$kq8-38YP&v&zWHRvqQ|hNaPe6hYA{DrE2TpooyF?7lmpA*^uxTi50Bv_ z>R24lpenhLtxr4N>|d%7b+$fomDrH6$QwvKwk1B3h}868BkUL(T6%CHss+72Sg>&6 z{Do97GCBeiMsQRu98oZ$(vl(RlIO@g6N6>+xafwgn;Q-T2T zlpqX(3Wnbt<5EEg?Ga_DLimY6u=q@n($u|mtc%-3mEj%$q&zfO4FwE~4LW+pj16)e z#(m_^XM=7l?&RaIG@lJ}l*ZEK_QDa9mmjN57jSH_l6AlFY>i=q>>Qc$!s)`9pg6sh z7F&O4OV1Xc^k8P586gZLhck9)83_%D@VuU9;$tnw@#Rz%TaiX@#cTDV{m7B z2%Co3jXxzI3arT?0Dis+1olM1k1YEFiWbOi- zzi`6H$OOW~i6hI7Q2D}z3l|XPE}%~^LE&w34v0O!u1G-=Z4BsWDjGBPqcS{BZqKY#AO=EAb03nz^@V(E_#hO?BT z3dHSN$Q2mDieiNX`4A6uS*0sw@Ic;GBPEEE56V+oHf)s@glc1?+klUcc`6u;#g)`G zLw9OoaDdxHq5DIFizgezBsN%%o8Td!&}6K{dD+$#DH; z9~}ga4NChtkv$tQ$AL#>T`j`N#J`cjTW2Mr6fQYEXh~s83+(R#k8Sy9KNw3}8H*Of z-0n5lRW$C_NTPmk@*Sh7Lp zMKUJMK-OH<&{5_07j12I71LA~Ab$tM)Y;THhmSquoa(?a-k4xGY6zHc^+NGJR9}!1 zq=U2(@gS)vBV#-wdfWoENCnjLFf1tN-vOxN$_GUvhyD!MU@@Rk?cD1wv)dsC=ivXy zWL&4>uiwxQl;e_H=nPU{GlqS&SJppXtxQfU>+yj~yM^3BLbYdu8q{PGz?^^0!-5mG ze*{z-rs8KOEQvJDCT~Q)ksBt)l7Uc0;pL)|*LU#xA;Po@s%6&N(|*GY>=mL z2r(!5gQRyt4Lv&O4}#s+D+FP)D0_U0n?j|t54R>gRhXtwqSL(k)GS>4^k57zC5es= z2>o4wGc<-jghPqrRZ>yLU@?#<%1kJ^v@LTU3S zl%I*junc|HlSRmr5U8j5juj92?{Y)9;DLqQPf_Eal8A5LIgXCW=S&B$;WAuHIy13^90GQey597K1(x#>KuL(rZ^0#v)7<2bsLxAq9MS z8;JxAY6%XQZ}&4tY}>(4x^mT~4MCdJ!ro79v71H7;%|QQn^R6XWzL*An{Bq)v}w~8 zELd>nnP*;c#T5@f{P69!-|onhl3w_`5W{{XrU!cpfqmpgE~?_5NYAgm`igt+xohgi zn>6wYetZ43Gw-`+wbj>n^pU?inj0}bEl|t&F|z(>Jc7tHMUz0H&uUOP3QIxLA`=7~ zAs{m4wiC>c0hGcXOOUDH0G}8H;I@gDtk`dhzK71BrEC+`?1*85AUnqYyhLH1W7pPr zY7*XjuVn1W?8XLxV}szKc`u7QzoDVC)bR_W^Z{&D;IAJP+JaAv>q3SN0tm6+85u1w@U=NE1LMU8OIojuz#;vTz>+=1DsQi6 zoMG&rKILM$F&vp88*=#A$O0S@uD{n`e?8>}4?g(d7ryX?b>UW9ZFSyx=S`nJeWjIF z@|#Q;8CkdhNh1sb#gRL%z~FCW-|-5QFZH7aT2sF)H2>p?-V%ryy2vjzb`GK8gzzG;IM zV8i9u{g!?ntlYusSz@AjDKY4=LFC2>xox5j#R6-%KxTsg0_$$e22nAD0XQ~jx&(c) zK|>GtnN^TR&uZthL6G>rq{_Amp%=+i2NZjNaBL7*HVF3J7ZAP}1^gK{_-4^adJuwT zafTzG^qCQm>S78~ZM3Xz=R`)vfH1~!;h14Dec-Sw204xXt6%(&!@^iC$Asmvq#hYP z45M#D9WQ15BUKN^&Hzpw^A}E-Fu^Z=;)y4&yzdl|6=pWQ=3V^{+mRV+*cka7CeYohS7Z5G1lJ zYppP4?G=yx%*UUZ^Kaj)+itz(9dCL4l(kkQv6pW(_2QrXm{P6?eh#EpbmMQXfBW9A zU2m-wU$W*3n{2T9m%sSwIdkW@4+>fg%I6|To4+r*>Jh0%1^NY^86MX z_JJbVkl!Cu&M6Acm&Sc>7&ge=f|-@46#AxeLR-2;jlrJ*&vtLPGo~VpRg&h z784dy_(d}47gklCBUJ?h6sQ`*`CWM%K{gohBbu^Xgzu6`;i8f1xQ1@%N>4KuYb?pJ zYF`+$fl(c5GKL2Qi_^%bQx3&^8VUrLRGL^H7)rmC^Dk2sYwDu~?^?hU!WlDWY_iEF zYpu1GS-9egE585z??0%(KKtzBw<1Ca^Am?XKAI!SKtK+81_*4!Ew|cs^DSO>>+fgW za`R0!)%?X}KO=tl#y#Hryyc%?E7Z9BvWs5->X%=2;8f&gagEixKzkS!+-gxf! z&MdjkLOku16OTA#znS;lv)ppaQ4;d(Gf(-%M~)=YY`S>)r9XS~9PX#aQ2Dx0aRjP=SdjS?1kSSw|FcWmFg!hz#fb9@Zf_FuCvZMPT|Cf z6Q>kdZMD^&G!kqzdfZZY(P#&Zu%#9KLzn&u4A23Q+E?xNI{NVQOMhClRgXRP*d-VJ zWVO}T*tIA(P2F?%ouB&nhseqYkN)^=cRh5&j63PS^qES&b>jd1^?|>T8+YG*=gHst z8cBcbzdlQ~H{E*Ajkn&j>Z+?({H;fmNY8(N{KJzbP5Rz>7hZJvHRt{KvY%Xh#pKD8 zso~vs-J$GzM04lP{o(oNkcq>N`0y3i&G`0N=ic;(dp>>aaibGP6R2RFO6^Dm!6ymk zxU*CcSSo067>>qZqZ5Ej3`*~hske!O?`Oli(9fA#`8_=r3KCu+W0BI(&r5*t3K_$z z#f1%WG=*Vy1zqGU*T}#>C+Hr~{XciX1QC^#DHH_`Yyx*>EvBefs zr%sh>|L})DOrJg-5=^)7!xJ6Bn*O0r|Kgd$3aA-NZHF>}E3CNUb=Um*uMa#xb^3KO zuYLWV>%4ef9jd4*;{Wv(znC@ai7mI<=D>rGnmlPTRnmX=ec!=T*5B~aNB(}x%{P+F zwO3zB*+r6h&wCHj$<|e0v>K5^{aJf>Wua$}H@$VoU0$u7*l_B`)3)4-8s7P*KRV&j z=;(xHi?_bseDjTu{QY67oiH+Cv(2{9uYy(FgMtPXRKf^AA{9il+_Yh&^=uu?dqe|! zMAH+4Jd?3`fO7WG>QDT$j(%d$4NNuHwG1#14Fbnv{G6D@VH$dDe6Rhtc*|I`L15V+ z$O8xl8}!$kN`9>6j|a~4q=s4`;k2E4W=}iUbE+2?y1}fjk&$w5 zqm6UVJ@nkH7{^sKn5{GC8i@92cLzWrU7 zUi6b+T=uigHs690eU#suw#8Pi)=I}6(=A`Nja#_! zrUpeQ8*j12R@dHe+qvhQb=oN>-gfIP`~JsX@7(u&U;Og%6DLlzvmH9<V&qu?e@J)E3Kn90J zI#7#2YBVn-0XV7_%wq`QbI(0TDK5$rzW(*EUwP$~>vBpMo`3%NuYK)nU+{t#_^oFMx-G{BYu`+}wtM^wMLYcT{32z8 zk{{^mw-=1-uTspfSvI3BISh4wLiYkJjml|TYi8MCfN8Y&oeA_E3qfXkrVOx*T=s;m z<`78_CY>#ZbIrstx0sPJP~@$E85tQV82evM>=&aW3+BxCi>V`Te)F6E@sEFe^PAt? zc;k(yPMu06lo*^jbLJb~@P_TS+m2PXkc37jNT%AJNJqfj`B`oL)G>YY+koObfDr7B zqh{SoE3N$M-Cjqm_u8wk)UT7Ne&4TGTZ`_r%WlN+Naj0doZL&KBFuT_nX}J4`8d%wK=lArwOyafy9 zYg>Q+`@<)E^-E7b{j}48xpU`CzwWBJbLT=4*ljj#%T->``{|G8o_(&~9m+@Kh3_bi zLu`X+Q^CGD211VuD*gusp^o+?T7{hwgGQ-Clo!76g|B(dYd-LS53IZHy7%03 z&%O8FO9{iHk3L#rgQTR#NsM2m?{gMLlt=s!(&(Sani>_a-(&9;R$P%jZ1?h4uC?~s ztnlX3w*2r%|C>Ji-Lzuzkg(M@+Z}$?F(mWxj~uo6)U{u^%_duIy59C%zx2i% zrd$0fJSXP)&98rDvyIl;dyiMYYoEP#+iB}ZANl*Hn@yXx<;#SyNu+|!I1GRa1|Ju6 zsf(%7a>mx`y#S_`gy0WL)Dds;`(wDbiCW|eJmM!kG$_16#%7<6wh$ZSI5xMb6<|!+ zpk3{1bA0309>WH?&7v$D1c?p$cLW@Bw$q`_qB3E!tZ;W&AW)_P&m=Z7l2<{=q?j;9 zHRDRs$!beGN&aVKWMpJyWGn*U2s)?W=({%x?~)LnMnoeJK%&%2FnoOSaa2PL+A$YCG2 z;HQ^wv+XO0r~Uomhp6W5@7VX!UryicHLurllP6C){+p*Ac0})2C7zr;n_M~Zq%#jc z@@P|+8c`qm$S1z_?Xx%BXya#|d4}{*8j$pS=_}t@e);DqJIW?KJMH{x$_n0k%ZwYQ zUo&~~a)%xH;q!m;^B2DGMUIPAk3}ljjKhGbAV8hKLB?)F1(CB@REdc}mkI($1)+Qu ztgTa}y*~zk`R#KjF)07;ygy1-E(S=6=!*?<%VGg<0Jyk_h0Q5A?KhadXI% z#yUv9Z^mY3yedNg_zVxQyV@)&$k|0pGq3@4pL;}I0t4XZf@C&mbXIUud}t8mRG3Aw z7@s}*328qs0TvsyOU#z+!)X2F2K~Y0)?xx1482yA8$(y^|gn}Dgq~p<)^PYUf2f(E465=ZQ?Cui#JXDlZVoYSI0mZsWXoY zma81x;MnO%o0rD`FwCkRUaKRfp{Cd14dRHrNK8+2A5at3k+YFe4))V~{|AMR!_d$=>+FA|0Q_0=WFddHC%LX~LT_>Y~$imP5dHj=aW|79WBv6#A1M5C{AV^eDzdMu<{cE*6 z6=cIoZ~J0d9HfFE{~(^H+@pdZ1gwF?pfljeWmIh+>gK=^1($-@Oj0Hi`c4o}RwHcC ze`t^~!Lq@IW}|1+)V9djAf&ND2(Ur$Jy+6;WSoJmzt}yMC$V;FkiRow3t;^G(;_|C z`I3du8AGF#DGWR#BcsMRIWkx`7KLxcsi}{1+mNA{*QyOl?a+Fi&%PNl7A!w;&eQWI z&YwSN(xk*DbLY;Tj|&z)e;L35Ml>ZxYdyfwzck%ww>20b^i2Yd#Dx?`R;oJl!162; z{22+b$H=MT%wgNCAO!b_2B{!4kGCmCLyKRPaJthXF<7u)1sxKD5dWn?ZQW|?j&@^) zp~@l~Y#cMSStiC28w7z3dX3AL@lmzPo3>0jO7gDdwBMOvbP9hiNdhtXYWP`TVK&>HW3iNa3XZkJPW8xuj zHzVHxKwGJU~wIkt7x2uqv5q6-6rWD*#V ztQ6KVUQf7m;D~W8d*aFEhd5Ew>Y6O-eZ3W2AcQxmjj|8H)>+j-Yfg!{AeJd7Aq~`T(NXyz?Xsi+T=o zRV*GWZbVV45EkP61-Rh31#15Mg>!rF`y3$>NL9;@z~}@_qk{ePceGSsY3qT_{y`+> zX~h76A%Orv9>{spjt2sSwuS^4yVkk}w+qGEg+u6r%mpi5uN%49ak&Y+*QcG#fP7rQmj2K8)%Z;5eL zTa@ToaILxgusfJsGlMQq$MGL{x}I~+P3*s`H~L@p{U zJ|nL>JSw@EuPYUN7-U$TLpDP1YAXD+OjvPUOO$V91Sd|=qd{@L@gop!n_=uz81-Ux zFKiWIQ%8g(1_;oS1Oo5Uz=Qn!g#tjwAMR5G)&y8_Tj(4q z%;1!@A{+Ea13AqaGF=L?!O&(=-+!*w)@TYuPkT|qXsZsKc_J;lVle5!Hf%7b2bWUx z5!5U#7)C5LjxoFyVV_Hfz3jTqSXMn^Ur41qI*9T+RlNd# zT}8FWnN>{HqTptoFMAmoB^J#Z8o1R#DO@@aDZAH;KbP*}{GfX6>siX~P4E~@|E0q- zcG!;LVU0S1t<7<>FSs)%UXDt93Ecbo=~0yPLw4c4RwlaxCKN@j4fOtv} z*xjLJEG|$%0B*BoC2fYNrdFyInh*5R!7jv1g->9i3R9xB zT~($VkJO1UHKqtq#}48O0@Lz`Y%#1=5EZ?ANylv7!%qc zS#dg5?$hCv=4rFQOZCI~gLcJTqjD<@CkaP^xn<5qilR@Y!c+zbHVO3OUGtMD>1wOq z6VnF|gpMgeP#lGnsGvbk1VfIl7!^$UNeOW23Yby8GhLNh&m5#ZF$gTJ>ivI^+eBHi z)Eg%3^g>b8)9AQuv0`-E#@Jvz(Pnc606ZInG0P1CbI7|Ey(3YE3cW~1Fyz&GE|#C7 ztft+ggTZRaK;M_+fp9ZyQ3?ZbJ7Xz_>MwVZm*BWZyU9(TP?h$E#=)(SMw41B5^iI1 zY_xwHP&?MDLeDyedf3k#CAaNw4d{SyQLm+r4tQgqu4h!($`~-^1Xf(w%e7+DfY6Zy zLPd@NhRXw?ZA!2)D#!Q8+p@J)oTm#F1V5^F`p8m2a43+ehYU$s000mGNklnsWYpo%e9I!hWr3X4-I-V&MY+Mg`zFlplc-XPSO6@pkcz%5T;?sm-~mL zOu9P1NCskTP~UKkBK^{uE@}BtHx{)D(PuBe*EOc&eZ!$Rj}u=yp(resQmWlc60#!DOZa8>RX71M?viEP=EvSd9xcOsjg3UL#Jn&4tA;zThIZKG$G99R zxz-uawWS3F#E#15G*#c-i(KAJi9@58jszoY9l_#-P9wzp6k+`_OF}kq!OuY_&1ZN` zA??)nsb8L_>utWsf~=gOst5Oi`1KjC0z{>h5aOLqvQblxG^LGC--?{di13|LG`gF= zOk%pNRiEfObqXS%eGBNCs=&d&{ z4odBKm^Th#Ss-?lv5+cfEK4$J#NjLzEcB@F0%(KGI>nG-s#g5IvY>Aim)VkuYE;wK za*@-YZ}9shlgS9~I`AuJl;v_|8^sc)ly0K>V+q>|aL{$M5D7Z15==)sDtb)C8TXi#|-D6#Fyn z%9uaGk^3(M{nX$y(-M{q|LdO(Fjueb?s=r6NM@%{$*ucaUog4c1d_S@z6;sQdXfO; zW|CRB-*To8_E4{t&y#3l-A8zlZz2x0Q4S2*|Qw(Y%ih!IH6adh&q5mE@ zc*zCiYim#aQm0wy(XJ+vHb5_P-5}Bc7(^$*z6-G5mw1`47Aa45^`)dxT3}X7M&^l*Cm_HIFHj$nCMW|4fuM8N`&6dn23XIdG!$ zaD$7AK;p_tB-F99E%yJ;!6H%;q^<3Cg2|vI@Kk`2Xr0bKCBK#s`;Nr=@8<<%WtT(E z-B*!F=~KCWpSVd9>m2Kz81ZNW?ao7jy4$k<@7D%|u&{h1oe6S zrda*4>^~OmLuP##{m(PjvW;8bGWOG;`I7M_yA_Bcg9#RS3uAbpcqCNrZ3VVNjxuca ztZMR@`O5**_x`b$=)L-GL3h?ix1Lm&=yeM^$HBQ)kUSQ@6#yausO&h=jd1l{WTNe^ z!r@MD#?Zn~rmpeU!20EOR#A)!!8-iY=YZF4Fy6;}YB$}!}-F7Z{KaCpH z4E8M1mqz{_{n+kBhui+o79{97K4Vj)_Qp1e-cOF?=f}P7=WP_3(8~vM90J}=T zY<;~RUHtNGT-Tu;llRXhn8F`_NOH=uuPXF{?VDWE(24*28GL>5 zV??tmBW;*)?s*boVI-T1L$s4O$a_LY6lEnJ+AP0l-PdXH;bv)tHH= z$GvxqMT&j3W0yTQ@x_^^h*N+v6kLyXoFWwI@!YdsE+wbSwTMsi;Q5CM8QR57?%Vz; z5m33Id6FFI>v*28qSQGou2@Z_3;E*pc4FW&_{j|=r3_hR5K+K>w+o<$)E{JeKC6O9 z9OjFpx~;otrYfBg4vWW79^k+#{`Ns~f;&-HTP^sQ8UMUcDLDB^_b>Y;mWMg0<+^O9 zspm3ZqFU5(Uti^QJxp~lnT6a7J>8l0x=U4*<^4P;^nL}rD;HB@$O2ow;D#mQX~Q*^ z2JK#Rr78Fe`3~g$p~G*bkw$l#A8Ak{Y(V)l{G_V0Lsj7l-OQ6Fdm0yn+L(jdKgT4R zXTJxYDPOcj-EqaL$jV)>OckpWsIJg}2S0odEKJ^;_aC*d*@m(6v>ifR__ zlP0#F^R!*#x}=y>FCy3B)Hu7>%{bS`U6s$>pnQ=OHU0a9TSwk9Oc^b2J_oS40&_IS zsk6tLozL@TDSG=ClXH73(0FCfwf7MJ9mAy-?`Sc1;p7b zCf2-P&W0zw?w3Q%qY4e{=QU=Hcbg3+6s~k^Dhdu#AdWx5*OT+OpZ*?9?U?o_VX2Xo zXLo4+cz-D|@EEzRF_qeIRt%6VB>VtidfmwmEK2lUat4MX?9*#z%$e;uxD(|hb0Gw4 z3HjUj`xudLdp~yYH?y6HeK?m*(Z9wF92|kQ+yf9ag?p}xzUNu}F35UV+wF|(8%=M+>- zW*;C4m;iwG3(rBim}c^Uz=gZB-b>ZTbCo*WRJ{wp;VOK+J(_J?wdZS}OsI@WJjugJ zVoW8M3vvKvN91uxg4X)5;c0M_x~K$uHP-pM#}uvHf}t{YS*qDC<3mxIOVp5CMp81P zt92BBM5e9YkzkSGf_0QX6kA#3y!orLh+}bv;==2~lZLAKdW3G)<*DVQa<)~y^D>CZ z66y3IB6U{XI{=Y0yGPOMSoMy3P9dHgk`Nw?zW7DLi%M+egRZg(EEp`}o+X_*k@j>r z24wKr`n;&T)BmyF{R|l~5{8`)17k)_8K&c?Fzpype zwCl6>6m;s#U*|xT?%3n=e&E9^;)>YfrO?eH%eF)tuH@n@A;QdHuVcN77F6338##lB z05^B2Rt#Oy46rCPxe7--r0?Gz*4=E}Rr;e#85aeAW(^Zn0A2U%vE{K60y4J14h%IB zbFvi!8`9O$oPZ(k$uho9K35Q_Zvl%3t#|$=i;j?5~?{_rUeMEH>_rOs-Bc7T800zL0Pw%z3W z*kjHwO$sJnP+9BrTcu+`pTIJHPN>&05je>W_}q) zx-mfLu^SoiR=*OBpEf_QJe60yt%=GTEF?Kw15-=bGdD>Ip1Xh>_o)z@s|HJ~OXZc{~pL#Id{??KgJqn$Li<-ZF|D(>F`uCi&8$&%_4nil8nY|1LnD`9a}d z*n0}_kLu))S^Gy;*!%m~ed%qCuL_vF!dMw*GKVpKs(x{>Hx+YKWrdU1$UqxGn#LVm z!z~s;7oXjYlxw$&9q5}R6ti{zDJEZNC3#ycQ+pvMB=#9yipbL6ImZWK2J~}XczR;P zi;BgG3#47Or6Qh@E?N)WvQWs+R+aHE^I^w-g6M(E>YZpl6}WR?6L6uDw0NN9{S7y0 zbU$krS2S*jj0*?LV$eU~L!F9vkVk96cI(oyg7ZC%0)+K5idZc0< zFze#S&MUEu9i}}jGK@)Pw*I;bo!LsEjGg-7?i9G$>RdkC}=8)xLhQwQk^z5YQC z>zRg*cZ*a3i^ZWu&Z+n}7C@%VXMNYu*dE0z8YXoN9SV zn$@^xwy?Kt?9Spr4UZ5DQtBBFF{2vMe8^qK**`jIg#kQo^W`3V#m%5qY@vwpSu4<1 z7fxB(w#XGII=u!@Bbw=-GWUmsyP=LETB0M&4N~36*@R zIE|o;H7eB{#a~l-3YVD87DT0($#2vX_)Pb^`({$;BR@fbcPEnVyyb*ZehElNnORwD zPHRR*l$`*g)CmtP$ESZA(%ccXc`Da+KZMn@ufo^MZW&I{Z<4SgX&kT)9r zsq|`l9>);HSFw;757~Tkue!)XjlLvJeQBawPUV)69JdIGLDN}zt^&qIFEt z6q=xZz;E)A3*)KOlD#j*gM{%Q54i+yq!nca&uCCzQx4`cCdj^%IodI}Zt&>@_`76u z<%ke_z={QQx~av;3A{U7qNMm9lS}Y-Poe~;gyhAVr^Ap`D7xO0+}mLFSs!lAd-}ea zR7178B~lhBxE_6q55qyGiaMO$C2osf{uZhaH6d=(>aj!pN&HBh_X9%WpLa4V`-C#? zm#U&b5)RVd8a4k^bH`u%h%qs5%y(K1ULY3wGVStF3fRD_0sJr|YF4X1lRpc-qWzvy@oFmglPTkhq)1e zY4my9f)<*(K+LI(%QARbS)`Vg?!f@z2Uew?a9bYVp^Zg?xaxa99W^dUFUWwEk(Oy- z-j9J3$@Z+$Dk7HCS8@`wKMFj1i5?eNkfw>b1?~knafRC0D%_O@C!(O#3}6g$@$4Bo zu$X8TvpvsAF^RKzL1jdRxyUNvRU2@h>4Vmo#ae`uV84dNlP7{q^W9RX&ZUhz@5&b* z1r(|)iND5z)biD(X3(S1|Car>vuga$_Xyybm=+<7~TP;p1p0r6NXluwf^!T%iKJw>aaEc?_tjZW6gsnqXD z!I!BhMqaH~lj;pr8KeXU_UY#m<+o(z_P3@?GOU?7`uK!k?-s>QvqYrb%YW|_%GC*R zRidyT*3zU=f1Na#SJHR>H#((;!PmnrQp{3-h&ew-^`Qjna!ysTB#G)|a(s+cH()(ir>PRh zXoFzqJ(nc>sW(zY?7|5CLUMEnhn_k|T)H#yZ2bSjc@Z=%6tHXqIO~Naf6Q>CF~ORU zLC_?-6)1T}NKE8}pME{>MFAw|4>k0I|rI3n&2uKUhmlLXL^ z9<_0?fvGF$1!X1g)I&M*S*7N?j~uL&;s$r>f6%huI60VmLpZX|nRq@a#V<9#mMCYY z!w*?5!e}}~|K~(gLuY691K2^#m3=5gc2BVkhMWZ?l~~TWWQjaX(9^N!YvYms!e_F5 zHZqpMf3h@8tunNBUO+Rj9wu~%>u|#{AaHt&gZ<~sp&_jw+0vm;mRgh{CgAdgQ1_R5 z!&l{MBz5^gdFdmC17t?{-JGB2lx&<*+oIE&g;h zdiy^}ot)9MXc_{mu6T3cAIs5Q=8yAVZBFd}__2Q-Oyat7-5IP%UJyv0XYRP99RZB& zPfyT#R@ncbd7*xmDR_Upjbe*}lpLra?TLSs8vPHL_}j1>jKj#k zZ*omO=YCSMvau2?`Bj0Tr zi#H{sZ5trk{qH3(KiS-(b-Zy8SvXHvx|vHi1x$bbu{_x%6xol^V0Bs^PVD*tH0UJj z+VlL^+5or?0rgvh;V;ymOKpu3-+1KS=b=Af#V#1~5C-dftb17ZRx+ASZ{~&qi!xK| z0S_M?2{flNlXRL>{?~)f!^dL$(gZx2=L_IoJes@15ZX&ENlMv`Ed`B=Gd-Xx3<@0* zm=VaSv(jE}Uk~;Hn3ka7HK+IgmOU~O0g;0>S5gWq+BcP-MM5wGEBX0@gGynExuWBT z&Tn{>%gYPZHhr}b?s8O-$<8%r^RAgY~t9xzdTja%H4{hwP#C3591k;ayW z>w7`v3a05-BS8BDVle+SZ(P+^+aSt<__!hru)OuLAU!p)auKoG$Uw1``e` zt7Ii5=3zgqgYd1m86Au55@O7yTxV(|(@5y0s{2aRHDxx0lStgFqJp2R^=%RNvd3d8 zBKkA7;hL-?KzCuQ3tYbL81475oZoRHcioH{V`{XE6lUyIozzv$(-wM5KQ+cs?kbtR zxs^SZ(pe)nv1-47t_tr|pV~1|8Maz`6hyq9ze12xuJO26E$qgasp0C|U3T_J;r`Otu0k@L5i`>!zA`2gV+c$5yfdFpT=2NQ&W8iO5$c1>;MajHb{8r=Sq(!L>+&oES|9D=l zFG_wUnPWpK7UEXGraf5a!XsUsYdDlI+KITKXk)!A%N(G>;|$0&<^0L=#c`Mr)Lmb`hq<87rFt#d%_MTkW5}a<6Su&YLS(`ZR1zv$I z>L0`iYKETU5Bo)w$KUd2YR>Nkm*6JGwqgnhriO1>yS)&qk;y@p93qk-9Bm74bOoez zpkF2#tZd!3G&e|>1a3*S*x#Va%3rsqP{a*Lp4+L**6Ks{JEP4di$f97`Sd$PCHd9x zB8g3YZ|k9*L@@qPEUIzF&4)h|%CQTDNJT)=d&)N8fDK$B3amy3-}gIw$pgdYmq#Y2 zJv@@SDHd~*t1E^}S9s3xXWXfl%45K!Z}si5HbM{3`nBV?knP0#l%y=*;t87YD$;5; zR50R(**x6isBFOROsqw>MPJ(Wb~z0r2BL6SAeL^gBd`(IV_0{lvAR%d0gEZfrV4GC%6iP75j@W{WB~E@iJXY>)0Tj8Bt~=1Lu8~JzP=z1(q<9xTefR!6vrkwQ4j)B)TZ~ z_LEAXkNe;gpz%~_eYM7-CsLD1RnZ zR*dMR;_*$m!9J%m2fXH|-rPn6h>V32@@jR~Hrh2*$2sWY>>m_JQ2~&cdL=Zr%r0rg z*F+Z>LDkYBs;abGfOuk1>D7E z?o}|lv^DD4ofO4|TBh5o@hzMkE`O_ubzDqbM=DBe!>Ns%j z)co>qEI@u)fn^Z>LyOYitKOM#td_pUW+oEm6kPUcFqLIgp-P3wE0K^A!n4Kim(%iD z*EU2^>CN=+eXd&0?kpHLm2e)Bc|@WVoS(qrJX+TRjZ{FsFOT=Ea;2~z3TKcPx{xe; z7$_?=M_mMp}DQ@o$rJ$DsI>y6ZGW5wCN)0p>XNXk!lspofBh~NO7Y8^N zp)b~=-}XH0U#!M!a^`gcN2<*xnaE#YLC@jNYa%O#xBQ)@Fpc3=q>;Wss~uWyuR);{ z)93R#z`E`PHZ*D^9dK&NqQ1`B`eL=TU$SSv)ZjX{Ao!_fJvqo}^%N%^-6f@5vDJZ& zzNrbP^O2>F?=>_eQ-($cHWzyDmki-oc1FLqUJaz3){RyIX=-V9*E3<5!E`+8Z4Me` zZ=;I$12?qIHc`ym&WcTC%gqE|p<<_N03sKJw7Wz4nY)|3?72j(e|U*sxCu;et|CXz z_01ffZEWk|BCEVuoK()Xrm2c?tS;1oQs`%+0FA{+#&4OIoCLq;$XZ7glrb^mZxIs_ z8`@G5L2Q++HISEpUQ(1Pp$jBKNY==*q-|3pzZD6E1c}IzZ#~=2RB2KtV?`^6P``ILih{)eC_NUiGs86EP}D<;ehXnwX`Ud!8QT@z9Yo)ndBZD%ala@cgM8 z?ub74Qnxcl23EA;+mQBFjFfgodC~g_VwGPkMuw1Nm`vy&k0=)q{dN3Mesmb= z7|8ou!RJG=TbBbpgS{G&vao_!t|$=Ls_@?%c;TRvCokxG1`NbVIynGX??G}GH1~0H zHK>gp&Z6c@rrB(uJaT;QF8L`-Z@fDt)c>g|+d>&O2HseGwAb4`l4~qU=ZJk9-zAN% zqvjD!3xooLoS*%$^e#i)sw#H6H_kb}SYLo{k?oR-`V;J+cLAp~J_43q%M7~;_yZu6 z0Y2M7Z*BPeX93n|Z$u~$QTUq@vLr?PUCs^yFJ(Lw=aU)Edp*tER5)Uys=50~Xrq4S zQj34W-ODy|$#o{VTmvp`$}!$I%a*=Ugy*9Wye?f#g9T$ts|8H1eozNxC2cA3!rpi1 z&x$znf@DQ&w*!n!LL3Y0dBcr;kd2X!xbSc?zMr0hQNJhb1a&0mMN!>*IQB5#Zm{nV z1tg>G6-iH_iN#qMDcH%QW-5B*cF3 z6We>2^PjBob?dsE{n`bu;XAuImy1)j)bc~q3xDgHcR*L~#3RC6_vvT9@8rfMr`ZO~ zQh+T~W5YqFRFunrPorAfJSk!K{)|gu*GZgHQ&DDlB_E|p013uqCibXrNBxvv6}lAz7fz9>1$l(}0brOnwwJn_@ir7#B! zp(VYuvwcq!SoGwIxGxcVev8#yIiYOxs-jwWtDoOpH;t-DsEP$pT3N2%S={6#` zBEoZ?k(!4=@ZA*gD(Y}B86^>)eecg3xnF2f#rju@tm>J%WA~q)Cx8+n}f$wDR;6!(55$TD6 z9&HPuu@OjHc!BU=iJ6Sjj8c)nDu7kv!UP_|&R5&83fp5$n@0kVZRC^m0B)esjj*^f z$PYyfVP+&wcjE5>rZg52U;HOz5JuFhdDVg_<|tVX z!?fAMPhqOMFyRSh3T+$L3@tdDaCV`7OIT^AcwCQar7}MjG-Gt} zbwe?I^ZN81hrYU4Rtpr}uxS%TxFdVDI9FX74W9)?VJc^TTJ+CKuK+8w+?>tRukRG` z#%sPpr#t6A;-{tumzBq2a7BePUnUaJF-S>$cBuJsz82GXj`CU($?PxHJaB83m9zc$ z7LBgsgaL(!EkmneWB zKkU~y&WcemSu}UJPjOgQ{6lmD?z3o;^oI(%uexpkXpNO{k)jh?Xr>83%`|Ub#=zV1 z8^2$0CWIN*70Wp{qNgZ6cH&%hdT!oeRjWpoT_R2uhHSP`e|72x;X=}{j|$;@D+Gzu ztKueYUHu`a?bt_(QsUxo6w1p6V;C`m2L3=omgnFo+wdl8 zw%{5<7C1e7-3RKgjF6TfCZMm+icZrNi;T*%%pTm&ydX~h;GX!^-*zDVvuatjjz8DF zTs(>#EZ=z*{5V>jE_Zw+c(T0{E_YBz)_Z+bG@-~G%=SC6!!E(|2oA#tUS4uzrM*-d zTXoc=*N09!OV5y&MG@g^d*0Rv-#c^*$kzr{Nz^GWD@EthwN`vBO+OrG$xPZn&>7K4 zW>(u3HKLOP1d%8;2UoxSO$9}SU?nG+0MPsQfaGsE_p#NebEl;@a@jH@e!rUjqU;n}S1fMh+@H9Lvk%A>A@Lvl)s*^+i4hXvtXo|r7yaPQQG-4k zqpT;SP~l!zV2D4R3zO}+W*x~ggYGp6G+~F=kR5oYMKZfI+7;2BI;UFOxC@_~(@Wz# zuAIPUEN)$5JLE#1n?~543EP=y$w*9U<2;=we*Gk}Y`;5C<~nB0X{!@_@%?L%l70Yg zqwiHMo@lu&zvnw9;`cg6i!izoO)u5464kK+^zoR(6qCG>NR%b*WNyx{L6Ojh9`Iw= z^#r|Y3PXTccsIh1>k*2_0)9nFI!cC$`Ix+jfLIQCP<3b|2SK}!DUnr<<4SZgv>g0& zie|kK;gq$8H-WMj#WOeh{e&W<629=FlXBRo1UjdG?n5={Pt0g<{8kYw1@jH+OxKwk`GFT%x1oT+(+U* zi*+rmigzD(>_ldF@pwTjgl%&6KrL@?WlNkEWZJ3BM`Pkga^N-L<35%HCwcfLl~sFVqL~CIo;#-ky}1M#0`1(%SAizg zWQ-mP=Bp^hfYd;^nMzQh*#Y{`(WNu8>bfaq#u?F@CZ%wEyxYCJvC3q`PBS(8Xo9P< z8Fk9$p5jvKx1E9fPvGL48nF%WM>OZct&!SM&;C&2M#F^^!U82Bh)Hc)gZo9;%+ z*-Q|`)KGvdyGunxSgg4ihxY=tVwWsTWRUA)8&#i5=|0cPxVkC?N~9k6=!JMPueg9T z$9_XpI(7UDN~XUE>EX;$b6gw?On!xyX8GD1o{uU5Pw^Y&=VahE{9cI4hU^Aut8 zMKZDmUnh!0DGF$?&@Yw(TtT=nG8l|`{eo`{s@jeq%G3v+E=f%?n`#vKHJ;;?gSw{G zT#e<`H@R&#ZW2ae^ z5L?|`OZB(ANnTTbdAv|B5wdHPtNWSP88NYuw~}o{nQy%L`)ltS|(catbM{Lp-4zr4)Itg9HJ3` zz9=<@CBqQSAz|A!Qp$E!SNv6xAaIBVY6cbvCRQw};x;gZy3WDGauNH@bG5mm=!SvZ z?i#-?%&cY=XnaaWS-DF;is6#=a7^BGjBROAN=s8bu*F!Lb4*gYy;xM~itu4|R3yHk zxT5P=k}{Y#N6~#rMH_`;#JsbHoo2K3C|z=eV!0x@`K?>Hpy)&q=aZXnd;I8KoO&kM zk&iXFAfAKT+H*-*rKtzZqKDqSlC?Wsp_30XBUIIb=Id3_wlYsBKY5IiqhlFXzu`R7nQn`MCT$G2 z1f5m)fP(2JCgb>H<3_MCpN;x559JYe3%!rb%WJku%Dtvmb|d?reH9^eH;T00f>TY) zb3Cd^tGQ}<2%A2JUY7fQR=S7lzc~!DTs*3N$s2TvO7?iP)>u*1o~haO7-mKWA;z=9 zS{S$!&#>Qmte3uS8SchGvKl;gngX7-U9GzpU2*u$Dpgf2rs&lDM$sT0#g3wow3SRF ztuh8frbN^cjp4p1zO=c2+>NruUKai=0p?P%J-5}q8n*zC%uI8wr`^Ea zWCH)m7~5ft;1`c0if1v3RaIH&Q47JFBS82@sr#2jrUp@@%JD@ zt1nYcDNwx6zp^;{CeZ_PWm4de&BlfhPIep9X9;C^-;5zAweuJUQyy zaYUw;>Rm=QGD=OUTy~?m_d?>zIFhYXFvHvjh#%v`-7gGqZp()oIufo@ws&z-aNx}6 zpN3*&YDW3Q;XzlXMElK!PY(@#{h%kdz``)gLkX$#AB|p8Az}EoKgM%%n{apo3QfcU z@UYdb(gkc5hBtY=%PJZ@-|!!5@Iq5ZAeHJgqv_o=tdWq5Qv>U5YSd89rUqJhzGd<} zyllSghYbn=WYXKa`PMV<5i5&|x^0<`h0>~UF70>SEEO<%*_WLTmgQQ^pV;)@@lw#( zA@;|9d9IXD0cA+!<6MBUb+FYNov&?!R8*Z1^sZ|@)^xs7hD?K}@T=y%NazJ}K#V#1 zxG;He?B)FBoyX#$ar3=$H1n<{T4TMWD6{TnqSe0rj?)ruuD&R}Zdy|HVabF^Gr%F2 zXM_0b{*;Lt!6%?Lxp`ES@qAi4IdkB$pnXu?d&m6MBfqf;a;&)sp-Uz{bhEUq0?0<% zy+1i_iG1n(TCAz>z6X$w;1vWo*77W6-~XaK$b7FbXeQ=Vu3LN>DTbU)+%vwBIp8Km z;r&D!*iY}SctL`}jB9F17wOIg9($p%G7@((AK8qmq0xj3$p*#5cT_JZW-EKMxyKDT zd)0Jddr5OtU_+9u=j}r?bo0g3vIrS1;(lyxCnJh^6(>|e zJ5liQp)8AjCgPr>OhOkOHGdcuKpks(&z-sKxDVp(u$sW-dJd6L94JDHhuZ^JryxMwJ;tN%ZTRR zb!2uYtb3>XOJsqEw^&~uZw0`1JFKkvfL2sM3h%a3X!EM3qM?Ms`z7t@!{eByv!JBg zQEq!kfz0;4r=N`{3RAsG9U&}X>o0xau=}F(KDF$@=fkgR$vXsKA?gXetymlg*vL>` z3ip+|(Waw8L>%~XO(Zi6KlMcaSO-afpEmvEy$ijVRwL;3e(pBW^t`Cq1`sX5q^pAA zWK>HCXkoD6!&!*hfFHhJv$>!-sq#6x9bcugE*-&> z(sAf_nObk-PbypQx5SWiecm>h0Y#lizVkPOczQ@4v1-<`A5crn2ZQQShCbeNR$@bd4Qh z=0cGJ_wU+T^NF-JD(4r8I8?(zm)S*?NZet@WXDd;3k+^M$Q8obt87r~%4O!kME*t~ zCeQMd5vxy5!V+^4JYY^cXetc-IGQdK9qQbk+P?TL=s1dV34&$>cKTRXBC<4^-Qzg? zSv}x%f5E>?R?48H0>MRhR#cs5XHHFo8^flX*G`Rpgae|UcFUM88dv9mlHLl(1>DjV z1S0!#T)Rb~Or9(4esI;E0hZ)`Cg5S?TS_FLOTc^cdlIGJ@%!JV66j|}^twUDZcmq=>AgmQ{?mj!tNhMh! z!2eRt_Wn4yfq{NQ{w?2ePc-M=ao>yW$Q}%JZskhnef_1w;>50jqC{J9?0En%qUz-# z0D;bSPhDf$zzU?Q{oZ-dUQ0;2aj~e2JG^bI9rK7}i8_`TU z_H6uw$@EO0B3A4ACR!a`vy%QRUR5-6Dp&We)VGjnOKqs6=Q7S}R@BV>Y)aH7BQXPU zM)XXB;*>?~0|h)8%YPl(Y&hkPlZOD&4KD~xo$o{!-jW7ub*>~$uJgY1<)XFfv%nt* zA3m>sOii8NOXku#7L%!O0XH2l`;F}Z)PIZj6Z~iS>JHigg6Q>ReoP;mVM@%sMVTJ) zEvyH>EIK~g**2R7H^_zAuZx5PKLBa5;_>(QWL!Z1Wzj;&=S#a-42j<#o&%L1{XKyI z>2fpW<8@}S;~a6d^J_?p7JBeS*3J6I^P^PE%gCau&-h6w&n)SR0x0v zwC~no1F+>jd_oB7KJ-1?&dG>g9@Q5&F5{4WwroD!)*4pZznm0NZayy1)OjHD-F7K@ zZ<`clyl33_IG$7S2jR2!Ptt70lHf-`Ov>s5bpYXxrOo41)bJm5kJ;2@QMPg^z)SQ=;7GQ zaS^l;!0l~(`?H|vwSNQXAONzw3Xg9LTn_bjoPBI1$7O>Lg+G68s45C-KTd!DtlbT8 zjVdTL#UaC{&wRT49wyV>CmtsB-3!zgw7$uY+$qDweaHUwqTDScbbs~nd|yI!(KcF{ z8i~3|nfsYXQf5KVV_2fkJPg_X_g*qUO|DqG`#c@@_1Z1k=)e{Fc_A+T!6wX zG~weYELD0jKAPRCO;!8*bxLO}Icja1#aPqhc0{q;;E&zB{bc1?*y4ygCt&&{`Qj0Ls!yb?5ETCye4|U{AuEl5gb1IB-U?mq#0)KCBq3s zbLLAj(XEb1^xF$nAwAQc??Mx@R)cDTiqtd{GCFG1JSC*wC36}$%nVknJwK}RR1z$4 zX{19+hp-UQ84?1KAkTXA0=BfVLUmbotQtY08u6jL2l^;921FI6K4xn}1jluu>1%D}GTduu8C zjEEZ0De%~(z}H!t{5I}TSXDdG!fW(dj27KdcaMg9qN^@LsqwZlrSQd=GFkydg6QQGoUe9y&axdS{j9F;OB(3&b^<=z zuw=a5H|=5S{6vBMaf;}$X0rLv=2lU^z`GkuwqW2B063(t0-$}*8_)M2ORlSDe`~At zi`o{Q4;?-U@|<4lC!3E$c`;*0?d^F*&p%^c4;of&8^<|U&s#4%9XijD|H|U_7xsuD z13!l7eK$IKAoQ^I`gD`^cpxM-Hw1KhwD(5yx$A8a-q5|dZTjrUWt=ldt(Q>w+?WtO zO<@at{A$1V9@T*KBr$Iq%=A22PZEa;%|X30jv-s<&^H=YNUdAkaL~7J9u}9-f8BPW zN%?$KD74|dI?>uDBYXB{F3^8>rQsogP_$6DY@UX$M*>Rfk{@`u{mJb$Y{csGQKvYP zbnmIQBDH7APMJabOQL_T5}gk7v$cq9P%`Nq5-ulo2gJ}Rdg94wzjaxqIh?h?qJfat zy367`g5%8Yu(*Z|uMEG>+g%Yoz@@)6vc9-^cE*^pkXf+u1L&tm3=Z!27*d0bt*2js z*jxbUwy|%$s0_n(vFq0_BA4>?%4s7tgFM3LAmKW1yFtn$Ll~>Hp<~y$HMstD9fAV7 z(o2*a#J;;`IDqCqN6}f#O#D&W3jsdTN+i?02o*d>+E*Go9pGd)!gpdcg?^LU8(xCa zj&VA2*-uNlSj=u3X*o|DAMCFhjY7m-&=oK0Go~#Rr)rK#EZH(<)g>u+$jrAhvuXz6 zfGKtr=r-+cayWsy!>pALMv!G!wuNVMil2Lwxd;#P^tEyBw}mU{PyHoXurw%;${n2z z6?I-hkJ-pNM|>jU>sAai#R|e@Hluqyua^xv92bdk8SV(z)6+8NkT~XJBFb3*x}k|9 z;R_oUdZtZpsgYAu=q8|tC|S>SMz*m0!(u0{8e17b?~^xOMH8A6@3XEs(AK5B2l*b# zf7=KRh|y9VSFPHv9@C zDI1XHJnQ+q*M3VoGWdAL-W%U|=m3|bid31eNk|3=pazd~otZQB=#+BBL5tc4{dDEk zqRLtyk5W~~PoqKxeBwQ~n?)aQ&N-KFef&AuvrIp_;Xm%?R8J~j;&&7u_m!mxd0l!_ z+Rp4=UN1gAbpl$kYDM_b(0CKzDQM*{KGAX)ae$CYBstEHmbPeIH$oG=&iQbi z7_}}}5u01C6si|-#m!jY`9$1A^kVvde`dVoeSZA>Z!F-@BnHm|j|H!B<+Hq$OO|-V zc}^5vMH`%a$obr&q9t#CgE>c)Im#(DK6!cD%t+s78m`Y{v0sy>Z;6H4=yR#oWf*zM zK21d-9y24evT_&KA^P<~)&S|8*KwOoT~+|e9F~XzabYo5tLhiVgh{?1zcN}ctsg(?KX;xg&uEyevHNd^qDc*cil~T8;8yn?H z&<10w)s%0k$)Bq0r&`mxP#$W4MYanzU=A=`s<-%3um>AOYM#WIN!Ci3-N~PGkSx#^ zK8lXFw^6F`N){AN%gl@Uy_6Y2{otwz8ooOn14Kwy%LCrf44wf~D@-jIVQy6-X*WsP zTzZM4M^|z+i~NjwTu8jUs&AYV&>rQ`G`NZxBwV+9;9|$@X8}0cF&ZOt35pYx1Ka?c z1n3Dn&7yPxIvK3P}K7#L$u1r3V zj>Xje9Ab%&v&mtS@xd~Gh^UE{RJq+Yc9MG54Q^J1*4;0XG+&Ri!5;we-()F*C(!*@ zYaiot790W1aQWlAYnP%d*Xyxg50%aPI^Pb)GdMgo1i0C?XA9@8a?Lku&9Xf-z#}2g z^0@jH`G3negkySTS1Gu$pV+YD%=cjyVJ_3k;GY8lggMs%j!?RA-%%Y9;6Sn?P+GOA)q#cg=16PQCMK98qbPRugH%RQt#il5mB>*E*hEn-$c&e&Cg_{oN?!7WBws@b)&e(tx(ir= zg42rFa&Y<=xOh+dI}>?s(Ef)e=9mMXQc$h)QYvlWv%<;j7!=OgrI!QK8p!C^2+2oz zGCzKzd{=%qqdh69y(tud3%8%1Zl4Dg~m} zwh8@23K`Ecy5?)*zv(F))tZ0R76Ed%X=|R7dg6bwVfKm)-0lF0!u+m;nczh|&!hzr zqR{_G)H%gv`n_*ETa%4xvN_dc+n(HH+kUb=*|sO!ZnA9~Q~mGn#_xT1+G?Zc)BUV_ zt!tgfd88HaoK<+BIOn{*rwl7XWzo^2eR zQ^Zj~vgCV3)UK8{u)Xt~w9<1M9TX_IS+VagOVxG!@&%RJS6i|BAej0`+4J~2Tb}!f zV)tF{Zo zO_17!Q*Zh#>E44!i1}V{XaJ3_*kq9*SYzWG_WjQEBNu}>`l8O4@Ec`;PILZ>CFjk@ z)Lp>F`;u`*|f~NK`-DE@C#75bI+}1V}S~G$S6hthHG>64jR=2y1f`Ip7OX}AN^?Ga% zyW|-(A2lJ3GAzTR%+tp+cECL-t=;4dQBZF}4yie`mwG!4fzEf=@)HmaCi_l`3NHp#Kz_68n_!3NsPRR)&Umm}Db zoj{(V-puU6zwh;l#C_RqiuWOq;_rByhxI^1FGi z@ewPz+U%PC0pze-eSqd$Mo@Jl?ml+d2{u_>fB2a@%_Pcsud)+quhmH!r)^*+m8RQvZN9*5{RJ?}&fvSDkN( zv#Tss(jKD<{ZEc?s`T(MYIAmbskYJ`2Z49f8=vo;OWM9CkvTy|Zo5h(yq?Kwo)-C8 zZkrDsPSbe;W3#h4`~lUJqvc58=S)+yd%a=}}DUXg6P~eH8c}3S$ZXX6$~y ztXn##GF!7PO$B~mpTylCH%X5T=nQDX(e>WhBKD3ue98?%U9g=|%=BF?JHlcb((%f2 zL803;EASy#KoR&iGWk8{F?iZfeyLiK&(>{?#8$V-d%0$O+;~4v1(wi#rYKeK_QhDB zB$BgY6VdaUEHpmn2-~;oi0{p&bCMI>>kwybd@`Ny?HKh*+@fW}Z3+2%4yRlO5V{i( z`7>T!!*j7#@^M+55yStAt1<{MtZxlDy3YnIwxNWcxF#=_UE2MGpofx5g~rF_U4{a$ z%T}CdDjy2<*5b`bI_FF`fw}fLoudXPoc~hDAwA1l?)34QM#^PHK`plUeLUf0(qk?E zT*jbzr#qo!&|lB_g}+Ia4onz6_zB6G*#8LQ+jM>JV+HvJ8k@@qLV#i-=`L)?umTP zP=}0X#XCILTvcDGESp_xr}Sr;*`XHXEdGf1DU~+s8^hK>1U1?v zq?G46rT)LZqvP(J*ZU*hvQrgH*q59^5p{ZMrN~jfxF)O_`ePvOM<{rFqa_i}Yu-ap zzi2~mD<03SSbU}d6!7|73E1E6OC93+9#ygx+tisn>>(F%j7Ixcn7&t1nF3eBX>V74 zg4-q;YIMHBK0>a-EMjw3YC%v}O}^y(=fd9cw^UYGICBD?J6+w4mT_Y+YlQP6Uk%_T zFjW34o8hS(Zy@Rm*M~8W*O>gNk`VG6T}3ZAeYp;ws!VWmzL5UsSXr&rhAZo|s4-%O z<5g!YYWVCCVr~OBfXgl%>A@4~CQ4{i5=;eA~|N1}@%uT1MSZU|%jtyK;0J*`zMy zO0d5I>soq-U}1>ae-=!T*^)vaERosuXCpu|mj29Fx1aUP<7_n^{BXc%><_Y! zn7Boc84bu{lNDcxMx&Ta%}@or!KYEJQPq6#l_6Kr_FZ)mTQTZPaa~*y%!`Ryy6RWX z?D3zKBTT=0rNAiGX;=y=_M%|jq;fO`=}8$iUG(D07Jb3tRdgt!VNv^ zf&ke1TS%VMpJc>eMMZhIqIXjlY5(-#7HSzFb`rDNOfvU>f=orCxUBWt$-Hs+wXkr@ z(L^=CTSJb=;SXEecUC+WO!Y=#2@`M%;-LT)){xLasGL` z!cNy3ow7D}E<&_x-&^t=0o^&5sT*y=ZtGRS2ebAIOMs4i;qVyNZ$-1b@$XRgx<@6_ z_UpQkwkv`a&rWr7G5PUh-AA=$cK=d)5xA={D|y3%`O5m-!XNWztM|X)56-{SF?_#d zFa3HpRUm7&9fY%_c-7Nd`L^n?fpOp#Y7EgVkBNotRI`k)L_m(^iCkPDA#g{Kv{QhL zG@{w}y1*e{L42y87HVX50CZj)#7-nVEPb9Ib@?x}_NdsBsp|XWA?>padt(NMb@3Ks zJHOd7dWtJI9{HxS_IuyKS$t8YC@P!gy+e9u3-OIm#{1s$b+h?I_Nc)g2gk@4bu=xi z2>Mv32E=51HXNs2tH_|=^wqpHP`3eMJR_^m$3Znfw_tHdxV?j(^#k74QtX z&9_w=#OTjO`5++e?m!`$CoF)jslDs>ndOAlUt>LMe6G!oczO{t=8-Hpx?4L-ZA}P0 zq!yglBj%|UdDL}Or5kDBtoOq7`-ZZpmZ57BEBQV}wZLO3H73vz+gn$)PHXrD#Y;lT z_kmioqQxk#_oCpjOO~SB0tT$o1p=F@GFCL~fsv^AuqQ*Z_quENpkvK;Wo_7Iog@1UNVsDjDC;8 z{WH4auXmCm&{FbQqwwLDTcr$kv66e1u)YFJ-{3@%0UPN;%5fZ=W(%7qP@cJgWerD64T$d_=3Lq z(-jFk(~w;v@&L4*_syl3B;TJAxP~VlaOxWhaJ)z3u@}bL2R(ijv{gOpsW)^0W^Lf- z{ezk{Lxyluh5j;#70VdA-7`J`dEg0(?>-8kek zSc7ex^)Wn+j8C2r4Hpm%$%PfKNLC0;>xaMW_y)tp@xLC;Tk&efSMHXgteltkXm45@mh%S@ZdF{ zm>{O;T4TYzs%xq+f>^#(&)6*V{aWcc^OQjqZJH&oLsXP1-(e486k2Nk{?`a+z&my-TKnq&S- zu%oeo`erTJcDX>7W-(8q48@jNy~i(7#V`p|N=n~7_Olvio7i=P2?^}wqCiovYlA{( z)m*1faH+Cw8D&n;thW(qa(ab;(i-oAjA!BUDgBQ5>j+O+4<9?uS5Vs-%9d4FPVXzv z7lB%zU9HS?6`k%BW&P064kB(07@l?f!0k@TD8>;A7^!#eEZsMN5 z_$a8?PtYckLq$BSOP?`*BWopSgbG0is~E!4!d;%^6G|mZLO(?3!nxP{@f{#3cLx1U zG1>UqC8vt-p;1k=571Jg_{xW+1lmtEJ@($Cni07}uE;KI!?3?D@CRo<72)vnOLC42 zFhUf@8Op*J@eL1DSBDjD&`$ zS}lI^&%ql$B|9*4?Soc*j$l^E`(*0m0kFtX3(4HTLaPKxhyXm8zbq8+Y3ZRq{5k$b+xi9OKtxGZ)s6l1 zWVk%N*Q?y+A40WA-5zZeWhD2c9^~}+?|p3G3T=;zwBT+h?uhVJ&tuld(t&$b7-aVH zSgZRu#_1SVUgJ_pM(SCe9aTHfRN0tYv#cqZGf5CkP_`d7>`7v{n(*jU^n~JZdTe`D zaDEi3EDbiE7PDN*KzjBXyywhgWs-kdqg*vFvt^2uE@cSG1@iqUJ3{jUT6};$ zXNDA}vKY$y5~tWNQ%oZHbPO!Z3oP%EHUKK0e3}w6xCH)?j(m1m!A^|Z38rCPc%~A#T?_?TOj|P)gCLxV@Kx}Yc=j7@ zDOOtye3nfHZc>P-If?`4h_HioGuCR8JdkC2X>3CLvSshiXhOfx)5zrG&s~HHHR>4{ z74?r?;8;B=o&MT%LW&4lDDSr@r$yOyQhA+c{9#v7j1F2`$%Xzr#z3G;0Sbi zEsU}D?Z(C!7hK3$lLeUKWX?S1v+mpnyptg~SXE1Vz@P_ZqV*IhfJNPb%bO>EEfH0= z<(_aJxI|3HlGnmo!FP)OKxYl|G$vLBVS7e9E9_-RVkpH^-@*5DPRtNPwZzNSWkP}| zK*hV?7R{P&!gCD1ma`qEH%xN)P$HZeSVtvC&zms9L-{sNZZ3=pCLw92!;V9O&ozhC ztIpJ}*}73niYU7^FknIXf<&zA{_!slLvsf|;C-V#(c;J}cS%41nJ*QxJl1S51Z;vq zWl1gw5IY4~y7QaRC*zvYAtXk$mD9@nv|yhq9fQyBj6K8(wP4Z?qk=z}(%h<)?0FvG zK7`J#7M!6XlcLsdHsbr$1)U8eai{-79s8k4_taLzI)XdG#D);rE3&?2yWFP7mXHIF zzC{`mC5U7m$`+Q3|E-r3ig+mU0G{D&Zcgk@5Ynt{)kng~+Cv`Ky-;x*#L;^2w(A1> zJLpT#3O@pTnXolxn@lIVeV?gwd7_0O`}zD{uF+LCco1IO{>*K>MY%OTC;GORd`lkw zjN(u%cO#mSUCd6vRL&jc??)uX6$Od0MXqTz!Kt}C(68K;l!XZdh{8L;+AZvUkL4h9 zoUp+Zx(`6Bv+$Q=g(F?$CbzK6RnZ`!MZB7#)SYpJqlPy zwKqkCoYRKJk3>oWn5ch{gSJ7Y$zDGS5Pavoa%sSst%B2`sAF zWBAWp8tt(NV#=*pf#-NVYFR!!@5Q!T6F|p860h<>c&JcwiLc%X#;F8;J`W2VcLPc! zdOs}lhdx|tjRFy9E$#&dI%=e*+uOJib}58|&}IpC@jPVe1%4LXpQv*>&r4^IxMOs` z(2ptzYF)&%_;^!UQyilX=8XEA^1uh@)LrX7V)q0J1`+wlCUGfw(1J&$CLS}5y@k?` zQsl?M;XEjCtsu-LMiA_0=|#6WLZT3aP*{;G)B>AJUt)KSah?ji>Ns1|bj@)j_i5`Z ztAbCfz)PyG2=1rh7yP-%w6lZo8r3J?`@gL4<_V=#D&NEl1CeJigH8U`TB2r&ZKmQ8 z6y+AT2ald|5i9Kk3&SxB0UE<)=KfV}Y7!jsP%w3xm|QU!h#pH>A?U=2xR{~n(_sd+ z7AR8ou2Cd3ewun+cbeQIAxqE8FtZ9gjX?= z@8enEzbhD^Ir8ZBtmG}Ej=LdA9`M$BWR-PT({4ea2j8HmqAfp6gu}ar)=99N9G_nq zC*y*^tudfOBi!zSux#9h%pt9HmDEwEi=vPaf%ju2uR$cHSE`Emc!evKK|<6%Jd82Z zcR{zYS+(R{sXyx|-^V{|`=?<4Dnl6&nD%)*kx25q8J11GP9e#Jwv6YVRqc`V8?+7` zwpcRHx<)rK#?kGB2{KEh=@M^G2C>1b|C~0HK$i59fbD~?VpZ)MDMzD%Dnpc`i5SNP zH7O~Pf*MuH0+VQ=;4Vq4Jdffa?Ok|0D~N+F$i8*B6zldWmW3SRjtbxZxM;i`&ExK# zp6H*$E5JiStF|&Hf%G|v4tc;er_(>0;(A{jCVUst+`WFl==PZD4RtRW7_b5>|0eA} zmo}?76z#Xltqqs1+z>bf&+>J=Ei}9@+YqCi0}C`@)foFxM%uVaiNGL>^vIrgDmKtL z0mC)~F&WO0qhV7=ZJ=IGIP75Fcfy(|cDSdTS!qv#v_Aj+pa*md>rQ}W=^mI?{sQ6~wZDz$3Z*J) zx?cZl2m+co3I2ZncBaLR$CsgnOFsMWxzq33__76y1qGI}*vu+WXp_$@yBSP$7Sis) zK^_DR)53P64`URmG={rFUL{Fhk%XujaEA_RgjoGE_W%8adFq2uf?zB9GKte9#AHVFd58C$_VY*PVK6oKL z)Jam*aE!oC7=ONjUz~_lk1-H?elLRuGTE^FR8Sr)K_g+R*KHS9VK5CU+tv11KMv{< zH`Ob2J~b!T;SorOkXqrBb8}TRsT6GQ4$?dj#}$mfVB^hN>fcYRFBGS(aEdo2Fi1z& zsy(kAUrj;wnz35&H|7S0^P(k`88B18$q-NT1(I5EPFpP1hIzn+sk_{@+IjPKs_y9@{Msc?+uW5w*g#d26O}V$xn$7=tDw)w5&EtS!WqTVvXlBuM z#WdU~2%ZQ~;TS8Cc@L+5vZDR$ffWhJM**Q}W)JE0vlNb^F!C`-H)A2zLOA&S72O2| zX#UOSmO#lcU6SN}dTxflRL;5w)t!Kr{cD$xU$# z0a96{IFNZ0_;jcQm}xe2cOnIWahw4}0YqnDtOOI9^Ke_$hgPrb-)M<=srDuD|3<*q zf^p3SL`Cq!kvT_mkh8FVbLcDlM%K6w8aZeF0#7DNqaGSvFq48&e>?$SAooK$K2@d@?w)mT&|4cYkvk(1D zeS#na*%)M&AC8oCZ8_o04`YLPC86zi8yV=e&vK}HK(1kjaiRQOCk7~K3KL8D_KRIS zf(K0)Oi~`*C<)^hg!cP50$v6jrkiRqlC=moodUEy3uXXmKK;_XkC1DUfChC`bi74D z8?}~9w2*=pxHI0vo!2doK8*MC9SyqBUig48`!OBWbBf`rr;nJK3iK$0zi!OAnl(g% z#)721Oz{)$(nF=v36)wY6j)BU=GQ-(qna&ra@192zp4F<BdLV`_%^(!6u;D80p<~Bt)=CJ4@PYAc!7^o+Q1Cjqr z{XhkE;fVxR=-i+K;(_t~H^{SMf%7q-U{A<0A&)CB&n7$d&Y+|QZM1Q<&#L39gUymMvl^$F~ZP$1zcp-7Bjd_i#N`qji|3n z=KhOv!~Rg(x8OMwe(g7cVM@JS%7I4xgLHJiZ=5QNbQl3Zf$21tQ|^xyGch7+>B z$$kUPq+`&kBf(~UgNl*XYSxCCQ4%&!<$OO9SKbEce2qa)`pac_Iy75s1M54;fRKY> z6bf2H)91l=2V>oCE~nsY*?2&EBt(}~#gR8}r;Xx;(%`5MHDIMedMIUGGJ&O$wAwtO zWabP0rVSU6_!~Rn>>mq~`7Ug&g0ojhZI^Cgg2~S_g^kaZMzrKcyN!6Lz`aL*4+Ggv zo8_>S(*YJcN19Y)AwlRbcZ81Qz8$8ZCzH&d5 z)Jhf^(q+WIptr|=*poIMYgiGRo5zebNy4+D6fBpE`FDktks<{m8zqow9SNcbfys~) zoV)s){X!yggoCiX<`5K#69(JJALNmu#t`;rkwu3XncfTNsq{xqha@Du_i{G)qEL)z zC_jQBEO`VX(qBY>Z1G#gWeh_YoeGLiTl_A-NqE13L>`CK!7yk&en^N# z4bC<;_tG!N&FL9Mop!?Slu5@dn0DRU!98nIDK^5vlQG|@P=h&&6p?|Fl@sDB zAmBQ6DFcf9vCh7W1^v?!w&&hKdtSKa+PU@)xy+n#beP~G6D0WD%S7X;vFT>2CcdIJ z#pb@wDzE6Lqmf6vu;sKI{L6aX822SIXA$>j7Zh^|7fHl>%1kY0=8usrvPMl3XA~_Z zdRY~xceel3-r(`0LL?DSY&*8cyR!mX8lyI0s-(k*2B53TY43iP{HoAbc0rRkz zcl#OZ%;PK7fI8D}ivza%hdHG%dto^AadzZa<~0<70nG5N<^BB0U=3PwgcLh#R_xd10&^Dg9}*DQ!6Qa z1qc1{&q{wy^p1cjxsp>VX&^M7O1(xXWC>?y>v{pr@H!^_oJX!RuO=`f;DiKWe?!Yv zVMUvJi|I(F?mqiYLETKGF0GgY87c++qeHZj`n0whrdwOa3=mnoLTnv+>e0Yb0tHRaAVJatIF|lbKk*!BCV+0lN1E_ zvNx%qqqO}su*8|u^b)JCANf-?onT`|elbjM9|n1Ej4i`WQo9T zA2Bin4frDOYbi=Xio)g1NOwRH+!(kC!^wu(;Yqn?b>fOjXDX7a#xT+Ze^tVq90J?HQURzbUxIn+a?n25bw* zpsl~g>DmlxeF24-A&EP0xpxRT4Lguo=%Iv^0m=+2T{#{vQ1-8mg=D-+0v54$2OrtM z{OJ_0&F_2Eo-H_p6Cryxdp&b8WNgGN zCHF&Q?4Cpz3k&~r0y9LtVs<)449rv)F8Cw zG6!h?6Z|7)uk!w zGq_<$3|^aFNV<66mXO=}cSRv{jy>ZBp+;)_)xE%(u{CVE#Xy%}d5f938Qj_`;FF}t z7p~hK(!H@H8B8%r&uphKQcCsBSWq%Z!68v0L5YeDb%9%o?C){#r?OSeKY#?vh< zIwj@b(Iyf9kUy?U!==LH{Z5GEo-_jgUa7t8CuuAfutXEgMdq)7I9Uh%me}K%CJ*l9 zPj{qm`YxzH>{77!Q@a|BxzkD(B)`2)_^b|XHJzg)P6G0VlUd`i+}zG4lZ9J=nR>?` z_t^)-L#|Ky{GvUaJJNzrk2+9l*QZOSPCR&JA!5d%+gECk-pY~}cyUGF$gk{Z%S>+U zj;jD-)|*#{$56PFOMoM*B_n56BLAxzL&PD5FjKDHtx`kRLl-nNq%=%WqMCLPK0*7e z@&IQ1!A$lio30;kSj4;+{$1_BLDe)B79pkgD_ag7vLFxrSP25bs~zAB*MA>N zW$fI~{{&jDXSM(+0B`_XMhxZXyN*6A>9-t=H#;IPsAC>?pXU4-HuF1*3MKI!u?MqJ zqcuS+Qh*S#5wkgFkBWH&z#{qA#c+X-S!nhU0MJ>DfVC8{ZVJE3Tp-Aa=3EW4xgDs~ z0@8xd97{S@0CQHCv9#9{)l-?j0B{mb5w>caJ&vcOHZ$olze@yEY|~tOUI4Gcgur`0BLWCa7AmQnMXZXy zt-Eb?0)caQAYo`5VQ*$|76J1wJvKo6N=E;6?mwpjqvOAm0kf;Mxn_ z8RUGbdMN5PglD$yIL^>Ho6T_sjDz*9s+vN0{PAQ+RmZO&IdN!qQQO!lNQab!N(B+I zo?&!GsI%DnG%9Xe-H24BFD?|K$tcEYLo+E$6Z zE=};AstT2QN1(#BdKm?1z=KxE%h8MAff(FU_9S)dWKs@u&5Uu>Fo}ZB_I$@B z&I#}5zq?p2;WODjfX%F%lcw{zFCa;V(vB7sA4))ECm(#p=15N!rxe~z040A@zsYpy z&zSAYka7HeGUl%rwakW7yFU{-#y7tc!#bW;T#a2RDN|KguAu`V>OeKGtlTO(b_}-| z(E6QX8Q1Z>rDW_P)G?EOxFgI2oh@?^i?FlT2`5Fp^xUzYZ{`2>1vJowAyd)Ivh`Q= zIR160KWgDRMBtX!JXpj(dI+8%dDLFkBQs#|p8R2jtb-GkFN}{HT33$ds`B(2NJz!r zX8fac*7NbgngyZ9;g?3k~EjV%>`lb(SLHw`}UB}sA4uWrJ@ZV@9NiI9~ z6teZro#w}KcJ<(l?qDDE3A44qu()Ul{H7!_cuQiyRI8V4d{hF4Le@IPo|X$@tJ_vB z$y8QN(6&OMsd zM^nwUG92};#-Z-RYy~SxXQmj5QbGQ`XBx@af?Z=QsyFCUVOX@!O_#&sQU<>i%O$qk zRo!5-ge8EytuxQh` z5l0YLc9<}r?$7rfkLjtkkK`ZeFo6G{aYtMQAh{N+T2>BIGR$3ZX7dBvCM z%pY!3EnNEW&H+hXv=8^U`?G4k=k5OD%I+>~cT@T4 zT>zI>Bx<50~cBhhR&jSFnd@AB z_p_bEC!Oi5{Q%RvA-i=#)|nLY8sYeUu8yz`K-AslyTK@y zxBk0|b#bF@#gVpEvAiw-^S32u+rB6BFZH!GtiAx21Owper%=anLY3GyA%5215NRYK ztWA~T$cabLA-sN-Qy7?5SZVu2g;yAyf>kJTvJ1x3{zM5-sK-;QmRTg5*rU7w=e_>-mD z-)&8Jj0F2Q5skBJBKu*WewtTY;X#_c+`pWakHsP zcg00>Ix(wbZ0WY41Yyyj>A%b3&yV{f=i|>wj97i22aXZKc{5@@k@8k!p-ByGhoTzd zt+n40->w5mGG#jAWhZ4w>dK#cgJ# zE^Zw+bmZ6Nyj~cn^9AxeS^=m6?0n8wz{)C`{tp@02_?~*Ca38DV4kO!ST}3kD9&CT za9Bcn#a5G~FyzPL*g#-Kwm&lyc=9Nx7<1bR79hhjq67fm+hb$?^0Xb~C50{H>CPDb zL-PNatJC5py!zt{AGWKtGdVA-NMQ5pj?XhGOf$D(emalQ<(p3#!0w-6-F6}-(0(m2 z(rF|8REh(5G;FUaV)g@YqVZ z>m-!rvjraZ6ARb%_OGu+P;Kf4Q%GJ$BsjRqc%)H20n0|-1c6U(UmBZPpbsxv$?JyP zcMFXDxg`az?8Vw*iuqu`*ysB`fDvAaj#n^~GiHX#=+himG7VTXg45puU@ssoW`1CW z@1xnpPwD+ikCEQpJb#IPeG3&>_dKubO#7NOPoDp?FlP){M>oNR=>yGy8VB1`_HWpt z9Wf*Dt)9KmIM(%}l$5tbgwl>6O<2(WIJ+qLJt-wp4-_K(d%Hl({Va z6d%RDx24l5IH5qk4aU*aY~ZL$8_F4@5h;CP=5BV|>GsvR29z->lM7iV_zHk zIX;|PdEmg>?Lm6Az08p11eNK)oc@K$t($5emr;NcKdl=kURV$3f?1)Ui3m#lY3uls zWO*aOFuzY(04yLY~ z9W5OXHf{esfa3IF)Ge3u^6lq5Ww;`{8c7E8oVEpF9zW9~lS|>brTzs#sF>04-ad7o z&1Ng_gUO**1nZGLcbxZUv?p2!78?cnU@7~Wg_3yL= z4wZ(TZiFhAVrOK*nAD%|@!e;OuOic(55+UyO27HNTfTq29azMhB66Mg9FfAO?v^RM4yVfY-%R@z(Lj(wugvfe3H2f1bp_$4tG4vw zht0dL>YhD}F!1FIvlLpDCW-cjB-%y;Q9bDLBq6>z9q{Om5(x2UwtZ$yzPf8 z)fw&^b;eQb#vd#-7{23g{aQ-5fHf><<=ZlXTVnaUhI))VlTpj7AZq<$#TRRdVDTXQ zjftend)5Ox+|u$=o1gYHIq^_`a$hUGq^wzH)k`D6kP}foV6k`3^K_Xi_5DGY2z~sh zy||LRDJ6j?wr19+ESar$EBBC2c{~qa7j!veP^;$~$J#NXntBQLvs9hL z#m4cv@|X@n7w9;}dQ_emB&7~k`MR{f+Muye!Q*&r7`k|PLha*XuKOKt z?Chy3P#AH3q~b>7@87)`0UoA$bBU_;;W4?#Bb>eG zunCkC)_c0kK0FYW!~TU*h)VZ#purZOy^PU|>KagWn8%2@)om&FpzV4({N8yp5$k)O zq;?m>dkZj=(x{JD-4~631oHf;Q)4o@+wmY-;WbsD?eErEjRs4#Ctu0JmRdzrNo?2q z#kfhF%bpsuoXx*veUCcy4xHb!ye{cwd7A}%SE5-0sk+Tvemcf#-%kom6IW@}EL>)o zOy(DMs%0t9%H(P5RjYCajJ{BM{$-r8>}bn>Qq4g>L|Is|0?=?QKu+H&7X1h~AG2?& zX#STAsLVlGx%Wo=g<3ZPi@~JBB zbF(wVXwc1V>o9ZhFv`pNJo9^JQj4+N2?8vmw9jR2HGw(IZC5r9 z$-mUMSM6*uh=M?Kctrc{ z3f5f^`X!fHr!Lnn=z`^zvHPB{xCmkG&mPDT>)CjPl6;NHqOn$7zGgne%XxbFI(-urMCj*R&t;c_T ze&= z9Iwe}U0XETdu1neKcvKpi0?Efece7v1=G^YfUd9ar;GXx5p96US%MDIyZK{8I{ZLZ zn{n`?)QhMJ>3XI6x`T4i2)mk6SgwZ z7fSSWxyi$*eIIC9?Z%R58+}@gN44Vl5k=dRTlsrJIZS3U7sAT5i$viU9p%GQH$NYd29)m(O@Y` zJ)ZQMx+4a(YrdCGIq&l&{6#3hIn&2(p;v~fRWv$$F32*au%PdL&xK9WIN!i7pz#Ajsc#VO0-gL;R1-sfXp&XJL|a#c08kawr~patefQJH({cSnl6 z*J|zjjz0bR6i7I^GIcyL^%hh%BlpdGFi9pXDr-*u=)OD_0+vSH4qD+3om0 zpBUc8;Qg+id~38T;4iwy%As7&=hJc<6@ypje^Tg{U)Q4sIc!!Q7xH+gRC9k*k^IFV$q{B7Fj(h0+dUy)0TT=bT;+oHm0dMA;s^>F4=IQUM!&oz9~fJW!LWm|-e=gvi-^^cu;RYN91-9ks6 zyzz4Ok~umlH{r&%53)L0lyH@sjcZ-%d) z)uh39L&6poWb04Z)vi4=!fYyPVWn*_&y%(I7t0DJ>G{cvKTE5G)R2{$AA&XcPJWgZ%t|9&Yl_`AqnE148dXAHHnH+_rgl4}oE5U+ml%~Ck z`S}?Fnw0wcU?v@P8-dF|7+tr?bOJ83VlwZ4jkYRqZvX7Xex7Pn|GO_?L|<(Xr0Z_m z4(zV%66(HBi0p2DZSDfHx2>||4kv?=>@wh**(_>GsO~-CM_FD|O-s5|INc*9dK!7W z2NmTWY7GJ(b+L@)nvF8&>mu$aMX9B%^Bs?wPW<<|Dz0678ip-&*fPzk6SW_Q#1)sN zte>YCIKWZlV8Pz!x!BE+|yN50R5TYUme?+X0S0hSiWK!;0{wHoaYDYr}P_K(+st0p#< zsuUGmS zA!}6R7e`c_8W7o!_T~Q{O=scO9rnfEC}iMu(xyhYj-3y4t1JWx%lJL&xF#& z9y247aqfO;))_xLIzWmbi8p-=`TC6@7O`z(lu`EOChkLlZd-yyNZdltMPDalxHc$g4L00$*Z1NI-FSScvusV- z_EQNh4L{3hYit?iXS*dyM0=FOKgC~S!Dj{6<`y(r2?>u}zIFWOAUY~uobitd`aJjJc zFy4A_$2Tgi1S%FEsnH5OpEt;mGc62QvJoka=4#uebBCvVFXhi`o$?tA&$&-`XxS(e zqjECMYjUMe8PYcxq3d4#^=IV%k3%Us;p1f9f%l+*G5r}d2#4=>z8#T`EQv;BKd%WI z$rfunI`d`fg?fCxr!wMU4_*rm3YIY+uv+(Km@Z6Dx!8@XF!H~j7qW`&#%;v}o}C#0 zN|=K&9W{9P-XDe;J^l;V*WS1$_fK&c7pY3kIE)*jUm%5vu z^&1J_Ed~_F`aJxZaJ$tih@=DmX$x*Y+T}x-UUE6Ky=Riv1ZZ1IJFb(#yF*3-r*>8- zp>uGX?uyZjTL0p~T(tIkU-prYe>E&`GNui(e{zngSX}Ippx<< z8T}-U6%Q^*Mvtit_4Q{$(83x<=Ph$qD@BvE$%agchUs-2ttGm`Al!eDv`U zb3kBptdSY)(#L#(V=)HeRn$bgRmJN1d=39T=iKk)l;4`%89|;~olrO5EaI~5MnCmp zJ)t9d{W;<R-KV~{MCURh2r6~~HspwN#vVrL2IcEIs+jGuYUFj07&;El z&7D0K%5EzIOOVHBgth%sRDtkQ#M_iG+h_3;IgqaOOrL$76t|wpEj@}t&_UY%F2pBW z077plG|!Zf9~06a*YcZ@COAWIC&)Xn8gqe4p>Uo4^H+6F&TC#_WclFdaJUAafjJ4x{9w9op-fOCxE%Tww& zrPW{a2VSDZ_=27^BoQ^<$o;Qv=3UI>?KDS!mLEp9KQ|dl*o(Gg@crD2!RQkejg)`qaleXY>a*_p<`(x`( z>EDH-hn_ddj#*$5LDD^{FTvNnOQ{vahhMO7A+O$7SL1~8+HP)fz7@xPiB1i~3aSsq z#bInQbrqTL{b+#nR!9p?zaSPlo18~D<;h^dK=DNs1BmQ&c!kw4y~GWciVD6N5%VPW zsZ0AwZ7~huhl<(D4K5SDd*LtCfh8TLy#k3;5 zbq#KSMoM-*Xmokrr+;MD?_Dh@JVL}BgDLlg6f~$!)Sc_6_QG-4&I|E^TLS0zD)v5k zJQDbffA?*?wei}lmfm=-;BkD90r7|Cb#PFX@kz<5bT3^f@TXE9tufQ0qj&!K{E-Kq zVzGSd52{YTU{uEt?ng*UZJo<=Bzw?x^9gIDL>AZ0|M_2Z|o}X zh9_Wd(zUJjYpE4Vu4wk!*QsxA>a?6P^Sy83VW)h*@O^T3AQ7UuAI`84e^$3u-(3|? zxi(APljV1YDj@J>TRy*>A{#r^$^bb9!PDD(ohS*W)g8S=Ex@O9><|xH5~SEf3;OUzcY(aD^+mkk%fJZ{SY3skCi>*PRV$FO#x$<2yabaz&0`yLHWC z_|?q>@ztn@gYK#CrJLhe5f?;PG$3dge1&4kr^6=WS^oMDwEz~-rkqIa-zHjti;v94 zX+H0LrvH^2z`Wn_BT!9(BiZu3Qq~k{2FBpHHSC4=b8XONrjO`jqs1!YtHw(w^=Hoj zCX6w6114EonkV+A`-giJ9Yq5^@^BU2hiO`o$Pn5;4737g%u3!#LVao8lhLQEjMx^2Il;j`H(lw`O4h1FG` zeYJ5z9^=9zkjpj?=p}NMCYyZ*Fly=}E93SyT?~0PA4>0}e&DD`!}*Q6Vg2*Xs%yi% z`6@h~?@5hRivYTLrShsdJNsDBTWo#(A_L_8H4hJiV0suq;ZTWV`1=7hD{cdn-VR3k zh`@XNnJaUTn>lTuN_6low<$KW?>FNUzju(CIX+tD{P1}D7%&$KZ8{r+_|(qQW{E>N zn`f~-9+DT5-U2pom)m=tdagT~Mbwu2!jGwTP|qbR_zrw7!h#`;B*+8eyJ*xgg&+}4xWC$zqsIaMABZ=_QV;mthsrF5&J^+fUPK}-FS zqjINW^4nHVB2?^CNO17~g;6SC2Q9ESaC=k+VcQ14$f&Ju^X-AGHF)^XNXDK4{x${W z_hC;27+S-D(vhu5fxBa$zcMv~8=X?~;kKQr;u|0Ip5_ee^#L-|W%yOte9p0T8=>QX zC+OavT2WcN+@_hRh(n)OC47#4&(SQa6F`TxH6xYZ{wv$vqoz^kpb7O&0mZx|ra_`@ z_Q>sPHQw{(F&EZ(im$I~fP8m~R8N!u044wG%+;_**TwIQ2v39SZSM%IU}r`heK;kaF zbY#%fm7%r1j$4%bM*YYdbWe;l-!(Wb2f*ZQ}10-?qm9A8oPLRGD%!Ri}VECo;_*aIEQG?CT7s z#1kUwyvK+E9=;$rUC$S5h>qk^1Y2RN*@Ra@Hm8Xy))UApRmN-0ZM$~g6n)6kF(Yh0 zT=r`Dm;b28y80#e%?jVWOC+M(-TnAu=H^~xbCTs4x5_UckEx6b0c8{YqgYD%Y!mzy zPh~~lE=P%JJ3=-YXu?Ljnw!_dG%wDk)Ql&1G?tgH<>>oVzJc${K)?%?x&hu^B+Dx+ z)|K+deFXWoj64xzV+(`?KU1k-)R%*mOtj&nvYir;$v6x=Bv|WI`7_7jjqaTys>}xm z@U;Kg6KnI$S?tpz`A7PtKcDiOk<|{+zQqnZ1K@uaRaK2Sf)E*pGct{i06s8zqF)T7 zN=sZFowBlqh9dg>fZEg761ir@{IR6!(_eoS>djiH`U1sIImYoMwvTly$me7PrLf`f zd#=}L!Kz`GJQ&z&PeZB{;*r5*{=qkSdDxx7FO>PA@3%!LcxKe`t3%ni8WC{E|A&b0 zu2g`i1}7}ke#)?_3V%iE&M*SDHR!KLsARcTAQe-ttlsRwv=CKE&~gXfJ;3O$B*|R@8Pk3Bl*97K-gcNM$*7EpHZR zLPqKx0G$4zANkzMe{}U-pCXBulKrx?*dYf0%%=jbp z7k#!Z)AQy6BI|a@pXb!6q?ih)5nN0pTd%f5Z4;@st0Bh|f#l1Z_OOf|c#6=xVqlT~ zjgKaosA#x$))-ms68myZ;~CWXeXLDrC88QV@iXn_3La&L$JQ?@-`l1t;iS2<8@43+ zDu6K%{;&G6fr63jdW}|?!ss)=S7M)<+z5U{cT}M!A&E^bByV)9E^M|%yFh0FfSx@w zhmM~3q%^2NvWRk35@3paFuKRL0@^hU=T7dH%56GKri6?i$TnKRb4GD&1~{*}k&#GX z?Z_f)n1|?`1>QeeQpP{{VX+#7PPS>PH~13ryjsfsFa9P&sa639 zd&);j6=0QE3u_jY7kj!ggR=Ri_YC(30t@)MH>z2Rd}-QomGjmS8sI`!T7 z3#A)MiOm!^Gd58}k&{5hq>8~j=)!_O6j>4&gfT3B zSTS)Ayw<)OJYvft>L=&3ERVoOR}j1xu0Mjcjen0{@XkJIxvu+OpBFEU>dn4=>GW~j zFCMoab?TXxuvWlzBj`TIQJj3X&L)TLuU_YS6fimPBz4I6bQSF$Iwfh5q2} zDq>%?RkHD8WnVvU{^Fb+Ebzx{j6K}v0?2J+g$`wgwi>&+#y>-KI6)(qEc*&R;CNFi zk-D0TnCuE>T!X(i=E-C27bI(HD0!>nwn}-N;slOw#M@b+?A5Kw3z7>M70BPq zw3?AM&Y=^0zS^0+{=`R%@<< zC(TJOWrJhvdLiFrKh@rg_8{<{ufMXqE+bwQx)&~YqV(+jRmW+0>P`W1{>)(%J(I3uk#lA1KN=@b4!A2`? zaJ8io9Qt!eHSx8GO`j=lE$%1cZ`9sMY(`OTa7(T1=Sgsgy11UXTxom5Rdz5evr8Na zs;%Q*MRXLeVn5n3i)g5?8K!N>hdLP&XRdatTx0B@<1Aw}_oy>z(6T|y>K*6`Svj8- zJ13;%@%FpMxsq+5O!YIe5jwS_vsPnI@e4w(RN>R(s2~vv3s&Q{RJ1~ILZhn~-M6${ z*LG5S^&JgPqqP)L33D6Xen?WF^y5@PjW(g#xC0G z)lCWlM#HrN&Y5MwnAf9i#kZn$7?Am{M($>?G;1UjqrGF)g{_BGD$u#y zOHDf#4uBw=s_VX zSYY7&RcOha_b#Ho^wHuUhWn`Y%NRK$6?ODovQTPx1@*)8ieOF9Bx%lNJ|5p~vykOs z=Z0rV+X^Ws{pES7F|yg}60+5D0zJ_AU}%ORXFpqA7YG>uO38iq?{X`tiM66cu6n#RV*`vON)Ia zj+7c=7#hUvI?iIyNy=vaK`dtED=D=va%Y!B`ng>rC@}SFCnTyD5NBBngj73Gq@>us ztoAoaWimX1zZo;^5N@4@x8V>+FU&0~O+uzSHk$&8@yXO@JpEOQi8O*-oX47<<@xo* z1IK`C>7{7iCxK}?&Oxbw+ViR87{lL0J?H`iu#D@u=JUa{++Su4%r(CytAwxN6s-%4 zhMr86Af?33&|0j8`qF(=X0k zyC(+^IfNhosi~V{iiO69Q^>&mpU~Tp{^ygsgu&b4b>_(DHG#S!|0W}4ZhI$Nto9w( zF(n1KAcJ!)*(l_y-tt`PqGd}4^cN%OXQ{}b#-ylkH|_i?6Jfg*?Mu|~wFJ49(1-3E zE+O5a%U%sW-6q&Q+|nutT^~QwdV?{7uMdQOFF6J=oqgBkeyjI4f%8_RB6x8lW*^Rz z;%({KP4SRSU9Yc=SVw)2;S1R=DeBxy8!y82aM?ksBL7NnNyMNEZ;++-;C@pS3nL(uw8h2b)^b&(tG%76ptKcw)o`gdFY`eXv^vWX=PHB z?9~~189CB&OIBe}k*pW8jcH0`ZOK+Rdmt~>ML^Zc;dXb*ao>eSvN5$1nzk;6ug&=G zV)=ePw1|%i1ehe^Ap5uyb3Zg3W#OaiB20h1+kQmj9x{;`a_x|!@g|wT5z?0t3Jt3x2%-jM%gr5<-Gj ziXY+}X!G+5?5{YqwyDU8jipf4C5G($w&-FL;BNp$_olSJ;x4xHF280Thgm~Pf}z#$ zRIf(oce7>|X5Xvgmq-iQ@|~c%m%lzVWsvjIshY|N62@737K%{a0l$##2m2LdPkDa6|5(g-t2GK@CMC1{+s%iRwVep zj3#6ZrrX~Z|LbmjBJ{d}R7)qh_yMyOdM&RLQVj?Keq(?Wj|b98osVm!@bhKxJPSpQ zv&c%wpl#@7&BGxTw~b3Osu;G9IcYf4`!6uI!*9N(SF4|yIwA8yw*@-L|2p3q5WOAx zhit&`W#LH@=An1K{bFs0kO2b=(COZDhBL+Md-t*9WVm0sv#00ZQ- zIl}T`tss>?XxSF}xRsg=p_i+A2K*aK{Re7o;`{4+p}uyovE8Rqa{{N36{=88pWuwhVJUtbz-z=*9>s z%;r_MMatc-fNGF^(whPULYl92EcBy`E#dOzlF;-0#R<d$!CdR{@@u{CE3guZK$NgT;;WB? znB^}i%b~2H&|fGclU@x+IB#5>VQ!#CZ0Kd@Vin$}Dp9^s;`BDX7n*!2*v8Dc2c@DJ zG=?IqybN`?M;8UND^|E%rHcTW?}iB(t<`QtN;mJ+o9$;gHRWJ>2X(%Z=ax!MI4=xr z*r1q0`&3J;q6-)P*Y^%+n{M(;-^L^kDTe?$5x@o1$LY(F46Wb>A;*LKD`V=JfSO`; z)QwJhAb-+<%W;zp zaBiECeHry1r9=I+FC^9z)wfFdp(rm97WnCbWL-Tjv}0bULyazI@&=LI2R} z&~B8zo@~{4tfqaf`<@w9fnQqAW8-3F5jVe%E0jT<|80`QS=KS%|^L;wqKWPKO+n8Np9`rY+2Jh&&gH% zh?K3V?)1a#itwPBnsk;2r2gz8X)(*Yzl(TV`e7o%&+o~puux)#Q4Z(=eVK#n*QYM>X)k#_Qr4V zq;N-`*wc28d(e4|mHCLoe~Xf}e-@}h zl9Et9k=SQawB`9ByInGl(1lcPu&P;wa+{ zvF4in_Sl$n?04dMjTkT~7_$Y>4P5726gVO{uuZGvgKTDT>0wlkaMqz>hy^e$ib#Fr z8Pgog6SAWl?T3wvQtTAYZZ$Tjt6ke>20Q`77{Oawn=h6g?w9ZOto+OA(X%FX{+L?$ zB#oi`a|F^|qxh-%U{W@cM;F_VG{7+W7gv+rE^?g(B3kmyk3OC+;8*d^H*GFIx5LhiJDb#U=T27qX#OzP>DO}i z!TGJ_%>vZ726H`?lQ9`U?{Y#vo@*FEWn9Kg;4)|5W@@G>BYcv+EH+U)fCjw&7XK~5 zGYGoB2@RbddAO}v9QkfhNgKytxpaJSUXKX*t4Kra%gWxNzmfGbS^rM72laM-#Tnx& z$(|j0Z$%$^dxWZ!1fQK>B2!X_hgl_qk0v64qN+F?ir2yxur&Tc5UN;bIf;eR@@8C` z<|}U8vwY9yNGPySGB?NwW&Pu9!NMJ?YtRQMC^tqt8yN+}J$u5-rj$*J`)4}i zS)M>~9}mRWW;ZKVB3I^8lgZQ%zhLa`K=Vf*s&X&sWz|atdE7r4dm)cYOxc?pbALOF za1)s-q4wMt?YJGL(L4OEc@vVh>2IT{)Y0#r4iY)?#ki@bASU-|UOXNk*T2Qod!fEe zmKv@J&UaD~)%P{xzXs$wuV{6rUmg6&X;HoFu=x_)wZC|FjyL=;0QJaOXw2N@GP1-l z*|KwqLjSgdmT#u!-R>|w+|ty-x9=W4)T6lxETkQ*o; z%w?xtYMmJ@2R<(FUWyjHZGF*tP_>nHl3V)0*Q+(t*M_WDUm+iLB!qhgY>XFtEJNwv zO_pkOfyit!Op*4)g4Lx!@+UAAKSH43)Q(=g%WP6S z>y38V8qP6uZv>^!?8^jg0E;I-N#W_O6;hY=>pIEau6QTO+c4RxEblsU`}ENpf8DL{ z_936U;Jp@yFO_sLT>l_6bbq+6xK{^7@atut{{E5VhauIwK{QD|b^8C!+aXe1_FFO4 zqHTV=w1{fI8q#qx0p3_mO(2x;eZ)3F=3M*XRPoxK$M6Ez(tia4ssY8NiacS~mc4of zI-7OKxqBja_$0Zx?Zace#6E`%5m@zrEDPO-#KgznzFn{wLX$?1!gOl?0YV2Y{c?bK3$kIEvj>(P%g`L1h7|KoBt>3C6ODwNZn0lindUYGrDg4AEUGEze0{77?}+OMx;F%y*RHQH zaK7|_ei{%+(oF6M`75dMV{RWhRyK8QEPgZda%L}zj~NnMc5lJ6lr&zm+OX3$i9%9a z7su6Ja~Xk0^G)22r5|cVS%Y$FB@qO*0&e4ON-mlFp2&X#3#N{xWWTsxw~*U_if~U` z&kzovkq2qahpqqiMULrEWwKxEF4e^5eIR&N=7Kq>I2x?kvtn5F55vVF3J z8o!Yk3GhBJ^hG%pMMTaxS~D+b=a7 z#Hpu0Zd&W!Ea{U6SM(0OZECp0PQrqo6fu;N>&e~&w2Swv^~pe7Y{+kVfD9l-@i3?2 z4MA%S)}cA9)Q``9CC0#Kf6ywxGx`38;abOUtxg+6mUmN5lG;nc@gdA{Bd%Llw7R0@cXw~1v5K-lIrRG z*K1;#i64}{lna^cGrzP5kMLYb&p^QXChYR*laKs*L1nd_)a8chJGR=w0yGoO?RTH3 zN{k%VO|qrs7Y4;rxZO$rM zkP6MeH@-Br{3ig-+H>C$PL~83Z4gwjeCT(V`97&N;fkal=X5xGD7RL0^pqivqV1&Q zr_6+Kh0JK-ti7wHVd+Bqv6`bwa-Kb#svZGz239H8F2M z<)3PjB&JeaEZCY9CAtTT;nl;v2BIB=Y(PP{++(XKg+lFs{^PCJ!!j43T-oFozqTan zAFq`zLt@Buo-2Q&^DBPX3vR{snJ!GETq3y2%z?rNnu?JW2vm08!)vhPDa$GOx?mk=Nd^ixi*`AB;>cc+q{T z?z&5~OS}G3Mg*pMfP*;^I|RzBu^2qBk^|xAp>#BiLi!E0+kPeE-`;M%e0?WT`%>`K znmuCeZ`Kg6t+r4RalBnhrK~UdZ{wDfp3KXY;ze4-g0`=~;M^F9Y3>GDRV${3coPiA z*Tkk1a?>5zkIf_7j&V&UGnRGsQE?t}3w#B)&#Ob#WfMM2(T}!+tb{m)?pO!~8P!c` zE&7bQrJFu79We~5$CsWeo2od)z5yZY)GyDN99d{x@Qjia+y?sh16L#dN= zGX-)1ujkB1gpKzy^*#wNP=CBQ>|rL?+EB zsu?+C_^saKwPV108_#~Il=9u0TnSJf(EOK)?>`+Wk7lJ<&qqpx4AhqWCKKwGJj;}!Sx zVuY08fLZW3MLc~odqm{ zbUSb^EaGnhb*pC@?K$i<`=>{c%(1W97|9>Ui{1Ug>TH_*I&venWyXJ|n<81>=kz%h2V!BC zXt!EOANc*M^xcK%pf>j7IYuULRtp^Bbd%F!ilg*IcNYP+(^DQv7QwdT`t$SyNhxce z?9!3$A~5h^Fi2Jl=Z3yzlAdfwtDID{|2?j(64u88_#?Pt!ctwW6Ik_{EeW>nwSbW1uFDm<1mnf6ycco_YYO?wJ>}k4^1nfg7_toeG`MP*W@bmM&h7Q`A4#x=7N_Et(&a zO#c96U@-7~|C6$m`go%SfHfUn-r#s{=M2YIqs^R^{0v=0bHbt3S7;qkyd}%%5g3*f z$t0nz+t55d?TS*Rkv3EFg%vqb8cr_YlSFpX+JiBw_jA(9AN@Jwp&;7mJiHBlEZPyn*BS>SvV4&FB4lf-2b%+k5^ zQZCZjSIesuQike0`y3G^WqoNY!p}vw2#Cw2ngrCL?FnYJaJGn%CsPle=Y0+@m^{bd zh?YV)WPpv&6PXqKSh!Tbl|x3gC6>?95D*XZz~S8&>@WET1r`09QIuRNoV~0g3a1+% z>N!)`4Kw;kJ8RQz^sn>v-;@kE^l}85%8X@$zsa9wc;D=@GY};MSpE&BCca-s=FZwx zB;zul?PmB3U^<=lou*Q`L9i*bi*E(dIUY%;fPiw48+BG1?|H8q>jE{K(haTS$Vcxi zBEuqD8Q>&9VD4DgyCPWdMrqphV+#2fqr_|aZ^gb{ZJp2J$vXo=&L@DeHeWnqqmpO7 zb+^_fFkq!eH*ii}=uo-y48#g$62EA_pD5;8x+^Eac}e&TtNVb^JO!zXZ!<(G`3k4> z-R3?k9Vju;ggDDNmOX-fD`LrT956&J_7^ZF86BKObgxCQ%#y>WcA#&p9)U{{8pOj~ z{aLsevg!F1OxkFQp4cc}OjR{@@=Gj58r zMKY`L&i5-m&9#uTQh%lD)&LL^=@oQ=NPccZLN>_T0LQgy;))Sf?R#cB#Hwj?pn;6> z0;VPLO#>7+0ydp{eMpLsQy zr#PNw5h?JTW`&I{bu26Vj3DpiT`Yn4a@Lb~ZU?#4U&Q(%!(Z6rJP?U+#7Q!{f8QX| zl@lg`n9ai4Jk(|Fd>#p3D4NuKoy-)zNFF1|&3dBt4&=3xYZ^q@<)f?cDNF&__l{o` z=b=SkgBxo@g0;cWr1RTv0VAH1PwC2%TbB5{5uFkgIirA;$xcBn9POf(`j>(9N$(Kl zFXPdME{Us6eJ{vh646U|`7?14`S0Y+FR9}knMTFl;V2F9uhD9WDR%Ybw{mRRj#iD# zLjK8Nmjkz$A__09-(I+&29kf@iuPN-A_{-{WNhHcmtmd>w#k4>&`J(=>E{HYr(f8h83Hx~P$K)(y#0vtZ*=+k@^dE! z-inY1p=EyO6(S{XedhHJZKNTSXrp};mRHmvn|C2Ylb;IKSA-Y~ zUhY$V-O&-ZHz?uyoX7SC>pYCLL3z?dGf9bzl>pADoj`eE?m`%zTt?mOi(`9Lj!MZnlO z)yYrBmy!dP3Ujzg5Up;<=YC#1fjel{1qa4a6}-jAioHA5cE1vuw_tG=X{t0-G2B8= z^)`qOeWkNFs-?#7#(|C@Nm@?9B5?N?#{@(_R2lg@U^=n?!hYh$%kM3y@q}X*bqc4Q zh_!_eR8fE0FuyVAAHkQ3V_&<`n=G^%fhZ}GQeFT&5BZH>jd?NGObax(BSv`^=5$)s zynwOmO{Q!5HyZ%5x!%_WE`kBr9IT_jZ42xi{58IehRR1&Y2z@EW{niB@t7_;Z1(_}A~z zxws_N@q^ufwezi|q|KD`_(8_pUI66m;#$gj_mlQ^M5p)GdT9bU=8X^VGTunN{o`9o zP7KY#ApXJI9FH^vip5?E*=~)0**!?qSQK{fH0r$*5*3t?M5yg<$N;;i1KxR!N0QdC zP4vEB{pC;mM1zrkG{4!jCLpRBG12mW*|c4n#-C@aCg z2n_SIDyJk+N-DYP1j{0g{`W+hbm4E>zduWxXy{1B`?(rp6kYY7b>J?=+zV0<;7so@ z1!u(8?_9L$88Lyg^}0qhQyo#cVypV2=Nx{NHjF|_k^0PsA_{tMY6AW8Y|IpMRBK*# z3hr+$rPIsha6E1WTl14(Q4%8xCMRAr67cx&DzVBPu zi_GGe&mg5HGovXLlgT0q%Oi(gYwSR2w)I16N6Nv|EvDNIHRZnLZ|X+jZF8Hicutk^ z#!%H~oQilW_pf%^l3q&KM_s;lwcqB8Jha$5A~7cbc1~@ytw40z1-+%VxmjCyD!RT4 z-AE{5=`vDAnFRit=Yrvy}SiXOe+8t?^PfL+r`vD7X|e}NmCf4$Jc zX~+`oPQ8A69jq0Vq{9THQ))=)+b{gpXjDs7^~u^8Z;a<1&fS8r%aH~{i+$9#d;m(N z{-nz>7Gu=M`#ipR<6F&2?@rnd0=CM4y*zT;s<)!zbof^j3sXVX^#W zvUxI7C5%V>m53a7U%6jvcA?;OY;F%8=nqgL)>U(LD9)~uuG9eSR(y^Ef7Zp^K+#m# zfNu^zvuDlT$WAZFB>DNX#lCH*^YQlXeDCr(&rfEn!`DGMNXlG)6{y8NK|jn<``}+U z>OJmcQAt>!9S9FbfAA;?QpH4676KkJA*{b<$YdRsI{F_ z3pvS^ajEt5hl~ojyAQ!)FkaTU#*=_tzu-#o|IkT@+-VXy=iW|)yo+L9^Zx%Wl?Z8Pr5fo)wyD=c32?cNVs9N_{{bBp`Xfs6`r)0-)Bs@2&Kb`2 z<7UC}OxW&%ftkoV*v1&wD)R4pa&=AZ9!zpm8gC$S_ z<$fWkp>`7G-)i%rw?wTKdHz?n_j^x!eB{>EJC&YAeJ6?1>-f$3muQgvl`7e*2v<%8 zCM8E3Pz(6gT#l{FaHnpqL*)63P&O%v+@R9P012kkr6NhDxy7oRu&OMgtK3fO)C6YC ziA@(V)*fP-b{qroIQNt1NfMMkh<%1n+P+SW#Q*j>(j&)qdoNP;*5E6J@vQ^fOFwhJ zMIKChY?#KaVXcQ|$`9Ain56PDHKIY-P0O?Et zlz$R1CykLwI3>>w0q8h-z(89!^B%yMPxn@Y2R^V1ps}PEm9LYlx}B$Mpp&S#SFBh} z)Zqr60KSYPhso9gWNBYec2YinpOK4z9A;75S0^?|!~=ge413{R6seF0b61^?Xf60o zYo=Oy4Uicv+=X1|PsE4Ei?4nPCw#^fkx1n+eShb-;4|^z;dZ3{R;K4ahF&n6N~oywAhn?3ex z&|birJ}NL&mn}jzop(0^obIF*rFAm5u#s01!}*7cv+ha4`INkv?xnR5j&tscbO(#s z>+MoVR7l0Q*AFF+6~(VN>8T=Qm%jh`a?jrCvE@?0Fi2=IFKK2|)eWo<-8HKZ+0kg$ zmZgdy0#1doXi4sDa+NpOF3TpO73|v%B5glU*L@z=NH2>WyS^h-tiAuGo-*7ONWH_s z^^(z!5rQjlq#TL}%^)nmdj-wiQVEyuYa-uf3=mLQzFwa~osvv2zaSK&e z=9fNydJkK)b4ubsTTWY;y>vM+qf;7_6v`k@j3Jg^7cOtpNz6WYucWUc#9C?D;rg{U zkOiSj0;g9~u?g;amynraS>B^l&WjoU$hpgB+gWpMKWhO>-?GT6Kl99 zFz@%Z`@_0i<%}L7xk>AbQ?b_u#VRGW4e5q6&mX`VgQ&67bel0V!PEt4Vst}}SRzgZqVX5#PW*T3>rpK>XLZlR{l)** zL{|3+b-pdTbc{tY9gbhM1*-pV=q;PMpOTf4KqJiM*UfglJg!jPET)0*M zPnncs8H-4KowZG1GV;i>i*n6AYTw>b?QI5?I*T2TMK!dbeDU&$kvp-u2`7rTQ$J3n zUn%2tzmCFyT=OX1Nkr3H{F4_lFaLY5BA*b-oR-hKJ(Xdx<_y3Cg6iU#m1t zv0pbIw#ZDOA#C@F8(*~$K}>BPz7exftnzP)KDadW4M<6FZv8SV2_F~|uo_;-yxGc_ zGJ_%}GCoY~HIbKYlq081(;v0g3$b2InH6$N}sI~%tk_4PfXBe%wE(j^TtX2+sQ7ivl0*d&i8o;ra|N>miP;p+o0 z9#W5w(xm_WSj1ONndg3;!V5@KGw;H&H-^)b(p}8K`39+^flr;dpgO|dCT2e>=j@6V z2{n%;n5e}b4eI1po;l5iMd;-6$U=b-A_2T(y5qMzPp_5mj25RQVH>q7wGO|D((Si> z=^`Oud>R-U3AW)foccrfEjLO)L+S9u#H042CxEvQrTr-5W2X&XmxI%+~s54ZIw3vVvqE|MzY|#%0=Otfxgks zO;9%Z6deiTw<%Pgv@GPY;)l1TVjF{%C1ZA9q`;YQ*r_{lBbW&%tS<{bM{kHDZ`>+yv;RpPD zVrDdz5Mo%Pb$yD8NlEC58-+#peC(Hg!}M#z34+?=6u`&eq{Oh2_H%t-#NX!1Y+;t& z;L6_o9j}v~J2MCg;`m<>PSNhE*}mCbJZ;t;(BhK|#!kpdRH@-by=#+>93=+Gc77LI zA^QHZM5wX{dG#-S^NQ03qFa^CzT$wNo1R`PGMrpZUv6I;E07qd?((R>w^7wa+GSxw zeM@&T^pGf*%Zy9uS2oC&jv~e|JX1~|FE=T*ZIz56w2S5bD7oV4fB*VfPqy2fK4uVX zmB52VAAITwyl9Jf)i!i(Fqk<2{(8Py*icN${Hs{-FJOpy*XRqWx>WjpgdvwJTSOsn z_?wBucT0PH&pv>nV{mjUuY%F=QnEVqMUdBWNeN}xC ztNx{z1N46VJU`3=T-?+y;&gGEPJpTUCaJSXGr#Lq4=6r`K1l;Fli~nIr#^cTFz4Z(_=3w95_W-Wp{EsdEDR6ANZBhbXS+q~iexSE zE%XBuEGuEibUHf2?N2OX>_LMACqI4jo)p6M#u*p&aB3(aFY&XAl-yM`@D~WE6U-p@ zELk;rL0aY6SwEuOe*d~MfyG1o%SV?+nHhAlA8BK{SHq_%^y@^jKy$CJj&F`Gn*4xK zk~f$5#&4T|ChsSg*SquYhLx#f{jM)prT$dr%zF0?w-?S)qd439ciHf#@d=IcwH*G9Tm9-jEiN>l9UR zgm&0QXQEFCT^)1PDbwZqdg9@?u|Bb5MvqgG=u6kMm&Q5o)9jQWiq97WTB1tRz{`0q zwfUS&j?MSA@d`$#w7ZE3Wup2XswBmrMJ&%W@D`}%|Fjtb=mj%0R=MNtUtXg;uYQg< z5Sb^drJNOYb9=3vt={bUUH5M{c!(c#d;uD8LVRX^KLcEmx=S+8Q$O~B_dQ}W{1?vx zk1X$3d>&Gni230DIz5i;UP@l+UP1U^b1B^rjXIHQg^a5-`kXBr`^;a^|2c@AukyPw zme>#QnDxB~XgW(Yem8$H;vVLuA8^gqC{Ou1hLdCC*-RF?W zLe?e6cg$JV+Pd+)h7;+0vI|jdCGO?#nlf2+&`%dPruKmE-zmcJUlF}VYhQ@H?%ciX z^N?8Koj;3fpJ{ZO=Q6%XINuEq^}F-3!fM-T8(T`VJ$p(qo@#lY{fL zZLWKFuZyR2vr1G;Hn~PUyX!PIwq;7Z3`Z>+Xx#W37_>w;Li6kNUcL1A@%4R0+oYaP zMq_nFu^wRp0Ic=hKjr#}L+Yf=BiS?GbCz4$L5<-Rp=JH}U?2_{5d{Fr5lc^TLbJD= zsiLDscMRtTG$_r3 z;I$+pGWxe!@=o`ako@exCS0>M5Hq)t}YGTb9s~2rk`E9~K)b zR(#&87U|iQOH)i46?n8@+l<0(dcPh4Ln!z5SsN-3@n-h;mX&DX|SbQ^ogCwim*Z2jR}{S2{rOxQ#FX5cOxJ!uzmL@3?#)%jlREi^>)$LAdA>gTUi11)wF}+GjVt_L)V_|K zBsN|jvu7N{E6$%vYSm6%M|m_|T*fviHTf&cd=I&t+r65)xoXmt?^`(i+V5t3neKVj z3$)d@LnK%1g7P;V<><16#=4oK>8_4BjL#}hn~WXuBDB6Xo}TrWkb3VJ?y3XRDk@&R zcGss*Zd@!9Pesnx@_)F=X@0s{(JIM*a9PUVUs&zEP4-3ArckI7dw5cBG*+&0%fj}v z?KBerj%D%M6Mr;y_D@yGx=bGTmg`dGux8dqRRu!GEuKBr)|sho;a0BXKdx6Lg@^mXmC5#D#Mrn=FVVC0YUgw> z_S=2@Uh!orUun_K-ucUw)wwejCjNZqDnpC25V9AVo*6YJyH~p<>iO(ZlyjSD#6|fU zdb#;H0n%$KD>)vKT1K4>8km^}k=Fen`<=@h7BOKk7(R z>Ky7M9+V-`$1r6krB}1BU*rzzi=De%xxK>Fu1eN;)^F~$ytvxEX_)hxIZW{w1^Uaf zD*EbfAU(@V)AN_vq|i;-DlhArVzwt!e!qibUS>I;?w&jQVYUCi7Qn4l?wJNidwlvd z$@wEG#gz@~yxT$NMw9T(p%lm9c_Y=gU&Btm6`n$vf^m?uS%lSy1 z?lE-qpcoj^IyWKq8cLkEcT;W9`l(%_b!U6m_%LDPxW(vzRI4^0>g4>>_}d=x*iI{3 zVdYzW|F|9ns$paI#;9S!Z7ps7<|9=umH$KEx64UvnjZ`b5JDHH+ZO}FUyPcrc91+) zTDJnBCLP4aU}WrsDQj$L>FtO`REsIVQU}xKI8Vy9P#I~W^qZYtL8;;UC zE!zwEB_=n|W*;^4z`w194t7@}rrQ3ikbEO=o?gWP#cvOdN`Vy}(kakr=N9?UTKLO^ zaM#yvh35gwu`IX+@ZKllOD;)p6>b5F=M%h|a?kJW?23OYa`VYpc8U%6+`?Jl0y=<~ zJsLJMbsE(lx~f(!_a!=A7qCdGU3pBV!idzont)K4AN9dy3TSxvjK^CQ%!|yjo!fR) z2prk;tS^_OXdKpHH&mlPzPSdprF~FtSMo%+N~S^kot6M+1MfUQT5=2-4czs)21YB_ zv)ENn#!Eb-qid@rqm8O^^isNzYDeA3Go`bCVxkJo;s0KXaV|xN5EkSQqU=_pYcN zItqo@ih_1Q#q|*%-^IF+bL$GR8P@lDq*IW)P_le{qc$n7f@8hOvZ-FB(@ezppfll} zr~>yR!N8(ZOfw7IL(@|cYH)(P$&M=cmw~jc`}|GFQ;dIz{=Wsp`Hk;u%>z;uo*%5gM6rqgllB#uh%l$Ng3+p!Gg}QCx5M^!f17}O; zho8r&Ij^Hgnp@RWy^lk0{)j(1&h?U9Bsq@3*mbXo^gZ<$_1omKEjd4|I>QK?nBT zMg*Vv5`Zb zAC?+|M{DGHGFeZ_rSo;fu1aQE*(s>YYYKpmTfdmIn*EhiLZ{_bV3~U_`j~A&Qz)0c z8CutP67b?x)kL{t=>t%eqSkrM&2f`#OJ?6#{^3EjR>$l4*v6y&Sc8v948QgO763d^ zfnw&6qF}=zb|Cv;17Byb&(q9P21xqO8TgWUuI8_X7)O&t3KV-df}0}BD?44F99i}` zthm7LTMY6Ml*80UChp(rDA9406xu}lrc=eP(fDdn=|=w zqq|W+R8>a!M<%|p5WU{8K0%isRT;Ws3o6oS6wy;%&+R5N2ZORPS2!A+GdM_#xH-ME zwaP0lp!(7I9yBMU3TDR6SLSb33PM|4jv2Fcr2{SRCp;}0mVb12iQwJ?t|MRLS41+= zy1E%dAX)T+PH>h&AFlI6E*8{cfr$$2hg_JSp z<&`Acg6X4SOREkFxwI>yrj0Q#TL9qAkj1|Gh&rm}1mdesHK_xJLGuG3=l+B3SK5F0 zy^{&LCAu6%W^`#DQ|i`&-ww?@NuVA256G9z}(~aWzJB$%H71vag!I>J*GAKpx^A zB^Mc?-4{|wcoG~!Gwhtpt@bDjXg7X6#B(SytQhgbEEB{zS&x#uw@2`C;Ly`uZkH?Q z$~$Y)c)aYC-qU1cacI@Z1RPJLqpn*B(&YjFK&vM`5wy0%ps z+vl|8njJ{%Kz#gL&XE#w(QJ`H%?{r?UPBkU?e6;{O7^cs(s+zcLdc5en114VWKTm@ z5RhG7{@%CW@hIw4XzQtl0;w!ecpu!`Eh;byI;;&oEj++}d{jy^k-(US{F$H%CScj1 z;S%^F{AoF@-34^VxDpg@ZK9+U^lO^k(bkQd_Z3cDe~Pr1_xmAU*xMG=)En!^%`R(! z42ONx@;7N=d^kcDeh479$ue=Ek$(2{i8HL+u1EAN44MFfQ=8WfK-+O^jj@t!8KsB@2{4VaIQN>!Rop zRj8T7v%AVlDY>lp>j91p=0FfiNM&N?f@NDDPshvf2amWW>(PD4UIzIO5RhmKGmlw+ zr=qm`Lgs1r>GylFVrCGXKXWn#-)LJJ+snjW;6+uG42U0}n`@}J3!E_tg72RbHE^Nl z&Cy1@FzOt+WJ!7uzt~ynn zw;P!j{`?VPCF9Ep4*A}++^PZ949lF?MqHt(f<$X2NLf5w68%l;V8)iUS_8r(g3jd9~5=n(BDJ3s$k_i8)3 z0|4}tdff8WTT>{$Xz1uZK=(FZF#3KCUUl9l{J6R4bI5U2}f zc>3o1`^6a+6x}WsK0Fp2%8@ zWQ_~u&!guGTZ=F)O+0xF8c0|d4sgZmBwI0Aw^uWoY|85)mB%G23K{CnHZ1F?Y8B4*c((A$fFKCZMRB_hc;yLtE?#4&bCLF9Zkba}c$ zoUUiWzZnuAWX`IaB#EBrc8bM&3Fi4g-cd%4NkleI88Rt&9rC^I>QayUtQfqU6~3wV zq`7{8{CU>0x)Kht_=#_g_qN?Zi1=;Aj;?m|WZLQMe05aeX+@?pnE+dW(r%9;%+Y?|&RYxM9`Sa>2p zIy8Ca=S^X8w12wdqo6!_%#jhO&F7_wtnhYvLMQb!wc+St`SQI6$$|szmV2ummGl*p z3X61PchY_C)^(kx(7T_NnedWPP(Q2ypRb!-kE)>l$aT9&=Xv;5FpOZ5JdH0Pzy8)} zK=Te!k1&8P2g)xnAyu^wibDOizJDSTTg;676Lk-Y6VK%Vuwf9!8n~=(*Z8g46uI4aMrY$6Iqx^KkEzDq!)S>XEk({Av~c46yc+_Ef*HD0QA zf-2CgTw6Fq8Q+6|Yhgaho*!|lkIFW(8&-8eM=91O3%3xH9P~KCH(A*cf%Q9e>qCl; zjf;Wx^Si$FL{gWj3?U-FetnV#)BtM+D2dVu&$>=a-5hcObdR^wkt8`uA29-FMV<*I z#*s0LEP{HUrJuj^u+Jo`Q&4bko-nga*tk@|k;@%O>GRKc_6dO}u@adj0a@wEur;wW z-vaLS-JRo5bE3iWq{( zLg+E`He;sg5s-{qw#@GO-M~UcS5h0iq~(des>JcpaSjj+;2xV|FfoZPK(v7N125Iq z?`h4PT$Szlr;tuly*27dp#5-XpZ7G12J(517j`57Lp&i|=uO`6r+!8<9H?vp0wYdD zA$VM}57MJ6O1wx+=W0g{-nC2`ga$1AzZPJ&-L^tV2SzB#E8&oQNhKU1{rj_7;$Rm? zw)>Zg{k;K_=OSqp3EXK=Mr)I)XUOM6P_qI#{14!CB#|*+KUow$b#^2*f9rb}oX745 zpUglR0I8TelM*vB9?uKhuOdMwQf%+;lll2Z@+yk5Se)c!Tq)zuObUW+x_A|>jLNNe zGuj+{$v@M}@N-{Pm73*(j26l?bKX+|SJ+BQ z=%4((kO;%iz>ZWqYOEWcOZ0-&M3w$1xpadUWBn8^K^7FeTv{<4mN*NA7X79n4zqYp zY1pLD4xupd$pauA(@= zXa&woD^qFc04`nqCm1Lpq)Mq6K?YI8FL-Y6m|OaZ3}TF*Y(x>Sc8X7tUP%dYCM7CH z;v`AA%ZxepJAWOH_Pq>Jt6IIlbn?^2Gb!UV|n7S52FbsHcAx`Eg?cYS;P()C$v}yvZ-I12Bf;C2PNrs!(n&lU0Wkcr( zvXDG_yAre*2P_ri;qLgFkh@qIu0#L=(NB z6K2ZE1^@9LJY~t6^n|PzB-#>Zfm&nqU)%PN7ll3-PkFTilp;GRn~%r7-4XcC6#4eC z$R8kasa_IWaDH@p=nOUUc*o*uV^BwyzOAzD+Nm;Oa>m-MxAvv*l$gR)qY{Km8H^AN zYp5KU8e@2ca}-Qt$}S40l7gS-yg>M-=Td0g@LXw2UpYSmmJJ#TCaReSs;*~|C5$Xe z+^+^iz@*8bH0NNmm6RRCPhiq*_fD2|T815)9_wWlK`IhrLNuy{Pr?W5uX@Sziq-3> zFBUgHJbRC`(WfKPAUo-8cu;sIM9+&=M%$|AX#lKdA6iTLTF?J;NPEgA6p(+MeI6O} zi$&<>a+fIh9`o?jFAu2eKy%M>##$i~;#>Z;lIJHbZ#5+|DP5&K7u@zch_yC~oXu=a zVfIqObpqrWdHHE_nwZ34oF`_j<6EKiCq&pzY%83!mJ=!G4}uC&#Dmairw8f0;a%sV zCbD;ZvGIxE)cb%JIP$Jqe%ZTrV*r+MRsT7XrL_YOc~_^TKb`;m94r_X>i_6KVv_7ADI zULhuov@XEuK`w7xD=rBk1)dx`ZM?gpNj@2bS2J!E@fq=41&7*$qU|>q@Vbi9mkt!* zIuZe|q#|)d2}rp|d)|YabK*0G-0^PSR;zmu)0zsl^j_`lC)r;CEt}+JhW55Og&!Vi z;+$^RUjt-~V!z&Fue8UxmKBFz%C zbJz{b4GSYncVNv*0vSS)>n{@Ss#gs>Vn^tI2x3&@a&50yy6G^K4wS9}$qEC3EeT_c z@uQzrL+9+15}LXYa~uBqT?oR0YS)xvWs4F2wx?P7N zBLeRO*pU+z z0hEZ1ckSdZeDwxyeQQvM5YX4Xz(&IV8k+f{{6Ylm0!8xZgvmmYaY#zkq8^zYm~Zq! z-!((+yl6x>-KRLPCB$F+9TiGfoh1A`El$g3NJektvf$4x;?PpKoJy^FWiXzO?_uKn z(~aDWQdAEEU}qt>k(TkZpfl9Gzc#QPmjr}LS3wivQ8WvEVQ#o)XL?N5PzJKgMOqUw zq#Ik^@8MbRj&iYF%Qa@sIwW>``od3YhGx(7&2p5JfO-wHsyd+4(;k2^DIbu>^8l2o z6?ld_lNH#T-|ZnEQtt!OTZchax!+}LpdqiJ6Wos@hcG={@hOVK$+$@aT~}!sHPOJ_ zgO+G1C4|F;sod|FB;!88;3xsF?*yo^Wm2CgR;wUDK*2Yqb7}u{VOmECXSeou$i|P9 zIHqxc#FRwtVVT`HcTea&?9|-*_q?G5z-_?PRhLY#nk@bMi0zO*9?VPm^&9P|1q8LI zCQj6N^U|7jTS=LfEf@+k#v$|GdHGWC2M~?GUbYOwkFG40FP9<*6*kyln}8;mL#GE)sO62< z(SB*1u_lq3B`L95-4^SOY%esT1U3ifp6w!CQxHRg!`fY12?J=YVYXAro9|Nrls5r= zU8MbC7H*)aX9}yF<#~e>vkLVIg3T38a~nze`E{F8+M@-PL*gBzA(kRo-vqa&!p^bA zdcJyowYJvK*h;+*;-ZaW1t+wvX>HqG$1SE2`yA%Pf#!TKwz274RZSO-uSSipnyDI{ zPbRIJc71j)06>Q|rNecA@o^t$C6KyokxISKE|jZ>UJq;hZ1GV&p}g`CNeU>LIj8xO zMBpWC)ru@xHB$sk;6O45FCye+v0v$D8(v06XBKDci!CVhd8=4k2aT4F(vplrV{>|q z@To9IZ*a3o6BtuzhEC!iJ{&T#T#JNRVF-v;b{ztPdp0bh_C%<5;@{XEFntn_eD1e$ z#?usrL%R03Swlrf_1L?w0XmCKqto-WN9Spg0LTeoZ!!G6S~`Zu0D$GK2ZrKCf#v`f zdTOMpf9bEUsT6f$7B=sJ8-^^j^${Q2^bJoZ_@>B3xYN)g7d$5E^dhobSLH(%FLt}j znc-E}4|axc(S-+N$5ndM`Ol_b3HC%+vPpQha(q%Ukj~fQqT>DyjM_2sKVUi5DfM*l z$WR&DurJW&5B3^}skpLa?P+OCDiTaSN_hx2+to*94 zL~MqxPZ+$Ga3x$gX+YlCg5*QyklN>$u{HUllLg0}Q3sMLtHa$3+DR&8;BV{MiH-Zg zPDvhf?-b7H0d}`sE**dqw*P9TpY9exl>Xh4{@ej&)uxs2id9rIQ1TB2_(O~@to%-_ zY%kVxzWCnKZGFV&7TK;GHrfx=(Ui%fdf_!SoL-(YRqc1ht>8tlhv;>dSN%Ri)q?+^jC*c^(E(^(dgH9ZW^{-ine)y zGWb>Lj8k_xUR0`XJYg!2;cROOERa`|$Zz~0D63W7J|-d)#FKnvxJ8sNEP|N#}vmdGB4rrrxZt3p5e$do`VU0US&i*T4NPL%WXX z0XQJ`WUu|t#+PCKPnT}7nD>CE-wmCn^ZLfk`aa2vtrjBjt;@rHsly(Atr&p!^f*dG zSm4oPrtPpFTDib zupCuqg^_hRgNOFJessOKJgzia5i^w8Z3@mOt%OPp>tV-wsUwPqYl% zs?R=GDld1uZVsZG!~GIuYm)0Qlsv$^gQ!M{0F&WDm03Uc`^-dkC_5dA6QAQ#OwA2_ z<4sr{q#(#e;s5|(_X#-Eq)|GVa8r)Xq38ioGr=u+lx(enLtNSGHvt=I=V`tyVQwe&!a>z~G#KY>)@Xbr$j?O+In6O2}Kf}>a!78Zlj zbyf)pfy+e4gU5yS-Hhsv^ii;DaTdNEmY!*Fc2m}Xab$Il=VWpBplaT{AoC32@O;rV z<^F{{mBkawPPQh+!Afn;1DdM)#vj=KUkj*@pkZUw6Q)exsm~}Bi{^z#N8<69#b;A| zFkssln!>1|G8J`n{&J_P0H@5QVS)~ocQ`opJYATknsl7)s4juua+F-TG6~5oXRQ@e z8C}#l{@`6bulD+m`%9LuZn)q3%T`oPy@Kp|xt#le`o9@F4zhasd#j>f zd+1Lj&~VA-b_PKV9p+FWKflrZzMKj;zOmR7j~lKbp=cNZ8Ou>jkh7n8C1_oFx{p<3 zBV3k}BmBt08e2f`d18}B`Xj9)cqX!90A3lR!98E8D3XpGdLR=|##LFP;LmszOliBD z^qccIR`GQ=4sRBt9tG7+1KygN^7=!=JQkUgkLssq3>HVCS=xI8?9)~4v`>$gYrr_;?WUky}FtAn;o7)+W2o#0v3X7Q|EL%uAO{d>LvuvF*%&)>9A zQxJ89KF+q6Xy=?NT&_oghjQ;)B*aT@A> zA=i#9F&ZZ#DI9-iZ-8N)qe#C>WDT1g;q+$PM$DaRohNnA`QQYRUsuf4myZ|*)FUQX zB08pKw%=L^&(0WZ(L--3;sBh?4H(dJ^Bx1`^LG8#2tN>ezq+};df_<~nH~U8ZTHbS zecSKI2!UE*jW=ayN8fK#;kp&U70LbuE?o!sCY~I*!(zWnmOfpxC(GLhO&~YU@LIpNn&C=;9z?-Gp*q>h=xot@IuoV*A= zr~@xj?p@i1mEr`6ve~`fNZ-xWT=5+q*g}1k6HOuioc=nU2W|5^oCI2;!Hqn%oK19X z!m8LaSrsSTqQl<_iO10X>{k5-9XLhz6rkK9MBRAy6=yM{)~?FgryO z9BpP?Td`pC*7lO8PRi!HOii+kW^pOV6l~AVT2ue)yoY{kx@Pw~1~C94xwD|m8*$CW zk#T)HxIh__CqFgf)SWaiN2e$G0BExlxqA#WWig@Mxf+vat9YC+*&eWv4MxRfP}UWk z5Lm4h<{Gb9FO<8R56lvTANi;@KIHZ|4Tq5*!HlWI$Ps+Sx<)u<&QJ>WnR<`i0XsPi zRn;uFnAB^y=JG*PQ(VlE;gp0WivGPt= z*~Omke!!+j-&L)e0n%ZQnb-d3B^%-S%V-8!-3o;(2Eb`5M9_N$*t2(CCV@8T*%AG( z5W)>PHlJp6(Gi2tKT!<&_#}cYj(WA8v3bZfTK?9j%OJK-VL(^1VLG}KS3DrS{=sXV zK^&9Bto$N-<%XYkSTPEdG+wSQHZgrksrz^?2fRZP5GC^zQIoqudmx%<$GZgz7Ufmu z5|yCeKAP5>O;H3}5GKMgU0wC8S*or7IWctN2`v)e^_`Y+L!uL&*NX z+ephUFyAHUU5zm$InzmhXy0m^1+i)3Nl7ks>n#Z5R;Sbm))8@vxjYf6^0}aR;=~`X z^w5?hHcy2{dG*jA_0W8GVdn8Br*Yu(IPgrnIY`uC`E*A?yY*X~?X^`*&gIS{Uk;D$@i9P;&2yXNLx29C<(P)2Nmg3L1V zQ=;1x!1Bbt3{+))$|Qqis(7M20eQ3(GRUZWFGbVT5i7UHfgg)qb9=seX>)Y2yX)^JJ!kmti*z$* zRYs~?Wac|Ou+!nKYIa2Qsh}6Cc;+X8!b#lo+<}>x4f>9;P`6>|pB|opDAn(vPjP9& zu#hs^_|KhS7nQwMhL1+RaoW#BVBtLW(`9W`(7Y;C*R2YMiEL7_wC<^(9e}5WRJQoV zL1|G1Yj9FRoSXJ4HUY`#u4l_kk8^lQ_biG6D8ym@_Agk3;MRGo{4CiCD(}KI*%Zjy zz4bf50f!)`1Q$^;nbFi@ zpwwL^Z0gW@Omg15DEcq@xMuQTAkIKL^dcyr0W6%oCn8`z7!soHR!td*=sHM8p4pL9 zRD$B~wk$29jksC~dO#WegqwVU6CrXdX6;XEmbfjBujDg8z?}|kZWw9l!zDVqA?RodS_^?4o#@fa;3 zCD=y98Rn|W4t-^iW@1ojK6Sj-L!)&bKY4|IPZKEL_LLtU^DsLeOv>1l(-DP7Kej~Q zb+77A2U{`}s2Cu^jxAU0}K;$ZeF( z7zJI^k9#Oq5`K7EsmW!WDVB?FtZ=S~vYUng@-`6z(>7lwgN9LfhxoKonz>CJ)CLcr z_=DTR?C;AkP{2$YI^GVOzctqd4b<(`%wwIfUDgjfV;kM-!V-OnnS~P%#)^dzEc#PR22L=qveuuf{oShjDHVChg_n01n>OjSogmL~Cu5LSy<$REgb!TFM}XE8Der zEr;;m7UWm!U-NvWba#U)(X+S4*e&$=)p0%Ea`Oi-TCNdNn?B=*>xjawCu9~^L@!JX zTa*NX{w<&J2QGgN(X)L(WQE9(+2P{HKgFy~cHJ`NN1z10k>H3P5SvMhZaO3!78L;t zs%Rb2+N3^ZdLXF&cL#a)Yh1`Ut6b3GNb}fAydC(!FYjJ*Ohmd}56Fiq>Rx=i;XDtO zlz?zhh9(9k#XlLDk1fVP2}->ylOcSY9GOU1$zz!rLIt3{;9!^mvltII{nP_$SXOn{ zeHqB@i>Bd7*LqjO{_l^S#~>=`V*-lwRy=jY?t??}DtA3y$SbtKsNOOkUzOg{)X3TA zfDQ~P>`2(rK8(crxj(A*q&0omto%W)HtoN!yge5I%Z@aIlR$};AITYPz*s;?Q^32h z2A^XR@SWDVGE*QZ#<^g!CAn)`5oez` zb$_Nz52d^(LH}^5mw?x(2V~|?NK#f-?u$-hNHGam%gXRc{cCQY(U?jHHAF2UD(HRS zRf?6X^;`x&*6)OG)A>uLLCki>8Q9}v% zB4LvzTjIakHZ7k(X6Z;5BzZUfi2Ns@wXT?Kbv9s6Is8FG{6X>t^@g?nBvP7tMJX#e_B(;*z+DxyEYIIL2OObzxWS9HDC1fmo%X%(_1vGw0Fhq z7F6cgdO$EvR++Z1dU`~W{P)S)R5F)7@@Y`)S3Q#;hu%gHd%;Z?MX==}Vl5ZBPmviX zq=zPNYJuN{p?9=j*@D}6VTffOQF}DGD7-C8m)+NTTS-#PVnfEgAay|Q|FwXIANj0* zU55*x6GBjY8Eu*8G7t&i$q*PWM<*M}^HljA0&cyB%Tsw)F#+6$OA9!&uiK?sntd_` zx&WxkcKFjQn!ig5gR}I^h*4kdjw{SJ;OdDuR`R608+vb|alB@UCRqk$oSEo_$hZG~ ziQNPL&->#{g5Nnzb0&cp0NX1-q93KdhpbrbL_JwB z=q*h8&sl&>!&eaT`u^s?Yf84BbRdl#SRDg}Q)DPOcZ@^5b2+?Qu-8#*>DBISKW#aLoSfpr6X! z4tK-yd~;Gef=wdx`BmOOS%BzBjH7JIcyjGePB!N5tqV z2d10AqH1@h*dppC^+^VgQwcT#-3|Zkl(X9MjP-niwrU`et2XCGT|Ej-6T=4!dhE~o z%byy6P#Pm`U^=-_`Wx^O<`qD?M1T5cS-CLMmcU$5Q8=Cw^4Qc(4R`WmV*L{)ne{l6 zfJeo-Y_-`Vtg0-U0}si0Q;N{30Ucfr|J*<(Mk0{$@Q*jg%i!|@PKPWG+=U`s2!r(i zS&}r#;NcYg48`{OU(*85t~Gf&kg~u}DKe=Q@Ud|y(hDfl=f%_+*$^FEZ-^|>Lp2Y^ z?)xqbTuIhUjFe+(w7U0&M2-J*SMpEB_SZ8gD(cHXK3&`oxmxuA9}T>&19ly1w#Ft} zRm*LxX&x%O5c)oI@ksWsmw}!~JRM9LKTsn8xOy|>@Wbh!Cz{f+b;W}%$@t-PLI#&P zwFdVc#oDJMWdQF7vO6Z8&e(7>56qzIsrRD-8zCyD)}0hoOy>P zjn!(}RUXK}{ka&p9r160KVKTNv_91d!*XHH;kX{538La@Wwk_0Q$;1n5V86@Ux3f) zHV}1FNBUo%p9P{LYC6)b>mOSD%~_x*Q?q1{-D@)w*7c`VphIC80jbc40tKuaJahU; zY%cX^R7Zedj;X31=WnR#NM(HTNT!-Iq}jU)WCrNU>+hgsCqDRzt$OCXE&9i@^MFN` zSO6GK;Lc0*D=;tq-|oyx$2=%Z|Ip&|b_2&!lU@3@hewEf@|4DO&IDGmwSNf`4Mcw^ z=?&ucu*Lpsx#o;xKA3DmaQxZlR+#{;6@ir*iuxr{;v$kd*PF#%2A8E(B-Zwn#F}#b zpNh1ZVkCiRi;&dzbZpE#E!+jq!FKzXImtyV_-M zec+EL&9zm6q-L^2e>7`j zw_4^*G}%Wzkt#~ax+nvQr7e&R+oLnHL)ZLUMo0bc>jZ6~v;STO5K8@6Gg`X5fIImx zjn7+3<30!_=Y|MPj~-1aC++3eWO93(4m%L-0BiGJBfa{WwXTs(~_kY=ng`LmKdZPiU-o_aDqK2x>Ka z-cRqrC}V}d^^8RMrxmwhS^mH{mpCTFq90M)cK;W&e}d7_P0!DtsXmr~v%5?*VPH__MC~%NJGs z*03K_%iAdao6|wZLW9q~HYdbe13yY_YG{h;Aj+YrU*!>Xu#r-d=fD%N)cbc(cF*%} zZ#Hy#5$bSX)L;+jQ>RJO9s9EAEYWC7iufdVANaqsDsNN8zhG2&-auzLk%2w{lK8I@ z5yaW(HJbpz%SqhZ^a&KvyE3bbj*8!B271XJ@wcwoDe&e!a^Fk6OpE7RiPz)*XIK0a z-)QkURw_cs$uJ29e-QB6Oz^~18SjBw@+Mhh;=VX_4E$e_-gFR9m>Q-db%)(DslC|P z6cWMb{)B@vM7+dO@JEACVX@`z{?;$aw@?u{le$6&ZOwtCdgww&WpbXNRT=;=5n|GU zuskB7H@%;;@msZp$k_MpKO^ZiXK>;yq`o!(u-%ybhFK|Emrz0p0XG}I!Qk;86 z80Ec4;2d&*luMRKZHPEynJ~J(7VWl)@$VQoCVs8E@&fPG%iJ%0WT&~$X`EF?xu>5Jp{E6q%n0C zg)h93JDQqr36R~E;eI}U@1IgshkfLbk92?0N||W#)XI|<^_Dz%GH590g_IP09yIex zr{xajKbKxjWxEh@29#n2U_FoRt%b~RcG8Np>!H=X@kq+sOQ4$IQgN;t5 z8v&&R2|)~CfFRu=Eu~0FO8M*q^ZPu1#Pf^S#oM!U?sLcMj#DdPX3hq`kwmTbpeca9 z5pZPRNjq35mGyCTkzyIkT*3{*6h5rFEt|^&J(#6mYR_&eV1!{n>^P20&g4<~5Li zb4Gx4fk;w%#|a^MD9)LUN^za{k(3-j8zWyud4W#;0dlq;n`QWTX>)#d{UMLL_oZEXw_r zPtv*gFr>ySIj_&0nHB~?4Kfg z^1|FAqm2B*dgdP?MB@r^?fLR!GP(t<>+jw+nEXIVj;mFM9%=n+!D2a;65-g4^4l*% z3xf^ZhkYBcZN%}#+K>h_hSm_wthr3bBt^n_kx{Y}@}<#)f$hGrQR}~{sK6Lrr!5bV ze}BWH3^kxT+N7y*H)F$i+Tiw8w#l%kgj}}u(O}vFttJS2`eld z1W#27*p@TYM5x5T<~i2}1|WLqgkI6ux($$T2_SEq7e-4(c^+Y0S#qP@rvJ-nW|7W7 z8%2Pq`#dqjoZsXR>iwn{7#*7gE!bo#XY~F>->TgOI;%J0!W5Gtt7HJ6$JQdNwa;3< z6OHf>vHXJt@cXM8nNg=LQ4|B`DaHBz*F3G1GRQlOV%d*HYk6x*Kf%v&Mr{645IIIY zC>`p^!3VMb`@Ko?^9HgUUStw0dXvs&@_6NwHqnOvkoM=!oZM!0vSc8zKtLKFFvHHglz$%|CAiF$C}Z%z{$Z-) z5)ME2c0RH>v;So*qXI^#EMt0ufcmt@{qnZ``fnnTS^v1&IShCgN&EE5s|HwcH#)C%z614w*MBf8oLl&|QlKuOTqtzW* z;L{xPkMA?Y2vNo7zweu^^!)FW)Ng+4;sSw};KW=1rc;gZX&(63fJJjs0oZq^q3eGi zfN!4ijLZPv{cnY#_fI3exuYT=?FZ#@BUO+p<8C{}It*pkm&1YWngM=Rdt-aqIqY3Hv~N zhKVH5bvNv;aYy&0oKZ|Q6X6&U{acj^~WID^0%e`6Pdjx zrdEPBmUIP-%0?y&L}65mkj0$%A0HK(sQ-V*|B2*39{<0rz{skHT8+mbm8d`arEDgl z(1C1W0x>da%J_4(K=*p! z!f`B|MxQPQ6C>E$c@G|TQ(;%A(%21reI2KSG5)tin`!TDxQ-qoBnA7a7fg8tyz4O{ zts>pdGVgsYReqV%Zc?MBKL@~QfUkX9^x~QJ_l=nq|9s^;uJ_qu=`l8MZ~L`%@sP@g z7fR!soqXaMXL#!pwvHi9r8Ga}b`EEf)Z+STD5sVXa@UOOw)Y_BfAL>tUhU5mvcI4x zKgp|D*^aKq!0?0APxw7tk*V#pfme@Mlhu^}tud$tRJ?xp=Jl4|fz@ES`dzlGbY(}` zvt<~j!w2YxcajY3h3QIPu+&S}2r~e0)Gs<`hwLxEoWa^$Mt`yoW6C4S@5s`B^5>6Cv=%0-LAjnLboJ{Hjkess?xUpk< zQjmiHH@Xkf!nAq!I`ECP3mg0nWh(v-NT5{faTJMW@*Ev=zL`-L1xghgy&2e@3;u@R z(m)c^OR%tXvKy3$1h*UGX^HsTMizvhkRVXx=gKdLiF-p7P<_fcmB{w|0zFcN3=P1SG zWX!&M?C0aLS8-$dK2Vpx-!W98ZVkmOzw~84RG;sJ58CDTy*%*#=wr6h{9Fi?U#WhB z<2>|atC2piGCw)Sh1Z~fK^;wS9`-xB$09fUc{|Z*n9K;_DS6M7wESLV??Zk%gxH~9 z@bcDmfic;G{py2W@DlaQyEEH3Nz*jKt52V;G7Ws=R1wB>pe)D;VM6$S9*~sv-RV{7 zFGl{r6{zD584&#N{H9LlF1zMQu{u|CUtP6`-dCDm+K@79?cvifm7}M7M5cmj{Wl_U z=Z`1Q>0v&(8d!ns*=NSmYR&eEg|l>qK98rp=1Vf^%VB|t+*hR!LNB?VK_cu0a|)`t z^#Qkq2xdfLZj>MgR|ck~aTklhzbEMFyEKZ83yz8v$}z3?IX4BSbVVni1YIX>7`Dd=U-1?_17pw+Py{2oSjlWLig zDJ*n6O6sxcwvlHnWO(3MUXt)|MJem7&bIcE;IE7q1kO=*qSwOfsrtb{xhm?c{zi@Y z=w6oTk2&ykaA|HFtFX_s?a>72+D5XtE*~bR<+so-ae`BhKcsBTz#29-b67=6x8b4F zB!h?xG3f5b z3{49UWoh@w%F(4J%I(`b4pwp{c=hyK8@I@%sqCxzM?>#;d~S>f5ycB~h_zli#JQh; zrGKH86HaRF7z@b<*OXwC4Z8VG%FkRHR>@v_?q&C~KAdZiMtaF!7BEvZlR5gzrkC+O#N7VP+Hh{3G}W%|Kf=zJy}GKlBEedE}Gm@qUEUZP5VuKNI_@l%v$N z)pO%&=Ib@O^A3mXWFMVLtWN0yr^W!+>Y{eg}$KFb^tOS`V`BjVjza_Wj-PNzC?^aqeNj&J*fdMxV?B@@%0eH_N9FmcJ_s2!~48 zF6c({(BfMlnO-nm5WTX;-!!-geJqsDPmSKT;A()%UWPE-cz<<2OXl}32iwcv!%H-l z9O;)FV;AXUBYljXlXoqDvDI9KF=C)hEwYA0NkRip0)^A3giYY(a_{8(5Y^!GprPg` z<||dVz5OJ?UjYPW+8Wm?|3ME=q78>c346mn?BL^V|L8Z~^0X|C2UaO>3)`dXoe7u^cWc?d9_>N~FsnUC(kA#%F-^@KUC;vVyF`#nRvn zH6>Uz+erq=ud{ZbMOkLT_awn?razb+rwvGMj5pOI)V&}5%uVt^?U;C)#**ln>i#z! zmE7L}sg+o>Q;NVTQOD_l8xneqRPhWvcw67V32-*p!__$wE1tQ9dOpr9O#kVP%-Uy{ zx5*lpX3y3*vd_9`9rl~HPk2SdaTr1Zm zmQ|fokw#5Ow*Wj%_WKeREC~+Pb_o(t%D&NYcb;!8@_s#~Mez83_lWSIO8Jd_wd^9; zAft@-w@5Etgc7G`UYsZ}XmL@r9mR-#NxlbwV!IjEKeFr>eRagvTDV9wZg(G@I6mZv zHe-+K&f&+Rl;xALxRvC0SEWau!IBpDMBLw{|K}C$>1=Yf_4pn`;lEk{Nl8S`Zn&NLlAcW)h3?&EdH0*L@?B0AROZl*-w zDr~!7PxBhB-kL)GT7GLrMgwc5{7^ErnYcjM+y0f9dudjLdR9z-oic>5@C^A2NkI^`zutwev`M1S+|n__PWmR(Mk z=p+}a7L7W8Thglo-*w#3ILTPClo}&V9+PeMHWa;Whh2G*?!90*7Vty5|59)da9i>$ z*VwV_q2O~Snzv2Xl`6t0_4L$hwp2;ZxS?MM#J_)#yi_F(lcj_-VF77S;Ih*P@nbcT zIxnil2L!LuADl6VnkdYzTO&*^)tEI_YVxm@#M1j)kK=1*jfKA^Rp;M>t?l(Uwb)_o zIABiCn7TI!+W@}APgcI|Rkq&C3Vr7`UIFwl=#Si+Aj1B#=Mmfc0kno4v|+cm6;nc% z;PRT(;pwFOv-$29%@04K_+{>iMa4JMILfEF zK_lKjqHsu$^+)3-+CDlB~3o|%G$*aZIV$OFk2k{@@EIJ3^h|^!%iuXg8W5~ zCm+9NC$J7G05_}=^JmwK2f}vZhg=-%k4u&&gO{|}Yll~ccyhj z)UVLVSpSv<@hEIv0)Zxr2D_$T;u#{}ux+&ZdjY-; zsZRvOilV{~tSC8*BOjB#_OI~Y)57^HkC%lve+NcmB9xtCQxWELGMixgel?TVakDbx zTG43SSG@*?RPjVs?FVFr_f@9QvKMHlzKy-l1wLc4Yiz z$s7I`Ap^cE4pN7w|S zZT6QrJ9KK5GX<{jXW_%F4z>)V@pp?w8EHKyy<41JN9$H=Pa;NpGg3KMuanU%d?aa& zhc%2-zrB%&s0K~|_qu8HsjYeUj8WUBgbB3qkVAxN=G)+&n%S&_VrL0pS?F5 zpD;3!1DQa(Zs1wgY3ZJwT5B z&PB;fh(PPbhba0CwVD2CCKoER5MBe}+a(rzFiuDAdN*(C2W)%BG)gNi$QQ?R-ZOf# z`=a!9489m@M+mk0Gq{HBS|e#A2Ws0%6Nq)FD1RNbQhX=CQBA;&-D~nEx}2%ksMB$k z5FSv=f{Xh;@gvyBH|nHJL5;d;Y`7vesc$fdM|aQ*FldZ7@@`^_;x^a}Z{RoAVcRE4 zHJmDwCJ)->(k;?x(Z3>!#<{~}=K_4%!aX+qwO>LIaF^>iQB55L($b=M6&yyVQ3V`0 zkq6L_&5;vPt5{}^9o4>-MVvau-nPz7;*+BGR+9rmfd*?HHIC7d1Vh(xF*Vy4{MQkQ z6+*GZj+Htm$xF=pZP<*ERNUCMRvS;*en&AfYQV7vpfBrET4{tu8ve&dPBK^45t2)D zrs{ZPNc|rssXd#k|JFzh(5Z}|ua#;zFR@jLBLMD%v)0;};f%9|Qh(mI_tDp~dV~fu zWa~1lIdgd!OL4LGnu5dbKf1l$(@VE%(#`z8te~%Sc$qO0;<70fv_wb=nNZN%X8e5g z^t}ToO50)T@JFF3|E^x{3S(D8S7`{Dr&?Xp1mIiL^$M_`(>xCRV@bs3+-q-|XkbW& zbw+6s5o4xNZqK}_8n&|aw^N(8Mv_Zqr+l0c-;q0}%)ReH>$XJSr^A)LJ-|0HmC6MJ z?GSeS9M#0-|AFL>p7(Ncjum3XIIpaCCyGQ&=(5H64e)S2QbK${u)(v9+y^Rjl7URc zw*hjb=`;5?))T(J5o?4aOV?_VwCT~biBy99qc>3%u;ardRqA#{eIbtv$kuua?D|fdvNnq?F1#YU*?X2B+MpJMQ0O=3Tnw){ zwp!QQr$k@?We=Wp=7lJz!8QYzAno$L0^A6>A_uWG)N`dyujn-Q%HEd!zRxyh`c+0* zzqF6!t)YjU}WG>%IDoD9({Ld)={GGW^ zwPxbY5naZ*{`Z+F)zrr@z3o(!UtjNd)g)-p4>#+Shdunt&Z-&OBRrxx8NEP=mshE{ z>p&z7ZtekC_^sqWWny-7U!cF>r~ScD!=L`)597N(rqC1t$ho_H_!ckv%h_Ry|h)=;}~ zIDO-y@BXdwHkl>=1>L~Y#ZJe8l~(q&++dCCB7mO#JBd0;)8_v zzX~_j{oZCU(B|tde_Zo9PBzu>6Uj*FBUCgh>*xo`{mKv9{rmjEfjD*E&o^e%WO9lQV{`{M5s7u+HU334DNb25C?t)+%O`4SlvKCm# z4<4JcDo*qWk;xQJ^0Ei7A6AS|x$Iqt6(=dTOV%uTNWz41Yt)^G4sS68f_GuAR-S#D zL!S>pV{3R$THN{)1}h)19-)wO8+}@kTs1`IHf;^61GnQLn(^C*Z4Sja-Aik3N<;GP zTLREn9EzFq(!U;e3GN090-z4_cMeU)DR=_B_LtY{Ro0}R#M|deJ{7xNqtN-jrbM^z zO=bH_#~|UzfT4346cqsF_)nr&F*;RVUI13vZn5qqS8CCu;GKjB3ScL{<{lWBo105V z69M#hw*1qQe_3%cdG0TDAmwNDR{BSl5Khu-8)Bp!)2~Y;Uq7k^4fQpgAG2&u+c7j> zHaQg6Us9M5+TX&{Zk*?KuJldk07-e#)R5$%PmMQ{zG{7zxQ=|~wa&40HzUm;S?SxJl(2;-=$e`1k213GpJ5TRrW5PBiv1++XqERn`l;vE8(CV! z2Z8Ot#i+SpesycHyUgP{^Ajqqmj`s3-30R9Kvo^AQ!}T=xkjm8@myuZA^1((4TWc8 z!k=CCcIn_rCTvm^cyH=)jlGxV?#IDE(=ND>eZRWX1mCk3qhozp7Fxz9&GCOO-uc(Z zk}=^Usd`~^f?&)<&q{(fwc#UJcLnh?iVL5FZwlxMM#3~DVP-%csql8$L6$a_Vd?wmDp6MsGy6kD$!G3H< z)VnjD7ES#Er4QGH)5LEJlz?W!Nnw>?xa#m<^470Z2= zBDofIEh*k(V~5~E&Rz>tE(p{$jg-4+FUZhRSF$NxFk9gw4LndU@|Rzm^oU1X+s&Cs zFbyd}kGxJgREjt|yDNky`mPy+8Sro7J<_}tg5QpXZ`L-=hJzTbVY>WrF?==uY5_Q( zsosD$%HJ3~GAec%pd5)Ax}q*#xw3JPI1RX>0G21Sa0VgFN$Pv_u;mR%Ziwf4F1oox z^6WO=ePE>5(BLCFsT~4Fs2d&uVvwBxOJ(D)_95rfCN4|H{3Ch&*45|13shc0uNa(J zxa$w@9FmnwA~oGn-a|0-<|G-C4XIJDqnkOb3Ck(qzbk7;7BX`>9Dl~g+ieT~9;aX| zzeI=4FPr3T_Sq}NbZy#U?J5wY`?5D%vHYnYzrg1|=5_narLg8`z~4)+WWdIv&E^-3 z-VdDNbXz;G{$7-oBOMGW=w#5_Q_zG76U@rq(qNm!?`9sB+t5F`wzOkQ%gHidQ$UMtM+_2-3C~VSUb+&IJ$kewnLm6V1so1!C(&cVG@2lmMJ1)Zu1|P4P>cIx)~Nl%xbM`aI-fROv@3FfoR zhvE3k4S3;5)s0X)>|GXr8Ma936WI-W>=fJA#K068*ioamLacNFdtMS78`uxgwhzP^ z68yxN-=WaYfx6KK!?!{30A*-@gISn4Jsi%xskwijI?~RIQ2@#uh@D^(0S5;nXg96d zjhh?2NzpfCFT~{KYw(yMU(OwR6LJ1FoECkz*ko!hmhv0lLy>ECfE`r{Q1qw3(9Vjs z!Ot3S5t`qB655Zr2_a1MBDe9rr!NsIT73=AfG+*PHPH&8wcYr+vh||u;H|R+-x-3l zC7SAwpwEU4E^t>D;Y*6re|O_eL*c*6pa%C6yVvRAttt(}V%(eSZ3RsC8gO-&< z&xs98up1E)%e2$up4@TDT+sSxLZ6cqQA-d1Oo#_J9Sm(4*Y&Xk_%0RFZicn7VCRNC zBboLp<05LyDbe}R)*_YfF{#YkqpijUmhWtNdddRMTx}vXPF-%cfqY8z1CUS=8oYk^ z^N*B8FF{BG-dSU}bun|Ij7}qN33#*U{qk7%g~jj$u5~D23gR z4QvNi;croP|>g$9xYyBhFr{AT4rLB7VBEjh-uMS>8eh zuY$kr0qr5tQDG;?H>Mq2!RWoXL?jBigLi~)(-_<#y7{D_6GBYm)m7GN@)ad5us#Vs zHTcNvqth-JUr9Jj5E|zttVQvF=Gh>Am;X};A#xEfd--;Stgup2ppJ0WLaZg9zVM;# zjnT+FNGgO@p`E6?-S8?yUZYBbBGe>c(SaM1hGQeMfs};hQGxz`x)m0%(K>yvefKI= z-kX<$H~N)C6EW~etW;tjK+p@5p}Fzs2Y!DuNb~Eps1=8jS_VO2)%M5V{?u6WmqV%X zHhc@04?z~<{dVSib72nS-RrYys&TTW<}iCf}0IkS{JA zR_i1t6cEWK_v8_u|4GnBgDz4-cq{=reOXYraR8tOe7w(h+>p6 z*}y;6^5#X_rquDb;L3}E3}dT$$I9R4-*T@$u;-R_(nfPb^S(%fktm99Fd5px7L;Hh z#boV`j_1F83GETIbA6qe&DycHkE>69eAsNl`+K68`}D1I>|eo;=c0NH`kJqWvT(i( zwAscxe!XNYykh8RTNw=_mTwL+wu;X$lqFdV8J;ZL6b&O~V;xI4^l6irTLd4aDsA}ri4aY{9ZQ5D3?C=upH#=-+@)zbLjxpI`mbKM_3q}!g}8#5r|D{yKrE~2#<)S zg`>DnHEu5%0PsG7qnCQczlL{#G;T}PY5)BCxoUiNe&Mk7msAIL?(11DN}VX2mUCB+ zxkl?BuM@}!miDN>!6E^6n(Df39mX;z9ap-l*WSoK;L_U*wwH(H>jGPqEKZVdZ%c@9 z<8LqbX2uJLa=}=zXeZv7e6czp;gfT8{e0x&q1n^d81hAdOY>s(bJJm5|_?`uST>pBK!sWJZJB72F0xmnb-z8^(jijShK%jU} z@EkB$I^idg9EBIZfVF2LwUST1#R_kjhbe9%}L(Q)tZRz$%nSbN5 zEe%rJ{8Pi@)99%w({KF0H1&%tm4{DVje8c(zS=jRea%>Ag~rsM1*i3g1qIr(3}uf} z2pW!wYBHI$=4yj#OQ8uJ9(&**;`4Srb$m1K>FopD>`X?1>-S1yn~niEw8NY(h}r8H>+g_uyxmyBE7<+9@lBN`#|kxee^ordg-dI zmKJg=T*RZT6rb7KYuRd2r>4bK2HM2_L4$r>e}$67dsy1N*?CypLLMQ6f*l{Itj*lkMmIub0j0n*Hj7AukaMcc8 z4~mI#x?4aTd+-NFfV8tGM0x}!I-UMd#{J?6S3n5y16nZDe;lPhl(4JKuhPbI5q$ck z@DAScOgW0%q-x)<84GX2G{WgL{66plF*Xl&F8tY5pH}UnWKvpCS+n$$TQwDxu>AQG zl>{DAV24dSK&Ve7*B-P$fPp02nGaBl)cXRZ&`u^6kpz4vdbo)Go*@CF;XNtwkYGK% z`vSR6I-QjKuET-^Dg$jU_JW)oJz@Xf@lWe!-+ zJ?=aOg#X_$SJbfolVv~tn_5L&sp;Kj3SwIwd`WA7I0amS6p;X(NB$ItIM+^p57>TU zC9tUgof5J8P^l<4^uPxF0A1eKMj7>nJ1cD?1St1u&K)<^`^X6OU*-IF^Tv9alDW)A9g5kpU;G27+D%hLV8B|)ma3e z?Caz>*Y}emW*s5?jD@??e{{%?pKq-Ks(^X!Lz_5MLO#iaPb8NSQffahCgP277y%r*p zegkKj%~{V>v!x9bS%B~5-@5eBxK^#*?}b;b9;BU8^cRYaIGE_dP@q5jF6SLHh!OpH zpplKKORc(_wj_nj`R|R4TosXmVdtG~Eaii)qKX`XQy4aQr-$4M;y3RK@!)ygteSvW z?)AKhRV+*7)ZpmM)It+3qDOw0?$ECHfiXEF^~+DL_+!G4)V!I4{l2?(LG&tp+?N}< z{qS+|J>>VDYjb+av_?|;$o3t=srSDqS+yMIe6ihr5Y@D$@{4+kDSGBc#E|o zHey9mGBV=0s6~4s+i@#Nk%K8#of6uzke&WDTQ>o6W z)cPkxg{O`;Xa4DQ7SgF>840k-{WK-wM~fJnOvw+661(Q5&g62%me!TgX295z6Y{<@ ztWjvQ_<6zkWUS1oDL1z_^RFkF&fTbQ29P~z!dz(Bm+x-XUz(QFHWoVS-ylN`*G`fU zw?@;d4H2WJg3+vUtS^#&M zO2gy9pwNCZyJ1v<3U#Lqz>1pRBIjw*9XxYj!TWE*@em8#FfVn33t z()Vee#qjQrB}FuEN?->tknR@^NrNL%FJgNf7P~#g2Ac(DAR=95;4CDuX6eo+LmIe3dNUk^Fw7Vv!KBZH4!3xsH_V zxOtI&-_zn-ozjcyA=#Iiyg$VfyMScFG0&*lhD;k}mpP7H7k*h?NIs7-Hc|hj*Za^j zL{A$R$Z>}xaXyfemW~wVzonLe(bqU+|M*&`yT}-j+styK!Ri<)QDxsKza-Y>)Lb43ZCID$F8+PW&aIo&2TYbi~z@&LGU6Pip# zTSZ4$X~F~u9w!SJFE7)10!0;UE`ZSHLSY0rU(DnW85Wsg%{I#)Tq-jh+lzg!~MGR(=VECRU z*M8GX<9*{(S{jnzwcPm~@@9bTqlT?8c{{#5b9du=$XP+;*fEnEf9>khTP z9{-{QNWPsFH%D)nU;^)ot9e#Z@B{bwAMbmaSm7QdRD1Wnh7OX23tY(ZY;~5mbn=?; zjKHIfWG(QKedrf&rk?TUB9?OwD~kNbq#oF|X^rE)t97+}M{%vNjVeD#7gF(`RSG#v zyov8Fq`Qe=W33oOciDk7uQ^I9H3J&i}ew}l8iHC8~c1LD1J+AH#|yiD($+W zlU-@S<5~_Sd zK1umsNyD|wJ?kXMbZkb{`LRss7vT{%ee$XR5EKg1F)ZP0UQvPGA>Mghm>6LNZ1^?g z6+ZYriUAa9>EYaonA!0%1Wa&#og0e9lB8S}@%e$JH%=k+6?vOC#B>>Uo3^I8cQ`s~ z;Fc&q?qT^LsBVu6KUjWz?`GVJ9lxz5kB{y5$C#hX#hJ&-=HZ(gkaUP9fb0Y-_rK!u zZ^W$C3DxTlduJ2|xV&;85EnSXyU1V_5*fw{=OavR|BQEs-vw}Vyjx~`m;6g(M9r*c zouj260Ou(Pi84l9%S_WEEU2xe1wUm3Ea+b8YKZ}9uD+-Qx?uHZaBW9$P0dJIoD?oX!kxa z?(zu_IW~JM=nT@ugeuv)7*wEdfsIh)qowrzntVJ$0zg%tu<%Dt2{f48fS#D@yZ8Qr zF0cu0_!KR?`+SbG*m`RAquy|6MxpoANW0&7lUQ4LD=)hGFq`)ne4Jq2!SN$dW1M5R z?C+Ws`wBH5aP4R49sL#5EpT_64-u`A*r~~g11LW_Ds8Sq*Zw;9(jKmM-YYnBJ0EbV zHF+=2(b{&HgHK;kH(Ka1MCTQl)2z~vT>vgAX6A35jg9y;QA7ib4Ejvb?oRCo6-tQT3_4TE{rr5~9rUUHzF2aHLh|&T zr(P`e1sNx;_!gxE!INq|w({PtvVxQ&gA343Zi72#oSb(>5@(8s7$hvKGr zGmij(csUJ@xOl#hjHDxwI6VO1&h0#BDOkc>Z$L6%M*Y@N?5=2C65;u{TNj%%iDpi75IraV+~z&pwciX4VUn)f6&n z!cQF*mQr)@o$gUJ(!&k($PXr?f1kI<4KPwupHK?UQv!SnPn4qaaK4j+3jHcQNkaMF z&XDX<{%XXg<~hzJLB{oxFYTuAQ9>BmUNGbAPVCB;TeEzEa4}}b4%?}zSKd_Hu-`gm zZ2;Ea3>U6??t2^29Z~|H4kg*>?SfPy_ny4yPjPosD&Y=XO~B(eIjr^MM?R`J+NSWL zw&)CZQe2Y8mM*xAjDNTr+I7qA!v#1qS2Kp~DTEYQ9*lU5N_G_wi#pBkO2Vu<#BRzS zFOj;`o-OuI9^X&GkE5H5l5!?b2UpQq@!KdtKfxr}{jw1edvN4!Jh|3an>O3>_yW-L zpdBg6KY1b~*a2MK@ll19`)`KC6^%2CHf?4o*Ilby@aY0neF`sk!*Jp>w~9`_M(r6+ z$L>ZDFH$+LgAhlM0UmWepadt$XBrb8 zBqtT-IDc#*x;bxrA`kVxXL39$aZvXZ<|hY>$AObWQ1}=2RhelK+({%P-Qp(?fYT7;@j@TuKR7WL=3=qqZHXGYX? z{Kv76=|qc|pNeii;*^SvXtS_Op7-S?#!mkzN{aWrQZZ}Z=A!4}k))6ikl$5$u|p77 zhpX-Jy=~FQL}!|#y{na3C#0XI90}-u^>peYmei7y%1fHC@6ej1rwWr&nh-j_yQ9;k zuxO`7OSt>x248gM*Q??9q7x*~@sDP^#<3Tpry_$U^dlxmtXEx%z3Ccq-Fa8Fnl1P4 za+_?HP5V5RByZBKh#VjXnY$m>pDZwYI^r~zG!dD?_XU7 zMtZp;Z~VR4EdSgGh=3Uh-lVX!Wt-W5n~0BE>Zx`8xC>{DiE2zz|1YxRLBieB*2G)|8;E_gLo@*W zxUL|;Y0j$o7Kt(^E;auJkn^+|6vZZ&a;>1%K@I-Sl9Ly` zLPm_uX{WcSXVc=~~ zZTZfxb}u}%TD{IHcoyml$8``T0qA98@*JB$CjJYqIK!KD3nQMblY9;M88eb4cD{PnmMQ@&xkYWW2R?MT zG*#3u`oWxP(7d~zETl9%2tppETVtuNfTo~l$@oVy2C;O$GQNEF za>+lS?Nq-{Z`c~3qF-ApuqH+0XfzvX}1(Bd*q&ZMUBRvXNI$fR^^tqE@{f>j8Za9&phZvHVUn*{mbJAtQxD z;-fX_)L*ox?Dx}Qf6-}u?G)SEWc=9mK7kCyEYSRg|;28u!T`qW>lIiG~3X1;|k= zzGzLL6Nrlnj5Ie{HizCs@2TTYFLSBa?+hp@=^mUPbuW#f1FsTm zo9rcMc5Hx8VSv7K8z2`u{K{=w`q($}y_iH1DSy6SkH`bk-ip^gt;0+^@(*n1zt6HvjNx8XXpDevaJR8RnmkMeeu3m$TNB}1CPH6RWp&x;F}iUgBkyrY zvD5Cvagx4;H`sF}cyNs}`}Q}a5$CJMyno!M0{7J;e<1vsGkKrL53DF)&=sF#h)W=qY$d-(w z=`wE*a$++V6qR-THZp(K37nHJ`F%` zjTrc#@=y_al~(e8hf06ABV12bGLh=F%W&ot0wQ=Tyq*w-eJ)wqE9nXYu%Mlrg|BX< zeMu)F(@z+PSyA38({jR?d?`YfIYQb zaPQz`GVb_}F}v>0mX^?2<}{0v{ZjJlB{<5iArJ8Jgth`|hQgsWSC>~#{G+w?9Gtq$?$$e@1{)v=Nv?o`Tg1nfAP-gm8u@GU1 z*En&O9lx8>ZdgQ`5mHK*MT8)DK>i?hxOghHf-0}Wf2yES+pd}G=ckH=XlUyjlH4}r zdtZ|YGp#7s_`i`k1^=g}s|<^>>$>ES14F}511KONEg>~SN;e47h(m{@G&4hspdcmE z-CfctN{4i#NVhcK`1pQ*?_cLS_c?p7z1G_Ms5kf1r-x=*SWf&_uhKGy8VB9+?SA>6 z)n?9Pxi@>2hg44ZqPQZAp}AWg>^M%oN;(}&V|!!j@D@5+!|2!0GxWAolL>%{>n7iu zmI>($=@3>Ojn9gGoq0aS7}9YyXlMCxDfQu~mh_YN`l%oJ3{_LyLuUaeFQbhdFvW!9 zmW%~&F6LhTp=V})zlx6K0oGYxx&EmG6_b?IzurN&eZ_%&yU?#fSrY;5UC+?*TqzM< zQ|OwdQpcwK;YGr=(C6Y0b|xKSu1E-7<8f)mj%7fMf$vB~%1P>6A&wb)_Cc)Kwx9Od zpc(RbR7Fu{0VQyhY%61WRlvACj*h{ECCWq>K4eq|z83MYU+X3lJDm;l`e|1(D;?$~ zcv{BxvJw3je~G1jl>#5Cl4!Aa{gm9wlkO%5S20g?M5DSK8(tT+p00=$X9%mpp2#4Ts&l*!SM;Zp)-TU+nMj#0X` zna>*7Ukwv-Znui_%F{EvNtYwAZeCWiG2)GHk@y&WQz8;ioW`_cd2;^k0guh)^FEkc zLo(Bo*OmYB?;y9-pWd^ygykr-w=-8O z1(=@``*sIpM2!6*=dx?tCoYCZ)5(qYHC1MjQQ?ba8R9t@vCsRc*G98WeYkm#1-}4@ z9NK-a6&hXmV^MXaTZ6VH|LPLYR;jJ$^S{3uFzO#b5!cJZ$AGDgw$I)ZkSgxnm)V?$G*zkKvAH5Fy3n&`+qkUs(0Z;;^TXaz~-ZNbVd?agb88&&4{ zgjQWe(0q)eVW%za{+*hhAcj#(gvSpQ1(A~hi{3wo7-Sm$Ei>**#dgrGm9`1%Z`9Y8 ziOey2j|oV7f2{8GaQ@!H$*9GuN(28qBSMi9M?fII2de`h_?H9(TGFGIeBRteEzfpt!4@JPS0E z!AidR5&8`1-n0h^EQ~)Xa`;Hj__wHk zD0uUSnMlox*YL5KV)|`RZMSyGsvWlvE%o$mJLdm>lVQ?CW~!nI;rWpG4wVD--AI;{we_Q;;KtMUgHb8iW{YV4Uee)q3# z&S6wU4YBzCONrzUGgxGsst$FHuQ9&9oLW*HTmBd8?#jz?yPAZJavDe;=XDy^QnG|- z(R|0K88`G(L(8G)F4Lbbd7162!$l8tk9^&>0%Kx6pelhm2sr=citlB;j%YGOgq` z##S=-bAUrx{rRi6@WB)l2yia+rwylZM}x2iV#T?V!G!&a?nAsEuMlrXsz^3~5;@rSO}lbb zz(dtRT_Qix6=Xn0qg_wNm#BJ4fUFaq3TSuIg4ARe|USUY$9jrXHrwDNf!a>Cz>&>+aoxLegN7 zB7@IzuLS z2;l+B7B~otq>ijWQb92fdenl=g$dy-jL36Jseiq3N%&2^U4estf$cWwGYu!hUym!uIwlJ&AGGym zzZ!*za8Xm~L6F

8ys4Z^DJzS`B4!yh+lTQKG<5DH4jLNb2TOqv}3d21O`5Jdhao zTNPQh>vFuO9h@vmpeN+GO#*&nAj@>$r9QrQAX4yqmbF6bWXtW>*>~BVtGo7hq^~}# z)<>??CWft2@=P*|3k9Qun4ho>HSgbls7P1-+geb};%auFlX0bN?@_g-11{x|Ht-Mu z>ZG-MT6R2`fxAYx+N2a7x`E;v?MdHRYGOxP4$F4hw`gnKej;zID)Sd~ zER&wNEm;^shGrwoOSVbqx)rd<(2QbeH-zrk2tRost`Fu4pG^Gy)JcN6`n6eAsE6TL zDC(_#^1qd+p6U3xiUU>j(_WYXe_wHZv*sm7I%Q0U1na`Ezb{*G*-40j#qOp&W5xL9XL6@hco{g zJ+dVtbbKHv3=Ru^`RF%xrK{3#LmlBe4$Z&H$rZ)8PHWmIM2)R!*=o#O4xw-I$R6_W z^mWCU(tzF(@^BOq1RfApb{%%4^nd7Uu_?JGre;S-m`qk_`u|)&b%|W$ZFhs!J;Xoo z^tDA0lBdpoLiA)-;7RC8lIfE6PIW=!$+Yj2TR)atG8c3eP(t{bOzb#ZBldm zFM?55iLYkgqO1)p8~Cnl+i_*?|05fNU_a&%7gG%+>_965;O8%D!p_7hVMcTc(AmxR zq@q2SM2a3N@xfxZKkefX{I34cQe1-kMJ>lC zvIIMu`HK&HTxR%Bty#VygQHNMgD1AzmhEgoiU+dYKioNn-$5AZn68J}+ z1j&XIrN_;U9QcBPSY{9&6@{#Q?pa|y0rnn?`)SF~0B_wiIfQ$*jAaU^g3`h%u61Pz zT(Q#-3(r8m#WXJMrvOHeO%|hboDxI-V(6WZcl%-pb~k8?Lw0lBE^3{!sK)G$_>DOm zERy1apCp{-Jz5y8wXj^^t+iZ@qRKtKBMVNkfK`S||1E}Z-Ax@xt(L6DCg5=*ilAI* z3Xn$_U)|6T(bLl{%(-DA0n|D1K*x|H5hh)3U|aiCzG@zU)yR`J?6-V>bkaz9)zEjw z1k8016=>l_!hn>W7tv9PK7;70w!@}qSl6EGH;B`@V34%h%mhaFg$Zy!h@{QWVwq6e*7$=28Gpmzp zKc}P>x?Tzt#_zS6?H+YL!Ti9lf%qc=2vDL^q%5tc$0fR8Pxx)!p0m3gtT#fXf@@n& z*puGv^xhcqGJ`<(x%%_)H#5(MVhBDZFNSwsl^g@)h@39o2%ge~5mP@AP*bfa8c0S8 z@c7s3&!`Liw?($5%7_j%2y)79cTkcvD@!1_SWpd7iM@&sY-4rhVaV%bv@o)DV#Tyf zopPJVB*0}EP8S0@>S70N->_2Vii1Yml#Y0So)2b~ghmNN!c=w1io5-B1>sM1`pZVN zgVG-w?BE*zRsmePGBSWQ=gQRMiP7$^iXNCRjd&?6l%P}N-$D%Zf4iOR=0~>D>pZ5V z5F43^)*&PJm5c>c<(*KQb)kie07iO2H}u2U>Iio5X%?ihNaQ+`L{c&=jj@LSCI{UL zH$t;tCXB_OHu%$jWiZ_`4D4c6M|mk2tE1hpHA9~7lS}Uy_F9fZtn{ClT*l==Z=3Z((8MqVO$^66J3Gj|6L{nnmGg$@}$7c2!_CpR!ADNm|}X< z=9ZQQ==?SQCkyJFvNcU368>A*r%iyfB5;Fr8H13za_@TB_1my`%rD&G=Hl1dh4yjo z1=J?_l)_MHYfj~IPKb5qo8@pcP?Fgt~3ActsG)|;&FsdY=Odd$MXJ1gK)v2y!F zT>`itpOJ0-Z4Ek4ibz=3e!_Mf(!Z`;3r2^`SPeIa|p)%v@5G><I$ zB|DTg?;vdOh@94jysC2lz8hhV`VyMZK-jdIbKmnlfnUMl<*zc-u0=BrsqN8Q z+svLY2 zn~m^z0nYCvqf!D_#LJ8?b_;&=>bX7N-7!CV8k^x&AEOza&~_ju4_lKZ#fkdyk?O(_ z-9<6IRBn(M)Iir+34g^hx7O_BC3gCLbs;ZTo9D)>ng}Bj^ zN}0#bFN-*3$=ehB4Z07W%@o*@$p=s-Nc(SNjYV?8YjIGwm84GdQ}dN~2ti~EHUQU2UK{l7al-?Pl}gr&^&EOy|>u`6t`%>oR} z4##V2#J6mTST(_OQ9vA|2Go_nD>Fn+ppe+7emL~tjV(Az!07UtMIbB`1g|{Jlc#t> zDcs0RBo>FNa>Jj*ucXaMe~Y~$sQ-#t&Z>Q@I{8IbphsqLewfM_YqOI=-FImjFi_5D zKtNqc)O}-<-4=t$#fHkN8y1*K!j9AA{~tMi%Y?=Q8qaxDYI7#7-CvfmI*^uU zK^K`OtDRWh){jG)7gA+xY`wZ9z#F!VnVo~}CfSdT*o!kEU@j|_`TZ~GN@!{~Yegs^ z`2Ioir@g?DbAbv+mmh)@UYK}MGX@)CRq2-JMEcdDPsHy%MGLgDmzK!FUKAG1gjw65 zsNtH)~< zo-t%8t2|eVZgD37wnagm0ux;yi9!)8?A1sBF88y;(Z&-Q3t}uuAc?e0m_)3IJ@KG} zyrwL4XIty%?rmSNbkJo@I?&gpEKsNtA5n%T!{pQa`Zz0^ z-?W}Z_37R_@bT~bS!(-E*b*L8LXQ)QpjbD0L(3FRL$b^`)J^3)cxKb#3pz9AKR)$rMYtYYCT<^3 zp%+Lb`FDXSz;4TiI4hX{pG1G_EXlE8eNK(%#vykp`7cAcj-1v0)42m9i_vG%Nm0PA zs!)8-f$&CnAc0Eo{iBc7+onhj#1YK1c)XWWUUw z9DUhPGw)S6@cFa85CBzk&w$2XEjUBVAYAcE*IqSKQcP+?1b^Kn{~n*et(LIs=L+cV z>ZoRz|E$1!%zUo!y)`t%A^bEtl3)s*i@l*N0Xdn&uaAZPQ_`+@*J$wE)7U+q4l%`y zK_n;2M7(w&jxm#pGfT6)@P6`F-Q)02DIby(d9$WI zgUdOfIqs!TCLR|ed&<#Z^n*A=VQDwytNCNB?P9QlL%$ZHy!S_oe8=vYqT%_E|QC9Vk{?_mf4TLj#`MwF#cvzAC#I7)J;dj%GBYy;_4aeqvc` zT|f-S4tp%6TbT7Jk?ve`T5(SeS&Tw&K3meuooqelZ37Q=bm9e3`q%J!jZnGj${i{H$Rd9)`DAdzlg5p17 zYB{qc7bIBSa0)Qtq^v(#f_dJ9tZSr5;Nf*w@9J7-!gm`BwCl%3qm&vyOXUn# zt(tnO;op+;&6mIsDcVe^i-JVnez966)acmph*8%Wj02_Ifom-gP}s#~46A`liIO78 z?E<`a2dlPdEhN1f0k}ojSHNIQ+@_*EQPcjA-McjTU?r~Uus{b!a+kHs57tBP`!r}2 z99usT<5hzA^qM)S?${mA^CJClX?BYJ*V+nJ9uNp>oTI7X0=?HU< z;CEFaLfnJ4qnM2^=Lz8joMdvM)^#|BuUBYs?o4lLB49mY%*`vVjA&spD+;Cd{c%?? zYFz2!S3BX;5DS7z1hJ_fjksd}ZAqk!?EWw? zYDKG~?ps+oh$)ljU=TN4OSp4RRK-obsG}^f>VWYdmY!`U0?l2jIpaxyn$bcCbO>Bz zt9rklDaARl;#bJ1$I#*h(nA6|_oAqTBiQ5>?BZzoM2Xb$I)er9kE~7P`YafY*@`8X z@wGlfBw|8IR9&UB+u(+faY*vI7c~$o%Fy5<+myy4DYE+6?9Iz;t`500M+&xfo$ROv zB7?owP-@DJ{F6l+D72S6_s{zoR-7p6Qx;j_A`hc*%7hy&NtHUb)P}z20^h@l=Plxh z-^MfJi(64pO;F8O#?gLtDsHybobRJAt z&WFkaMG*>VOSR`L*3A*DI5(5jf0Sq7SaLKn3Mfe__Hjs|OtXn@%OjC_Zzs|Th=5rv z0GD1p6M8TqZ~iiTxV=C6x?}n&9pXeAgmcy9+FSfYHBRZN)v}oQ;R%%caFVrFQ_TC< zo$?3GG22%GBB2oiVjEvU78dc=p92zl`EP0g%_}GC5obUB7cs&JKE>us$ z2`rPxMsQjFR^(EKNf=o_pQ)I5JL&zhXqeP|eDG$hrboh=wA_CLC-G?ssP~OJQ_iyj zXnc;VC^%OW_nyrL$BbP0SuWJ|Vnf`lrH#^B>p7c>#-0h`n%<`NsJn!ByrSypV2A<< zyFP#=uB+WhRj%5mX)`LMbr|6$@3=bp?5~fH03eq9z{e4jI%=|@J-zEo=%iICrdi2o zA99k?X6+@7#Fo(9|1Nc9?SjKy#wFe?qF@walRfh$zWQ|};Avin_X+rP<=nLJT+dX{@$<(6 zSh5m&v}H5g@P(CmD{-d%5If8)x){WK6c6#k6`^~2pK25npwN7qAD%zh@27}GWs-TI zGI(v@WldajnuGXoYj&)F&O?OYy`h|K&QG0DX^$u!4i&f*=i|bq$cQjI`D;tr7(IyA zxs~ylo={X1vS~7>_aa;9p8Y$SpG#k7aIUWk$bkCbaYaV`drC=HsqoYK-lSQOj_=W?R{yZF12I6fdr{G| zRP@x*gye8g#4KVDtP0r>d!$=(gUNo+Br`z25lqbr)WNIFfp+tBXyVZF12)%jX$Y-? z$aT^hmZwN}%W;o68LckDzA)fhALhH^JARS3(#mCJG%c{_p*y-=0wPxqO>x<5jAr>` ztSwj1^?tzi?%!HkQfXE&}nAl#|K=Ql>-P+-OA7xJ$<^o1zB`wu=8sN6aS21;AL zna4Q|EZYlKgw#!o^D*(bclbdDc}*zQAj$}_Rj42s7@8hUmsiS=2SrEFStDv|uSC*am8&~xrrc*9jIQjsJQ)yB70pUl zL7Y;C!Q*aY7oq6+?X_vR=Q+!XgfD6rXmexHV(%u;uusZz=bQ)cff-qd&cmKThR(b!(X^saVWA^1N`Q64cF41|>K7Pxc}! z1Zn=|$b#)GS^V}P`2N*=+k4H>S6K(|xPXCIQ4!s_E^ZAeR_k)X)kc$ooyT^MR?1jl zh@qdVhEY1}L5Tr#pV7_@2m5vrpBQOIs`7z)6}mZX?2u6T=zfIq6ix$op~3f$7Qxs= z5!g;;jb{r=vnxGkVstw35?^3H>H{8QxNO7yygEKKTo_W-xBaRR?X&!^Tu>;FHWHjXFu~pAd(Irs|iYfhwiP??|Le6CQDR zJ3{0J`AZ#%L9dC@jeL4IAl0FI&B5PoVKXj|D3cHU2-Y62lT)nCEBuEei<$6{OgR-u z`&D7T%Fhi(Xsz#{`j$O4KXU?dGITU6jDL)gu7sGnkR4+q87rVyLUhqkuXSsSScBp| zCtp?$iNkS|Kc^jXr)=gIodM~73KJAWO@XQs?F4z8w zwg(n`^%6w%_36&sczMjjLhpv-CD0vmPm55PIyD7UL6rJ|0CU;eR``FXH0e{JrJcF! zL}pWbeun}={-?UWw%s8WPFB|6+!@xJ7t*I~qE^Qzk4*ZzW+BE{$EO{cv9{w7>m`8Q zsK?;Z2bAK0sncptw=XB{x~!^?D9o~6&Gg}bFrljwaCI=ip)#sfW+=Nj30`aPb=lvw zuxhjlkDl&xC`xvDD-a{RdeIqIe4DI9%eKq*M3UYA-IWN3Rhu^Z%^&Okwy<=@Tf>L~ zsA;Ib)2WGY%%k=$t+S}YE3vHFDwHaGOpTkKZrCn0u0s&Q!lC6Tz1J<+4ZzfQmftdidd#4Tl&4oAYYWjYRHH`y z*h%8_{Od@PY~Ofhmqa?(3^>-^kI99RjEsh(#HvAL81&RSH}qyuaAV2gN)}@@!#5>v z^V7wpyF030VE&b93^&cm$ zlcPN>St&}k?poY8{`SB1SqbW?X>#=0jV>tbcKk${L2_%R%1d1ZoRH3>if|AsNQd)m zNiv4vI2T|C>KT)axhN7g;-{KydSuZxA*tTP0)$Wv;N)q_OO0R#qf zo7XP)39gPbwy>Y8^S=D2-bHZ@+YLJiEf;zu_?ZrhVB*- zID>6I1V0xZz?!oB&F2RHIBvmG->rf;JG;GWi^K=ohvzphr{dS@v1izUH0z&ax;w~6 zM(UQ)zkptEYdPd_XRi@nJ5jC zjR^#EVy?7T#ij4Y6OeVoLh?5@b8OlDfpHBWBJuR`ik!25HUFFB;>JuOqN|BFu0PEx z^R>>)d1RH>wXSm z2DFHcrqiolTjJuHd@d8M(JvCGug0(H@OwxwnhHwhiDSq!AK?eAhke{tKbdrgSNVkR zM2ugKI?)>(n+H(W&0&yxN>OVVLyO%hiPgkjUKaKsE1+?@W`qC!yPXv^sCj}=*ASLp z=$L1sWlvc|tvd!o8xrbc)Q7yunx#1Na+qU7xpjY)TJWLeJ-;}Oo~ByAN5D41*feJt zLTuOa>`V1H#G8xY;J!mKbQ&ASr_Dn)sIt(0ZL&>fo3k;%#z=qOG!&EM6qbp=IE%>d ztbbp2O!wy3so(SGRmR^4lF8=DEcq0}^nLnG=|xG29L%WzJiFW>g%=8(oND;7`4=^= z{YbGx=C8<=S5n`RXF^om|56r5V6wS5uxo@3BvAjGpWL&3V7jlk^?_9C$sbUybB~mC>>_XN^#c;%i0&yHv2Xl0pm;_i0@;nq zL$RV*f=)TgtAIkaR)Za5b;DMz3Tai@l`>}tlPD~$MVEDV{wBDd(Y3r+?N$$6&#i< zasd=&FuFYHmsy)Rd%IlbwYUo*|L9w5k9;XH4a85ySlog+1f(;E*8t0CX(n;sFB@Px z{Db?RC*?qNpr7?vTcYa&ZehAi)V$VCm~1^4&p*&2yIsD<6J9h+ z&VX#-oiMniAhk1Zp^;H!v7~TdG*@$&omptGnjt?+to5rf$&`O97V=;RW{-Tl5x%hR zeNm)bmmK9?g?DK;^`ytmCqqr4OqgtcPFD2gmKNoO_qn*P&qn;#vDv$X(favu~EC%Mcyz$YWSubC; zM$GVi?K22Dr;_M+T{~Ny0t;gummdf!H{?wIImW;IIx^}~iN_Lv*IrQ+hG78S1t)aoIKX%HDQ2Aetg6rVwWf*C;z@sa zE|lM>_qnjaAQeaN7(_hhOc>78#P5>=K(S#Red%(emR+F5;jFZjkv=}Mm+0juGKGlQ@!>Pc@TD64S zL4nhDYK?(=@V~jWxqUbnx}xGY8XMp5@rfWm3;t)lQp%|5#-&Wk=xTbSXb%P#+AB4| zt9wS)9p;J_ki$G(XOdxvT|4$Mi?V%Dpuw650>#;7$%+xAT_j>d{P|tz#=;f91P(ii zjWlBh%=d{7+qD;lwcOo|_Vb#}pF0f#@-dxR>BPQEPsec~x*3PQi*=N}UA7oZC5O6X z0d}HA&G(wY1lpGkl!R!8Nxs7Bzii;?eIy(~MG$i9=V8t^s#|6s*nyp1@IFz&uaXEJ z{c98=%oBoccN)IJ>{3CD+CFH1g(c1l zQ%2?yMGj)wD5u$}wdj+~_Z8wedh`ggEMbN_IUOVx_Pb3ML^!^$Cfsp;kax{S8Tk5k z?_ZgLwJGQ96Hi}>HWR#M>`;6r1`w0d zW9E2X!&5ZS{;p@%6v! zRdy!tcQ_T-M4s3bMfKaUj;MTXQGHkJkKFq*;&W1oZ%p```}#rEoQlD5-Nvziud~20 zh}7;^;RxOjoa(NkwioYu9|$JF4<|%li>*A(35Ed4O=M&U{q?;sAr$<0xOLwQ#h>K$ z9JEk}wSUH#$F_+8zmKD1mU%J#U~VMb_?rvg8$!A{VE3G;0*OXv7tJX?x4j8Fj-x@= zcjTyD@gmo5)L@`->pP~_U;=J8oc|=0*0WYcyOiPFrEw;Ir7fcQ3-P^AAd!Hi)s4D< zN63L_g_NT|*m)XyZX27G>1c=h4BI=Z);Pd2+n;fW_(eW`|Dz6RB45^-pIGn7SUwpa zSY76vT6z-T7DZA%3F8b84J96?!eBxJUM6<=IhU^Z*Bqkaah=9#AhzsQ zi4Gk#_c3j3(_=j410C_`L^}|rAZq-NVe{K^_#+@zt<;RhTksdpjl5-z=Jdz;#otxf zd&eCMPHe!FBM&h@S@mUJ2xv1g)j(;2RLNsMtb1b#NN_UXhiqNg3DiXiq&_O`{580s zdfm?aNk4DO;mHt-T#}{O58hIJk_#i0!W=^XA z!$wt{(M?uDa%OdVjzfKUe9ChbUDN10U^ZD5*g?2GZPhi>ve0UEg;3|1x+VY5$AnbY zQ~j27S+#=2NzoY%Q1Fg`(9QuzLWY1Y=?6|J=sqChuWQ+v>#LwdmeR~PXB}Cd{gFXY z*jcvcC=-Lv$L}R}f+*k&B8i6@7u%2!*d=eE9=wN?PgWmAtQy+NRV9I|f8XDLE=s0&mU7DI^K|DgK6EwSyu(+1sDraTYIE zM|Y)+f!!?@S#TTME&SHud#0>i%e0dsG0Oe7^WwIo_^MKUW0z)4= zP_%T_>0D9IMX{Y*c)z&Z{b=UiR5CtPlHqeGaw?oDKd>$4hz$%~e@n!~Eun@uz}Ej& zMk$i6EDe4TrlyHA{=%%cSwLB%m~N!4y9*Gk0B!aJFIw)nS_Y5I>-1Pnz zxU_!EBg8QA7lnP$&Q>l*R_@+iRz1JbQv;03NJp`EH1B=L6hOWgQ3U0M&qCIXNUV0M zd$YYlQHPN^Z6=LT0NkBjfNG*HV871tjiHnMvhl zXjo6vmU!u++ChjRHjd@xsCqxlAA@r6Eo#mbwW3mC0dthceSbUr61H7U?7A-ckE3i( z-~N5RQes%ftotK6L<=5CkCFH+J@AhOk)FwSq~zz%31O@jQeZY97Kz^|pz1jJvLK7A zfrJY??8Da}OrXJ0K9nEOa(qMERtsig>Q*l+3S<~NkKPo7jig4Ax>`_TMUEKXe+@*Q z7d>q$AD`7zm42aj($eWz3l0;eHfZa=wWa>#<+diI>{;UaC(>zb(58;(bK6eKv&go=uyF{fi`|*OGs?T0yyTTHOEXswuBMf)WnX0=@L-weqxca| z{so7gx>)VP9hKM4Ly-dNzXT_PNJ_iJ)dt?Rmwj=`U7URPABDN7`fDCB`kIf{uR;9n z%&!8N<&Q?o7q``4t;63-&D4zogBj@^NC}zn^-sAvEa6UHFv}zMOy*y_8O~M~RY{V% z7?dTMXSC7ZLUbL8KdWC4WbeQdFBJKx4b~gU*x%^%6y|(P@vvYbAyll+EDs|6c%D!A z9hKHwEo{z!@^pr`H@X9qOIk@B-Gcy%&1EMl5*{2Sb$shA zTPpW&O6Y^U^59$l@;FSk|`_+L@y~-BUZg*?z5{!^5R4KDO;wm24;jDe{};$vC9x zKFJrc{k7Zdi5NH+q9lou#@vC&NygU)*6mDrP?pAeX0_Bfhfo+5RWKE{ij}k<1O-1) z&xnW?5G%co{}h1|q^QSqIuc}GNDM^3JC^Mg--FazI%pu>ZP=M`yF^k>5314nZ~cRi z@y?c{R!pGrL_&Jfwv5(qJvbD}V|Pz%Nvn4hcJ%z>OiC~4OlZsRs199my$%5pp|7eq z-!xji8y*P$=H_Qo8w&^;e^QVaIbj!<3_h<}m*LsIa!%-Uf-t#LRVF5u8z`vo>^b~2`_vGgIMu4WkbtgvFaV6|=6UU|U3 z`U)wp%EX@VBUUg-^V@U2Y~{biY{S$;Vf=@ry7kp>D--8%ru9%GC$T}nTqgOglIld2 z4>}>R=~)D8T+BS;0Wfs715%n7y0M$mp8(C2o-;Rp`8e zcFCb>NglhhU*C76>;Q*{kmXZcQVOP`I;UE@T&BJ|`~Q@pMFm4l7Rh%ZtMkd0r0#VK z=MZ_4-(VfAj+@)XscgYUZNE5Wo3v+cy0$uAEQuAnE78)9N0;2k+MM6d{}}wR8e0?_ zbfexP>Ad^IH!lA(Q*4Wm($*KTlC;}p!(%N1d_Qsd5exJax3YA;e#DHm_@!qdHtsK1 zi$#O%j}{aSh5;OV_mu11vBa;eSbP}XII&vfyDyHZ;RA_M7Ijb@LpaGG;-_ELA_)Fa zRI3>^wVzL0ue-4oju5VEl06dkp7>%3=Yf zog!e400BEYj_wsJ%elsvGy%)9Hnwv9)guh7RaDNkCCA?h`A?Mx&oy?E_FSn!I`FKi z?AL8wD9>IGzydW*rhOCcMV0nf)6G37VaZb3*VilfNSH?Z#(pP>a;b2HlpRK`l=82g z�tb?ab+&RCpZP3#_)rjVAy@j8~3nlDUC57G-`fl7|Z5#{-_Lo}5Jc>lcNIWGDKW z4eyI$<5{&w6L%uHPR3gvRsX6o_$V=HEV$*(B#j_0VR{jTO~gH`(O<=Q%lItkI=-<) z%d+dw*rtnlf$Zr#V_ozYwZ?0#^_gTGLtAzmzIXH5CEw4>RBd&n|5c(5qpw4>ZmHXs zjfZv=B4a*XmD!&|!k<;#PtwmI7P`Kf>SDdXWSxyV&+IT1BO&YmFkwSVj=e;cvOK#2 z=8a@6Pj~4yw(D>mUrDfR*kkbaMFM{CP`p$$vuH%W@U z9)Hu1LGo4|v$xP`#*zj3NWBO4r`uMKy~mpa>HO%$2r`3f?;t$iqpi%8``Qi0&@Soo zk-)V3zo8L7q6?rFDqJk*PFrOWK)w06XgySs7$MSwe1V!2E9=vNPA$@zK64JS=)5J) zb;$k(6qHrsdzqIGXu%}%YinGwcdgy}9V+&!zUcz)+Q*F-Bo3^9T{y>x=$V{LepYTV zYy5hA!Pc}nr0km<1_o}xGkK_9vA~{ij<~XYQ0~Dtm!0$!BEm@9+Qz75Gx|kt7)psh zr`=4qv`dqy4n4K)nZl#D1m?fyJ=k$b4TU%DDT;K><=rIV3>1SEqcef`q<>#XFnoxJ z(_ZIw6?9);;pswiJ#P|Z9o(0HNXA5c-KC4o<|rJqpdr5Qv`t-1I_6`tDR8tl1m!&Z zGu?o~Vy~R-k#0$RmcY>({CSeQW-V$k>xva@6PwtqmLS2yc*TV6mD$^4qy@U#w3_F| z*tIxjG^33o!9m*+u7C08W+w{&K94{9v$|wj)xGuSPPq0^0w_bh?>(X~;U4s`sQ-Py z_ZIK9iCYBO^=chsed})hwC3;l=s`c3wmUh~Ei(*xn${h|H>E=vmAn=^g+&j}LT_gX z8xXybUziqPb@vkjCvH1ebKnYf`K;oEKT+QM@^d6=5`Wui09MXiCO6^cUppqtR;g!t zQk`C?oWOZ0yj{zZ6%;eJffa>8r$n@jut7n*L-kCjScPgjMI)q z4qcgl7iSLc>pQ)lv2?K(;t|Cfew7k-hlwU3qg>z~H=zjZ$zITjz4Z*ieqhOCO5`)o z-Jc!Jyxb4_VKhsci8pTdCWmA>eAgo{ZUgx1rP!NL2@2CUOBN;rT#}EO7jJz^9gYZQ zcLocnU)L$6oW!K`J-`vA@ns#CQ-TUuE|S2doN1idC1YQ-|3kv2Jkpw7Qo)r2>N8!@ zI?<&*joz_Q3FOcx&ljS+<)O+qwqqnnJ@v({bb4fX?!ud*|5EPmo+1M6Q= zrc&P1=FlQenKI{(b0Gb__PwSRb9|(Fi9sISS+5@z(W7V1pj(-ayKO(IT{yi{%=gB* zr`y=)p!6DOO&+arJ$qZmSH@FZw%5jQdLmB|3Vzg6oWPhLSEVSiM>uiysW{39yD zir`!2(C$1NF&d&*MkrwltXlnn16JxnjISJ}B!8{!=bEY@Rh#Q(Jlg!7+n`wr^^WTNX0*Eq0&)%|U;U<8nG`4_LR~9M{m;KjahH3{cU{@uzAX`y#o z^Uv+18ayYUYLhU%>1kuDa?hIWgAwcYbhYKpnD*JLXTgQ8`Li%5q@8&jgN7AVWX}rz zr^~=J2G@BrnguFxgQ)YpT`Y~9PD3)0B-Xi?%gr0HE>9nFCzU%Cvs`11{n^$MA~f*Q zF04bzJzWO)pZV?W7&gj(G7HC;xVsFjUizv1drnA7Isc0^;{GnDFKN$+hJ*P3LIOHN&9G58n;wLJAD?_h)06CaZS&RUOu~EzgCgpxX+=m)SrTCD zkTSo=Fc?bry5JrY1LOW)2;60Xfq?<|8;G$nKIAqMuc