From c8f8a3235d9320932c0ab19aa81738f65b2b505c Mon Sep 17 00:00:00 2001 From: taherd <183945978+taherdhanera@users.noreply.github.com> Date: Sat, 23 May 2026 03:11:32 +0530 Subject: [PATCH] Add component owner approval guard --- .../README.md | 34 ++ .../demo-video.js | 186 +++++++ .../demo.js | 12 + .../index.js | 338 ++++++++++++ .../package.json | 14 + .../reports/demo.webm | Bin 0 -> 91480 bytes .../reports/reviewer-packet.md | 48 ++ .../reports/summary.json | 490 ++++++++++++++++++ .../reports/summary.svg | 1 + .../requirements-map.md | 15 + .../sample-data.js | 159 ++++++ .../test.js | 50 ++ 12 files changed, 1347 insertions(+) create mode 100644 repository-component-owner-approval-guard/README.md create mode 100644 repository-component-owner-approval-guard/demo-video.js create mode 100644 repository-component-owner-approval-guard/demo.js create mode 100644 repository-component-owner-approval-guard/index.js create mode 100644 repository-component-owner-approval-guard/package.json create mode 100644 repository-component-owner-approval-guard/reports/demo.webm create mode 100644 repository-component-owner-approval-guard/reports/reviewer-packet.md create mode 100644 repository-component-owner-approval-guard/reports/summary.json create mode 100644 repository-component-owner-approval-guard/reports/summary.svg create mode 100644 repository-component-owner-approval-guard/requirements-map.md create mode 100644 repository-component-owner-approval-guard/sample-data.js create mode 100644 repository-component-owner-approval-guard/test.js diff --git a/repository-component-owner-approval-guard/README.md b/repository-component-owner-approval-guard/README.md new file mode 100644 index 00000000..154239f0 --- /dev/null +++ b/repository-component-owner-approval-guard/README.md @@ -0,0 +1,34 @@ +# Repository Component Owner Approval Guard + +Self-contained guard for SCIBASE issue #10. It validates whether merge requests and tagged scientific repository releases have current approval coverage from the required component owners before protected-branch merge. + +The guard focuses on component-owner approval quorum, not merge queue execution, repository release generation, provenance attestation, access review, DOI tombstones, sensitive-artifact scanning, dependency licensing, branch hypothesis lineage, or legal holds. + +## What It Checks + +- Component ownership for `manuscript/`, `data/`, `code/`, `notebooks/`, `protocols/`, `results/`, and `metadata.json` +- Required owner roles per changed component +- Escalation owners for restricted data or protocol changes +- Stale approvals after the latest file change +- Conflicted self-approvals by merge request authors +- Unmapped repository paths without owner policy coverage + +## Commands + +```bash +npm run check +npm test +npm run demo +npm run demo:video +``` + +## Reviewer Artifacts + +`npm run demo` and `npm run demo:video` generate: + +- `reports/summary.json` +- `reports/reviewer-packet.md` +- `reports/summary.svg` +- `reports/demo.webm` + +All data is synthetic and local. The module does not call Git providers, repository hosting APIs, identity systems, storage systems, or external services. diff --git a/repository-component-owner-approval-guard/demo-video.js b/repository-component-owner-approval-guard/demo-video.js new file mode 100644 index 00000000..1f4b7f72 --- /dev/null +++ b/repository-component-owner-approval-guard/demo-video.js @@ -0,0 +1,186 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { execFileSync } = require("child_process"); +const { componentPolicy, mergeRequests } = require("./sample-data"); +const { evaluateRepositoryChanges } = require("./index"); + +const result = evaluateRepositoryChanges({ + mergeRequests, + policy: componentPolicy +}); + +const reportDir = path.join(__dirname, "reports"); +const outputPath = path.join(reportDir, "demo.webm"); + +const browserCandidates = [ + process.env.CHROME_PATH, + "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe", + "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe" +].filter(Boolean); + +function findBrowser() { + const found = browserCandidates.find((candidate) => fs.existsSync(candidate)); + if (!found) { + throw new Error("Chrome or Edge was not found. Set CHROME_PATH to generate reports/demo.webm."); + } + return found; +} + +function fileUrl(filePath) { + return `file:///${filePath.replace(/\\/g, "/")}`; +} + +const html = String.raw` + +
+ +recording+ + +`; + +fs.mkdirSync(reportDir, { recursive: true }); + +const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "repository-owner-demo-")); +const htmlPath = path.join(tempDir, "demo.html"); +const profileDir = path.join(tempDir, "profile"); +fs.writeFileSync(htmlPath, html, "utf8"); + +const stdout = execFileSync( + findBrowser(), + [ + "--headless=new", + "--disable-gpu", + "--disable-dev-shm-usage", + "--autoplay-policy=no-user-gesture-required", + "--run-all-compositor-stages-before-draw", + "--virtual-time-budget=7500", + `--user-data-dir=${profileDir}`, + "--dump-dom", + fileUrl(htmlPath) + ], + { encoding: "utf8", maxBuffer: 30 * 1024 * 1024 } +); + +const match = stdout.match(/data:video\/webm;base64,([A-Za-z0-9+/=]+)/); +if (!match) { + throw new Error(`Demo video generation failed. Browser output ended with: ${stdout.slice(-600)}`); +} + +fs.writeFileSync(outputPath, Buffer.from(match[1], "base64")); +console.log(`Generated ${path.relative(process.cwd(), outputPath)}`); \ No newline at end of file diff --git a/repository-component-owner-approval-guard/demo.js b/repository-component-owner-approval-guard/demo.js new file mode 100644 index 00000000..c11e80cc --- /dev/null +++ b/repository-component-owner-approval-guard/demo.js @@ -0,0 +1,12 @@ +const path = require("path"); +const { componentPolicy, mergeRequests } = require("./sample-data"); +const { evaluateRepositoryChanges, writeReports } = require("./index"); + +const result = evaluateRepositoryChanges({ + mergeRequests, + policy: componentPolicy +}); + +writeReports(result, path.join(__dirname, "reports")); + +console.log(JSON.stringify(result.summary, null, 2)); diff --git a/repository-component-owner-approval-guard/index.js b/repository-component-owner-approval-guard/index.js new file mode 100644 index 00000000..958d405d --- /dev/null +++ b/repository-component-owner-approval-guard/index.js @@ -0,0 +1,338 @@ +const fs = require("fs"); +const path = require("path"); + +function normalizePath(filePath) { + return String(filePath || "").replace(/\\/g, "/").replace(/^\/+/, ""); +} + +function matchComponent(filePath, policy) { + const normalized = normalizePath(filePath); + return Object.entries(policy).find(([, rule]) => + rule.paths.some((prefix) => { + const normalizedPrefix = normalizePath(prefix); + return normalized === normalizedPrefix || normalized.startsWith(normalizedPrefix); + }) + ); +} + +function groupChangedComponents(files, policy) { + const groups = new Map(); + + for (const file of files) { + const match = matchComponent(file.path, policy); + const component = match ? match[0] : "unmapped"; + if (!groups.has(component)) { + groups.set(component, []); + } + groups.get(component).push({ + ...file, + path: normalizePath(file.path) + }); + } + + return groups; +} + +function approvalIsFresh(approval, changedAt) { + return new Date(approval.approvedAt).getTime() >= new Date(changedAt).getTime(); +} + +function approvalsForComponent(approvals, component) { + return approvals.filter((approval) => approval.components.includes(component)); +} + +function requiredRolesForComponent(component, files, policy) { + const rule = policy[component]; + if (!rule) { + return ["repository-curator"]; + } + + const roles = new Set(rule.owners); + if (files.some((file) => file.restricted) && rule.restrictedOwners) { + for (const owner of rule.restrictedOwners) { + roles.add(owner); + } + } + + return [...roles]; +} + +function requiredEscalationRolesForComponent(component, files, policy) { + const rule = policy[component]; + if (!rule || !rule.restrictedOwners) { + return []; + } + + if (!files.some((file) => file.restricted)) { + return []; + } + + return rule.restrictedOwners; +} + +function evaluateComponent({ component, files, request, policy }) { + const rule = policy[component] || { quorum: 1 }; + const requiredRoles = requiredRolesForComponent(component, files, policy); + const requiredEscalationRoles = requiredEscalationRolesForComponent(component, files, policy); + const scopedApprovals = approvalsForComponent(request.approvals, component); + const freshApprovals = scopedApprovals.filter((approval) => + approvalIsFresh(approval, request.changedAt) + ); + const eligibleApprovals = freshApprovals.filter((approval) => + requiredRoles.includes(approval.role) && !request.authors.includes(approval.user) + ); + + const findings = []; + const approvedRoles = new Set(eligibleApprovals.map((approval) => approval.role)); + const missingEscalationRoles = requiredEscalationRoles.filter((role) => !approvedRoles.has(role)); + const staleApprovals = scopedApprovals.filter( + (approval) => !approvalIsFresh(approval, request.changedAt) + ); + const selfApprovals = scopedApprovals.filter((approval) => + request.authors.includes(approval.user) + ); + const outOfScopeApprovals = scopedApprovals.filter( + (approval) => !requiredRoles.includes(approval.role) + ); + + if (component === "unmapped") { + findings.push({ + severity: "critical", + code: "unmapped-component-change", + message: "Changed files do not map to an owned repository component.", + files: files.map((file) => file.path) + }); + } + + if (eligibleApprovals.length < rule.quorum) { + findings.push({ + severity: "critical", + code: "approval-quorum-missing", + message: `${component} requires ${rule.quorum} eligible owner approval(s).`, + requiredRoles, + eligibleRoles: [...approvedRoles] + }); + } + + if (missingEscalationRoles.length > 0) { + findings.push({ + severity: "critical", + code: "required-owner-role-missing", + message: `${component} is missing restricted-change escalation owner approval(s).`, + missingRoles: missingEscalationRoles + }); + } + + if (staleApprovals.length > 0) { + findings.push({ + severity: "critical", + code: "stale-approval-after-change", + message: `${component} has approval(s) older than the latest changed file timestamp.`, + approvals: staleApprovals.map((approval) => ({ + user: approval.user, + role: approval.role, + approvedAt: approval.approvedAt + })) + }); + } + + if (selfApprovals.length > 0) { + findings.push({ + severity: "critical", + code: "conflicted-self-approval", + message: `${component} includes approval from a merge request author.`, + approvals: selfApprovals.map((approval) => ({ + user: approval.user, + role: approval.role + })) + }); + } + + if (outOfScopeApprovals.length > 0) { + findings.push({ + severity: "warning", + code: "owner-role-out-of-scope", + message: `${component} includes approval role(s) that do not satisfy this component policy.`, + approvals: outOfScopeApprovals.map((approval) => ({ + user: approval.user, + role: approval.role + })) + }); + } + + return { + component, + files: files.map((file) => file.path), + restricted: files.some((file) => file.restricted), + requiredRoles, + eligibleApprovals: eligibleApprovals.map((approval) => ({ + user: approval.user, + role: approval.role, + approvedAt: approval.approvedAt + })), + findings + }; +} + +function decisionForFindings(findings) { + if (findings.some((finding) => finding.severity === "critical")) { + return "block-merge"; + } + if (findings.some((finding) => finding.severity === "warning")) { + return "require-owner-review"; + } + return "approve-merge"; +} + +function scoreFindings(findings) { + const penalties = findings.reduce((total, finding) => { + if (finding.severity === "critical") { + return total + 30; + } + if (finding.severity === "warning") { + return total + 12; + } + return total + 4; + }, 0); + return Math.max(0, 100 - penalties); +} + +function evaluateMergeRequest(request, policy) { + const groups = groupChangedComponents(request.files, policy); + const components = [...groups.entries()].map(([component, files]) => + evaluateComponent({ component, files, request, policy }) + ); + const findings = components.flatMap((component) => component.findings); + + return { + id: request.id, + title: request.title, + authors: request.authors, + changedAt: request.changedAt, + touchedComponents: components.map((component) => component.component), + decision: decisionForFindings(findings), + score: scoreFindings(findings), + components, + findings + }; +} + +function summarizeEvaluations(evaluations) { + const decisions = evaluations.reduce((summary, evaluation) => { + summary[evaluation.decision] = (summary[evaluation.decision] || 0) + 1; + return summary; + }, {}); + + const findingCounts = evaluations + .flatMap((evaluation) => evaluation.findings) + .reduce((counts, finding) => { + counts[finding.code] = (counts[finding.code] || 0) + 1; + return counts; + }, {}); + + return { + totalMergeRequests: evaluations.length, + decisions, + findingCounts, + blocked: evaluations + .filter((evaluation) => evaluation.decision === "block-merge") + .map((evaluation) => evaluation.id), + approved: evaluations + .filter((evaluation) => evaluation.decision === "approve-merge") + .map((evaluation) => evaluation.id) + }; +} + +function evaluateRepositoryChanges({ mergeRequests, policy }) { + const evaluations = mergeRequests.map((request) => evaluateMergeRequest(request, policy)); + return { + generatedAt: new Date("2026-05-22T19:30:00Z").toISOString(), + guard: "repository-component-owner-approval-guard", + summary: summarizeEvaluations(evaluations), + evaluations + }; +} + +function renderMarkdownReport(result) { + const lines = [ + "# Repository Component Owner Approval Guard", + "", + `Generated: ${result.generatedAt}`, + "", + "## Summary", + "", + `- Total merge requests: ${result.summary.totalMergeRequests}`, + `- Approved: ${result.summary.decisions["approve-merge"] || 0}`, + `- Require owner review: ${result.summary.decisions["require-owner-review"] || 0}`, + `- Blocked: ${result.summary.decisions["block-merge"] || 0}`, + "", + "## Merge Request Decisions", + "" + ]; + + for (const evaluation of result.evaluations) { + lines.push(`### ${evaluation.id}: ${evaluation.title}`); + lines.push(""); + lines.push(`- Decision: ${evaluation.decision}`); + lines.push(`- Score: ${evaluation.score}`); + lines.push(`- Components: ${evaluation.touchedComponents.join(", ")}`); + + if (evaluation.findings.length === 0) { + lines.push("- Findings: none"); + } else { + lines.push("- Findings:"); + for (const finding of evaluation.findings) { + lines.push(` - ${finding.severity}: ${finding.code} - ${finding.message}`); + } + } + lines.push(""); + } + + return `${lines.join("\n").trimEnd()}\n`; +} + +function renderSvgSummary(result) { + const approved = result.summary.decisions["approve-merge"] || 0; + const review = result.summary.decisions["require-owner-review"] || 0; + const blocked = result.summary.decisions["block-merge"] || 0; + + return [ + '" + ].join(""); +} + +function metricBlock(x, y, label, value, color) { + return [ + `
%>=hr%_sd;!?C-mG+ z)~_;>H+c)%6{F^|+}0^7!-3yXgHkT>56N^8vQqC~6Di;qQ8-%BOb?&$CFt-J28?8zJ(bmW#AlQ&wcdGbE=1G5fS{ORzq5 z4(yb?LbWw@cQu8!8j*aFs$HDearBpOxLlyg9 VihRQLj$JdSOT+7u_V}HElDR73-5@AXHri3R-gmuKNK8Q2Y2v&sKM%6>kWQK zp*3%-v!3U@@}missD66mZE)hjo$BprR|1OyT}sip&;xUz_P$%&{h4j4lmbOguiK0a zklB)GPr8qkOh&(~R{(&p;9$0ejz YF{^)A~Fwe2A6KT?+6;?21?8Bo4Ty zx>-A2I~N8>Xa;$KYSdkpWKT^&J+UC ? z5{53F*R}e9!nJbgHzO#~m0b 9|aL#e$aMmyBVT_M!NX!AH8R$_-H*18?n`bCrS& zQbGw{i)Ko;3Deu3qX1G9D90Hbw2xmn#^F=|Xapw*A?*Gloh&XlP0+BjNn{BQICHmC zSb>VRd7i_>0Y^^gB(Fg}N2P effbTU1!g?$nVgJBNhw_7Pud_5ulr3+yX3%AcG;fdLYUiX_( zC;bTHmx%l*;?)O$^L0R}ZNJFjFxeOp&A>}qMc+)XF&NmH2!O3qtLxwcKqk<+cnJhE zQ<%4mpP;ZdDmovH_)p|3Rw 4;M}o*QGF#|k6t!HHryh8Rm=@bKGHX!Tq!6>ENu4t z7%vvz6NGq34_QvjhZmwFjpU3QSmC-;Y?rNv7#g0lURrBsriK2rb8PD`PjL@hj^8H1 z+*sz^*@`Zf8hZd69@U3o*=DusZWgGkQg (jW ;L2q&{xEf3-vAb!s0@sC+oxVkEYjmr-e_30dm zHjaFkrje$7!)mIPBlUK6{H-B|0Ts&+mXIxh_QFky37YvPMBs2u)2MZu7;UtahxN3` zisqn MBJcVetA4a{#8eZ=|G4qVyV*N}App #%{#M|2%F!!!i!aP{4+!Q4P5OFGZVqB9Ox{8dYJs>g1M)Xz!|;KtQiGGAP#q~g zn7q!+#4K}UChgLdL_lX1^9n*qe(wp`b_QCocWJaUhbdh+QgX@oLvEq($(J2pSxKk1 zs{qbHd0>0aA0;Jv$2T2>wu&CwF}kb#=q3p(mXU8XCQe#`VXz{I#Y8U0qB6B_kyZ=e zY*55%H)Oa}g~gM;@bX*5`-0luk|DtJErrJlzwySBb(qC86s7m8?h?D+d2vB5KpBov zO1d9VA*V6Hi`i0nb?mCNi$NstotFm4WIn3*QcS&iiBtB-LxkXVm)4) %9iOtW zlI0a(&*qf}b#gx&E7RyC<}q|~BXM6`M9rPoTtj9rm&-V}+@#gAAs49M10t=IzBr|s zMu$>IIFj)AvD8EA@?kg-qn_;`pQF9g?U8?gv1d)?hks?9oepj=JQLoGCMonfAY-=+ znv0ACE4^{vF0&*2xiB!(d*i%{5L4wvg377bd6!1QQIr*A#*52Hpngd_SF_ECt#UVK zO@f*i?I#>Se;zhFkoGOyvYN)q($W*2Qk`|v{c?t$i|z2Ok+ZC1q(B0~oxnz+D)3Hw zW@U5#WYtXe#Sz*4+jD0o#3#j0@pD9GC(J1b?B09EVSHPIyELzl8lFiLR$qM3LrnE* z3&b_BMb(>D)g&2ppqfqWpmB y$30bl?npB?UTv&~nm)3qH~@bn$bn0P z%Yi6yGB^q=?b=){3{R`jy4Mt7Pe(4{8f!(0-`%?Gv4~J*$}y)SJ{q&r_fR|(LWW=~ z<0&T8dSt{-ip>`bnrmYuO(u<9mURk*Sj4f-uU6d5EBDJdw1;Z^lY9z0hiwM-I652a z)@Ed^Xy7kL>7cTU>Y}frc)U59XpS(`zBta-SS3^9S8#&JOuckxiU%Goz;OMmJUK;A z@s6-%74**KP$I4vdbpoQ{5&cJQ5h5qeN|6)#FWzQ@P6M$aC^8{UVUk3|KoG_;WA1P z_2S7&r}W)sH@x%}FHxr{KM0(!0kJ@7VKX?RSooP08e8BQvl<(3R&)f1zICKa2C)tN z1K%bcx2au!?zFzrUt$~QMPyW3WSQx_XvRKX{?~YOUgq5;O(P&pmV}jdNJh1M{%gN- zf~4%vP% {UY4W~p$<^YZprUpmuih9%CzQ{Y+gf{}Ii&r9_;-1b z2?C(xXrE&3JoRG&Sm)CL3Ye;!q1AfR#cAs?@3OAX9Qt){UkyUDm>|W!boUfqJBqb8 zISY3N663%PF#gmRvk~>9;=y|J1&f+0_*nJYZca>`&hzxTa>a&qFvbdG)-~`aTU)(y z1T9qh_H@6C>Rij#skESjT`gf^&?pJ>)-p*996L#63m-FiP*#)kwDtGQ39Bw_D5MRQ zXvS-$0ER&IQ$*(u-eBXz3egEGcs9^L>|<1PD*UvwHMAaR7Mpf@ +=KUC$eDN`tG-k=6+c;X*Gx=4&+p%#;loD;}MML&G(uvb75?#pz)tqG=V zo@?zb0h*eeIm>4+zUFZfmy}w7Q<2E18t^QH2^B)?gQPM1;PD6HgGG$iOh||)+mFsm ztNR9_Q2;2to;HWLTYn(jZoP-adP@*t+R0C>Nu6WPV(z0Q qj*S&;wXJEdgyUpo`PQ;tdVjc{>&^J#yIEG z2o_e2_gei(A9bX&%!ma(9GGj?pa#gvHDQXaC|l qiRL%{SjhMW#@X zfq2zWU{MNs)G3lB+bFH6Z_ccf;AzDcn(7n^fpYAq&XmMiBHHljI~5{O^{BR2WHAv* zX#FuB#wCHF{t6!f-Xh@E_kxpjZu`V*TZjVyMSPBTX6#WCHA{njr+aNqFIoJKCtPMw zYo@bQZ341jn(-bGXBi6-+@%UKg#_+u!lo3JiqH0jykUI97~LaAN2-5DQpuPG>F0K4 zrwG|8aW8_T;NwqfdCCPTlv|4s!)Dwb1};xTTC2poH=s>cO*nTQM)4;lO4CLj-EF2( z_0ToG|9!-bUwFepx3K_6^Ot31OBLlA;jHu~km%Tm#`c$TzL8w^?mK={?3t%l(_-CN zuL!v|6clI#Jrm~Vb&-Ywjir56aM_j=eVub(;&{DDNf~S&m%AVwPCjdXT@!a}+`H}J zb95#)CY%gfGO2glCmqrim^tolQ&CqPh+h( -NcMe;k&;x#sY%3>#NI%Bs$igS Vy@wtZe+ptasEmkqX@v1eVOqkO0-Qz`^dr?NFAhaj zIVku`B>R@p)rM o~*NICMMp%-!3 z0ET5YV=U5w#YID;3YUu7*?rNR+EPwL)8F3_n7>n3{uw?j0UO>z?-kU&B}$+a?XEoC zad1U-G3%kU0YL=lQ&6no6O^~{A(wvXP-wY`=iQc;+J#=rRdAgMNzUoOd)WbApsEA! zf=-7Y)qtkh1JK}hGNzsqQcAuu6v&01++5_ 0O6Zj-p)Tm3@YGe=HsTg zJLbv#RxVaOxY;BesrW|cgy9ByjQLG6O)8-8x}YB+1WY8aA>5>q>`QZw+z)`H*^Fp5 zg*$)f$z;YbXE%Ye1q63S`c<5~Gf(-5_P85b!=X(!7d-j_*J=+Q!7WVIlLpk+gr+JvQDO(J0vemD=7cSPC#IJ08+t4+ zvcZaiw85IcHG{;Eo&KDHHjXa7awtz+k!k3 0kO1x~=0Nb`(0^=oFkCPOZ3dOUj7io^`&J St47xn{FWthjz)oO}^%Oar5gti7ZpA)Bu}0Jn)JH zjRj_B2$F`fO*t6uDdk92&)7#YP=N#CE5`dqM7RPFi;}V3UR;yG9$gbR Z$8P!oe*~rJxriH1pTQ& z3Ytac3-n2 oAtu7R>SNoknMRFz9+$FX%N%=f*<+>K*3zTr<|b zjXL(rZaPNPx=JhGmsG99TEyjvoaa!lDjEEP4Gi0L>seZ=?T6b$nyheuz$QNzq;G{8 zt*;c{W`1!`PAEh$H^|ZlpoPe{Qld1TZoRma8vHZvz)k$`Doq_6O%$3NQ|ESTL#})G z3sN9Nh{M-TmyTH`RGz0{!4;s(lLQ)Sl!1@n%K6#7Q+8_6lUeYofDN$@B!)QWgm%lK zdf$9;%6aS(OE+4@CAhvx+ShQ(dQ%)Klzzc&FAVIDP>S5{ehThwWd$6DEqdE*--tV- zz2{e8aah2%AZdW~x9}aW`wRb^Po0DQsMF&g`C6agwXuMNE)7(km0;r%MjiDa0NTf; z+E@_BxM3%6gaGBoCE7+%^uClpFU^)#zc9oxZ?3Y^?5F7S7@K#@W>r=)0NEx2;RniP zMszXK%V(MmggEh7U}X*TgL%f`pI8dKp4BsH;%A+GTRUz7kXj~&ni{(IXS`c?h7}1* z@7B37Uhl<&f85^PXZmbH;E)80{Jw#DhCK)0te|fI(BtW&O8V~I MGK}4=g0$Re>0VMMVB3?`Fv&1r6a d6MOL@EEsTzM=Z<$Tg_-4Rh%BJ1^ z*pFTKSj@qQ3ME+$F!f?#HkISw39s=*o=53qQwL=H(t{Gsm^l&jPQBEksKx`aA&ST{ zLEt~!oJksbj|0!Dvs=K=^|3X?5V+=n4NHh__IQd>8NxGV>IDy@;!-9188LDPdo?4> zOyn;D--ntmkr{57;CP_C=>@Zx3I;7 Lc1j`>Xlzzw) z?$6h|GF6Hsv8U|u4zxakS|75U2|QnUVsO>XXn_?1kR8m}if+XW_w>oew_OQzxSp!T zoT;;$BZ=T{JK+E*9aEjai#oPld1Un^!SJ~+6X3j58nem-n1o&zB-O)>+*|c*sZw5w zUsU@TU$U?YVfVK#8A+)4zL015W`h@HfYR^{bGQea1zfE1BF$@yoP^qZ1Ym?=y?ez5 z5T`lIyHjt+$F+mihB%f1o~!6#Oe{@sOwWuXA;`xbCJ9ISrco>oy%j8xh8G%T2CCo1 z=@9^jUSZqU$|%DC8Q;$n1}R?IisM|_E!9AOKq~JM_-EPbc}$RHkLe&Yy>7Eux+k$; zpiAk`=GOqaZFV~TdtFdkAZ$X;{3iFx0XQ?Unm;8tFM5j&L3)(N_|TmOW?52Ny19m7 z9CHQaorf^_c#D2!ns4|~EaMweiF5AUl1cOTe5DyY8Sxj|3d%ZU^h6dId?2|@bpf_9 z`s5hi`k?8)2Q&JryX46zK#;FBLpiCNNidQ9C&Qd!X+i=K)E~dzNNMpjUQZPdWB5fW zHm2vnq)?~Ps^-xp9RoYoL61vUjKgEUD-g=q*PMdV4hElXD+uFCWVrD9 5xWBTb8AHG z89)JIRl=P4q!+VudUgo^Ry`Ct)La;7tQFV+y<+kq@l!~s)jdS}eSwNtq8^Z3U7SaI z7DNGbNU&urCk0QMwL&ST&;a=?Ab5ZjMieCgoXGYYODI$9TDl(}UEEdp ?3UQFV?%7J FyW=FFb@_zkuwIYpc_&@9>>4wEl4wUY6}mP7*qzakTB1r%eY!y`V8MCFRS$(L;u z^7A11M>Xe6D_@ L3?)ZP5kxR z%ZhqxsB0B5&yUbxE+Pc?le`-zCnLxn_l(};3l0;Nfmb*61@Z%3tgwa7>6H~kz1^Fy zWRslvzx0BP+ImCsay~_Th$e7s)CD9+etg?o nn`B-o=K zdXkm(! %MoD`(dyNRIxm7 z-T7K*1grdf<( )eV!Kefz=i6v9J%0JaS0o9}9{ndD6tAHu zo?!a1d`&U7H}?Z3-|EPzxxnMwg0YsUzuvHOGiu4%5WIdrWVR^`TA9~-DqIIzmcBjt znFE=5^YSL;RHA6B(YqSHvxDnRshxih)Wd3+ Jr#?eW zjjAV%j5gCR>tzhEexa$9+-iBe0b`0qGpGp6Zp8Kpo1ZhLT;e5&u4_l)AYM@CeREH| z2kz1}yP7WI=(aJA?Zp92`V~>Z;Bwi-rL&w{2U K?UH{Nk^xCN0)5<5&0Y1hu1(H4inNqliJvq{EqIdonj(&Yt%g=A#N7!>VM#h3 zkL|%tnB0P!sO7D!oI6@P!YK44)N1o(SIWK~ojR4D{Wwk!VQ83f@1-7W0~y?O@}Bo@ zqsbP(@%!*mUWx0Xzo|iYzSpO#7tBa^?nnwJWqIa!5-Jz+LJU q~8j6VFXCq7n^ru>Xq(0XHq|DH6Dz{fTF@m1?4{D@?kiHrJT^pOs-0bZ5zFo9 ^B9#3B$N!kyLK>xC#4528_?_Q-Z08fDTzO>F4KB5ULk9%g30s!SHr_ zjHtrRgwM0uU|s7EvWeJ_6xM0X1kCLBLm)aI`RzauQW(D;{1aPd4~lHKbX4 zj9aUb-MoHL2QB}N)EvMJRS1fAz#V=9x+WeGbgxgRN)zRSlGJewMGmIUjD;X_hm;YI zemTE7dOwbe+v!dmf1PvQ2Ys%V9~E~@?4YeJ9a2e`vfz`t9VNs$%8qLUnHG?{9|em3 zRuU0Y{b%iCADBk@xFs9KMOuyJ@B5OKA8*+YKkW+~1i;b=nS!Nu9H*cICdbZ)qj67( z^TUKI)7wg%b22xVEi4WNq-QLeklr3g)d3>~W~yJei1Vdeutpg?uN7JPFCig*rgZ9F z5R^y7d-PpeMs^Mt0Q+`tUfU>Xift|#yxku4(<(HOqX`RrAFE%*a2^8UcnaD+1rr1K z8OljapZu}1Gv~o(--J$|-;1f >l9^jiJpd`%`K5@GZ))KBm=J@_H)~woZva$?$jv}hCx{#@43jS~p*dn3 z#T(mLCKn^W?*ZImP%f#BLqY)PS2@0u^d=S%0E6*&P4X97P!T{MxnV&kZ8Z;CJ|?Jk z`bbpdup$irM&gNOEPnJW=XjCm&b0!-uHAsISphKcnvI> BG+X(>j zQ z<%-1>iADe27+)wBs_X#xkKOKYA^)-4of`}Qg$3~h<^MI?W-XnX+xvf)|2+c#dj$Uf z8UZfQ$5|C1M`k8h=DR;27oegIU_ %UDN zN`ywZTVr>gyv-(iUH*hKV?oOWUEgI+nv{`+`8OZp(A_d {pQrZ*`ywtMiQ& zcTZf~3>cH;3g`ND$!j`ozw;a>{?!&TQ&ovNafprKfEWCV28WB!KU^}lL6p_ES`BY! zMc1*(!_cVaLIh*AAj(d7$%macOT6o|Q>PnMkl`4*-O?bxVMHy$VY(3k?57R@C`<>y z0L%I3Cn#`b0MtL%NVEXQzaJ1Sfeb R#}+1lQRqi^*(RmI@) z-CH)9L_GYdheF-D)8rJJ!LJ{mojd0+!#x)4mfJ0i@I(v7N4}%$28?~yV*^>tNdsi= za$^4~ZYS;7Ia#zDiK>N3V))EDzJEf~du?Y)r-Zc(6nY)zzj{xsr?&f01`2gwJ?eeo z JXl1ekUvbYw`D_LE#bJhYGO#c0;7&-}j^7>cM$m+U5S7Zn!1t91(<_Sr2%|HP zYTD=u`K*Ny@D4Q)hyuTJsmQ8VDJ*7QcFdK@TF#?IZpu4`gf4a{_JIhnE(sjuePWss zbOD6fDWkqZy(-KKD6D9RvD=|vN_=aQ__8h*P;-b3yyL@WUBJGkxzF)86{R?R08@Ee zw{3diwV+jD>H1SsHwl`V d?kBl9mWsVBx0gIJ4xr zCuiX&XRF#j9#2@VGSH2$LM>=)(q6|MxNEGOZWYVkrHx1?u-c-z46wK4UOm%_ogXPJ zn{vz?90B&T5ZNzL%uVA5kAm&weJ}jqsVmsPS &-i!WJ)JETf9eeOF_oQaha4Zw!bwg!;ifh!Y2mjF@DhxDx%{35Mx@skd7 zyRkSg(*(1H! Z8!azV>_{CW+z(o9MZPwcH{Y zjvhxPok*VNLtKt}bNo{dM5#}g0%B1xwI1td#U)iE(G!-}(!|n@3iMuicpy &W>7crV#de@F|Y zzrc&({3?bvjJ=qB3S%+tAb$yC`R+=1k;*7iopZTdT=f^YaWz@I;!t0}so!j$8)r9s zj1cIP8mrxxWLeTB@&y>6$PJ$(%lx+df gmB68V9j6bVY 5bVMEy-Qti%EI8WwgG)1X<_+_T6?y+s9OSE1_6!OG+V7*L_<~x)DM}JCj zDRKP*clPe~D~%0AT?(f`1nr_?%&$8?YE)F7vP70cKdzpj4imH9WDAr|UGWz0Etz`) zxUOz%ZAI7Op(~5v^+mA$+EG3AdI3#W7O{BJHBle?M<0mi&HCJMf;gnzc=~|&HlMHY zVp6%WXSmt-K7vj;bjP($_!oX`OAk_nb?O$&gF?jSrqXA=R(K(CWJtTs;QgY|p NY0GuNWBT5q@O(|PxsE;16Ivw>Q#PzwQ{KSkI5Kd=J_21Il}TBBpF5P z)1PKQ3nqm{vgDL7eEuD3?{IQ*0%2nIsG`2uA~7lX*U*==-~coTP5FQ qcrq z&vHq=B`#?5&ufJrhRIenAW=V@5U8;6CN6sSTQr#8&L0U^-|V4PF^U?LgJ_kFgG*)V zAP&T3Mv{)DpFe)>bCVP>Vuz*Qxa@^*-f(h|lhn~mVeHlq zjGK@Uxxr&U@I5yzmc`o&Q)G)5gx-g2BPSXI>%gsFm~4>DKmq z+xJkF>zxK-(#X#QP3eSqlMo$gsSG)#sn@gWlDl`NB6+_oaH%?hU{F6vfc6a(`^M^_ z=t~!^!d9l!qqOVK>@VbW(RJ>k!Hrys1t4!qzVkkLZ#hWZ#GG-e3w4 (sK>=Vu5C8xOfU+i0xe}#0Y$fq3Qn8{S zIb=Dw##6C^$k}h%*v?Y+`+}z1k|UkA Kq&yK$X`gO3?OR9 zOQv#;Dk+$g5jsC_LjH_lx@vaj+ EQ8j;0_l_&~M9w+2dpX5vTg| z+Ruey762<#_uhq4u;RM~qiWmj5Jbyq)ZB-W&a}1zr;vPc9ZWU;_$-=W{^~>e|FU9e zntv;P4AtIf%dNd~eo~8f0HtJI4Z;ASIiWc@nJLag;r>u}z|Rlj_CM_L6&2uYRigV} zy0`P+f=Bd&nI@gTd0DNx++veDW8ET*#JdC?*ro(l *b*zUC#Vzrl?7;yPFgL~x ?KFI)x1&B9R7K2#27j}6Tk&EAvtmg0L49VeJu5)DTp$OXl%9RdS497g}I zf}~v6ZaIHtjcEB5zkUHsh%5z?I<0f$y1-gR)0X(@O9J*8!?%|J6?nb&Kz*niKjd3% zJU5uS=zrxDpWvdvC`LrjF0wKICDq%sHRr$m{9A!e@E>h $(|T9Y#pG}z7DVGV)#zH8 zzE-c HH0*YVzI>1(gFN$?G#Rq(jVWWfUDvGq6jiQ8!> z>b|g_6(|!*H2Wn?zj40>522(vQpJO;uTZs*W@4@*5YwJqSJ=?VDhiv z=2ML43qLxH#Kk%QFU^4o6qPc `O`_u`DN;#`U`}YC+a!We^LMiHaR1_f*A$I6IyXgWzD+>l@p3i%j!4OH`GJbuI z--96l1c$vEP=1#oAuJZA=uRw67iaS4=>*+!m!0|!nnb}28wa3~i!sM())T++ip#Hv zVKPc=gpCUBgQU>Y`HgPg8bVR=8jP~?Yf}fzsn|{k3>=DSiEVB7_UGY7iSVCjaQ)FY zrDGuBP1zVSnZpCLGxT&glY3G4LaPQh0qzDI21Io10}I`OPmL^z6lCt`Qp8<=4 dQvvkqvztp?eNuM&G{!Oj=)RfZ3qe zK6BMN511^fqYdXKas(IL*=xff0x#@LzGOCNz0~R*wvZS;MWdhlB^lSQ6}4ryfq^m; zBC{2ek5ycBB^yaHxDYCA!A|++i_shI(4WshNYn@US#F{$LSR^$VOo{bX<=e3*tyUz zU+xD6!x*_Lu7L$4d}%u4!oG{GxN>qN*0M@hY8cHc2&rGtS*2M_riiHM_a_k4 +KOQ!gaUqOQFJ#YF zYQcvfAt8G1q*#&1u@A1Eq+UP2__+kk^ADl x!EVEH`+N;fs$2%wYC zzPdBmg?yX6f*|Yba*xMH>o=?ux@>*ic|p?H8jM|EzvWh=V)1RwEW+~;=Y1HQ04H90 zcoyqAT(a1`#+`2otlR3*DC4?pu?#({bmWT=^VH;uEiHx7b~E@o5w35u2U&W>Mc-7k z*ZhAZ6~lu;ZRI`My9EDvF&k_zek6G$gm=>UyUbtMmYU&6ry_ci*I)?Wib7uqp^q&Z z?l5&J6NZEAKVv|Hm_+?CCdJ91=2;;9)fsUrn4A=?Cim<8q$pj+Ijm7rz5*0e`ttJ4 ztw+@YvKib~$~PAMPIvD2>yd_$%81sK@ZV#yB-*~B!^lLBCC5VY3v*II#b=&(IcnPb zPm4_9LqfGvi#oV(^iABzn{mzxa&~jjxYahy5JF>a%)?_=0jZK9Yb!@X65V XOM3m8*I=#F3TQM6= z`5R {XwRxm?c5y9h?ds_nC&lQ+S2SAK7(T5w+hlkDu;xieRYksm2u?@ z|Hjag6o2i*r9_(` 9wA**3Kn4D~9Xe MMm6yQxMl`o8XzfW !f>4Mw58o%{yjd2q#jiA;UW4gIGGP}q>-j&}d+XTB zV&`A%hMAd}nK`*(W@ct)+%VIInUf7|m^ayMZkU;wnQ@bB;N{!?D!uAGRqbp4>_?Vm zYmSetv8^*_#xo9r@}i}sr5+uT`GRyNNJp;_ l`g@py~?d|R2 z9#>RY)BN`cXJigvs =j3>ok59`CD$sr^)E!@$wnp?G$CkE zkB%dCk@zO;DU=rbaWHldSyA4CcVQ6~u@sMdIVgJwiKv90Cn}c9sxIIjtdOv$sKTb+ z6=pA>pjd3URR1X)kT?*YDrAkyiW!DMIe308hHDu&)x17EVTO&CWn{Nm;|@vf-O`oK zbp_!ZoNBF98phQ?cq0#IQ=d!1{|HD@!VO#F3h>oB;k?8@kY0TdPN({Oqh<*UUhNnN zr*L+Xi3#Hn)X=uS^ML&IFly!l+i!8A7LgS3d_()2P5ql=mC+R9B6Z87AYVpR@*lu< zvevTvcUP({2!QNY$N}4NEYMLMZss~2)8oJGZ(M1B2YIPB_OGu2Lf_WH8=xeyiAQK9 zEQ|OT!lcd!D&&Kqrb09E+1*WBE_!4;dYSVMSo-zDPl*tON)J9%K1&=0hX-DmQH^7% zckXWAS=8AOfLW~_XjM83Wp~oX811j;a)ZJ=(rK{L9$(jFmX(LCO9!-mD;NUO=gyMD z?3HZyz*SgJqxL2Y=$CP{c!cG!78gF^8;{SK-M1AH5Ag5NKgS%S#9@7PuGDx&wlm1? zG;!~ rUQ)jlCtMCsYa8;%52+FQmt@vM|u6X+WWh`}j zl3DP`CP;;;G+FYOQ~uvhyv-GflV;Lat)9S`aN4h`dL@rtz)Q+$EkV4|)T)OSYT^1p z!BC(v=UfT2`sa5=Ya+=h6>1mQWqaTLVdF54>g;c0gzzeo_H-Z!39*Tf8AM~iUHJq! zae8 %j5fP(=m83XSb;ARz~ToQrOd{F+vE^~;N0$dQFp&@)+w@AhX z WWE$H)g8V_)yu3K3!B%chv~owz0lz(9j(NknhyY5%huQA#!sg zo0$~`4cpciz#H6giWml}G3cL{UL;uYklbAbP+V4g@! z#V{hx&+RagOOu~g3_Qx7NNb)aFDzQZN&~#BOW)A5cn% Z=rZ(bf>z`za7oU;_5} zN+s-7Vk-uHJp{d0^Fy{9ovIyNAR)2MFgQ!B7VWQSZ5o3zD?I=zED3?zti|SU+@$SJ z;2ozTF;>04pYuwvKqsaF`^K&_mh%mTmBMMc&5@idG9H`- !nu6u*J~L&bkWh9n$H{5%FId*U|2LAqZo1KQ&Z;$Ouef&lV| Iw;z)QAD3U!PueL^?+ zY?#_cgv#~rGsv7bdq8XC=`&?=7{chL*~3z)DZw2`SkeGPULlo|evIKq@5uCxbhM2^ zIlJU4$iCL+P)gKlGs{N8_K9C=@u^(|S509EbDndx8Lv3tBogUc9B7RpgRDDxxIYXa z7)F<&GH 7UsWGiu^AsM2d?{aEgrwLclHoszzT55m*30LtN&^ 3gEqAtx&JdJ_}er7A!b{02OS5Y*E_K52>Xa?s*)fz6zEP1 z2;MjUCj$k2=3s2~6%PPN#t2$=OIr00e>Q0F21C4vd*yLz)tT-C-QQhd3Z&)S4V;zR z7JtX?;%< (zeEsL&_3tq^V*$QnAnsFe ztM9#z2E*|+2v8F+x&uEvQSen5LD@I0e(f^=H#k&t7lA5frW5amLChdn%jE~BQ0qCl zB-~?St%02T58Ib@G>9_r{ejXgkp95f;~aE`<{QkTF*Q2ONZ+L2f3{4)Jo}eDi 50os>BA9(z=Jk}Q;K8dNQ^qH?oHkVVcM*@mcL#^do3?h)}`G2QrCH2s`e#@mVvJl zMG3ytwUc*|fC%{nn`;>AI#1>=9sjd(u0_74{2)qnTG;;U`PvV_$Mso{ysoHl>aCbM zB0Eh5dvz^))tRK9iez5r^G={w3SzxdF>I?E{x&oETQWqeWsYY_&hGM{bsD9RBeTWN zXl^X>Y!p5GHEt-%snNY@sP{4zJPAs=;RjQfK-MM7s%fHqtYU=)i3Eg1Y?vC?8HS8y zjh=AQ(z>_a-`<->52O8Vp>c22oXHU&XMG&83}&et9%4`53@}Hxf#(}~D4B)4?I7H< zeoJ?9evDP43Y^1th1DPEzqGOBNIF9XllMwUJW*ROLNYf46R5&WbeG9Tw#wxh^=-?< zxKhHrGcrcae$bZwOgivdC?KF); `k3jInFlXVwHC#MVp9wh( znyF3FXGF!7y3J)9gZyTiCh7;p6|@e3z8EKvEFfw+;cR><+VBDJD}W{~Gz$EO0kM{= zcUNus+3pN~$@i>&cPsun?@~-}Hix@`Xk)!kIIZYp$g83f5nUk+^%;SR$d (wya6(}?F zz7gFSPz-T{tw6(6>(HX-T_WjpB}5fR%t_oWb|@?g=bc)nMZgnbAd9gtQU1AoV+c;P z0)Y4j{|?Hw(T mPlf4Rb1`Z@_tXPO<-!086F7ffaW63+xRlw@c* zO^jIqaI8cX7vF$vRT0Y{N+&si8v(ChKuF^2NYX6PB5B*A#0%9b*Z+j%>6f0N%Ncay zi3{@>otu`t>E*B$B7Q^6&P#J(jR?(lu5PN}e^C=C(bKLHMCQ&rK}J jtUow`A;|+7;dL@7u8np^G z$<1SHa{>tEYo6>NBXc&lB3Lq80uL0kt)5-$6UNL_`~I6*Co)FVzlwnn3E=vEr_El~ z$EyJtEMzK1g~PcFBdb4%MD#s7^2YMQMPKUHru!60Llrw74B>QgO}Y`nYsDa!=}RMi zd#M-mbtC0#!j{r`1{O>bAl9^+2?e8H`0u1TK7(^FC>a#d8=iOgSt#|nKTBGfIN-ei z$%n%lAfY|a#6ZFT^DKv&+8U)V|EmnC5^#8|K6A7@D6k<*J^5?1`mDhBPK5f8 ?N(y$YogY3P-`#^NT;rk8p!UKj|VSJ1~X9kRMcz-=< zw(`(P0(OXBctjF|` h1OBnuCdNItiI`mg07F=RaAwClnEP01<7DzNj}M)8bgm z!#-v`#EwB{1A{hhD2LWt7#NW)GH_;&p^O^4Z8^8kAdBWF---eUN>+H;Gw8Vnr1`Pc zjblt=<4PfF6--t3@bAYG=m$|8L5Z@;D3LWhSt80nHFK6Ih7`&DzfyMqP!)6<=7f*s z1$N)HJI<5|5=9WQ{R~qGqTfuzsyoNu#bT1cNB@h@lpyQ9?N`tDL5K^^;b*)z2bQJE zpe=@)iYJ;Pt&bSYnw=)IQ5OrduedlA6WF26u!D9_e+i-+*IeJc%Q}*x t+LG61tO|;G8ay-0Yf!OMYi* -n_4Z|K1g&*XH8qGLB~qMV5=By#zP^M`}?dKhZYfF zh{>Kj=5BZ4%Xj4<8^8`-aU+N > zWHKF;;^Q&)n5wughK7vtB$CNUE-|FTH`#0OARH#pHI_ozPPp|QI3vYZZ6a2kvMbQd zjcOezQih>L$PwIpt=fMj#n*)(P5av9Sd_3yWA44x8NGk`mt9uvhVMKYqvE!>o8w~D zoNMhkF%K&g+$H&Gs4;C3uJ*pNk^ukhs80*?>>?KtCpK%kB~-#akzC<~3lFXtHBX?7 z;Iu_E>C@F8lKfJw#b_zFxFNv?z<+G#hd%2i*;_98-5&+8Ou{%0w%;B#nzX&kc??eT zS%PZdtb(| qxMZ@h{52BF#@P+04K8WwWt_#D-z=p-S`p!d|`*7a4 zNVIRSWp(6`FqKSXa{uJVVY )26Y9sBHU7?pM2reuCjNGj{6@PIIO8 zJ+>-{V#6_gC-C2`v8%$j9FKG?i;SQ08}*fBAzoww{)EDI9q7g{ghD3s2U|2esn;w9 zLaRgH=2KHS( x#&w$bwh211 zoKGiX{Vv0u7BREY2ZArNT=8>s;6>Wwfv@-=LyO3Vz4G7eb5poHXLOQN{v47`iwsBV zBZs1L2;}nc*Mmk}-7L57m3#E`4yY>}gi=zZJ@oWbsj04()8Q1Ys%V<`*}PKZH_=UO zzjra!_bI+X%UxeNpQ9%c>nCmjuL+DHyNYGU!Y-f%F%>LKA5UfQIpttNSeZ*S=~n0V z35NcG UtqYq-Cf@8jE2e{;gAV|@fSYu-YaN!TN~MsKM_ z17xb!EefeGC(;j2`Rz((IAOc5bVZYAUo#MFe_v=ggLekZ@=-`Mz%&W?qdog)p*h2o zM)v`s%X$BO@)(@+sJ(XzO<|K@3y2?*gE3>{LE0{6Hnxl?!Yeh1k}#OQh=tLUJ1BqA zheAC*i1Y@Kf(9&CdUM68ZKL}f$VmaEY%Jk&snvr_SKrEPXseC2?Co8eO&tg+86maE z7L0=m>DvgKLWMw$11>UV9=CK{M%dLIR>;c?A)4k8luX>4BoIXFm^}c5_v(oUXR~oj zGZL+(2p1@+uW+^U1H@9>ugr^?jt?hl`5}6Tef*jl%;gc>Ke^i$@TI*%#K|?llXw&= z_D9gTtt|`6U@fv`Y=94>W|8v6E8J1R%Vb?f&VPm$Zeu2QG({_3Rp6cA>_0rW8HXE9 z4W~&ds+!^F>3;JK^*Q(jh&(3QHIf;?Kt>X^n*_+XeMQ$sm9ZJNK*mQJeRF0F#lyjc z>(aCQhFtoD2b&YgBt|zBfYgRTl*DUW{eYCL9W3-Kx&0$9qg4M>16H!BF( ) zTG!k@=qv=bO^ZV{ZS5#*&0?I<(fM7447&(rhq!1#2J>%e2Yp6hGZLP$Q4e*!nqc@z zBU2+}aj~G!3?XJUA6!y>s*=JJd`G$djp+J*2xcw9JMQB`Q6uB$VJPvA4Vv6c&+K xYKbopHIfZgQNs z&qGakRFxITem)`UhiD_%1~g 2~+xyIdTHjtXcgo#@enaLbkcctWz#dh)Al zEYW}mXW7F#6gggmEGVd kxc9-d0t{fb7L=O2_9eAx5e zl?I*j$VoL`qMl=iFiGPo$TtH0Q)(g@C`@cv#iey%8K}W~@_umuXBL2RX}XDg2~vS7 z5|BJtPb6Mc*t`ghxWgDt>f^-6I=6X_t6Cqkt|D)oHNe5 d1)x^2e?}DM`S_Tt2Dx!u2+-NjcI;or=o9-Ph z6>hy33D-3?>ay{D$?LB(d>Yyu{81RLI1~b{C?PrMdlAJ(%JssdM(a4%m2PNy^vd{L zDtRlOE_XPdaeG^pbHc0e;|s=z^pCs(q#lXBVNsgqxJ #?I{45;CXUr3S*@x4!IgG9h;8xG2M3&JOVzukcj~}`xQLO8S|2RWE)gl z9~8!BJrgIfJsE>LI>z8rIc|^&JLXtt1KoLYt<<=k0e_T_)4==&qtYK!ONR6&0ZDRZ z4ANaiJjA#b=wQV9Q&TR}1CYC7yH)DT^M>gpcz1pa0`iGiTCraK+9ZE#xrT*811DPW z!QUN#DN^w+rQG@cj`pUaH6?$NRCCN>v8^s_b}{(H6j-Fhq+bJl436pyYE&QxJV#(4 zZ%2m=4*7lrV$?C&yY1ZsyEMm~ 5_vaWY9)BBi c%tNSrU0Zf&e@RwGzkPBxrmXd&0XI*}h|8bu1_wE( z@mJHcZ$yzHAhb%nan^>0Ldcw4@j}UMs@0SLZ37bmCsGra)~2l$elvY{wvr~%{E3}m zuUV-RS|P>kDh=x%PUDv?_tAuf94FD`v&;y;(pDPDzA3#bD0L+jSH*Tl=l+3ut4FYy z-G#N~poJF40OMSa4s~z?nkmjmN1Tv(1n2lST>L>W;%6Dlvz)S4Z|;yg^MdEa!-Z+N zut*|`j!rJ;ZhR&7l7&UBy%*m@#HV6&PzTEmIKI;W?*@w-?KXgar$O3=dS3*yAGA-t z-zra`aFnlKGKiuw;`dE~Pu3K-8o(&%o0bXYQFzA#QOid#B+vL*y>gx<=@Rc$qzP;P z#oURWNQTU#u5E^T%)P8tZR(EV)lMOf0DpFRW|B!19d5+6v83w5wT;}&Cp$ode%yVY z$;cn%#i6LLNow9eRTAI#VGj9~g6$s)5X8a#JFA!L1t3O<|3Q7BY 6`|;<0m2 zY=RpctmZC)=GSDs%mH}fEfM;ZQAw<9lNykZppQ`mp rq zg=aMccWRLwtZ0kjlOyELtio94aoubUBb=Tfo~e=IEgv}CrT#1~z6Ap&i|GC^6Iqe_ zeEB$COza@^Na|uT##2q4uH%r5n#2@uG ;OmrysAGIcWDrF@8yp)uT$_i zL?%81jcruKW*pZRaPNEXC@or&1{LZPH7#U9gq>=BD5izGdmfe#z2f#>@F-KzFX6eP z|J1Hm`$M9r)I05PeV2D~h*rbNTOiC&9qCe{-tQ$vjHQ6k$#dx{h1*h9gAZ@K!|{YP zcomZMop|Xo)zyVpyX){**Q_NgK{zz4@O&bb4?v$rulxrkqJ%sb(dAMe!w@-*iffzh z{lxHaWSIInT}%-HDZsqu@6mw|aQdGnZKJSm);}dlEV{)New13NDKEeTYo9xa@S|B} zrI!7dTu5 O-00FlPmbvOKjJV3{r-e?G=+2tAxY*r!30WIk)2 zG>j2^jPbz*OT51Zjeov)?ZkBMo8#T@9-QVf?;E}@1&tAS0m@)mwE}}kOFCG7Ai@B3 znDNg4j=-m37;n4$@=e fvz1~1XH Q zh*g;G6vmuG`W=`!ijVLKFqZDi0qRqbwu&~?RiF3(c~o*2dr?|$HgD+4X}|VIVSUYC zNZhg=UkFG9#2Mpf6nZau)=)N=uN|mMA+n(!BGvP?_t<1XchIodctt%o#2ObGrjTYk z;C?$zUlDjJz!L($HoRGC$N?f)jP*ZMLajTA9X>Qo^+W%PwqLl0049H7hd?-G+G<-S z^e8B;7&;lGJU48&`|W2TQL@<-GYWZF6*S%D0NDJIYb89M1FA9d8+@DPkF-VRykvam z&TQsw(g>5b0cnN`f(>a}|3gvaK6m0mf*b~ &@D<1H#cA1wqmT zDqkzIHjPXF-KuDe2H`c-;b+)4twwh?Pf*NN#))Iu0Z@;!f`U3V+wz9vlP}Btx_0Fy zT{K(^3jVP6srdk3=o$7mTz|Q|fn=x#(te)aRg3$IQmX|QE*tK5^01nJw7)WwE086* zmXsQ@m7zZx%TW`h7GI->k=Ae{F&a1gSsY&P>(Gs&jeXK6ym*~NG0TqxMGKH3m)#1x ze3ffyZWlC>5MWuD5vTJK;P8e u=T#C2X-Z-i+*IjIrjYb<84VHUsRU?! zc412PUQup7Fh5d7F= THNTxX|VawK~BMr8g3rGo7ss5e-HkzJD{s7=og zuC+Pcrr0ZcunKItJ{8uiKLfN8zTF<(^g@3m5r8dcH>ljWHsX-KAxBIk_*9v4oZ&8g zf7k!F1_A>YaH0A(6cyYU6FJ@qK1W00wr7)(0!;i~v4$Zj7kq#_dvj|IM^a>kO748C zer0cC1rUJ{?&9i~D>j%U<>4)u&BaachKC+};k3An-k$anvF^Gf1l!$rNx^=T3*k-I z{H{1pi#CP!K~(?e@pgpbD7#J8yBfw^=EC2ZRjXq@SOGunHq1ovxssI>8WPAI PBwIe?SfEAP90Hjor~a&)JcAD{IbJdi=Xr)gt!Q`h zxH`CUEb$2OIUeUs+VqPGKWf9rg?VqB|GjQU`gCg53#K1-;P2_dEh)Su=ObNVV_x%| z@W~)CFjcRgdF79Xzk)j$e&=}nl8I8ASDyPU>4LjB^%lQTAN=vp1g|}K>#;VC_Of;} z(UNUfS760%#wm;rEfXGc3|k~VvG3WMYQGA0 @MSKTOCJYjz#O zUWTE`oUaarko`4>?lAeDTwJ!;UzR4rXcugQHYl#Q0zrnt+XDWwYAHYcHXTsw%MSe$ zL~w#UQi%Oy-W}ft>~*XQlAZ3tC1}kU&Fx?VU|oOkIr`vBO7;7n_fW{fZ#u_M(%*Rw zo*ZrwH#sY=X{r~DKy-ufBW<@NgbQysR`rJ$#M0$TQkY@ao+(2k0NQRSbl)K>xXg~F z(#aJ^D8PX#SVk6Evz8PL-7kP$b>O8Jr1=uFk;7r2M+#!GwDT~M#3+7Gxjik!J68Ka z2iLk&B5m}x_z4WxVHmXV{zr=RuzhRDveOHRy-%Zpn?xj91abc`Jn;>@7}2b&tg36r z#7`<$Vsih`0|wnJ_}y9U1XhdrEIT2D>>s&mm};|F?|1zd5R%?OnZfq88&3B1!vAnE zpy9u~CH~hA284o17s 8d~^96A2RK+!6BgM0`8+>D!O)VfsL_-t6=iU;<0bVz(+*0ub`T9%eXXh;aD__ z7oEkJ=nC0T;OOt1fv{ANMX0tB+Td=1T7zbdIyLdchpZFT;VQD*-qUo|XriQyQVhFA zM@|PSau6AiS!`|`H-r+f_uW%*1GJP{7S?3@P7ZErxjrn%Q-%Jygz*Q0j+2Q}Zp6YW zyrU_u{?Zn5S{OUrp^~;D=LBrweYMmRAbO6Z+jb6vBaUP+=#3yH=L3_qbqwy;iwYf| z^ 1>$yp%vh(c6M>ZFcCr+J2w^T)G=+sbBZtRei zk`N0L&3q^X?&isPQF;Fm{`4%AKM`H?i07h-(o#XvOT(e~I);}@REllUrP$QQ^G=g% zkXBI&e)+PJ3##6N@k>G$Hkro3`M5Sahd^r3QVgr V{RMp7 z(14rjhPXWBn%)ONK_IM8CVyRyH$(q?w@FkCh4}4|d~vj1ESflrKgRkKUR>-~%yDdt zT@#IV8@l<1O5E+IlM^)~L_7o&NDELLDoPS=KZm6#Hmf;9EJtSS7zZvDxS~-iZj}D7 z(w+fxV9B{E+~NU~qSOhlLk n6kLB `TjZzTq}et}%n&SSENww^?{ z3=cUH`?Ev75^vo@)rGXmh^U6){B#2X;HxzJLIc>p0NGa3RH^9+p|1tt1p}Fjz)bH4 z#WXwzB*0i8IS`#sNTty44w)1b#WV`bHsaJuS4mG7f8v1X=<6a0%WYI`V9i-WP6-}& z$KoT>%WC#llm2wQ#Qp%h8mi`~UE8Hi0|+9BIkCu21;0F}w_GZAI6Kh!NA~o={1Bxh z=!OJqKN+H)2%J1|O_PL61geQ Z_zQv^~#Qi2l_hP^s)fK7-;^J!Tb}W0h`R5~M z@sziC4}kEC?fu70pqwdiMpVvaIa^G$i{%#y(% b*^ra+hRp)c&>|wZgjXIGhm2BCW7ZWl{QRsmBhJxnTbeH9c1IC^W43ueskLWhy~% zqjqNt=|71mB!WC>cKx!+qG{J+t|}QbkUDeCMw6y){1?iksSFX#(Z>i(YXTD~(B=$# zDzoenU0^=E!RtvCHhz(7UAb+9dEc@+NzGPEA8B~-^KZ^w+I{A~s!DBR#=Q^CX}6U}VN^VyDCkq$^%9n!GcN2@;Vw8bVFfT-{1>Hbs78ZW1HRmMj%rO1YPj9$Qg+ zsna|W7=duZMqDaVYRHU~Ah|$vc!ip89rQsjS5WU7Hm&eRJY5nRBPFe-`Z=%w+2Y^U zzH?Ktm>X+PEx8phVL9Sv2QCFJWJd#GO#IyN{R%NDlyD41bveHxfDx8>?Uoyy{G9 ?JJGU}?ov$WtB*DTEClI3SWB}?eXC!bNiw(pu|C-cJ$~}t~ z%w>p9806yc0LhN6GiY%JzT?iYGg&V5Fw<4=oB)cSVti |+>lC4{<2F YMcOoJyT m}9bcw{1u zmW_g7^0~oGqY}dM4)7-WzN{7*PVf*^Cd@Yn9jM0^VQS;2h3k2Q09Suk6EHbzLbBr| zD9YsCG`*5>hg~ww`54cAOFlvLJweioad<(h{qSD)cnc~@`LPXoxPIxl<@aI<-XpOw zZ=+HMj2tw{KA2XI$Fz5#ITf~TR!zAcwL;A?kti+vB1?m;gth|FriV(xS=yREIe8)j zGng!&bJ|2(!Ee+ih%|9i-_eqS52U&_n5drE4UnmTF5Wgcyi9AGfNylV9Tcv5GjXs5 zbcj$;&zCt7{a!6ib95p7JkTJ{-j_%|(~j-hU4sufasog}44pVH+P;~~49SZY0d;fv zi4zrw|0 %>F;Zz{RzlyISUgQ$I`0&&sOCO(KF@^q z@ae)VIE^ZGka;qZNSxzl8+wfN!4v@0iY*4Ensiv)&eTdQy+^M-bCW7U&&S#eaHx*G zoXErxaB8544Q2T5yCxzFtsUT|TY!IrhsTep1I|qAbsJ 4`y^xcRj8(FosW$|Of%n6GzOm0Eyf>P~3}3~!_kcU}Aah4&Km7wGYMASHfQrw~GV zn|lr-Ry30acHgmu{z*99q=h}D6yBv~auYP^pGdj%gE!9 z4Z~Nn0myo5S}C&6ShSLJxH?DwkBW}f+Grtw$ee9ICGlfk2@EEa-+I+V12s><%zQuB zCG8RV7)vxoUEL*y$<)yuE%NiMLH3=c^Yi%KKLHGJ({CA!2s^CSHCTI%RpnWuZ&FXos_ST{ z@56pV$bPxwHhDYj9Hbm!Z+1gJ1j70mgC~_Z%SK~lnPi-a*{g;ME%7{pE6^Oa`C&-4 zECNK6A=;8&x&rV9bTRP_dBgIdU*N+IJ=mVbPm~i$z8hKjTl`6CwMT6RYJCs)urUKe z_GFFIA}q1cul&UpjQUCu4YTA;>W5lxQ~>mGpnJ8I%{a?|Ml?Pa4xZGQ{jr;^K9w2Y zXK;lPaVEHHL2PR2Y2Sp)-*{T;H=$0$8ca*V6I@5aa3nBg&2N?G^jRss(p0la#^g!8 zXCAvf{d%CE^oLSPIz^-b!6q2Rp==G+(A$15MEGPMTVU!>JN(UPxNPOchZY$mF$XcF z%qd6`==N^Y-G)f=^!w*2BxDPKo|eCsWNv@@4&-zOf)EHxdztDv7d`8360@UMak|N& z9O2HC-yN7brj^^ibO9X@5WM6K%trngTpGBc4wdL99#Zh$l_2OZS}Q7_63bLd(0Ep; zEbN(dSY> 4jndzhL;5PMW7?j08erHk5Tw2hL`F#(X$DXk!YbV*U0 z&AjNo71^LP9}kEV4CJ_7R={Nvm-YGs*SeKp1SYt7NT3}axLEKhfY=5EeW1z?{N5)$ zw}$USO5vL$gSty7pVY?*C@F&sV}dPQ-SKz$AH;u;|Ci$bWs%O`Vx6)O2tELt+?V*j z10Zf-AaGg@dhsp#qopozmqFr_ _IL(%PeaIk|m`dmE@tRbJ@DOdXv$`#Zw+wh7HllCA2mkm<8?p@-Wn+GXp9!CpMZ3 z=Nqcw#~K+CkPiQWqhPK)tx+_!a3m)`J`uF(-;wMq>hb@b=HMU}XStrP8#09-B`((f z$d-+3`Gr5Ln1nR$?`q;wL;r=bq3R^?lj7o;-!(mh8eBsZz%McU{}M Tjs0$+Km%|a&B&Jg3>{{R|NKm@&Ap3-m%$*_)FGkII{%Qh|u|OVRX8> z22yfk6ML{n-SJ*L5oqG##l_ia`+K2ZZOd$8vA3Vm#1JE`EBGcuI0NU#{tM$rgDkhF zU(A`ADeyRe`*ABuKtMo*Y2$e1|MFcuM&Xn^Qh#|BpYTN$latR~M3vX$i(ek>TakG2 znxutMU!4>UvS%4GsR5EbYmp-(w^n<`>;E3V86lyG^EEINp*1!(E#i|$bU ?aAN{XCGs(}b_~PHe z25GAhbhEWT|2&*>s$~~2vzg2nnl1VTJAiq=-S ms2FB&=u&MHrbljjrh%Rr@12KtM{Lqj}Zt)?C z{04ZrXt5Me62oWV=sk5Ca>DN!rkjYLJMt@x-l1~de} 9~NT{ad|qNr>vl^>Of z?(kU_lP_$ER8_DJn_x?GX>wrMwBp8vR~I5?QvTtAam{60!(wqgu+m3m-OG^C%m}+& zT!(2vnU-dQj3X+}3Q02%B$rFeuS}xp6XNvn#Z&!93Ffd0^F0b(1Zy4$?qUplQ)X>D zZaD%6SaJ9is{?(gEs|55s%b)@WhgA`_266!PA9sEG;Pw`Y3Qv{(J#e>SMMIefb@K; zVH%(qGHz4(O6)0GMeHdFYG%nu01@`hZ=HXC=l?LC{rXJ=fSF-PQNC@Dqh|kh@(Udk zH&ry+Ym1d169t_j D(qDzdfcnW`x zPcg>*^4W+`b&<}K>xx5=8tdG@_8lJGv9Jijzk+|ZX;D*tKQk5KC#9gK$CT&(n}x#+ z&{EI7Bm0deFCwL`kr4$f2e9umK+}$YFRf2z72f$*1SR^tYAv@1pSuP|=v) p%IS@j~3Y!OsUM2b3>X!Y}%m(mggxrRO*_DBSYFq#7T#L4LemnIRz)H0&dr@ zuqqx(Tom>PPvj^Aj@8#0AMv+@SeBIDIMKZN#{k?V^Xs@8CS6`ga~-+C4aE=f03`I~ zlroFzz&0GZ)_J^teW%xDUmjjnJI;oP{Z_>eNechMc_xPl8_{)iz5(QD`CkngjOI46 zRSWdv4U!e4W&vynD%RBDO^U><)L$#Em$!PW&eqr77s`PH1*>aq3TtD&jgQOKd? SGTr z>m+87MyNaDEl}PRiWCaPAx8w4r>us#i>T=s{SS>n34ptn|JhBF8 6D z;$iYhn01t;rkx31kv9{!A(Z+q6ckn!EzSAIM{B+Q^!D*02!Z{#21am~vsPkbL$ z2Db9;unVHkl5bHs*7c1S?vFL8E?SEyhw|ukuTkN3YIo-2kGEjW!#5XE$qO5gw|2$1 zMcE7Ad;jG+M1#Ab2C3TP-HBX|fZy^ lKCcQ$AvNdTcUpD2W@m4ql;WRo`B z_NmHF!3yv4Ij%b2W(2~J(DqV^ Hp6^=Tsciuc?z!oNR)s~_|05MtQvV;h~@zSpIi!6 z2Kr!DH1iy7h6*`%w3jCt!62JNNWekM{WjPlhPA}OQFzDgv-wc5+uScYaz6dG0UxM* zBKsoD^5L0DcH))&9oi+%vs51n`$i~Dnq@p1!3Yd*;wI(|>(BVk@q>%%N3L(9L;{*# zJ!%hy_d=oA`wmrM^d1Z%qYc&`?F8u`C QSg=$DJWx) z+g(G(C$-QrD|g>T?xI+plcK9Z#f n*x9;P{EQY?1>Dkax54Kj*+4E86gCDkO+KL8bGHi7 zDSiJXhB(oVNN->Q$!>#%P`sZ0hf`p%o&7P&@j!!@A1~mS!W~nkpp8ngd2+%ev~z z&T<4cUlW`u> apmcHJ?iEUOC=ko(V|Wbw5$G*jq1mE(b{vCe8J; l@s`JnoCfljlSXCRHFr$uP)>BU}pO;```v zjfT)j@nllu`>0=HPTL_~?Sukr4o+KXC?!NhkRCD~rD{@GJbLU#=(`a`>`gYDKjQj- zR4|=ub8{0S-g?C~nLU2sp~9jq6zpe}n?M3!Q~-6stwibQNH?9MW&uNy+IkHUVMRoy z>FDl+Jpwd1Gba#S9 7psy-dgV=345|K=Gpdk&&I*8ZDf$>iUQ;a++_#u?9d zmB_UZypKDa>L~7`%qpVGL#-1Gs0=@+>H26+pZHf7a(qxS>6&gfab?}bKs2xT3gV1- zWM*4YkDfs|uqA8(mntbT_sV(&Q+o%Jf~67TnZH}nqFgvwVTdbTM_;Pfoh`@S9XBt{ z{cNs9{Z_=n+uf%f7&dbMGYHW+l- SYTEg;UJ?0f3v;5zERAm^4&2ol0*>f_nx_y;5o z^vXqmFj$V~Y=>1{K4RezEx@TASc_qgpdt7Z8su&E*$51(fl#q+nxHspX8yM_O|Kng z^LR1;uYHdYCc+nwa=`bBi=+^)aY7 lv75+8~p<+dwrV?{OXEyV)7%uohTzE6=kVe~$i!i38!TJv*9KMRvGP$K}L* z z3Au`BAF=!{0PcUe(HHe*tU$`f!uIDG#VnS~?0R8097~<32K~RhuBBfoQ zTIW$@bPLEHAFHxlvBU)Fzp?g~QF#Piy67vsxVyW%yS%ttAXspBm*7qa?vmh=;BLX) zJrF#&L(t%I_`W&o-ZgUP%$&K;>eW@%wb$-lyZ&_7uG&vtkT8LWer!=L 8$V&q$1sME@jHJR`K97YiT%>dk6VW@zG*rlB;Uh74=LDFu@>1x>u7e5q;mM1m!9 z^$UO*lN2FQc-ot^GVWKjKGXYnRspL+?#USkI&4!|_JqNT=swT~(S`Cx-&=e1%6=9G z^qIm_#DS!c#j~M9#8lfzkenW%?INGWz&Y>&p@g|ioZ&PEA_ *#) 6cQOI+FA9Q7|8 z+5dh>*jbn^_JG^ oTT1nfHNSB=l4l-5-5ogVx zZWn)0A{=u%N$>2wiOJXr+3KrRHqxo8`!XV*fSfF;zaTP2nZ7h*FW*{-v9%%E`b>vt z0BJyvT^VI`qqY-ct^iI Z56PM25JPKPuMW!!(W%a( zr>XirkXGI4wM~=2!P!xV+mpmR5=&3&NpK<*{6{zo^%6GA)8Jt+b$f8oJt&sw!vlzc zpj$G+2!gEUJ%TO2*){zgJA|z!#QHoTmq7iKGrRhdYOHV&;g9Z#2>uNZpf`?FDm6WA zlB&N0T5zH3PoCxkRa*>WjQF~MCC8vWCb}Q`scOZ}2_G1RjM!yy=tJ^=H@z@2w3=}1 z)^y|%Xf$Hk_+!fK$J%Doc}Sv!nl+yx16)aL*tw@g`oP>D*Fl8Vl=aPsxLK_8?=ig3 zmx-~3 I|Epq=Y>5uSG2dbODYmncZ{6`oJPAEHKCDFxbU@61JFe z1BE;z!)|Ia-UqW#i52>EIj8$=-u}a$o6dqU3N5*r4Qy|Z6>ieHes#of-tVoh=fdfN zcY*XiUZz>6qdv117+W{jpS*v?_dJQ{%kjfe;4lZhD1*>&?>?>JN++z9=`3tf)G3&{ z!quePt{_K>sVKDJ$oM=qOVv0D!Bk%tp2>|&Kn^v z=yXLd1y4$137p !Ezb+QfmL7U)T z1}RIk!YbVH+c@>;b}}SNz5)SL#aF9${H;G?FT)v4dhI3`eTj$pTTy0987Om 72#MV;fMQD=cBRwMttjje6bdHu&V94)M?}%O4g-GG0U@E zLDGWyT{Q9c3iC|FyudDjFCQ2S7jKIYJsXSvicuw6GnAk=>!?fPDuxZWL$f =PTno3cj2ap4mFN4j^>_%SyA; =NP>r}(;*6){Ok>LHj^AD}L7En}AFuS95F@YJh-2tCk?!)rrB=3o zTx%Vmrxs7Qzhs^~%l7x$^^eCcLNuB@W$$)4D$Lh^lHH?t*HZb#jB^cR*GhVu`!z7} z?>;D@M=lB&8?C~=1UQ33lexF{+6l25?*>rajTBzcwqadn^&7GjW3$6IY#(K{!GTL9 zm|bcWqFNPNIaT&p< z3|5(FF`Q@kNC^R&4_pzK&>RuPMh}75!R0OC55*8ZpK#&cm|4swA`(USGrN+!ftUfU zAHK#?PRYJW-)9;V;fn9Rr{THr6+x%UD{5b6Arb<5MTP6iIrvNdcLSI4Y=?Q!zsKz= zft5*D%Md)fP;UIFVi=Zg9)7ZkjW_0cl9b^fo~0$*&H27wRqrvp9kFqczdQiOPw@*H zH?DV6a?#Q|P!Bmo6{a2rN4m>CNG}Gm-iIxjS3-!g7|N0WrcID#dZR2ICS7)jTAUCd z35SouhLMS2Jd*9`{elmNBu-e&yVi*=3aCr({uSAG<5C}hspa=~Up8bGr-L73BHtOC zzD$t}_E0LEIb#m;v5(n`A!7%DjLZ~M9eX8;!X6ZR2SPYBXm47wZ+XCxV1k>@?fy3z zQK0{`$OkAn?|pmzdz)Zz48TR@E%Gr8AnlB}_dQPWWa#F5z5C-&<^f~M;b|cc?~*Q} z2J(om^r&k5)w-Z}Y+(2QPnG6-9Pd6xwvSotkAWK{71p@&2Gx+ympQ|Z|2uR5E_{KR z?n{0{{LM<1HgAz?NPJBA8nv{z+z=0+6`s*QV7N*db5;G-WH?*kUx5BsxKpf`ubp_S zm)gW|s|S 2W1Skby2Z781@&I^iz%76n0RA3QS8<4zL}g``xq3_f+da|7 zq><8>w^FascD`KeKPhyA-zPY{B?Kee95v)-7+A=48pcDU>yf(SDUsUw7Ki;dl5=%Y zM?YvH>G^*a2~oXeE0z3cbEJ-mDcWs9bxJG!Q3#{G%g(;^+x3R$Z*I4Fcx@x?&K$iQ zmW={GY&8JMBq1o_?W6Mz1j{6SMN2<6;uHAQ)aG_}-0Ih#dqb0ZH_fxMvRqb@J?0k{ z7JAC3*1Ouqb=wP)?KkWQ_fNFTJ|VC$9{&s0IzRaD3e)F8I1vfIP<^c7j3&SQtX&fg z7fJo4!R8yF_2CVtD-V9M_SiMj^z_W_JL-S%#B2)t-UcfzCJ@PAUFs4u$E>$*1i{)O zN??H8DhS@a>BEgRDDcCXnqi(6TyttlD@ zy+y(29yi_Ew(UbsKL!puxSz=I36az1Ka-1fv|BRN`bJE11y|xbCcb(n^mY6w>cmfb zx(nE8%swCtJGqomP|HoZ6Un*L0NZ6F%61NNa0pzTTw0>81T$r6M8qGHxyKRpYa9Bq z6i8%1DZJBGt`s8f(d;*W#$rqv=mXHus#-tOSG(C5P#$toWNTP$me_wFT<^6_w_+oB zHcoQBa@Zm@emQoqUomw(djbxEJ5^#1KbH!Qb`h3h@68uWs}B0ecu1eR!jU7`e2luN z=3yH3DDGVrrgh?TCV~8@!5N@`$7ql|7Q9)JBzIr53jrG hU03b t@PjtX7_!I?=r>v) z%N~O{tH3l0QR-ct?}QP^C6vwgYR*w)TUZ 40bXwQ8HCzBBJ3Z2X==ck>!l;jT#6n*?h;xc7)Js9;E zUulB*ADrbPz8y=dBlY#Us=t0=mAiHobzo+chK+~6W1+o7EHuA?wOz5Cfl@}p<#_ME zT`@St@UBr9&8l*Q-Y=n+Qomt^dp=v()*&E|g*DprHeO}zzp>DPlv%+}v!l7|@@+I? z%Jq@w+Ft=_O5v+B!rgbt9@rg75@>o i3u4$^$*LwUR=yD-p`y2a7MgC(OcVTkSP2D%qekE zLg@3|A1^`Yg68&0Qk3gTWEi&GzaDLXmd_W&H9EY5J?PrOCON_FR?Uc%_Vk7b(xIl6A+c~CC8ICpB zpanh!4hH7@IM6~y<4d#4Xp)0ei^*6Wz5F`2lZ8+V-bjCBU`+2eW+qa&*A^wLzP7lD z)-HJp96Vaf;m(HUwA%ZMo?X&4Wl^i?1urh0>UG@A5?QQoBCS>r#leGB)g-&i#w3Wt zUSnE8dMFAaVhMb^ou6vDAqcQF!&U5Q^#IM_ZW?t^T3xCXqTX2f-uge&R{i_iOA>(~ zs+cqpb0PQ@#purVwNLwnu ;&u@z3en*ZNa;G>v4E1RzpnIQLP zh@8o70Ndg-VQmIU*3NVd6T2(%fG`X<6|C#$D1K5G946=e!-`unqB}n2oiNi_h7;Tf z7gPJQqqG7|F~h2Z6Ov 6!!}Kvw?7IO^y-L5 zB!=gmt^>DzEhTHDf7i#$JOA#9eWgh=q$}|tIbC)HBw8Sac{eq4226M|Afe6}6ITf& zG4fyQqS66*y8Uf-1-Z<&4{3Xicwm5wQKdu*w7Z_igMY}l;~SHog%#XCn=h$bm4fjK zZYA39hCm Gzm}KvuXJ$> z>y;Da2>6zIQ>T4C+&OUY(14lccHelcs|-K3eQ3^qA-}J0vx3nZfztR1;i=tX<#8X7 zQ6N!<;gxX}3{ef|nu9^u0S%yaVpkERez2VT<2gD&M0 !!FYUJWKoZ aMyUv&?ffEH`X~_3}D59}-?S zF^V|Wv)2TOm+1?smNP7aKnhiP1Ik?TKuPen7LibZxMC8hp4EhK11J0UVVtrIrs@xa ztC-f_!dffLh>7bAsUY4LxSeNc3|XYb6Kx54dZ_8N6yglsAr(!t$$EGz@L?Oan$cl&%Dwf^d4%8V~3s?DYWxCpA zWfW9XxuNf8^ GZElmae~t5t*YM{7Ewuln1r&ndarUlm`HZ31T<*dCONU*#Kw z4mGl0%4ev*74f$&Ab5CYDel@W+nyTcdaozhTLsB*sn-QBuFM7(!#Wok+rE)N%t=jw zjEM{1T#PO;de NXIZNjyzoO5~$K_iOC3Q+@ame6@b(F&s6{DaUsE#`HQ{mZT-x_4k*9Rg_6K z^{dPbuo6YcmsUOGK4u?}XKK0T DJI9MwA3?r+b(Ap^Q~#s-!M=x=-*(-jNaL zzv-IYyI>X=2c}PttQki8Bh=u>ffeaWzd-pm`VPM6j7b75zg^4f{Gnp?0G40f8wtfM zS+2~ky$zb8xWU~i#_}NrZH*wos^x(p^UPsA`GE9BZig!+P#>6pg*C)O2MH$fqJ0sQ zZDjtlI_chB$ZY-^TnBDjV^ecb2~A0;z`Tz=&Zxs8xP0_HdY(h?CfGTtnZO Aa)VG4&jV-5=FA~gGwpk Dd~!FtU2+MQ*S{E+_8@tlNWp-pP}0e zkNi*Q*2TRS;OCbh&_lWqGVU{MO$-Zw=fZQ|=4G(%ZhRoKCfI1s-!auVOs*`isGAut zq^OW^cj8kWS!e-#omxxd`_Bdl+|kC`*%F!I^fLjl5|}|kHM`$w9fE-`dHN|}A%NbF zW!2VVrK&~RElE%7@8hVMi_~du?2KH+ANPki77JzBGG=Mayc09IPLarl@TsP}=m3@T^zW%bP3LDVpGU1r?KU%vU?Tzjfs>O}z zH7J8&!$5V(brd7mr2cU<2x{E;2^kMxSt7`R_AKa9vB}*meZ^$!q-M8t6!2tU^=TAp z$7aOi{bQdTdBCO?WPr?qBB-s?;tbTU0++ErR$@-ka5h+aXa=(gi(`pAK++cmYl^Hf z-kZSE!K?0x`3!>ovV5Mcs@>h{+jn7y>6S(ZsO7i?sly<|j2-#m{JcZ=)Fs7s1KZbi zS5@*rvp2C%zsD|2XLX!brJu|iXFWD(7%MZ!&Y4CKe+ZNgTMYa2!z~<^{7cWA$g1{% z&XSC;uG$j6<|fINH65ty4{>Q@o@&1rO+e2M$f#AN Cz|-SwSoB> zSFeB0@$uT-4E_|wM7|xBk?4p|e|OVgu4!(&pho1w_3_v(TB_8J@ER9eR5oFxd GGIGA(OBEl3L!?V zUnOjxML%KNC)zZ0bxvfnoA@U5qiGG(C-tr#!NKJSwfL)Q24<`p#Cdn~_uJ07M<~Jv z4+$%<`vTH`y?7JXA`PqdX{8NA!T^0>U*`jxUnqbS>~;3CObd=G#L_e+^KIsgkwIOK z _Oa#J^Q=mlHVBJ!%IqzAON=Uy*g^ho@Rdrpf^B;@axMlTxfyws!&-rZ|{M+Iq$ zJh@eN>H{~XI04#7%wH41Vwx*VKamqif&O{>x8;39)wiQ=f6sJX^UAZF?rC#fu6Yvs zO#4F5$A5Un*>BmI{&YEP6-^QUWq=z?Kv)6?JNG#3^Sd~&c$%e0!ck%TF$w=fvLIBp zf If%$dn(GygL`y3#dn zYwVb-K=A3@JW-z0!Hbw@ty%tdk~8Dj)( uh*Jg)M<=l%L^T&apw)J*u<~zdvU;>x z2}v1x>Xyx^^AEFK0|50s9k{lyI?3dX!kBwx+#Q~=5*KI9er%CIHlzLxgl2Pgq^Xsj z@N+nTKcL2$3pOn61d#};Kq9NWaY`-wmegYo_yJgi?5cmqfGCiwT&k2 i811AYhUt-X;2Uegww4 zJ={5=%PPH$Sn+8kEHEU>$`L;-+?ulkCupJkgmkWPEL04T5*ZF;=giL6Q}&Iy#Hxc$ zO(JMWCJ&l7pWT1^Tmon`pQl@!eW;hD1D0+gFJiDhZqpyn)1r05aF*d2yN`yjbsRg6 z9#)#K57Eijm{Eou9sUmA a{G^4(WBVb@Ihd8iBL~V{*jqI)K@8D zEOLZ0`pOvX2hdRyck74`Q|f(gM6a9Bt%5lHWfIu`F0B+EP}UkebV&qTYS9IAve;x5 zL8Rb}!D_zG(vbX#`m6=$&l{=CcRgGyNT>cO<+88RZVP8vR!*I1Cn^y16n49FkW;M7 zvO!a8#|lm%I$GeTGDr75NxXI0@xP_1S3iKfNBSXn)-Ornh@v_q)#_a7w=d8_j>$d2 zaX?vc(RGZ($$u3Tm55#ZDTz3SK&w~J1!nQ%>P7 Rk zqj)7}V4V5(cZhAOlbF{m`j*GOE1#mcr?;^mvk)_Y{4?twZZ-V8`#_FSH-Z!YLK1kG zL#xy6&9{^P&uxc=3O?%$@{hk}iiBp^@7o0i{92v1|2CmD{QqqE7A%k_^)6rXH5i5y za3Kj`!;r%EO=t+>|KLQk9+$^dp%;JT6wnTI$8#C)3-H vWmZ6#wrl%_YVK;n?)~(ujoYl tx&ZP1>#Jp92)TNM*}4=WPg2-?Z eqXJGp=RzpvcZRH7%!I5LXOyu@Dz7Cw_5yvjcOtA@ZcZ}zzXfL}FIA>=0Vzde$* zWWG_?e{m?idKp4eBqrD%Li9+xh{$)NT!Za&^3|AreTlbQy{pb4s4&oc1t{|}(gccq zPX7N8D+j#%q0hmMmfPG)Lrd=oc8M2c%Q&1^LC;g+v&fdO+?ZbqlUOueG+lCZSM-)t z2N>`oKi>zks=j93zZOq%J*{U; Q zBnlD?10O^2dn @xh7&_7CQlBr%B0k8kpa##2B0*$~3D$=j+{Ex|w5n6)(%IoKC36t3;VQgvW40xA zjsu^l&n@>P|KivW(Yc+ByM&tT^{pbRG}tZY4I|@n6HEO^V59*rslOIpovO30=;NC} z+{4&IYIT%p@x^s2Xp@o2yY5yL(3SWElotGRznRR;p!Jr&Wa*?l>A<=nL<(HG9@;o^ z{PlG5IHynhE#zuq(W&c{_F*>-eHE5d1pWI@@z0II?Mw|+_3qxeic@hc?&SX_CS;Fo z3@|b7ng&n;&;cL-K+*xX*^=i2Nip6jY`p~!5kVoI{a(E}_X bC%%_rD3+m2Z)TO%3=1& z !_-o(+m_$>;%40s57p?ay~bz@RCV7|=!lEZaxJOuq>%1!3N zmAlzP5!aOHx4qGc>rL#BWcT{%L8 (1^u%8vRc=X;I(O5%m|Mh^4mZ zF!;Tm_)0L8%CU5bk2(@3%a{I}MHFg#&<}?))^ qvEIU4H;($ zal4}uol{#jir;*Zf_}!VFUgjR)xks~PsJ4tgsB)?bcbD<%M*Q=@DLftp4fBZ^3Eve zIy#c>)n<@uNf>`08Lh~^`YUX*PlH08g(8A?P6Q#y2v&zg?a9qpZ2)mYk(I=jZ9B0b z+)j^xv*j97CGyrKe^!S4g?CN0FA3&{4gEi6 PttYg5~EfZ`9tu7 z_T9Ik=AX8@QwfHu;`ob*Bdd-n$DVP7$c8b7?6Z!YCDfDZo}W}NDne}vCPf&eYRa?w z8LWmC_`3p@BW+lhnsEpr8>JN#HF70r>oWw4xfNrpYpxz9q{fe-PnGfVGsX#@OH(th z6p`2C$7S?1J%!wK?c@efwT{=b&_hU6uWb!7tq1KCkZbaLQ$k5t(RTzo^c32+2}1U5 zsDGNz-Na9Pi~C*oLHSQQl=v=h_$(#ZTETov?jEur+(=^Y# P{MWjnm!s+QGWsZux%x{_Ls^7(1 @vH~JtVxn3?bxZx11E3|H zau~eP?47#rKV=-}LvQyHzL>o;LT=M& aPm`ghElq_Ft3K#vH^O(_OxR)NBy+~UBTHn z+o-5@bXw5=VDX$+yb8t?*3658D{r??z6 Lnagx{#raYeNUJiY$XIfGv$Jg0xz-U>LZ;TnK%a2;p6K(xo<+ySA(dw z{vhbLa(e4^@guZpR;W?Y+V&p!3g*;RiEzi@pm8x}OOzPr?{@L1tMCTgfG9C?nL?(7 z3;s1CNj+^5Rg(X=gkX6M-BKR(x!)it4@};8cTM6^99`mK}YRa34!|W*Ui^1_~C1 zqte EaH Hu` zwo=+yMPg1Tum^&M0;V@^f=m^Jp?uhbD9SLz9FX_N0$m}lr#_M7mI8GKD%1-3j;jl; zv`#NgT4y)%FDt+D;Z?ZP``RVzevt#+OlGg&-HOQI3o5MIn7kWw+&Ef!{7FaNrpa?n zfeZs(7o|b9^?N2qzdrL+Me`XZy2%ZoC*Wce|3WbzkzRI*O^g4vYy$>K +ILo0Q5cKe<(H;CHD#JFcAA4r*B&c;!bBcYX1c=57*3a?OVzkM>!rYeS zgo*VS8W*a4Va~!?K+>nNGdpGdxRT!DIt_-R ^Bgt442NyvSpVtvn=z8 ola=NI@vp z6(s$dyz$K({?;q08iN?|SwL <9NND&j-R{dWpj5V^IRIW!L?r)giNE>UIq>7#HTt33_#>Hs6Mn5 zN$GD+%ZUEb^uLv))9{Y|RBcWT1JN{50>bpR$INk$hcq1TDqSUc_~|sFCbM&XA`MNk z08qnqXTO~LqoyG69veO237IGV)>cwFKos7vGWY(Kz^Sr}J(ch-uQ~(yzd%CbFvd2 R>K40)ot$efX6y zm1p>)X;awtp@iEH*suBGAv^F*{A9k=NDPRria}bv!1!0 !?{@0doaOl$wWG`@>EaMJmphU1aYe0iS=Rfnj0|4Z$#gt)1R7oUGnJ0 ztFx{sFwMzFO?R}I-f_8)Kgq {rU)@9Y&PZ1}~^ zRuP@iwY*j}sV+i_M(B?hO7GA3NpugFpS;Wf&CT#!l4}f*o=`__!Gdi64?X1^wtq4L z9MFw{ytVYkFtSLW_l#buXmxlxBcIfy%URuoAjBz7EeJ%jsiMfFzo{@en=_Hh?97yX zt+U_BSNUN+r5${xaLYq5oW0tVmugKRy_C*N;2a=)@2%0WH7wPH#Lyv5V&&&pn7}MU z_tj+g9p57Zg)P57 SJ !vM*=VJG!mDAZD$;`?2=BpRs04f(Q;5%HZLAOP1m$?~2xYMe?Z z{ul449tzrQ2Ju6uw9g}Ja+2=#Q*8rD8&RMJS=aL45MAY;N`qYXx2L-sAz?h+?!Qi{ z-?yO_mYj5`og-1a=gLADadT}rt* @d?l@+o`y& zkSx{>-w!HzDR@7q@&esM-eY{fhkm`;%=@{UC0%=GUMPuF-Vls5*8PHJ&$T8*E)LwE z91khi->pLq&%Y@Q91K;(ArZ@GTm{A1d{87}M^s2de2`xjI@y}el)!fnDR%}wYr^X$ z5mM@)oI(38DAvdvcw%T23N$9Sa7tohZFoATLVU}PjmWvp0pg23qzAI~ktSAoFw~z~ z9l6{Pc+riq>E&q2c*d!yv^PwTH^^itHHMsxf-gKorsFM%7s8B@ kYbh6v6x;m@_u5D);+lSmI+CdR2KukyS`j56=5-D?Nlfz`@)7>mUq=Va?J zk58vQQ=w)=?91@SniXd6Hd4&Z0TOb)-?sVKla0E9qpi^eE;%SRx-CLvoz@W#27T<% zu0XQC9`TpLzt>RVB9L_XsqJ-kgaXqL$UdByz1z7sNG0dN_Bg34JU=%A0Bs +El;i}@0ziJ39UDV)EGW&kPD z27raUmQNH1r@%fwnBAyDz9YuI@5>I{z})Q+3$x4nIyLrs4{{owCnEfX9x*=7%>P5b z@bFOh)tnAZQuB$PlcRU+*RIt(7B(t0Nvb1BK8wGq$~rIZqcBKSGywnr@qx(G *(k07`*d~Y!5}DM4>RIQ^=Y$F|9Xc zj+K+Ycx%CwCUO=ZxzpFyRi`4Mi$^%etS+wclvQBeqs$bWQxwhZ?xG)*B-{33lbk z;p^{dfLB&c752)-DyrT7>SjkYt?bPhhs|^aqks@NKzX;6tlMmt7W-_c^NWWPyA*q> zT{F?cVWoR=70Ue7klM7u_>Rdq&twO#`cx+w14%`24$fL|Hx@-_R2bzJ2k9pTFT~ZP zot$G^szCNq7gNz?d|_ka#ZGk|C7qN(7D0{A(`x(3IeM`f#Ofx6z|l?a4XE?1a)*r{ z^lhP*wsJZe_m>F8(rO(8vyWtbD{6?Vg)KLqTmm(%R-vTZiM!OvL_TQl?%k%2X{4 zXCom|uBpO5L`3^jM(3;@6UpWNPa^)G8Pd&R|5Gh*BB>?QtB;r(OzQbRZm26$q7jMQ ze)QKA+;o0aProz`8>=#{idO8PDZq50Dat07(VL&x8m9(OsHQVw5jqmZl<{5fjnb?W zut07O4oH7+r)CB#T_0c-uXV(UZmycI;kTir669s}c)xqucw|}GVVpI>I(B3?G=11A zYFGbNJ@U&kX^tJG@8G`l+gG6Uqmofy5OaeYdSDS(93s6p*~E2=3Krw`wLTEvYHFpm z&(B$T#0Z8SUoTw&8wQcro>Rzj5}QA$UJ#0rln)li2jG;I40YkdE8SkorKgK&@QQaz z->1*6lo+*ybR<`DbF2cmSu!)&C tiGxPpxs8)l!ab3I3wFAoyCSQ6p7|)2EaH+X_ucV_dQ6Re7fAVgypL_Gr)FDG z;i!qFoq{be8sA^(%z ~BJ5Gj z1T0D*2nK=Yb4N1f 2)4r6+OSjZL!IL-=z@wtQ zR*RYepN3LR6RyxO*vLK(@Uv9rM u0D-b!`LGt81sau?9h~|PK9aRF?BdQe5&oZ4EhXZ~Z;wvQV3T^fJ$#cCd(aOi4 zrg&9a3mw#*Uvh3N{um0A#==jXi)&~onK}c3RGSQ*6LWClqX A0|1oV-8tI6mnAR4brB?EtWdA2|v#CHs)%xFvMBm zbMCDYq`{#WclX?zy|Aq^sWaKN_?N0Ij8=bn8fA$Nzp{*TB-Ftt8fE2|l`ypw(sl~S zJJ#-@#cs|!{~eNS+dY7Kg~=-hPRpBVaJLqB>wFTR;U8IAo7E~*z<~5vBT+vwGHu>S ztD_;gef9qsW#Mu>4dQj&^#Wa&&e4zRvdqtexp22iztwZs>>s%c%CKwE#M6CaaU! z)V&P&N{rOhQNYBC2=F!@7M=&5_sr6v4k~z3MghR9)?Y@Kshag-!L>znF(+gZ9=#m7 z=v>6k@kpo95t0%o*X6MDxqrT(D9$beC)mwu(cq9x3=fZsG@}celt}vvFjGd+ex8Ck zngDDR%HXTDX7Rw{qX)O2iNbIQdBiB#IKL8dK|(^=wo;lV=62x{SRr%XS${NmGhz_} zN}~xr+H`=>t}54)%!SEn^v5>+TD}6E$|Vq7eyx2qzp~IpI&|`divJE)L7Mc=i%vEs zFrUyAbFe0%wUuelfhdzL)6~~GlA|VmL0EI2+f*8CJGrk7PDn==^{m>!qY^CruHWJe z7W@|4M1{B|UQ7kcR0=vuGMSg<(OI-cjZFw|EJ8G?=Qt-Xnjuv3oEBDpI49hpSyQ(T zl$D7fh=dV)pgeQ0NHAO8U83PCQPbilY)D`fOFwstuFs7TNq`ypGuWQxjDySnHiyOy z9zD)lLm4UT+|8JQKTy^%WDG}KDZnlf*iHOr=I7s=`+c!h78-D;&2BmSZo8YNzG6Y0 z)>tu@9HZUWCNq;D?HV@b4f=|Jo#-OzDXz1WH43~n-;IiSL6)^J#mr4_uq9{Db;~Gf z2GA!!8XXsFtcIbcg$S!cfRaA_moE5M0kcKolMR&4IrF3PbmOYIMuott8+Q(aagHy& zKbPt#vR0lQ PRuhNSci+W?u3fR2e&6rm|Y!bX$5o!3lt7pV{*|Z)dkTywfV6D z6@%W}_}p$YoNpJqS-=^DmS!SWb@N=i;|ImTrXK{<&disGB!kYqaHIvoyRYJC#C{OG z(|1Z5mP$7Uzx`Ih(}|D5i;eRf`lc5B{gqZ}%s|HW+=X5zY;q)@)~rww