From 75ba98538704d6dd4a20c7aee2882f92665b5219 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Thu, 24 Sep 2026 04:08:19 +0800 Subject: [PATCH 1/3] fix(webview): render expanded task header text as markdown with consistent scrollbar --- pnpm-lock.yaml | 26 + webview-ui/package.json | 3 + webview-ui/playwright/gallery/stories.tsx | 60 ++ webview-ui/src/components/chat/TaskHeader.tsx | 12 +- .../chat/__tests__/TaskHeader.spec.tsx | 175 ++++++ .../chat/__tests__/TaskHeader.visual.tsx | 43 ++ .../task-header-markdown-dark.png | Bin 0 -> 47521 bytes ...sk-header-markdown-high-contrast-light.png | Bin 0 -> 45894 bytes .../task-header-markdown-high-contrast.png | Bin 0 -> 45497 bytes .../task-header-markdown-light.png | Bin 0 -> 47326 bytes .../src/components/common/MarkdownBlock.tsx | 314 +++++++++- .../common/__tests__/MarkdownBlock.spec.tsx | 561 +++++++++++++++++- 12 files changed, 1184 insertions(+), 10 deletions(-) create mode 100644 webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-light.png diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b93c1cfe5..49ef02c220 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -845,12 +845,18 @@ importers: rehype-katex: specifier: ^7.0.1 version: 7.0.1 + remark-breaks: + specifier: ^4.0.0 + version: 4.0.0 remark-gfm: specifier: ^4.0.1 version: 4.0.1 remark-math: specifier: ^6.0.0 version: 6.0.0 + remark-parse: + specifier: ^11.0.0 + version: 11.0.0 remove-markdown: specifier: ^0.6.4 version: 0.6.4 @@ -878,6 +884,9 @@ importers: tailwindcss-animate: specifier: ^1.0.7 version: 1.0.7(tailwindcss@4.3.2) + unified: + specifier: ^11.0.5 + version: 11.0.5 unist-util-visit: specifier: ^5.0.0 version: 5.0.0 @@ -6509,6 +6518,9 @@ packages: mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-newline-to-break@2.0.0: + resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -7532,6 +7544,9 @@ packages: rehype-react@6.2.1: resolution: {integrity: sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==} + remark-breaks@4.0.0: + resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -15215,6 +15230,11 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-newline-to-break@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-find-and-replace: 3.0.2 + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -16503,6 +16523,12 @@ snapshots: '@mapbox/hast-util-table-cell-style': 0.2.1 hast-to-hyperscript: 9.0.1 + remark-breaks@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-newline-to-break: 2.0.0 + unified: 11.0.5 + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 diff --git a/webview-ui/package.json b/webview-ui/package.json index c5899c9dd5..d85b51bb3a 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -67,8 +67,10 @@ "react-use": "^17.5.1", "react-virtuoso": "^4.7.13", "rehype-katex": "^7.0.1", + "remark-breaks": "^4.0.0", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", + "remark-parse": "^11.0.0", "remove-markdown": "^0.6.4", "shell-quote": "^1.8.2", "shiki": "^3.2.1", @@ -78,6 +80,7 @@ "tailwind-merge": "^3.0.0", "tailwindcss": "^4.0.0", "tailwindcss-animate": "^1.0.7", + "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "use-sound": "^5.0.0", "vscode-material-icons": "^0.1.1", diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 04ca36b2c6..a2f357d501 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -181,6 +181,66 @@ export const stories: Record = { ) }, + "task-header-markdown": async () => { + const [{ AppProviders }, { default: TaskHeader }] = await Promise.all([ + import("../AppProviders"), + import("@/components/chat/TaskHeader"), + ]) + // Representative user-authored prompt: heading, bold, inline code, a + // bullet list, an external link, soft breaks (single newlines), and the + // three mention kinds (path, @problems, @terminal). The length keeps the + // expanded prompt box (max-h-80) overflowing so the scrollbar surface is + // captured by the snapshot. + const prompt = [ + "# Refactor the billing module", + "", + "Update the invoice total in `src/billing/invoice.ts` so that", + "refunds apply before tax. Keep the **public API** stable while", + "moving the rounding logic into a shared helper.", + "", + "- Recalculate totals in `calculateInvoiceTotal`", + "- Emit the warning listed in @problems after the first failing assertion", + "- Re-run the demo script with @terminal", + "- Keep the behavior documented in the [billing design notes](https://example.com/docs/billing)", + "", + "Watch the edge cases in @/src/billing/invoice.ts, especially", + "the package-style exports and the cached total memo.", + "", + "The refactor should ship behind a feature flag and the", + "rollback path must stay one command away.", + ].join("\n") + const ts = 1755000000000 + return ( + +
+ undefined} + /> +
+
+ ) + }, "ui-settings": async () => { const { UISettingsStory } = await import("@/components/settings/__tests__/UISettings.visual.fixture") return diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 0941a22e2b..2985c00425 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -29,6 +29,8 @@ import { Mention } from "./Mention" import { TodoListDisplay } from "./TodoListDisplay" import { LucideIconButton } from "./LucideIconButton" +import MarkdownBlock from "../common/MarkdownBlock" + export interface TaskHeaderProps { task: ClineMessage tokensIn: number @@ -163,7 +165,11 @@ const TaskHeader = ({ e.target.closest('[role="button"]') || e.target.closest("[data-radix-popper-content-wrapper]") || e.target.closest("img") || - e.target.tagName === "IMG") + // Stryker disable next-line ConditionalExpression,StringLiteral: a click on the itself is already caught by closest("img") above; the tagName backstop adds no distinct behavior + e.target.tagName === "IMG" || + e.target.closest("a") || + // Stryker disable next-line ConditionalExpression,StringLiteral: a click on the itself is already caught by closest("a") above; the tagName backstop adds no distinct behavior + e.target.tagName === "A") ) { return } @@ -324,13 +330,13 @@ const TaskHeader = ({ className="text-vscode-font-size overflow-y-auto break-words break-anywhere relative">
- +
{task.images && task.images.length > 0 && } diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx index 022186f40e..be3a4ae8a9 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx @@ -330,4 +330,179 @@ describe("TaskHeader", () => { expect(screen.getByText("25%")).toBeInTheDocument() }) }) + + describe("Expanded task text markdown rendering", () => { + it("shows raw source while collapsed and formatted markdown when expanded", async () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "**bold** and `code`", images: [] }, + }) + + // Collapsed state renders the raw task text (no markdown formatting yet). + expect(screen.getByText("**bold** and `code`")).toBeInTheDocument() + expect(container.querySelector("strong")).toBeNull() + + // Expand the header by clicking the collapsed title. + fireEvent.click(screen.getByText("**bold** and `code`")) + + // Expanded state applies markdown: **bold** becomes , `code` becomes . + const bold = await screen.findByText("bold") + expect(bold.tagName).toBe("STRONG") + expect(container.querySelector("code")?.textContent).toBe("code") + + // The raw markdown source must not be displayed verbatim in the expanded view. + expect(screen.queryByText("**bold** and `code`")).not.toBeInTheDocument() + }) + + it("uses the shared scrollable style for the expanded prompt box", () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "prompt", images: [] }, + }) + + // Expand the header. + fireEvent.click(screen.getByText("prompt")) + + // The prompt box must use the VS Code-style .scrollable scrollbar (hover-reveal), + // not a default always-visible Chromium scrollbar, so it matches the message list. + const scrollBox = container.querySelector(".scrollable") + expect(scrollBox).not.toBeNull() + expect(scrollBox?.className).toContain("max-h-80") + }) + + it("renders headings and lists in the expanded view", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "# Heading\n- item one\n- item two", + images: [], + }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + const heading = await screen.findByRole("heading") + expect(heading.textContent).toBe("Heading") + expect(container.querySelector("ul li")).not.toBeNull() + }) + + it("does not collapse the panel when a rendered markdown link is clicked", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "**bold** [example](https://example.com)", + images: [], + }, + }) + + // Expand the header. + fireEvent.click(screen.getByText("**bold** [example](https://example.com)")) + const link = await screen.findByRole("link", { name: "example" }) + + // Clicking a rendered link must not toggle isTaskExpanded (the header click + // handler ignores anchor targets), so the expanded content stays visible. + fireEvent.click(link) + expect(container.querySelector("strong")).not.toBeNull() + }) + + it("keeps context mentions clickable in the expanded markdown view", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "Inspect @/src/file.ts, @problems, and @terminal.", + images: [], + }, + }) + + // Expand via the header container because the collapsed title contains split mention spans. + fireEvent.click(container.querySelector(".cursor-pointer")!) + await screen.findByText(/Inspect/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(3) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + expect(mentions[2].textContent).toBe("@terminal") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/file.ts" }) + + // The mention click must not bubble to the header toggle (the mention handler + // stops propagation), so the expanded markdown stays rendered after the + // mention is opened instead of the panel collapsing. + expect(screen.getByText(/Inspect/, { exact: false })).toBeInTheDocument() + expect(container.querySelectorAll("span.mention-context-highlight")).toHaveLength(3) + }) + + it("keeps single newlines as line breaks in a plain-text prompt", async () => { + const { container } = renderTaskHeader({ + task: { type: "say", ts: Date.now(), text: "Fix the login bug\nIt crashes on startup", images: [] }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + // Inexact match: the soft break splits the paragraph into text
text, so no + // single element's full text equals the first line. + await screen.findByText(/Fix the login bug/, { exact: false }) + + // The previous expanded view rendered plain text with whitespace-pre-wrap, so a + // single newline was always a line break. The markdown pipeline collapses soft + // breaks to spaces per CommonMark unless remark-breaks is enabled, so the header + // must keep the newline structural (
) instead of reflowing the prompt into + // one paragraph. + const paragraph = container.querySelector(".scrollable p") + expect(paragraph).not.toBeNull() + expect(paragraph?.querySelector("br")).not.toBeNull() + expect(paragraph?.textContent).toBe("Fix the login bugIt crashes on startup") + }) + + it("still parses markdown headings and lists while keeping newlines inside them", async () => { + const { container } = renderTaskHeader({ + task: { + type: "say", + ts: Date.now(), + text: "# Heading\n- item one\n continued line\n- item two", + images: [], + }, + }) + + // Expand via the header container (the raw multi-line title is not a stable text target). + fireEvent.click(container.querySelector(".cursor-pointer")!) + + const heading = await screen.findByRole("heading") + expect(heading.textContent).toBe("Heading") + + // Markdown still parses (the # line is a heading, the - lines are list items)... + const items = container.querySelectorAll(".scrollable li") + expect(items).toHaveLength(2) + + // ...and the soft break inside the first item renders as a line break. + expect(items[0]?.querySelector("br")).not.toBeNull() + expect(items[0]?.textContent).toBe("item onecontinued line") + expect(items[1]?.textContent).toBe("item two") + }) + + it("renders an empty prompt without crashing", () => { + const { container } = renderTaskHeader({ + // `text` is optional on ClineMessage; omit it to exercise the empty-prompt path. + task: { type: "say", ts: Date.now(), images: [] }, + }) + + // No title text to click, so expand via the header container itself. + fireEvent.click(container.querySelector(".cursor-pointer")!) + + // The empty prompt renders nothing but must not crash; the rest of the + // expanded header (cost row) is still present. + expect(screen.getByText("$0.05")).toBeInTheDocument() + + // The expanded text area stays empty: a missing prompt must not render + // placeholder content into the markdown container. + const textArea = container.querySelector(".scrollable") + expect(textArea).not.toBeNull() + expect(textArea?.textContent).toBe("") + }) + }) }) diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx new file mode 100644 index 0000000000..50cf62c416 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.visual.tsx @@ -0,0 +1,43 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +// Pixel receipts for the expanded TaskHeader markdown surface (PR #1257): +// markdown formatting, clickable mentions, soft breaks, and the consistent +// .scrollable overflow box. Semantic behavior (toggle guards, openMention +// posts, boundary rules) stays covered by TaskHeader.spec.tsx. +for (const theme of visualThemes) { + test(`renders the expanded TaskHeader prompt as markdown in the ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("task-header-markdown")) + await applyVisualTheme(page, theme) + + // Establish the expanded state deterministically through the header + // toggle (lucide chevron-down while collapsed). + await component.locator("button:has(svg.lucide-chevron-down)").click() + + // The expanded view applies markdown: heading, list, mentions, and + // soft breaks rendered as
. + await expect(component.getByRole("heading", { name: "Refactor the billing module" })).toBeVisible() + expect(await component.locator("ul li").count()).toBe(4) + const mentions = component.locator('span.mention-context-highlight[role="button"]') + expect(await mentions.count()).toBe(3) + await expect(mentions.nth(0)).toHaveText("@problems") + await expect(mentions.nth(1)).toHaveText("@terminal") + await expect(mentions.nth(2)).toHaveText("@/src/billing/invoice.ts") + expect(await component.locator("p br").count()).toBeGreaterThan(0) + + // The prompt overflows the max-h-80 box, so the snapshot captures the + // clipped, scrollable region using the shared .scrollable (VS Code-style + // scrollbar) surface. + const scrollBox = component.locator(".scrollable") + expect(await scrollBox.count()).toBe(1) + await expect(scrollBox).toHaveClass(/max-h-80/) + const { scrollHeight, clientHeight } = await scrollBox.evaluate((el) => ({ + scrollHeight: el.scrollHeight, + clientHeight: el.clientHeight, + })) + expect(scrollHeight).toBeGreaterThan(clientHeight) + + await expect(component).toHaveScreenshot(`task-header-markdown-${theme.name}.png`) + }) +} diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b30e104b865e95c9405dd2225cae369024078a9c GIT binary patch literal 47521 zcmdqJRa9I-)GinZ1b4S!!6mp$a0njU3GVI^g1ZHGcX!tW3-0a&m*5Ul`DM-hXU(0b z`!r8kp?h`LIj3sx&vu6@$Vni<oVME&VtH&P#S+c_5np15_-D5b9&%QW8lB|BR}ZmRLzctC@3w=i^zWZCL?BL1{rj zL1J#{97p`pErk%ObVvxS)DGpE?P+~ck?U}Rm`>(d(UjxfSPCnv=`QCupW`WBbQl($ zg&zs5-_b@P9QcD2-Gq2v ziWRas@N&yQaX|~3J<8rka#%l-9jwnfj+E=~qcE_bgitS{(}$XZI|9;k^n3g=Gc!+5 zPqk-9W#22HK?x0#v9e;2jt&k=%FB1ToM<+lhkA)DoqYA~+=W_OTMLB8`rXB@B!mhz zFNRl(+o0YQh=3!(I~;W!z8=8?U)X z8=kyfI$?iTQc_ZMbaZhexC$g+D{KZ$OgI%?Oc>@2drvNk9$Hf4%WzLoR47syl1xeJ z!luNdBEc7Q8<>*fDn35G>IQc3^`tl(7UFX3RLb)ZHmQzFAEjgeT{H}-ig=SD;c#sl zE0rU~(}z@W(_$=Rl#F5a7QSxnj-)&ogX<5_-pZ#r{*=C2%OBZgU;}R64k@?|t=$%! zayOOe?_gYAU1d?hy&zZ564lJOKZqFpYejE!9`o-`VvLzJ$)UgJqx$6%;S= zbF;E4jaY+E_JU3kvmz3$HviGK7+zY|*uJg;-ZVa0zz%~Pcg*?4j-}6a-Mh(X=tqCd z!F18<`2caMWBb#^@a5k4dY4ZZC9I#FY0S2>=yI<$Aw;^&ZOdNfw(aHaC^;FKuKORX zf6KCqYG0HTdR38+!r^xo78XurGvC_VbG_Q1>nY1BC4w%>6;y>;i#1ModpPI-KkxpWa)TnS7 zC$-z`4SasM_B`vjMMp=^&C825@1!6^f%_7rB!&Sc)O!tdLh=?F0 zf`5mw3B7z)qnHE6>qAUcJpmQxRBD%CD7{AQPJbl9NA2cr`*3Uq<&C@ZZ31?SUl6-D zvE&j87FeAoqxdhmXC0omiR%{desct82s9Ot9WlXmte zh$Bf*A?MPw!I8|9h_*4#mWrb^2B%5AT3=f`-NnDTrN#MZE)uHE>EKJHb_)@&iy7l! z0362ec$zxfbpZx>^R@PSaM^LEV>l!3I=)WaQ`?fytQmC_lo zFW7_zefC2?+eZ4Z^O9Mi?dSX<5(~pD`BD%jrVqaJF8p{bnVFn|Ld-E0Y)sN~ zNhaznoMeaC-PT^qziMMJmRyp-p`5V%`)jJ4oar{MJYA_Te^g4)Cz2~#IRaKfzUQlH zY6KlvAJ;aQ6I2Z>-_R2rJ+B(?N0(myh)GUv294_aX#U9j+s&eBS6UCvNDPzhT6+SW8a{%0i^CrrT{j`3 zb<5qA7RT*@=y`G`>j9szGe5)ltKpAbMtrP=`c)kD$NRHoI2iaAL4y*}@1MI~9|h&q z^fsG%#vc#MsxtZ9S(crWars~Fwml|i2F#}mjg5>p>S#4;Kfr+MoWkQ=I+-%j=6cp> zyp{980!@a4`hJQoj-N&gM!)eu#d(L(`kde{~%*PI4&5BYc??2fQfq0HCndHJ1X znD=hqued3xWcos~n*Fm7JY$NTzlcKzF9MF-;E zT_>z?rvqz1+KV_<&d+IS70KxL{QD?wm7F#!AqsP#iDtU5d*4n5%1};^3%*7S1_cKb z3x4x@eR=++b|g(M9`VWL+=H0Q?hSKqzbKb_hiF>7b(BWHN;PU&5}qf9DFP9SkVccu zYEjm=u!8=ktNQ}!BnuM=l@vT)7kUR7IZ5oe3bAnPw=l^0Nj6LML+bFNFwWVRS|8VI zI)k%(%gFPz!@0yKAuzL!wmy-J?~_o7L84|`S^l)|13N!y@Pp^U6vb0raw|BM5|j0O zxnB1dU%!4;rgWCWaz0r~Xr0PX6A41x48wF;ZnTbwpCM3!5BFORXcLc17VzeA#j7!a zD!5U%G|S6$aDW;i%^{@uuLac8|JM@QlAViJ7@DuwX7ROp{@o;UnaK&cZR1VBMN zxM;wDclw+uDMm7Y;I-U_Cl+$ampxdvh)T}YprZ!t2T&lUM&=kT?j|LOb(-yjSgS$| zZqP%@k{~{fu1{Keiywz|=mDd~^qEhL<`VyG8s z?YH)Z@8s^%T-V%#UF2ac_13*EBg4M42Za7A*S?17D^)4GBf!VE_^7c1x5`$^u|b&q zI&IEg*An?QUbjM-;O-DqwC*oI#SA|#CNgLlY=6{kS4Zi|?(h9Vng1Ra6O+w+DnFf{ zSlHH7pwdSa;V#^~N?^B~1JiQ8Ql+#)z0-@^2VjuGKWLKGU#$B=F{tj!R?vR$SvvJH z?JoAZ(C$}bNRvf>o)(UFkrPsWu7qug?+kKte65a5Yq zc2>-l#78H%cbFvV7(TI^5Pk?j)DT3H4G}Yem6DX4a1izKYCpxA9I1m+LA_??Y{;5pP1l1_z~ok%|-&ti6q+2?u(3K>@b4iM}#iPo>U5bO!^hL~OCvIFeYSU2N=PN3C$t55^GinDXXYxx1TXTc5kl z;BxdjzT!XZhmD$URCab~y&WPAlQ!@4EsZ%**>!PqYxY0d-ThZN9a%HCO&H#Dx<1~V%(f*q+OCf| zP;7-983G7#*TamJV#9jP@p9Y;Id-_zKt}{O4adoIB&XBr)YJNFv6PKS=jCczKFi~< zq{eW75zwwIxTNf=t=vh|wq)D%g<50jN-?zowN9fUbSvr~ec>KYclO5~`NWFugqe^4OGE(*uux@b9EqDP8WYuQ@w<=|OE$+OY-@OtUjGM$NiMP!<>~70HQF zGvg*81R_VHi2A_JQw~HCJ#K}6+)qd0zlt%rDJEN=E|T}To>g;xr9_Ybpst_L^J-F} z1}2u{2m9FiJ(tA{b%LMA2SWEh@&Dj~y;#bjk;ziMIky{TDtfGdS{Bn+KND39DxyvR z<3^wK+4B%A{pAIp***v8;}IK;+2X$1K@jtMDDzuu{6d@xs^+km+5eNI=dzo`CD*HP zb-$Md@WHBE$4oqeR0h9i<9i7EEH-m=&e+`^YPm`?+CzIxqJG;{V)CoMn?LVE$^nU- z@U^q#?)d0uhe7?xbXt(8;K8UPHSlqQYwWqc)Kl!a5kQkF(`cV z99cWYqqJOHxLI(9p@GfH6`EKT17YK%wy6o`L7PKMyOD*Cc?~()q6^8K_s->2?HBN_ z5O3!UPLTJo8eh}79SH>kQ&@3H|2i?t*WNcHxOsZAhAn$-hrNerVlUF-JJ?T7U&Rr! zLqz}jtf{6Gz%V#4-@5xItt!^x4NHz{8KL81#Ap@jQE@SKn%-vFtOHVR%y!o7s+l!4 z_2j5eD93iLY?|h1vBTw6{@a=DWn{AaWP3tV7*{IOe;qISRlOM+2U<`C^!H5nT|DG! z-SgS%;_fiWu|MFct?jo~lE8BQ@;RnO)5i2tZJtkKGdJ+ccvBY%N?k_6SI(`J8;3?muGm0(iPc&A-!j<$bM!Oj)*c}dlR;A% z!-nU^MG6bb^4He?!k;7BF;B+@9_hKb)L-wOF2~i%R7X=VBqH%=b3|Y~*Hr;S7mvhG zb-a6c;4q&OB|^bt**R@Ho3n`l0PF`bgR4w3Qx4EcG^3cXdnj#eY@#rVmh^m{ox{6h zVq!qEw&=B%1;=UzxdybQG(Pv*IMY=H91I(1?d~m`)mG;U&4%=d2oq5FEn7%fSR8=B zqj{Rl>v|eR#9L1oYmEkvMe78>oCT+(jLgW@!E{5KuWN;X;X95ix+S}PrME|#cf%cJ z*X}P3%%e{u13g3oe6LHMXZ-8r3+;1ToAY)XN*_C~*DT5LUmO#I_3D_bI^1m8ZBP11 zDww@3Ql`(T=g&);G7r@m_YinmUIe;0jX( z;aOS4b3FjJ0my!MaIjdaLN~IrJDTR{=9bRq?$G@m0*QbF5gxu2C{my{^@OVDrAuz< z>gtBXGQX`C97BSIHJiwWC{Zc-LP0_Cr?TyotXjLp;qmrNZIUqm4PXvMasUX6uq7U} zx|}SvIGQ@(5)tVDvJ9Rcpzbn#K$c-Bkd~L<%LZfzP$zjgIn{#gT(v4)m9~8YqT9pS z@TV+ZSGhp_jTm3K44&9Be;5?qu5YWlXzJDQh=}=|F2@TsGAS&<$V6nGKrtwss?L_B zRI;+N0-ds?KO`gsAi*!`_4RB%K0fqS4VLrx!(tly=@Lksa6Dr zEKFuC-9M{riWJ7JEt{zBIn9(0M;ce{=MmRazib&8Mx}?ec`+!lQoLWSW$177z&e>o z6bVhyH2Iyf>T}$ItK8?=C27@3#=F}+AM6utg~L9P;z zz9IKhbLv6Kr%^2Em)y^q&N!7I~+*N7z3Kn)K$&J_!v zAkRm-2Lx&P2Zb~cHRPe#=I!Apa>Wn=oPk(yg_rsQ*k3z944$Vg!KvK#TfZ>m`D!d? zX))`7tPT**U(ho|$zaK#b2c!;Fch^~32Cx;oWn#d<}3LP`w?6J_@fBi0reuUh3ku? zBM>tqzGzzl#BdY#iPQ6-AgOp3NEoOsV3PpAM}?DH}H|q)E?XiSuY{&KR|lf#U@#gAH==*Zf<7$CP?PQu3#&E{;cCSK4^ep*;cxct)Q2v3zLp&!!jdgwMDXF(FSR4vAv zYtRyn`<^cnJeJ=K9l+1!@o9b{`_5WRjt1`Xs$#NuSFhK)zfH#foo}lhPQ|R@%*4y4 zb4Om&u{4uAR6z8%TKRBFYo10FlyiQczY0(60t*#lC!ZTMo6ZI6PKvpS&frg$ z)p+i;b|&dklFy&T1>NM2ENDEN2s_db&{npGB-+@mr#cNEvDsG)P<~;teB&1I3X2wQCb) zZJN1U3M=|fgc%N-9C7jy>1?|GOWuSdGRV!ZU1uBzP+y3TG> z*oHqNcJNBU5NA3dP0S|Xk+S78hxJmx>(`^X3dDnA(k0*cX^-k_GoIGP$L(lAvJzZK z+#djWilfGArjiR+9UD9S1wuRts*>Nd)NeN|8OVcH2zoE|XzlF*H$VOsvABISGT&zHUA zL}l^znW9P0>m2$g0lq~QEbdae7?vWOlN#e^2@2_7AB5Xen%2Li)#~3Vr2|9C;IrkT zFIyab3mH|!?+A=Jd%mZmAeC?}mII$Nne;}lSLitSGF9pDr>jV{wG`J47LOVB@`c?L z+xCm!ysVr9&jqS$38}MFE@!I5{9({;r@H!9`s^#n!J27jwkW2&$hp-4z7DkHTb2?KQHjx zF8NsxxQxGE`J8#RexU6$S=IDo%d03oAln+`@n;r(I%!&;!o~imJ0hEpfhV7HkH*k1 zqk7`$W|zcVk2ic^pDg+zWSbz|*BmbcZTL-Bx)=_IwqLtf)H2tdR=~aqR|OP8ytq_| zfXIB8aaeH0??XaX-qh4D)a2YO7P6TLK_c2byOHwV|C=PvDhwMt8UhZ<*J( zqNX+XZMclsdZ34-H^q^YTaJji=X{j12@=>amrz|G4v%+tgHFv%e3jM(t|mm9m4KQo zA|r>nlAQVt?%3E;s44if-~f#}ir5J5->2*%Sn4@W?@)nH2m1u2B>h>6*`WcfkduLT zA>rx10f_oGhD4TfpWs`$%MT}nw*de7iOOO=_2DW5Hp}}ag>^_XY4{xtvoxjbRoPsz z^}H`R-RPr}kg}@!=P4DKN|WgC9+6>vmCq6^)3OJt+?^N}yB}yM6Ck9^o~sa2<{^$O z+L8$CcqNm+e2Jhc`Xx@`##ySvP+&Lp(wrViUzooz*e4^LF3?kIQ&H76jCdRG44ZB> zB6Psszb?+a{Ik>E4(+I4KCj@~pw7^Ly58wX$d3DBN~M>FfG1ZOR~jO64hgCOJ!JAT z)Q2EvEE&G*Vw>2lL8M<)fS zcIM`T**E>@#hR5yJ0j02>7XNTu_~%^UmwJi@ggW$D+$l+{uxF|hWw4CB+@Q){)LfH z`fsJ`Xx2x*_Kv#F8{|?gY2IpXRW;IRgFhB9n6vHAW%q_8OPGD-Q2Y_SnVHu;)6?AH zWY5A@KU^tTlK$-fWtC?SQ$?sqthMw>zm!g)VSbE*#1DL@6Umbh-{6LCdVz9t+n{2rnNd*>HZoimA?pqk#_U*0lsu}D@=fw z&4sy#Vo*9fZHUOymDu|VZQ70vAExpJ%Vq1I36he4jPe#H%jbn#+8ve$KVKA8{TBg; z6|S^Ty>bNPH7-|0oJzyRpJCwC{L?kaC8E6U|0GEfQ@w5U7kiJ3j`|FQ@C<1Fw3HE! zK&u|Di~YQ4U^2;i|1!S=8s?_prdy96bbo@l{^Ug}5;CSGW|Ilq%VU@$F}gr!q_SPT5sZ1^9SFjj zM8@QR)!}*7L)O0scCQA7veT3dEvPHSn!g)u5r3F}{yc%d%GqdHbCs;O*I(!c6@Y|~ ztII$=(RMS4w&rMB6)rU?gJZymNx-vPu+)YlpVo%=QRcI@l}E*6rcbBhPJ4><*t=`o znIc8Im@W>x`~km@I0G6+5Vz+`)(ww{Lb(H zwo)}c?}Xie=^yWu@+Hwu)^!jsr7>*W;hFv(633u7xRfArKA$1+cceU4wnjlK1%m5m`+N(210{`0@ibf1Fl7mVX+wLpmDYj74sl;@`%Op+^YShOHB> z^WVmFcoX@uGZe?sW$;;=LTe}Zlf`UqG7q*GwN+5h2rkTUI2@A4C^LKigxR^eaMV!F zmFL~81!jDAtI;XZB6qXfr#hjxN2gibyp+Y2ddH1#;W#gjH!6Iu+diA!lyhvGPHT0V z6#3)!l+PiS@y?OVu?Zq%rGcJk19@e3RP@;it+AVo=`3&=pJJsMmaPZNt{_P!Wpq<+ zHq4{0v(>!tJ{Cz$Oqa#E$i57LvyoII-sOOHa2etiBj10;9E2Kd`z>{hUnoEjBzW+# z8Cv?+6-Iy-p?gKyzd#LXF9WRKhCzrO@YI`e$yR{f&)6@Ebt)VP&wn|>`ue#33Y4L| zKOul(C(^0O4Vzk>k{FHx#$xi!ft9w?xgmaG(e(cp5LZKp=Hz7WG1lg*r? zh-dB28&B60VCAbcnfFKFVQM%cYvMP_yxxJ6HOBN))(5z1v(otVv=b2A%k_iF_k@Oy z#MIurAE?q=?aJ(x0^0!i2V}$Zybou-O0Q~FYR9_g(y$Btoj;HT$S~ZmFQvuCIF5#> z{@I%W0Z^s}xx;{Jip@miwz!>dfoui;^^6h>G9fOnOZm3imb#tvtiOv=lL-1nAfG3p zLPv@RusVQlpjmG=xmagQL*pl?ikd_52k8~PwzWcS80yuH1F0`23Y}tR&ei5Bv-sQ zFkKF>zW`Q-4Bu(B$TEe3g3@(V+4e-F{j{{2hx*2teeFes?h3gZ%-hhP-qIYQyJ_wGBfEslGc zJOyjzvBpHMfPy>x`3<<@o;Y@HAIadUSEE}Tk7 z`8fdg)e92u@Ij5n!;@m?uvtmg(tm;%dIjaPxoD=PgP2;KP3|m=*aK>1v)l^xFGMM8*F6;{l4Ke{D?$N}8a_;PxpL$no+!)|U zwfRX%z6&(#_dp&cA;32wyPMdP>#jI24FKbL-?M&Zslk%9^lYKV@b2&CVFzIV6(!}A zb_~Hb@;ftP1}SGMkKw&6pH9np#t8h;r(9)|^1($wKQ-!1WUuoCAO|7|n!p_Zds*X=$4h{}wsul4{em2t`o~}nt zCb#>O+dwVO&tf7iXhYv>-k^+wySJGsMx$*ppQdCi8Z(G!0U?=LailpK+$zZ?iI1ox z6e>VEDHIvY|v*p3qBl*f$kGWnw1~Ht8BJAsmSdI6rVs^*%X$*Mj?)Jx&Vl1kA8SXTbKIptp*BBrtMms za^W7?-+?XO<#o?;Nsv4FE?(!1>oQ79%+8K!&!Kz$<@vFUC!e!~87|GAjm8!T00{#@ zLV=W~GC9g6U!2%d_sccvm|SO~6nhz@bz481$>4f)J>L*mBeTYc2f=;kJ6UOoQ}w&{ ztqAz`m4DImIqrIl{)$jw%6v9T_E7DPjiobpev-L4*W)Z3&GWJMFAgVNhcUPe+@-_4 z7ml}BxLt=t)gbqz_AU<^S5MvgaCRtp_Uh9B^uSF`li?W1F(oqUgz+0^_??GgKPIT3 z;pL}fv?S|~9MQzSoewURF>vUTO#D{ad+@Z6&w(>EmL-^#Cfu-qI5YD01~A9)5eB`^ zbkF>?AH^H*@HmeqtxkpvK5CF7Gk%4beY~F6D?7jstX&`x7ozKH-Rmc{s7E>~lzgiX zyD6-VrX}S1;5d@~Pw~^%U7`2(M?feiC=%meSPAO4-?eU}+ZHpI9@%8OG%4Ca`k8+E z^MlH$M#ZgfZU1?{OmBs_?u!F@+P@GKVe$1(u(h;be-G)zmb;oTcfv+q%@%S8kf=M6 zKHN{{NibtEtmzxu>fy?%VSK9eOEx%}!YF@x9cep(6G5)YWboDT=&g6xXD5thzGXk& z1!jqqeojqij$1@B4K}~02}7dv@GlB%t@{MF?Y=AeBb6F;LGU^6Bo%yy1@Lyo7Z8;P zT2F>nUE3c_JE+3_jUu_+;Z7SEe>Hns_2&mk$#%5aP@&55Cv~vco?y;!Wyzt+b-U(PB4+tb(73tjlZ|` zEP7<$xZ#{bNplAxc%~6So$4^O%{0F&i_i(HUKUqk26bzrK7Orx#=R|S`sP?7ybAeD z-e1y3H)GFvP%GKMw5QY?iCn5SWE$?g&GyaGmH;0nWxP?v4hHY;pBC2=88VF?qvI_* zn9}GZLcj|5%6)&K3}=GYAv=TH3*9r@$i#Z%REGuMy@c$8Pg5 z1=^JS?|QY}Iw!I4LUZt7N8ou%OfNH`^=^}>WY2`y67iumJBv-ES@IE zS;H@N-O|;xn4(76rlaV2Ut_JIupcx3D0vQ|*RP*YTd2mU=`7*#5Wui#$RZ`S=ed7; zTt-x;Vrj{Fr{JRf6FV{6zV3Y*m*iYXAH{J4vBg`?kk6$+$>l1kh%D^65`NYPaRdzv8GLe(X$05agn57c zgQi@E(w{3N1vXE1u1?GYdYFaHY-iRW{0%uZ(b0xH-#L_$vO#Hq%M4-CdfQoN8HZQR z&CbiiQ5DB+U{75Hyx`yNx5aPEzFLf~nqA8?=3aduqIW_fY6;H?sT6&uT$d+GA zVvotB%(+Kt@HEBLc?LhYLP?BLrxz^KJ@~7i%sP;e#O%`Vt+b#SVoXM6+3Q#{QYTHj z$6`*v$z~9H>5L{oq4e+SD3ILs=Q>MwKcK6?qxycX$U52{j&v}6$Jj`=2$kF`%mXQy5swK*Z4{rQa;%HR5MX@W zG*J~E_*i^xS50{OM?GxzHUDELGYQz!nPWW|gv!P!YdXJl*e#fBv(5RBTAS65dNrQV zCULDLOATt-tlrx5+CWH_#_?12MTl*Pu_BL6HPLePw$DD~a=f)qy8;os7H$EkQGtiL zaq(K~hbR@^Wz1qE{-1*y0@rM5pDkD?Oeprb9FtB;8vUggtOPl13)quJ&F+In`^`rd zuvoFtz&C!Ard6RWJwb2QIzF{hI<{uKY9q9O7%;dVG08?If~yMefa!u7r58txac^yV z^09*xYQ85Cn8R)|kqCJ8uNVe7Xeb2Wp2ar3h5x^?Z_t0{%>O4WZc4Y4PiE>l*CmZA zQLD=Ict_cFtJR_i8eqY<^o%sfUHvX}s*m#^l;~h~wrs^|H^gt-d0+U@La#~+vE^rYg?NukVgTm z(u^ur%oEQN@J{d2HZs})-1WrUv&?#f4Azy){bqOwpv$~`DJiK1u74)*%j20=gT-vS z`y~iI{Y$@eaF8-FRRhNu1gt1~!J9kU+gqIudVM{_lqDr4H8nL;Sd6Epr@?y{@})4o zST5Dmn4SO_3@o(N#i-N8Ix14&LXl)-eR~*64hEpV5j5sopz{Lst^7o=YTIW(Ok9hG zh9~K&}1Y*wco?H!^n_R}>4S~?zU|pX)r*u5E zkPTdYrAv6E6~I_1N77n5qaKf>;jr-?suh|$M$?6|r5maD71RHW4=SxDn`fX%vRy7? zFx=cuzI14zrjY&wfd&(^#TLh+7Zz-lspe)bPr-`XHB52VE|w7<8ff=yB(T0DVQY}$ zG#=lj0j}9jZhTZChwU1lEb4_XUtKerjR)q5Ctx*fryyW3)$w}v`ho(jSV&Cd0PG21 zeq{)FdjL;o|DX3|Jy)Lc@{SlYB~wOTA+2{pDntb58Q7p8F+J1jYzYZqcvPoM2G2Dx z9wkHjcHaTm1_H6@85$iUA7LIV)Q`7WZC1F%aad$($N4T1W35j+3>?qi;{xbB%VNF6 zCO02mf)j%d3^$Zbt!jM;3gG0CJcFqEKLn8Ox8#u6k@Z7Mt#+WO}|PAv7ogv^BrbbMTA|j2LuU<6p#4+FefY6GJX^ z4ECl{QhpdVU0`t#p+^knuBK{)#-NAae#jmMoUR$*O8k8EuT0%8{eDV`*?o^3q2pMF zBWB#Iwqol8!BvB#6l6b>BSjlq^1^yO&fZr_dO4+_`F&Yl5w-$oQ_|7Oik?RjqJ?cy z3Hq0pV|7B?=x@>N79JDI>u$XUj27g#=)zLSXqaQymzQ-(&0-B&RvQMFQ~lE?)`IyW z0(ed|4eV#0bp!5r@^p-;lY;d`dDngPXQjsv z3oGjqkDg5=qkJ)jMXa+*#0m02Py4(lKOoW`H`Hz64OwZ(AEZkL9Tiz`O!fr|8IL8v)^s%0 zc;$C6>Tfaoc+pa%v6Bwone(G`u%~f*)^0?2VC!4wN8o^~8NKYg7;SR&Z4q1u>k7FI zHAhun;@%8jUi=S}XA=$mI%{<*W6^aQxN*SZL}EIWjC`C(yIS1k6E;|d997m0X;79m zQkZ0XQ@p1a(-$|8e-c(fufEr*Zh40M9i_d*yE^o&dWC4HQ);bh*J3chz2Mo0Z{;Y% z)NqD)&OnI6(bGTB|BEn_%btu;6Xto{#JDzUpcT&&5y0Qh>$!gFY=_<-cwV=hSBc)+ z?-*}R^P)OVf}QMQxB2Hs3hCrfV7O~qx}wnvaV$7ZyTb+yD^qT9m1f7<2YSYO$37Sb zU_qWnncVcTrjaf$W0vS2*kS>x}1Slge> z(~!vKv25Fo-WHCtyr_TGCNmiH8uOjO*k+~5w4UrnSH+`eZ+fz78>ufJyPjAWiT?Pj z`u;N}Ta17FqV;1HDeTCPU}FC@ByPfGV&=4qIogh&laho4LjAlpHST!&Bn-!09T250d^TIP<>3bTNJATNAv5uY>|eS5H*{tBmdO8hLLbla#lHaEE3R= z;6*i6JG^lh8K%a)bP^@hdiPe_y4Lj9?iv|3wQU2d9rsbimt;!bMMdsakCfr}@!=&+ z4wGARW~;40nJObPORQm0q)vqY%fN)z!_pV(JMjcsi?}@WV*kr%4NM~0QCQZA_YOAK zU*8xyql}=mlN(r$qjf)JR%~BoPvjfj>XdkswXLYIK3UO5hTq0#m_l|VMD?+d1_5Yc zoNv&2jK;e7-@ek>O@K~DL{8LUqTWi%i%dr_)X&=O^u8{2+Bku}N-1T|_Gbsn27+TxAyCBxiJIb9N`cJGHNJHYz z@;PK+Vp70>+H~1Tys_^(?;u_!h1aFATP@&S%vAPLuewI^lrRXf0^W$}5MZjp{Hwy7p()z18`s5on>m ze*FR&*eou4$neLf`%75Y8iT&ploF6k*`%S-AfhHA$(GL&05MQ7&>`q`$MkO~5agy> zA5YtWC4aiPX@9XJ1qHXn#50qs-z^JjQuM^$s2%P zR8&|f@OWGY=J(1#_UK@$03=iQxL!d@35aYIg4#zTDXepCOHDuwrKK$eSrag&Lsmj6 z613txuTvzSB_}7xA#TVuncf}m<}}=hdv>T&FQSD^!BYca|Nn^gR4ztrE0*id+svXj zo`p9ttP}=_Xx-@2YmGXd>}4&XDp0i~V!D#i9{y^fllu_ke*bGskfYyCjmFX76h^Ot z+hb8xDqQ(sp-$-cT860=d{c&>UYm<7Mu1OTn$DVSrX8pGl+j2s^B@J?F|}mlx%1|3 zGuVni4h9=3w-|#`CL}!kA8;Q|`WPL74)fLHPlB3irFJO)GRVd0>FKe#?oZ@kTCcUc z14K#0=f;#fuF?9J)E&g0`m;VodjN44sLr>V4HnECVA@B6)sih$&Z5yr`|Dk=V52Ys;*cjE zIXE~7;&y0@_Ag*OQ0nEvT3o!JJep4!nVV^D4G5(}q^*1)Nb2f(Th;Z#17>FLbsH=a zn3vXjPtYdH*Y|Ut$(Mp>=c0~7q-Zd1HU=S9mx3G2P|N$oGnyj~-5=)6lrM=l88s`m z{mF@s7i+A|KJ`|5gSiZW6&}aePOe+c+o+DBUz4j;l|~k8#`tWoPg-4JbBC;6ZdqfS z45>4Jr6YLa)pHlKH&;byRZDf6q@M9@Op$+mz$sg{-kn7y=_3S6B8OpTBow5FpqV+b) zG?%|f9WvOJaKGt^BD^a3oJI_Pp5W!On%Mt(>tscsN@IMsrbHuF>g=U&<^zxaW%n>v z#PkbwYMO0iVMBvR+UTDvYR$6czmpp5ifs$`DsqJiTw71SOAd;;SQm>_&W0tCmZILW{i z-&(2^YoGPQuD>LP9&j-+@$0R93(|Udo2}dowquFG5!^3-eZ6kQ@4QJm^j7$(1-rksgVsvNSiwCjFSHcBsuJU%!$vHyCX zPowC|FA+3(bt*tM9BdU-Tr zE+rzN`dF3@G1|&8tt#hX==sA`aoj0RqD6dj)?iOA9S>*5-e_JNqRpp)>A1sx$)yyN z^DM)>Mo34(1qmTcqtXP0K^i>0lZ^T5 z;ehz=M@9q~ZlQSQT#d3FZFaa%?vpnBexnhK(nv|LyLB(IhGF_>141tl2(4h8Mdo95 z+wIwUmq8!A=R6rzD|sMd9G&In&3}bfRDX97@~sIW5zJO#D$r+ZPh#4ZiEnKZp>Cix zadQj@r~NRF;=N>R_Gzd#X?WZI?Dq^$<*rqrPEP_lM6qF(!$D@>l#*4YQGQWT`Vz6{ zV!ZC1u*cVT$@$5}`PCLeFL1L@N>R`2f%kp?tp%hSF^b6?L&r&lb0?x>@0_(P_IjQY zq3&eV3sTa}7>zaf6uc2UYxI7a;zzKg8DLB6Yp=ey3WMW(gpM{5T6@o|ij02td9>F8 z`u-jU8Z(^XSn78w$qp~4d^0mcO~b5jT+s$a_tUR>D-iVsbD`jz1R;_(14Nt2jDKpr zy7|u~{(y4wZ9ga2&ZSN~xFH-8Og-$MPktmsDE_LciBAlsLGzu6)oR1^PwxL5F3iMH z%JMkvqh$#Pb|7u7Uz&B(DQ(CJwZ#Y-bsU&O7MVkX+R^@k(Li#Zgk7cgXUNA zXgxTqK|kQs;lehyP%YDBc)eP%mZGdkcKMl~h933Ys;{FhH#s`R( z`d$@W@95?(KXQoYju@-lgH%MhZU_F!u09x-7_6_AmrkS)eS}v%-aqd`dv^r?&>` z%wqP5zcxbV*mB%JsINXh-wEX`+XABRWonbY@9IuEQ`YElF3eZs$Ls5+uD>;H9?Yx@6Rx z;r8r}N5v>pK`1*RawTCDlOCsqcBu-MsBuVW$1wPqua&^cNLirH?i^X}Q248l@?Hgj zF;V3-SFEFAdYrb<27~!Y(1sdWO~*cX2Vhwe9RZykb~FfRjZ z<6%uSc1F3>AM#WQ@EyFl*5QY15~?q?43^gynwnwquwvGVvb;67`zga~q!}JA*6ZcD zY9^XboeaCC1d-5!MlSP%TlxC3HrP}M%Ebyouir^aI#sa?UgpoMgkLZQZ$NS)f>gb2 zKmObuO90*M3=W$R^8?Tb?eog;S+Ql=c(NH7?ZISwxLnAljMu4eN5o>d6|3i+`(2qf zXVhi%=%D2HCW-qi$DsDIon4YMTD0=7l~xQZt*}~lX|PQ(R3Ucjgn$rPI*_kiRHFYc zKT{BsaK?+D(u?3nM~3|$KcDhHW$ph=d;GsD-v9HZu5`?cz+Mx0Z2Dqb`Ay+unL^NH zblCIYz|U2H1^k=ze!RbT_w=-63=hV8ml+=)9}p0reX2wX>poU-M0*eBT}^P^UhelY zxWkiueSK5iMRe0_^VoyB?*A{+-ZCo7w%zxAKvEi{OF)!{n{K7Mk?y#qyHi9;y1S%X zq`SMjyIYV}V4uwQoomfG)*O57G4>dK;Db0MuIoIHfBcT!RG{n5K3ZP#?|mi{@IWPE z4}Q*eL=bTd>apwVuf3H^F&mvI*KL9r_iDiL%C7~twYABV)MC9fs*H_(aoTdDN5ojS z6=<;(eBKS34)5=_V;93kUOvae9(wMycVBmTSa7z@Fe`yc<~iTx|L?v?9bNBfW~$Fk zrlXAZ^0V5~s?-?k1qydbk|e;Q_ydHs(8$QTU<2mA??uO|j9H997QV^n!6P*}GAyjR zWhsa7{-c|l8#-sWBdd2hrPwzRY#@YPez5#1@pbO13`HQ20gS(;7@8DoP5VzeSJKuyAnLyziYxkV)$HygKI}(vMy1-ZJgd9W2%y z0jxpc1DGks0Mr9~eo`8^w&?&_*q6f*hu`b=7w86S7poS5)ST~HtG5M?Yk+foWaQX0 zU?h&F67U#67hH~Q>=JYlA~)LE-NC7fw^TC41DaZxq@*ME6?!e;{+XLxS5~A^NqGWt zDL?;L#AO+9PGVzXxbvUZS*!t}04*g!dZ-o5kardXG1Ndwp7xP+OS!P-@~X~8Mw?)eE^--Z?!l%c#>D)flD+T=3O#K24v`QQ zjiXnO;Plr`PD?AbNv_25xfpn-la5qPvv>`XH)W|oBhzN9czL^%y=nznN!ys7p}g4@ z(F~^V?Kk1>)U_peY{pPufZR@@N&z|+=wW~n9$|!^W^#_E=kE6&=tO*~5yJHjKaM6W zZw0sa_PJpllU>jYyT5IX#A zW($>GIDS4=dkszHu52uI-57aVFqu^&<=>3+K`?vIB2Y5{7Vu@Hy`a#p@ zl7DKmtgTErZ!j2(%IwmjYXIO6y5^-mZ;qFO-jtkU!HhCowg1pahQJ?yg-9bNCLW@F z6DrO!toVDo4agbO6j+5^2>jwm7O9YfQ0CTkV*o0+vo!QQIGD;R;=0FhZ{5rAEc^@R z<)eutCly>@ZyMEdd$*a}6NpdtiPm(5Zqv_9+A6!<1}dBEE^-U?8jG$Uvt?bWYK&=i zm)$*=N2ibB2>jFK)!GaBSfriWK{Hn&E8fQ!SHj>JygDJpTBWSEmyB9!$SGj@RF7Mt z^ZretQ@}l=Rvn71R)bw<2oC<#wEVS=o~g)Tg8Y2bAJuO!*Dr%x1$YAjIIT6BO7X}Y zcYmsf3u0VZYrSW0c0Os3`PjuvS|r(JZDBn$IEgwuhwUmwJk( zqWIPyTP&3~TOeljT$Q*Im-&Dc#d8?Mo6V}Z zXn8^o^h&(Fs#>IIWbQk31jXRJx%mx9TO6zTKs}X3YB%qu`0lz&61;5OrA54!Qi`TLbRFNhCyh`MC zx|a1jK7e&m&TmfZ5d$%`=#$bT@qv+ySgx_Y@T@pU7nlTCIOSQoMrL1BQZ^(mdj{&9 zro|9k-jKJ9v!}eeq3R8T2p!p-Qtq;iz+O>cHIiFnO(mgs1(;1;DjUB9Iv3PrHw%DX zmX#XG`@owp50SOE`Qds=Nl8gI0Rkf_H$q8!0rH>_a`q|#;XgT=QQTeGiJ9#{lIg-g<-#gQ0Kn1xvX)u>_ z|3w6|kPi*t-5VLaP`KVtlFQ!yU#i{8pvG(axH4SS9`4}cO?Z@>y=3|J6f#-w zN+eZA(6faC*cqufAPZF7)vXe0x4BYmYMFx{Zo3)-?nu&}?sBDK_f9X(NU+pKo9ilr z64fo#sv}z$O1w z%?y(>D5a5>!6p{EYDCb5$rhz1E%O@gAlG_)K6sc$W@}sTh!!)`QAztW!iJmvQat#_ zBm;Bm9SF=p(#k3<**K1rEf<7RE)_2#;r)@YW2`+Nfs#R}YSuzPa>;QS_dy(Amhd9b zgL2aZH9X%nO3-=K&0k?gXlLKFjur(T1#dfld`AiQO)7VA>-{&F&tGD3#G|zhA;bNQ zCv+XerYBo!oZKfFo^}8fa&pF4eW1%TFO!Opi*6Q?`o=AMW&aM9g z2Y>g5EG%Md(8owt)FQo83_Ba_6{LtiCY~#z~ zaB{y-*9$^|y~>HWIuNXi(zb4S*hS_tZu(inGj2l|#w0w#uS>n1?z&ou#P!7(y#kgo z5GopKve-`}$IZsN8(+G;PL-4D4a^>pLjA+M)OD{tS&#|dk>R2&P16A+B12t~142NK zw)bGMHFYrx`@r@Q=Y#QUW3npUnkKJW1wB5dfQTR-3Jk`f(1V?$66!uPJuQdgfk(pp z?QPXhr0eoMGT|%iuGfL}zMFVO9XnMH29vUZ%Fu4>3^txdX~~C_j;kg#j8I*OXOZ`L zzFKm!;SPmt*xE1(2O`gpk4q^ZyQ)H*1!9TtsEw;!{Pz>L#OV=vu|tS9QN51J>e8e( z0;S9Pg*=}Hi(h2(MUmV3?U6ZpFAPYUQApsq#1_6Xa(g{gvG(A0xJk^Mxh9 zcE{J390a%gUE^KmS4Ym-423#0n4P|vPYqid4Wic&qxh0SZ_k_w+U7@nxdco0V}@mB z&;pntB8!bL@Fa_|S_`jP6i#_-k-G#P4*{s}1{}rCyRZHp-{SDJFZZ@9jYNw&)uA@@ zK)y#*j)0tTI}97~MQQRJ8%=rwzJUnU(%X@~xjwFXs1)NuS05FG6T&$37Y!Bta**|# z48otJ(cUGsqplYM&LwxKY-#3#icAuC;hjmDm zQMFuY@0#OV)6!^>XY{wLL->5Mg<6k=FAenQDbfgcyaY}46K=6_JR!y-yu!6L))-qM zoY^NE?CP^jqmAl%?qW?sm;5Y}TkeWvCsq|DJW3Xy`oTHGO4V1$iN{1HDcnB~5)#M- z)LV_)PUv>`Z01=(*fI ztEUQ}3q1@rcJJ$t#PPpDmUlyvh8eIY7wS8fg|+;};F>qM+2c?G5~gddwW(*>MUU}k zWzA&MBykMO3wF>iU%jJM5e|e=dzbWnv)S<&>mCH3#Un^Urgj?%!|>xjd31t0>nJuF z85!j>BT<$pN#5trNuB6x%+!F|(J+EJvf0K2DoofF0|goW)MH!{V&h_>S#Hj^yp<+V zwXQ11xQv+UQpE}ndR?8~{MFn3CAGcz3-Syns@vb>ur^u(*{=;SgV(AlFH}+@p z^uj&Sj@GvfrTOb^rWV>1#w5cdd$%Cl6TJhUT$yyMH>PKCkG%LqQIXHj&#$Dz^&syT zBCyhL#M2P+p}{`Kdu^-py?1`UJCRZmOh&o$}~ z{>5@9XFOjX=XRMjZM>6EEucf419nsl=MZ$ZswtbO&!7M4O(Jnyvi_n8BJa}PzYIh> zg4M>pbN|!jm#3t~L-kEi!Q?yv9-3bQI@#Yy7?|U4TQ62T6^67<5S&ExtYf`ShdL8Q~52_(dop>5>tD~LX#O$VKp5jATM#%{YAv%lO&7jAZzngdlj8#8`7_1 zWmVcd`w{a31Iva&A9Duh>tB)oFoOSIA&UQZZ}@JY=@URg@VMk!X#Ka^;Lrgc`I+7G zIwZh?yRNlXAqYJ~1>PblhXpXg#l%il5J4*37mRD9nf)JaBDq{uUbC=N_M?u2bW?69&UPfMDcPzGeqh zv<6Tuk>o5r?Cu> zJ8N^;`Bu{lkAQG}F!c^#Y6S$+ORN^FLzt}79qAId^Q7Y`>x6`a07~Lr7nmmBCklGq z{#fk)lB=l9qz=F?gGMdxUZCp|(mvl?#_zBl{PIm*9H7Mg+h3;BZ}kH1eZ3->-hfG^ zSfa*=8%w!fNXluY5l{CKr273UX20Lwe>??JLw$XHb#*ns4Y6C!%Fc)YY1Yfj3zLCK zZYPXPfM^a8uVqm;5qm?bolHHkYX0b}lT$%$lWz-I`WIuhktg#Laz5h~;Z9=Dv|zzZ zmz9+^rKi;z91QZNv;w*e`-A@45zkGBA6J7{)xU#WtRp9i)tK>`JlF1g3qA)38IQwt z@a)^n64RQwh|W{~+C_E+RswjD`DeX096fd{M&arMTv{{~6zys=EU|PJL)e!W4>xO6 z;vh%a4Y44Mokb+~!W@`y@#LDo>;}`BruP--OO@-lk!?WrA}@SEuqHV znsvnaU~-m6Vo>TEZzh*5S&STnb_mGZJcU{{bd4d6EtiurbVVRfNfF2Aa?G-uP4^TAI(x7gU;&WmsEI&OUYWDZ&Qkp zDg9jOTD{?w(Rom$u5eqZs?}_cdYy}5wj8nAjf?=Pry#Y6BZe7|n8r_WYon;9Ew}!{_+6v&Ml$OB!l7$2w-cLT?-e{%; z)M14@fpFxp^{+uqBx-L|kt7K66}wNU&UaS`R27L1kCfE=aGG{lR+NMo=Qp113-{OX zaOpxlNwBH2uJ!jxlS*rO{jolpu` zL|$!mo3a5c40y4GB6oi)Xhd45wI(hwhR2Z{QOMv=#@sqEgQ!bfCNk^Gdy!1d_NZrV zA+aO=?eXd@%|FD{KX$_PQwwGs>sW2^oO$)ti6E~YWjhnnwaLWd^632@)?X&S_s?|2 zS*7E_x3VHZEic*c>RFKz%e!Lq=o#TFJihmFv?_b0f*I7Y0d#@Rg~|1YCA2KA1qyC; zy)c@m3DeuE6)A=kMbVB0viAm)X(RZo!!kkVN4pi@mh3Mq7+SQ zXLXEPmK>&2bmN0Uyy`!Inbn8oC-Vsit=o8(>SO;*4(Rt1dwRZm`{qsIipHKWM#Sh?)`qbzNd55^>Qix)Fi9HMSVezl5Yad$6VLb z-AOH#ntINg7J7oB!;*rYoE+8mqH-7`+bWYo^s6$UJ{p+%ZkfP;a8^w%n~g-k<5d#| z3OW}o+XJx0CSam-!Pq-SASXq9U3za8_iiP0uvCXJ%iP!Y%Q3&l;LBGDn7c4|8@w7R z_1p{>25fr^g5TQfzbhccUF$ZxO>Am`=H=!;iR=+>e>rViuJAZMH`8UZs`2}0I@5+N zP+^T&c^^^QpdoPFz}BJea#BX@rGyntOp}eyRyBON4T4$-wh9)V4`@lL7!?o5AIXMm z0!h7GCc!w0mIHFP#>SwMP_mNC6C}oevq=F2YIz-qYezJ_*x@De%Ne*0yv^MPX&^*h zd?!S&CN=>PJF_}y?Vm6H{t$qhJZu44kVc~Vutuq}1vLCQq&?VU4`4;?1ww5Mtth}}$hN2Dvd(5cp5+(0@c0Z%qDl_H$EEJU z-2KP7m;SpNyykqjZcg$?&*ggih)m|*rP0E`Q%4F8=O5}`325~w-G-9wDZMjYNfu#Q zPz=2Cf@4Usaz>+0$XZR-3`}Phg571xy(H>BMyT=;(l^_HJ zujbc555Ufja@Az^4c4nthrLW&5qHfQQO6U3Gk$<>P~+Bg6J7sBL^arJdmi}os|(|~ zkkf@c_c4-%vUHYbY<3g65C!x3N(wIe)poVie`*0H?;kEzLXmF8Y1To$IXgq??zn0U zDGgYpD9p{{rJ8KL2njSNclWsa48Q+*WaXvX;Kb7>+rpdi_Rr~0wnOj_Sco8FjSw$QY%lzv5w2pO_W#9E`%qdYN$ZPaGv z)fA)E`u>mU+x;?aV}Fq*XFfjHgH{HS_f$N1%+hrm#$7nZTtKrw5f0R&l*6=n`Aj9x z@-?t2nPr-JqyFTH@>u`biqFO5XdR}V-urkSaw6UiJ2Px?^cvm95>=s@kh9Gc7fVL- z=Jz3YrX%T9jve9)3?4&xY)>8E`T%7|3N@7zQw0b}**KB6@nDxWU2yDuv&9(pT0UQR ze3=${h*H*LxxB)-eO#Qkv^iN#xpNqBo3YZ!Ji6l(*e?n7Zi4S1``^X#@s9!8{Wx)U z#3P5P2+#^5vf=tab4VB!`Z0N;Dh|V=a-Ish_B<=2M0+F(HgFxm!0rW* z>FX}E)P?GmMC${d2(SdfN8KMO|Bnj#{|8g@e=4q*(JzBALaA<3EpIuvQ2_mOnyJNI z65Rf$i7i8M={emmOimEMt!5F-)u*z`vr+{U8Rw#W7Ao78 z$7uuT0usEf8WNt|63X>h3R~a)m8k#RqYLNmO|)6cE8dnjg-)O4?U2rm9!Kh5 zeiwWFQoDJiODjXTwuO#k=Iav@z8l{kmY@-r^Z)8{gE(NwVGHLA@Iq<; z)(Nl~-!U=SfNLY(lC%H_T!JflBj^}|v}Ipi%EA|5yMf>yaH?iT&q4bf#6tUa<)oyZ z$<2N*5KF6qgz(A8GE!0+K@PK~C3j?aUbYPkMPPLR#b5AQ;QN@D1R{hhpjQqyJ=}4E z2DT_Vx!~~EEx=DtamT0vdq7~v()lC?LqbBpo##yuFsM#vO6EY(JIt6E!TevP`f$%m z?Sd>OQQ7Hm%jbGX6qrW9Tp`tB%*()V{FU%Rymq4Fe_NdZFZz1)3p|Rd?1j|FC?bC} zKX6y>=;%;&0Jj=qE*sgG;AZts{kgnu1RTW=(NCa4lsaR|_FKG=-QnouWCchyOs+R8 zuJ5R+?eCL8pzD%psYzeFxj68S{n%B2@oqAZS?*lor|{rhn~OuxNV9uFaZGYXv992r zZjNqm{8vh6UeAP5FOK`0?UAax+7BDptz{DKw;$PcdAAPK1!*T8RIiIk4yUrluEH+q zJ$+|i@RVp&A-;@9gHUHk|FyQrcOQNo{e6V|k_In{%yobAOr@frpwZm}pF!pK;=svV z4Q!8gI54SfpogY6MtK#-S}`-LDQME+cd>ROBW&(VH$@Vh8aj(mxEQ*{!V2~HA4hZL zI;-~&HS_7zyaHRgRV!DrD%n{cdu^Vgj=z7IFRwK@pp?fq8~ZGtTWb_C6W@}@fnlL;08>jya% zN7--ny1TnalRG>PvyDZ;cFO$~^uCWORkE)q!2*jh+JJHf;@+&n+>(BSN=+R3R7!4}MN^T@{58LK0~B$204<`aV6vA;7~M z>ZmY2=L&p5E|P?t{0Y=-Kbe@kjz(4GEE&?<4UfWckk=%T7ZwqD=JS7JaXHoqHCtFU z^}HDh*2a431e$iZPdyIe{v*HiQzu%GbZ*$<6`IRHBIWvw36?3))&UEe{Lc42XLpdAHD#l@L z{9Y7TBopr8M~pS6XcV9Q2`<{z`*GPmrh-u+@YGd5d>I$>Ao%9H=Xv{gC{C+JC`Eu} zt%An+XuNJH|F=Y`ko)itnStJ3OX1Wz-5lh9Zrnz?D!zz~T8q<6_%QUe)n7c&dnP0_ zy2eNh3=T9U>hZN;_{lGFv(XE8|6Yw3W@d2bp}yyO(z9*AXO8_i+)8eu(?an6$()Il z+XM=uz$^zU85wpt+0Ubo>|fv|8dqeaUpg}I;RZ_^^%;&B>KV2|4$Adf8b>~iG#j3R zV5&@kF5q(C&o{d}8s8@wfT=PR0uXl?7^RYLGK66BKGb54fFMGa+?&w55Qk4(Pc>BkTWQInVXw~CScE?I2VXv%@-w5j*amWnvIzpCDQSuBzE%E*8jwxEo}uc>-E!l4anW@d;1JKK zeGM=WLLDHAu3Tv(){Wk?r+tZ~{RnL4tnxz4k-v@BMyyoX>p-B`%t@(dAr$VmR!bZi zUh-E77LhF<_3AWo8@+yhy*#y!*dV`ei+AUspuGr%J}@dw92svg(fkTJ%v?a z&-r}O)GhRSu|41NLmxV5Iue(1`KS8#+T#%6ml4bMp)UOB`A6$Z+n$<=UzWEz&(UO4AdFb@m zOw0QM60N?zQq;K8T-~v5$v#V`!<>j=1a^wEdS_i~Gb11gfZC|H$qwj8h&f^6Uw%1Y ztFppHw_>3bdd-@yZ1E;HE=RrC;e?s)< zkl&=bSd7g)wB?fMJt;^joOZYQ)g0+n$9aZiRnP1C?(A*qk5+)8o<=$$7f}RR{5TSo|ov z?pP(EDcWm3>I?t!?iKRE=GxJT3c2&`-p_&aQ?b7fjcpDqaS^e59*6q=nlOy1hd+bu z1O$4@6ek$Y6!WD_X}1Oge8nW293DJ&8!Cc~^@+QxhJRBL^Gq~JJGM3HL)&HeYNc>4 zfb&nc7MiFDj#QH3cI1H>K$CPeBQ+arJutq4xNp52cl|Uk5H#4wi zrrOyrZ7DJC#fFing6idUA6cBF_w|}6$>`!UV}^c3XElat=*-fqf}$0V{3JUyz$GIj z)NJ$d4zoeo=vD8c{>5nqU4t~*>Qa(=)px6!*ILfWqp@(RynZ_hL#e0)WLl*NBGfyu zD9P@F3CU~u*syt5oYtU#}NxkE-Fe1MqmF?ZOmY_ZVi>tYNy$et(qVAJTNH6%Ot zwYiJqI;~r=Gp-4Qa=>OC_q5SS{tKjDst9-ndk&mB!op-Z-7wlma7rv{?P4M&3`GTk zLd`<+DY)$0nO0jZ#ALKtFLClVh{5p>fs4P9VuupTr%{p`@9)k~29k=GIxY3~K*IT` z8b~~9y6G(@ zPL+QS{ltvDRJgx9Z?Q1?N!Nan!}^ynoc&!ELl_)$%O&<(mQRpaJIrKHzn{Nd!Bv9u zEZuq6F>I?TEVW;6YeH&Ou+8mg!e&)W;DJu>_KxwZ@({fFyIOop!R`X3HrQd@Wqv!8 z0usFfUr%t6gCCkkCxKwB4d(R|>cxv74@>gnw%K_dJU%75Gvm!eZE&$kve(lq-&PL~-(1C04} z&RbzUrGK;)o<1bz+*tT3yuWIzTkje*Sz4^L#FCWo2C#W0oHXQ5V~ZK9bP~0v+cn5G zigBtprrMvg0nC$jKSK?Xry8MBO%PA&fxhKGwSW`A#wXwn$1v+_vvSl+z4i#EsmA0E+<D`Cnt_rkE@nvJ~xN zu}?C&*|z*(cO%KD2N6*->@Aevg_wMFZ#aj>yFP5uU= ziVO9-@;5hsA;w27jgKbrJsI}9toPUQQEV?WP!y=h@|a_rtVkC~0@Fz0b=kjX=V;=M zg#SC*;=c!d|A(3S|2~Ot5P8bKypu3w12ddcb8@2{pCM~92<+z9O3uLHi{2lmhyKg0 ztE;PfyKLx|WY{hbm=%(epkg)-mqq1ETpz z)$;N(Q0YH0kARI?avA)Zj{h;xBM6L&juL`#pFzDmZI=?1?5J2+#*>pCA0NLjx^lDs zlj7%s!eZD7hp5Z~g7<(^Z9fih;sAbN?#l1}b{XWk05Dd)4_JUWX8USJrxEV|Q zC1CRhI20=qPyidw`?srFm*UA(!B|;C&Jsw{1*64VSN}WgE0}0G{ksFq^(NCl5Is2Q z)c4n-S3>8G*bX}q5;_{X1hN)hpPinr?fXfPnW-+Xh^K8{krDjqU%|aX!Ka(M z@KcK9zv@KESxj_vB{2Jask6g|F;(3xDwun~&i;bP|5~5zU!V}PFOJ*ECELJ9dA9BP zXl^_F5u?w*$E@UFso*7GP_S1~li}g1wR+tF4~P*kJ?7>TJ7SSg!Rb-{03uC?(?ueb z!H>X>sk2_nR|WtwqFVmiJ20zbkn)-|@BjBuFd%mPAS9G&2D2GRXbbv2{sq+0Qn3*z zT-Yqg-Ntr-`o=OCP-{^I)iUdGUOzn9rKA^>lF17jkf@@=u z;b=|p0Q+4g29185U1qw>dwnm89K{bg!RQ+yp*}ngJ7*Q4s%R)z;hL3~Aja^i9v=g_ zq~b)k`nPZ(bZv8}zS?s1jdAOgymbc3X+ zhR}8GDOtn)c1_N-7ZpH@=3w;pqnTv2!U)3+I7q&uO<9`F1NP4@%}#UH{QsR-G?z`5M!`$X<@>zCRBcOdq93kfmYc|%G0Wnmdutz*=f zX4tCQ1oYf309mvAUNuC`lr(vhg>F0yDK{F+FO5Lu!)6)PxRD-Mu!(Nw#i(7Iiv-5A zcTXm^kALs9YpsL~389J`31k#R_ zL0sf}-wc*Vgw9#bRsVWinG^2R<|@^$ve0CX4N_Mgjt)K8wMF@8wNkcG)1Q~RHTf~L zXrf%bPCks^kWm;`ML`stfpg!c57>T6z;m_Tlk(P}U|4Ff`q)nQpt?Tsrh{jBmZ=)t z9Xnc!3KVoCr|4THuY${Gw&qIbogpHQ^g5imJ~QoEQR5)mtNrzsI+NQ&kbZr-5H#G}TyQ z5ox`jr-JNW_BiqNRO>ox8e6Q9rFROaa+d0G48_#^{3PLTNv#lbamYiR1;!&FT(_PJ!@#TyBeY?* zM@3_J?GPGVRo?!3Z#|!7weWr$&rUx~pD=@h7MtKWmV|u1-eNO9j~?AZFu$s@NRYZE z&azz~%SU5oyDWOb*W4#NYy4O7K(xMGI_tsjh3Lu@hq@$e967&m5$~Kt`AmSgo;H=3 zRE)gGBKA@=N7wo*d4`AaQk zhaU#B^`Ua1P#t0Yo$i)F^;3`^>*&T=uCy58P1-RJzT$|puX6EgH~a6y6aJ)hv^?!6{v z-7qSAp-bpwG#BUR9ghHe#48s;NXGVF+-iiMI&aH>aiSQ@zLCNY+z5W@d5Ag?qTUmTP9!AVvNPKornWSin16Q7XK%Uzm` zh@gd>vh(`IY;-hFuVb$lF3etF&v6G7t~3xVN-DvOk(QU={cIRQ3onlmm8nM+zPYz*Ru^5{@Pkb70V%!d zNH|6M{Y;#Pi{-YSK*lbP#tat+bY-FRY-*E}S>x9j{D^T!{@ujW{8K(~oszmi8u-r2 zsd=_OH}X$5{oO^@i#$F8oXq%wZIjp_jLn@L;_cYMkH|8i0tB%dGebgx>9TB8kL#8fyNEc}07Un3qybDUQpT zjIPphQjI%F$I)c_s^Y;Iqhc?VX>*l-aYUHXPA~Vu;>6i|<&@c5P>tIMe}YTg-AKlw z@e8X+W{Ny13IKMrIdS^NZvhXI+aRo)Isk=OM7+v>f_D3J>4m#nlHG!5*4n^%5m`sk zfaZl_u0{Pq1L=(dc^_$$frG3Vf5t}<%D}I^6{+uiQ}1~>cpx*#j0OxyAmQK|Ewsfr z5FK#BpYQuHws}il#r4N)QGso%v!kpsd*jOAX!8j1?O8hc(8JB7gPg^2enS;k_l}k1 zQ1BA}CkLnasCy3oBUfTFye6Y-<#*lMR{$pG-uK<{gjM84e&m)+2QPHBG?_2d#+z!B z^N+fn-48)$XoIBw3l)Aq=%+!jJa)rYwA005XfNN>7DxBkB)#P}erAHIL>FNu*vVM&5d`dSQ>7kCbYp&J*`~Dl)DBIRE_2HGZ4N4JcwfXf|E@+^*(}5aEbrX z|BoDIUno@V1PJvLomR8{K1_q7%Tp#9oJ+DKPu#x=&{^t|;kLzMd$eZxW#3lB2)6oh z__uIh$b}1}rWx*x_kUMx;0^y$Gp|dWz?dZ9`{}1`R0XL}r;Ge0(o4=Jl$Y@AM+*hs zJq%+XW`zqBh8xSC)W|{Bp+iVe^oovf+w$Aq=Hdvf2>T2@3k!W_0IcOU8p7!alR_V<@b5gFn*Ty70~ zB$1E)#t70nniHE7Q4Cv8naIWeM>e_845b9k7@pQdY>)u-I`O+mvy;_npECh?!v{aW zjjj7k;&+$3aNGD2MU~X7{J0S`FUjWm9v>a25f>7KO89-T3Vpz+EoV{V2uRs8$DipD zWTK^5&`C~4shAmUY{*(wO|;NP>tEUF&>(WXb|Hv)Rv+r%f|$!-{Gj(^E2ep0+GJaA zuR$AFB3QHL!%AEhU!ZvVON0wv;2s~@P6#bKmKsOVdvP-eY{9s`h0SO3M=WutVVM02 z%}`i(f)2nJnPz`>Uk0lKJ193mxeBalG}WR=fJYY$MFml@JpjQsn=K_giQgd=r%k>3 zY`YCMlzMN4a}f+A{iI=AhHe6TAIHxr@(9Wz3#5nnUx~I5DxSwuwU40@7^r9^L{(gz zEb}+V`DOUkpJA}4kp5E(fNpS-z~`GV7B2nzWfRvOmqLKkFqlC_vDG<>dnD}=Ou#)n z)YnIKw_Yq(scuIU6ab$dp62~`ZIu*b*g3Lz1tIX>&3ph7tr-#U9L^0dJP4J^%8e|V z`&C>tFmbf|^gScGy~1JkozZ#@2hNt1%M})}Uv$3W(Uf}6((vA@v$j9geS}Te5EUnc zhr@EZI$0rA^Jg*?&-}JVPNcK>dNf?gg%S6sMZ7IH?q-KZvgFA;bAEVnj)=8x7yBg?E7l0T@eXU>4}-PZ)XdK90@ld4?yk%QJ9#>q%zz zwCp!D5*D0(SYd| z{=q-y&B+;U?IRZkxd!xDY$P77+@IsyAeBj2JHxEKK4V%>grVEqF!u3l^qy{)`fMcB zTiK~;D!I=uQotP?MM0%^T^Hb9pqw8Isds+V2J%pafEB>Y`{Q+*81?ZiTm*+-K}$r_x8RV!teiX$4X>CJe)2ksvEr ze-<~;HsO5}AUc-W!gD&B;$h5G=n^59l|fb+A+q%*q7rS&$1JEG##sWf7v~yLF7(x} z144zmQ++2Gt)H#1CSUEgcw+@v=AzzuAN21SnEdo97R5J2VSu%*wQFK>qbo$@w^T)n z4+J?Pr9|h%7r!OY+`b9JICpl5c>U=8q2p>J@G3DV(rWFn9+CafQ$NT6kAa_G8G|YP zWVvdr4u?Qs&^W}`736=Miyo5)^>v|Gax&N|Y?|)oSf1zA|bwa)Y zB9+x{Fit+dFNT;)Tus*4!**)c@fHZj=H}|a39IG9YB61iPRgqR_wPM?hqrI*zW!&K z8V#F(;1&#(pnbiHIg^a^3zQTVJ=@Y>ZzqAJeorQU`j$V}gS@lE5N(~0d&$QVJTkKK z6(``ZTK|5yDHp3H{=Vzerz+G>=zdL7Xa7gyY7rkb9O$VDG)hK*b82A>mzp|92*AU- z6W_(a!S9ct+u&e&vRDHonv^nuBc~t!VCTF1Fj#MXv_g7^=SV;t#cvP=M4gG`FwL_c zpBT=7PmF_uGn1-CTM@7kc^BdlvyqgP1TLH!Pp{{VjHOt+YSb$9! zvPk7!>khp$
@D9XmCqzs18MRBX%0*6X&7&K481|zS|ugD;b#tR}FBi4-0R;O2= z9Ji!xZO?$b6$1%n{D2G2H?S~INL*YTczkh$mMhrR$Jd9soef_-{O>@PBdhji8^J!o z0|VbxWhVD3A){T+7Eo4k!SZ;ot4`KbS3fv&t+%lQ9w@k*+E&5eKFY5YCrW^tH46<* zKcJ2TTF3#n1dQNP<^4QT6PjRr>haE|R-w6~5Q_Ls48?c2KWFbx$oJ<#Q2jiVj1; zXUYl#qgW141o`_%!2Xlvsk2>s1li;7u;5#{tu6XBcmEwoDffy#Gtgk+Uyeiejh|Wf zbN8US2V&&+U`;TzG)n#P#|S>e7Vfy8L*pLNm)&TJqm~>3dO&M z3<+HHQw?V9bOSA81oV~x?R6S8Ck{HxU<6Fu=no!lU`g^~cKiXn^B=Hz!W*o30c+m3 z=PBQTyreiObS&dp3sWYUR%BZm1rM=EK@>)}dW(kp{13yzF>vQB^aJz`?Oc)cEQx+h zX^RSKjl@MtEPj^4=kW*hXvM=6cZ~SA;($)c`r5t`N~Rt~XG20Yk_0iXXHIcn(k%Xh z(4~0U{sLpZ2?dp3C*Wna87Obp^#5}u{@8#&O@=*OD8gsbzOL0z{m~Gs11d6OB{T#1 zhvma)62yNvjFc~dV&m!Y>}lMTZYLe1$eOT&P}mfNi68 z{t=4>4n!Ovmn^skZ>~8j*o;~}k+$GBbhk>%$cO}jAb+?r-+UFi90f6)MXgIi?z^e1 zhQ>wQ*fz<}Y=l*-hGQCf-LLp0PxhX}b{7?y{aL~(qU{cU!9rQd1*02|RAL#2&%EP2 z17RM-+)?N=!qicM6NU7TG1k&TAEU^xYCT7qhlr{$Jp|(;e?dYh_BiWm*o|x}-iL3{A!K)IEz)sca#R2qV52ck z{%*Xi?s9r~3E8mMfoV?c_IL%p)Yu}%UPi)j{lQF=M#Sv^JlIMhJLD ziWgu)zq-gnX^{M>kz+oc)@Y&rn1f2*0dGEgvYsyt$0S46NOLNXlpSHC_6@o3MR{9P zVn$%?;!^V{Y^cBycROA$Yo~nnn1QJA>f%yW1ff7e{$Wc>x-OFvrU!rxr1w+{aa%!A ziFFnNCEK9BK?3kUCDl8)dxlNQ4VGC_DWk}}#{}-#($%cPiX?ulYGCuB(;8y3+Q{U$ z#iU*+zcV4Wo{aro`!TRXOSWUTHlY{k`ue_VzCH#u7N-WI0HTim!wgx=#nV}tJ;l#~ z$PVW@Kr+H#XuKCAbrEUiky5!ji9p9<+(bG?FqI0W ze4SfSg|kRaV#?yJ6zRIUlHb=tLjRFvA~tjW(8czZ?JNjV9rYc}GTx|;XX>0Lbbrlr zc0$08$RHz&PeZSmBj+{eO=%7XoA0NTf$7wP;t^e@168LNI+(e=s;_7(lOZ1I6YRBh zT^Z=tSmo{xp&TZt1$^i6i(jYSUb~c;M74K!>B~NT49+0G5YH&0X8-bm+HNpK4a=(a zc;vr+$xfKA41ynZLD>mC)zgo6zC;CA?kV_P%3`nahXg><@eULh{?$0YJgHJuGnGHm z)P8VJka>bq8(ezUmuvGiV0Ou>kcVoC(>UC}_w{nZ_Kpg5M4fMSgL}F&`|}So3;B5g z!RY5yg$1nZ>ryHr-%4drUmsEDbam~f2QNju(PZwv$D=4pHKkgWdA6RWBCPg;%_*a4l_eVZzg zInmZS?2QkFB5KYJl?`QiSnqD`yH@tRj{x3(Buqx3a7QCYrCS=unn900)$TwWX;Orxga-wO_$p8~p)e7C|uXg7Fryznj+j{LJwgy$r9o0YHBC6ODp;CTRMZWRW#$Q1OPm4>HQ38AitcG(ubg1nveXHpvPeAOsrN^28U=RKH4vXKtO^21)b zNg^qQaQ7!cErSF?FTR_G(H#2mp!D-Q@4qgIa4nmDTs_AYiA?IRoVfcesO44?t|*?+ zd`Ze|ZDUyk+UmY^nlY33@?}b^cE-AzTlLdnKUGu2Ue0RcFD_3`y#+r#iU@tH65HV7 zWO5{!&{cQM z(q7_E&>EgDqY@(_Or7*4iF(`44Ckb8+%QpAUa(2#+)|FdJXQ)`3?Ozk+?HlMYoBV` zBZX;0Y%(VGO#7kY>SVM@_1sQ<4o6H7rbf?&pG3f|j)fs6H`LTE-P%-}d*}MCHYWwnNEZ4W~%3R1SJF_J7 zJSLGLDP$&+IZ?)nkPu~-lnf=Q%(IG;NHWi3hRU2FGDaxh@$CKn-fz9@TkHG1?^@rt z|7h>Evpn~6-}iN0=Xo5*c^vy2Po#(;XBJ$N8F6opiSC@b5hk8cTsT*=Mc$4-t_V&h z$*hB$n|tMm=khDjX;|`b9kCD}jHM{ zx)_da1nL-C0Z08y)+I6loR=rTEGI(>E)`r{Pasn?WkU9DNhqvLCt%`Yqp}A22nQqV zWI;XFEFve$XJrZ#H$Bl6pZZJ>AwcODra>BrG~!^Z6ih)6YuZhK)K-*NLEyp62Sz~V zWo}#<_e9U7RDs&#+6jlwF!7_9y|9mWOGE z&LgBry}2^0p9Xe_fa3OENPBCj3C{HN8+@>Q89%j%nxB?7)#(`|QBO@Y!WQJmgX+;q zkNc2r(jSGFzmOi0z%r!qsR`W;xDlCyJBdi89NPo*O|tY!B+cwkg?YpLD1w3im{i33 z#%E6d!U8lxLfG*S%yl-AEf#oFQLa@!i#F;nLUhsE?~KR(#fL7Uamb>YG?h{xurxGe zczJxo;z2*yQc&;%E>A9JFJL-UXl)jrt6xi9A7?vtJ}ZjVJrg1z zlsNsVi09YQ8-ElV^ewf^v>UuQWF5%oJR0xuW4zI%H5~j``k<83ft&GKF~xEr^Bp-R zq7ES|va|JYS9*3d zy>RfM?vwFYZ->2GPM(TzqhHu-P~T^HR* zAQ^jmbGXAJp$=$&p6PHM1Bn|MhOs}|QlbjBxl~E>K6V49%Yo#8YIy&uDXKX0e7}Kf zl3DiDm(T%R4jc{J34v2~EVmDJJe2pW-^(~PoGw>JV@qVOHlT!}qp?2V+o`aNUqsm= zlAEUV;odXji8l_+xJh&nC}+t#%^1?h`&h&3;O%h0;Tar*#JtSxDHruAxF=o^M`(oX zQbKZ^g$>N=C|!SVu6f-dtCQz5As6R@H*c+kvQgBDC)rYAkZgD9WG(aMFJ^F+8- zzMixQ@M6CNj-85Mn=y5M-ofq$-TLrCo>a!*DqX6si3l{yQ4&VOza zuMW)R6pLN(Y2Y7eA1QiKV}t!`Jih^HA6Ldc z&trUbcV7Ff3Yb_RE{+g6SzT0)EQHPOZo|$e%P<@?BeRO=VAOpmr;>kf$~0iUOZ^{P zlcJ^XJ=wHsJ0UTEi=!TdBnjbTNpOvR3wkCA3JdD<6T+96Bq1X@fKgJyc{XZ zEK3qEo!wGaj`*+1olcP|1++rDY;A2ZL>Woj!rv`#0*<)SfullC+$EOtK0#D1`ffeQ zuEQev+VCg$R`ED-?*_`CXhzo&wdw;I>LZF=(mLPXiG9D|P{$@5?8CD^WDj$Cpt$~0 zEc7hDX3+EW8fnK7AqZ0#vx z^3tB>b)#1C8Mn&%W=1hMePuKw=)o@)G!{l=F2 z5w&TFZ+FjI>^4nh(57l=wYq3nc6cE%S(k%LNsGL85XJ8N^FodST?3+Rk%9c= zGtKSQuRqZcOMDrV*Q1pSadjV<5{}oX|1>NoIj&-#P*0ijLV5B=cbMfN5tZU3x8%D& zsxPgu3pncU^NQX~_BVbNoA^!QcMXk(S_1VLZz^AV(sZYk3%6LF#`Va4&RuLqY=SM% z_i~o^ni=Jasmi8$N(dXZ#hDJO$;5r!{XtGYP-{R)M@6N(h`ohegQ@FUORh1wVE)b0 zFFq$rjB+$CZ|XG=cacPp3s~4wsC0bq!*}n`C9dNwes?a3t(_2%4si7vL2O~zv9P9E*?h|VX&{3pyqTqN?Fw%nV;Re zS{o%39U+s`8rtF#vO-XXCb^L$ZU8fh&VP}2kFD^Dp%V#u+RTRo(B^mZIaq7FpL+<$<5-p^i ztfVAO@L;tqGt06Y6;-Jf)IM%v~^w5BHu*~g@pIRmvX ziIVIN5#7^t)_xWAw8NJyice`hS!P9BsZ-C3_2H7)LK=|(04gSNG(QLwN$`DPkix7`I zNvz3U`$+%VXZ`}!pLa||!r$s&0G-hNzwgygWvWF<&S-Kb_I(r2Mt>4?7M)!8Op6f|NaTxN=m&mgE zGb2y;@VnAzRRcTgcxMc>w``c-x_aslVfOrI zLu7bkADdbA-0_`H@3luSHbW&iu~O+Iebm+3Mzhf=C1tbz-maGtw^Fr;*$KGu)tb!r z6*(4UAuV#h424*#+|pgA@-O**I>p38yQ#A#WUjnwDQzpNEt1Es;z@HH2Z>UsXoO)T zxA&DfDoM&?7R=J(q+i;#-IcL_zB@;qx^7s$sALnc|55dBO1Fo7K4E3VjnB*P<~<3y zqZ^@C{4rq}px)`h4cDwPq);g}QMQdT)Fe6E&#IcJTP3)+*LJIEo%61jxm}${Dez>a zcirS~2zgs_glUO_cSv3)k>s0-hTaU$*$}QorJ%lv@BJnE%RzBSQr!;VpP8IY_wV8w zmyL`C_*8SaMvCNcpA9JwIrV?k)dXmFP~hLx+hggw*N|1v{Y7viaJjt5^r?Sj{shU! z7nlkpyUvJ`w3zr^zux0o_K2&^%lox3i?ov=VGvcN>@#h|;Rp<2f89FH{tqBKZ#Rzl z`o3(Vlk~(Y?NVO9dlYvk$IvJ&``2Sw3Y8^4FR%T=@O#|Zcd$W$)ur#slpX+<@o~G= z0Rk5MSn=8tj2Jgm;9L*41;B3mDS3|`t<20kbpH&*e1J_q!z7}rstUD24qqb}^gdW- zp=L}u>?Oj_p9K+oNOo zefB6}S|e>^@1tK@1t&;4%6w4%^pu}BQpzfV)Cs=Y9G)r4t0Dr?S+d!o3i93ysjI%< z%TB{b^YzUdlcUQ|bbwa3s-rT~x{}2lu8{v+%b~iu8aD#yI+sUlDG*c_7nf{?Za@5t zror5wr!#R*Cvk9j|zFe?!XQlLG(2YY(5xgg#N%JJqr! zsp)hx9f+`*K93{=f=X|7U7!?*cJR+(m@}*RtwG~K6mIvMl@N0_K_-Vh-|ZtyM64<_ z!H3EJhYjApcV_u7zi^@5A|5%w=occY-~bEFmlHm{R1_ZF5R*NQjfGJNyRfJ?R0Bl2 zc3t!jaU(daByo~gUutZjpU19jS?Pa7H@F-!&&;22Xn{1&aq)g-1a~U%jBy?Jdr|`KG-mo1*t@|?CQ}qBZ?_ytDnxQLIP*42upUKL&=pSJuve$i2kXy1|DgvT6 zZsWP;oQw0c+VY*MyoAKes=?+o z#P2`;dwAi0`1bw#U+7}h1~X_mZ5m>gdNv3)&&-$Y9BKXi5eYTHLp=Y*IQifIvj6VY zjgi6|3D4#B@Wg}>TyAXZ(Q(kx(Lt{=GC$9b)Ll)O;z~+LAa*13^W`PeGJbtGw*|aM z2KxFh4ktrty#DLgBgJc-zYH=fV2#Pk$M^V%uQ7e_;l0Tf=~ybEw)*;a#c4W(Oba>n zZ6(<-V%e$ykObTB3szbtre4gm+LBi+#pxEO`ceD^g+PW2o-nFbU_(sFqm(9N@SX z@aY%bjjFDyXDmn!gbRcdM~Izj7k ztP>;kd5E|$DU879d>hMme*FmyKGNu`JJF}j;MlrfsPj zpr~fM*<#s+w*U@BXks@&&W;bl9GAv4?~L^LF%p--S5*B)n&J5`aML@lVZaFfI|)tm z7k5fTnR1B5?eA&jy*4SJvg8(XNHxLw63*gA)$T%T)yqt`X^DoxQSI9gK&SzG7Xr0E zefU5mxCzr;0Cd)O)aLoLlWGEbkyJTv{A+3A0b&v+HbL;Q%X^H2o|_EV4E!1USL_2J zv$XFvzEZAV9{ScAxv88=mWdL0Rknid09$w2qFi>UF1f0vx3}CPrk{Eiz5u`=RKt|5 zNz$_@5|ZfEjvqHTbOjD(Y4cEYF}A*}Zvz9#K}Toft_5b7U+$L7@?i_!M)tZ<y7BkVkX8W0Ih0DR0>SKb~cHPYy;q`e);g& zK^Ru${mvLqbbI<2P`Hh{eUb@9p%O&478VxeSLbd~vu(g_bommDO}~1NQE_l^FwDRS z>o>6VgzImi8S@KKfFkxf4vd5ah;BLs3*J^2YDke1b^8^t(CNjp1>_vz<{o|7XZbYV zJx|P7lpt{IB$pkbBqiim6Y0X)TJv>iB3zuEC#O#!`105Ba=lt~yB3~7AY-TMknW4f zmly?h07_8WWYNzWv^)MKV)Xty#myjtLoYpy#I>FbKr;FCNY5=rlS?Y~o??l5M!waT zO8TshPXC#QgGT0OdI~jeL(Yoi_dCvo&-3t7KhjLJNxGI{VefuURucH+MyzD^S=4x7 zQdv|rdk0iE&&587h)XD9;-b7Rm(eZq!Eq4?Z$|ZEz%p}J=O{z1YHkPMMBB^GlZT_4 zLiih?Jy~>m;+)iV`bT6bVq_6L8YN{apK zVd9GTxZ4kWp@dBN`PjWm>jC!8->;K0lG4pYjn%RHMv~(ZbP|tHSABAx3b;(=ljAU7 z;`0#4&2*hyv9OOwMEu4g1`_Ut#xcw@+l_o=KG$vWSdrd^$!#%wii2e$^ZJTTfm*h% z_O%53|3oI^Xb# zTY~CXp2H_|@j|jNNiFN+B_7APrId30FOv0Iu|)0DbXz3^$ZgzIi!@@O=`ofcf+Ly+ zan7f$kJG`G<&bHe+VlPFJXST`Q}eQqdiiu@v_d{qTylJiWux*P&65v&2EvucY9~w$ zH8>7dP?o1WGu)l+H`K#~1#OghWH3YR9_cc|x z50Q)M!30c=TZ-AilCneQ+wt|Ui}w5H%x*b~WK8T@l5uF>H|evzc4IpOkzDkb^w_$5 z3g5Z+xO3Tf2-_tc4C=Zy8G2uv(|NWmfkhypcck?xbx(Lyh4dnogOrM!S*~xCLrS{W zO!o;2FYLsNP96&cy!v9%lzLz7?S@?mKH0>#M{hU_l|Mz*|L9~2~z=-aPQ#XDch@g z|10ZS)s0oF6P8MKkM?I$OH(SC?a4i2^YLlG8Ij>y&x{L9N&QWcwro4?8SEp)^TSb7 zWON`SEP`X$>XUV{#M#yyj^Xi1`FV5ovTZ@k_s+xzq zmPS#sOk{b1?+5qL>mc>L-<>B7m@2avQ4<{{^rUyQa`_aLQH{FMj=#)DT`2PJ2f+TX zsS=NV?DLvk*UfiX%t!ra!A3j3^&E>CMMKa>jid6Z=n8qY?zOu-1a6MnS8&h~?H70Y zB(Z#J7$^BP^^^*`8Sr?*#<_$6tO|#?4a_*yGNWRaFdn5;1!WQt3 z6QZ)dp&DVUx%jDY1eWnos#wn!Xu)3X^3>@U#TX^%p24W7goMOW;a@nbB)u1gS5{V< zo13vO{Q0{5`*Dg;`bJK{yEo9GpadDP)ImGoqJW7pC+B?h4yeV@T-;Bx@_#Pc(}}Sw z6!rZPH_N_ywjIH~^y>Wm7*tIX5*{c8)VxQ-_)s~$_50-^`~&^#EYbpC7Lb_T1d7RCaCI;kxR#Ey7pUxf@e(Wp!oc**DwtU+e2Iv$+ZjstuFuZ`-Jv$W=fl zVfH6Xp{%?d=Ll8#58Metz%eQ>wPtzGNmhA}U~-(Ee8*sgfJ6ED5B19to|vP!;s#ep zU-zJ(AY^$Jc@mtLl4%J6$}jXKU8!$BI%z+1jwMI0iNE&9!%WN1p^)AiojP?2-kMfc zRtVtz0FMeB|Q>g&Axws#1JtV8FCL&Kc4ej{0Qbn zE<_IIQ4d7U`hX?IzXqVWI)+BLR{R7l{g`2SlyVo&;<>7Cse_gEmvO^-TDzEfGAE)T zK7tJm!CcZ}6m>&ivu6k*o&KzJ>Gn^m(F7;!D(#ll$~!phU4gPw*QBpmhH#F_8T*QP z26(-MxefX8{$hK=PCt5as7z1N)&2BaZ+B|3A`GwmuIGs zYrnQ+aySa!I=VW~GjN<3mpgEP_`P7L^+^Y)ReBF3NEU3#a|bsjlM@{f-} zhkDM&hMS3_)n!g**9jDSISwhQ$nOZe2{$0fwA^b#X>p%q{I@ewe0Hm@yGZ&)bcO9a zRg$fd95%LtMb3?r`VMr*9S+3${z&nf2g_nv;WKi7lwF+NDqwcM$ylY$9VL|3klP*DkPjJbS`|+;UG%`#WZum4OFMYixRH2Dz zT@gW;rL0ISEEG#-=B>tNs)P**lGHpv5U^{hb=|`xgg}wK??AHEub>hpG>VUU0G8aZ zmy9UKE5XmtAHgg-xsI+4szZK*bjrH=x+7~tad+-052HMVg3%I5HyHaJF+8EI{Ts+B zYQV7Ge>xWI8rQ*7e)2grUZff;poYA6xb@8USlq#~CXB{?%FBEvkWK=u2yp5eYI6K- z9+^!FPp(t>cxGm1`TU!clCCQ9P}E;^i@t$vj*Q*g3N5{i=mtvDVS$e3@}&OA)A0Yo z73R#16qUC z0)w!KhzOot0=L}u?w9$Fe(ejUl#mopn~R}Px(li`MZ6vJ*v}9R^KIYt8aN2@OnyPc z^9poKshdeTfx5O}*rz1OWOy=#TL=lqltV?fxBVj{=le^JOa7Sg#dt1bXg4V_vExq_ zw@WT*Pm~uihB^YzV$ zslF#@=-(voA}boOdvxJ;vF9V=4=jP0D1POT&mHdv38B344YqR(6^wBkJ9dzFo={UU z#8RX#TL~YOVf<%_mC5yJ{o% z^Atf@BA2B%2kFd{0diuQR3B4eZf={ZfStW3p7cQlR3o3C*mB82FgM{szAAw3eYH4g zuKZfES5)8pL%NsfoV@48`r?>)&i0S(Ke~MeZ#6b-MB`U+@_Jm=BUR7!7&pB>ZfOCz zYz_^i9STXmlq5#8SM}2%r-==tJs(T$!qF>M=A3`!F!9Jwo;D#D$`5#9v32dJ!qJ1{m5XjGsBnm+7eni%Lk) zog*d{a^YZ%PO&U=d%v#)ufJbY!0kQ00B3>;ZMFA-)6F!J!9Yc=y=*0H-BF=*snyOS zMEFvxNMmX}T{U(i7A@>=Em!Wx?C)`)VUu*AoPBH&{ZY5&Vv25}gnHtZ(@#|gs7oB? z&Jqe1{ebAa8|_}VzE!Q4+BMuwa^n&6G27oqK82m(rQg`m*O{E;@JTY z!-3@v-+4RaNk>qR06tP&tf6;0pG!f15R#_n>FGY+-Vfn&1{=e7cuOK#BoP~sW!YTd z=H3#TIzv$dRo0 ze=xO=b#90O>V{@@!cVWUSHoYi&uFOX}4 zaI9hUD#PV$*Po0i$1c!UaE@TjM(bklFoTHFA49L{e+0JBCrdm3gdiLiv$10ko!Qzl z@$2JVBN0};cOCBFDlel>;&?8yla!Riep575G`}cJL&jVK#pnz3oA^`z3nmaGUfDI! zF@_G>4ZOGz?72m_9F%PvCdyH42)Kf1MbfoA^7C~Fex7XN)c6A{R2-!F6nLw&EqBY_ zedD|4a*x@lI#_BT4B_ywGW%L+eY1sr(ItmUfDyZ-6=}{NH=*u7{D8y4?u{J zbOj}ldYSl~pkd|$s(tQgGy$)l50NuS9ynkJ;ts^$(%PDdxspff=8Xk%aXA)Ue$Z_e z77za{qUn$`qH%evK_E#g8%~-~=*)nz9r+AOz&g5M7d*CNGRjejgWB7ecyR9fBj>sO z)=xZew6G3af2zE3R4Xr$k*cmqb?=e!$;n$nPNfGv4amWdVDb168-lY;%1b24k^h%N zeu_D_&Bm`YroiI0jRg^)b}>vM$okVYYsB|SEqBpQU4;LE!%z3~&eSC?VZMQtGd!f5 z=+|OB&NeNGC7e1)y>MSr(JBh&5iIuSAosdDOVFJ(1}XgLFS(sq1K64nkG=L3eIsE! zr2pM3Q|*uY&TFLISXo{k#A$|=V-~V#aB*3q;vg=zkjKysgkB>}2dlyG=(#m7Z2$goBUGC757On;rE<@7 zE6T}vqd*$S+u8JN{pDb(>yL?v5X&5OO{N1yWq^(^q|<)-EL2Jt>I8({3Jxd?@YiTK zB`vkAEN$P&u(eL9>8DQ4H|jpq@sup(kj8NwH;0pV)u;VY`O1<)H1^ee?%Lr!G}pI= zK@AP$5gX9VXbZpC9mHu$!@*JTpQQKlI+@%yMeR3n7q;%kY)MBb)Mz6D1kVm zc+JrB{l-$XxF{jJ@))}Z>Q2_p6H-^CFF^pNpCEnPcfCIPB}Sc zI}$!3TICq6{_{+MV4|lp3W?EkA5YkxskO~-JoY>$CMG#~Yg`}9m04jic892l5GIM7 z&*ZYHl>!$;{17Aca2AUzXqcG%U~!h=VcETLQ*u76r>V$$9TYXzu+Ty0D7KXSjv|nP z33JZsZ&;+d%EX_!lXN(G9d6qu+OcDMyTl;s_KqDpND0*q(T;C!&&twg^PyW Lqn3ZnD(HU!v2AeY literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png b/webview-ui/src/components/chat/__tests__/__screenshots__/task-header-markdown-high-contrast-light.png new file mode 100644 index 0000000000000000000000000000000000000000..124f5d47e4347197b3de41155ba5bd732162af7b GIT binary patch literal 45894 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 _Rm@B`d(KJol~hlBTJcgUt6W6J0nilT*7H z8MgN=#HxdusEc+{QG#en9VWM5Z5^~l5I)WqOVR)I*UKlZnY~`~1pi^iWUr*vp5oSb zeZ0DrbULM@L7b*wr(tEcuLmn)I#V|Db(Lk;#m3%wSf$v9bllz<_hXLVHgyU%=iXC@ z&&r|_Oq(X2wn^#Nbl@r>rvR$Co;7dl9)Hm>Clw)v>o0!*8*D2YjfkC1BD67mcU z4=na!UF_GeepQZ=kv)9g(^PJ5(Y^lZ^Tdz=^YoOvNu3_kYvI-mw`oDldV5e0;S@%& z8=I*?sBl+OXz-%)`h* z`*yn?!o1&tuV?0)UY>+{Unm$vs#&*cA9J%31#qTj!(F^~}Y=H%C1 zK4Z(+)Q3$YO&%B1Nw|@zBNO@cuYNJ(hwBLcGxg`%){xW~tUSJNl-%=-@}e(9Z10xo zxGj8gpXc_LjwF8BPW$LIygOb(0q0p_>Y87JXm*dCM1B!NmAT)&7LjBnMs?n{_-xxS<`z{ zC&3Qi;k84~v!sy5PWyO$ps!+9eex4i`iHGM8 z3EfD>qtqxOUQTw}WPX>TlS+56ll*7MQQKc1j}7BKId*h&n2a2Jt(!~6tvxxPukG?dI){2w zfo1Iz`+zc3sfY10HF_Z|-AqjenM&O@>JwQToJ=z5V(H>Y!PR;=IIgsFC0>~o8P|gh zD|702Bl%I8`ucyVKh2qAzJ6(vn6E=ODZ6VMr}GAZ9(v^L=CXfOy3kTn*InIipCeFV zi?}2Thk6NkUjS78^qA#o7y-vuHmbc>m34t7Jxu3~vFTnI_l>FdF^I*BdkLW@qWD9# z8mdTAlarGrUzKIbLT(jvF9&iG?glp1_SNIVPt|`O)Z&zg%`)7%>@eFt|9we!a{0nz zP1D?vtVvMg7@ZHr$a6~J0o=(hf^SY3jq_`X$s@l6#sqKn*K&Tm{)VU4y<{_%W zRv)M6+S#>lmdWRI_a|3fbjf!=cEjzlRklxBLBEy}VO1owVi*KNt`W%A+lCz0eSJ%4 z-i@mSp!GEe6Y1Za^%9GYj2b_+wq?%{8DQK}aOWN^IiyYtDs1I5MOW`kTAyZ{ z{oebTz;-U4`@b{EOlc8&PCBm?^$FM3Hr964ij>m7^66i#w<#el zgtqEQ??fCqhlTGIb9=3bv~{>|eYxc?^5T-2%JuQGt4q|M*I1oq!2Ukfgq5kMJ(2B% z;(-^)Sxsa@o(We`VSea+BcptGmYD*ho{OFHdELkMt3^^hy?G*cWA7p;$v(R_#`f>llFD|yE^!` zzIjMKMgRI-rTr$t`o0Q==Ww_!m6Re;vRnU#75ZZftZeVRUF#Jonrbz)fNAs*Oi7`_ zQ)Lll6>J_M>*UyilDrD|=*6!g!wH~8d`8U|9Q;*EC;~UGRA>a{)A?(TH=-fT+erqi z_OQ)FUBlL7+l!x1bClV^6_@gnxDB?(4Le-FWT8y3uFaf#*6bU)Dx zWPS+bihwE%(3l%DZO6phf2|3lJkEB7hEmN#`2!5MV8xbdi}MR)W`LKA2cbcf7wP>h zWWpfN0!!4C_+G1YnlQOwjGl7{*1yaCdJ0)4Ho;!U|F%1wGe+ ztBw~N|8p8Objx9`bZ!(;Qg=F|Er;O(BTDt;3rUbXfB#1du+VvT4lAty4MAx8cdrv` zrs{9Jk=ncZH$i8XK7k<1id1+0}xYFA3hzy5cpeD z2_{w9DNt+2`5IXB;&e=R{58pgxDWeMuqd~|MiQs{tO(Wre*oS2BN0>;oEPgoV)e>vZ6HD(6ycudI% zRdZoivb_%3bwTodK|tgD6HE~=LjDc0>;fEVt&kGG1bD^KL#nR85^O6wnOZzx@iS)6 z=FCxLp4^BgdZK`V#|tM5_O-d>8Y1Yolc(ySTX_8BzL~Kxe{$yAUO_Qe1&U&dB=Z|S zlEZn*a{D`34yGO|&u#f`vI-4h>IUS((Mq>R^V+W zWy}6U%Oi;RN~ZJbQj1JCOs~OZOWh@w4maTVJ2FYj~+1py?go@Kx}*XilLSac7|T z!LNovrB~PsvMUEv$mkH8D`oz*btI@0GNoncU`|e0{D=5yA4BIV0H}&NZPK+u+WpCM z^+!u)cz;$}jAvtrAAJa--!POQCQ#6l&|SqHv(7Bf7p1|z|A_RpMEMxbB}38M_eGT7 zrY=UpFd3^gLFbT0;@rAfm8(P0^0f@+Cmg zP$8%O`~iE?4`MoOmWOIw+|!W>ULn{7iAw7&_M_O}O%~=P(FeamjHhb#8{1ZS_2e75 z574HQ_EWGL{=*)~&k=}$-eb5#aG6trd*WPPsWnx#*8RAufGd%mpt|Iogn}_FKJXqA zF4nM$@U0zR8H1w4cE7h~A<{1%(b}UX`%L>UN9H)ULXe9bEGGQf@5rjH8f#m;9homh9og z&z?O^dGg-T^PGnAdbQRhm*6&vhv-5E65E-R{gM$hNw8%|>0yoUmx->Q*$O5<2iXO` zPO!ok`z0rrz=CXQ2nFGmOc@%UV-6?*Oa5iCa#LmXDnKFS^h6U~L~_;gBT>+M|B-T! z50#J55xI&R#_dE!z+vvK;H|p<+Sc&4SbO?_Ua_b{ zZd<7@CJ;~b__S*dkz|y=(l;3536EMfcle8v$m`$NO7K(yzx;@4)5^R25ruwk@JY|$3g7TIhrh)l#?&?S zW*?Yzf*tqqidPLA;)Sowo|z?uURLps3tJBNR34Cj=0d64D9sj9<{bVd`@C}- zBl9*7JIhzzKA~vGElibRPRh?n$}>@2EfO4#0y{BghA?mb-k4)qLER&45^D77g~+zi z#Y@};#+6g5Afg!GZ;|)QCMsOa$*-^(X(C{+GshNV_C~${b@8;;jVjO28=&P!PQg9! zlG+t5k2t;jm9jwsvP19P>ede(s!s%@YJ4qe%T+_9!rW4m`YIZD{&9OM5K@Y$WP)4IX(J3|7kO)f*Qi+}XVlxPlPse=QxP{vYZuMB4xNm zR(}k+NKAWl+GSlQied-W5%W2z+|+lmbx8l)wKA};_J6l==Ks@=9O&jCP0|0y4pym% z0H7Jb4zKtBCmZE4%BqO>xij<<+GJvr{BFC&-H9N`oS&a--_dXNn%SFvV}+sP0x=b+ zPQZo=z-h=4&BP_KB*(3CRW3dII`WtRix5U1Hw10iD#FCf%7Sz`)7}JC)*lGxfN#=jUjkO3Kmd_x zB#CfA3AUox>_edjgNvI90ckU!IX1D6U~us82qOk2bToGe>bB<^;unbV@SMRq1qq-I z>H`S0!Mpb_yn?_DYP1HO9&M6Wk63sIN{n_()w5*HE@5>6=W79irLDyguXe2QiO zn{UzVKC9V5V(VYzlwI(iLCzoYX8f?s`RoSgfp{$~C1oV9QUI3&^u%#c{`nU)w6(>%nc*i<-r3YisM{;{({HhxZl5^6sdhue|7m0p86B zMjJSmv7~D438Any?-YiCc%#{>`!9U1&R%I#!Eeu)v7ONF(|-dRg>DtlbHadk%td^Z zK#3T5cL5HE3d6bic@Hn3MCJw+;_dWD0n&XAE)c<_hvp)XdgjNPEhdX5!M@2V{Okj> zA`b%ApRH6SSVMlGh%x94ctAk^e8=Zx&cAs>{JdxPcz<`*+?}Q~;vG?)ArYX##Hd8;rWNH5Cew8dM*A zOH&{|eEJuxrauw^kpqiwV~g*xDG)5HTjAjQ9S!5c&Bl3;-TAD^ep!4AVRH6-Csfq( zCRN5{_*tz`U?(qGoo~_W5L22he8}q%0_B?Y0+4G2Q{K_e_YVifdQFHCiHdj}rpVDi zf;^mhZ|I|E;iI#MqWGs5ECx?fhJm(u2Hxgk^=s8e zN>y~spd^Sc{sGtYP!OlUjyk}WZgWjoODb5l2bgb~Mb}yIkm3q zH>jl&9UgY^b`P&*vUTDzWpH$rR$EIk*2KCCi`&edZ=8qG&B++3mtQvUZP|jYe8M-b(s-8ap#XDn6?9c6ckCxBxnGoCg%u_TW=Llt6ts_?zrT(D!%u}MCA2mF z-~m+H^J?#ybhusG_ayFc#VhwvJ45UJH0{dLn@~bouZxISxyRPHQ78T!AbYsuNt$%T6fQPz5n_8dI`Ga&S1P?U)>3)i*{ zT*tJh=f-Jb7UX_LVVs5$A89b=0kMs7p}}FP=5(Yk9z^_A)59Xr<4z4XO5j`Mdh@3A zomYW-h3Fa@8neA|Bw8XY!*}s8mL&p?VxcwN=YcFL62TU!#y>R|V1(uB9TUKpr}ad= zq7))K=G+cpOHA{KkTyw~tA34}K}JYO7}3O;)nM-vCjjZvc`GTABjHgMpDtodoShgUjMJNnED0_-?!a9q;PRjaZA;TKf(iN zxLiNDzw*IU37-`bnH!(5qKl1D@dgff7kZJM{%JCW-74+coI~?uLNar_f2AxKsejQv z^na(Jvtunnvt?)UUyoqxtRoyP(=$5?CBA*6LF%;sXaV7@!?_B{4}POy&8|rAR$AN& zy7H1E4j~#r*^y#pQI%~a!{!1GP?Egb5V_$&4O)8R31lf-L)>GTfx3z@Dbi?d1Eidb1m0m5Te{{M27Jy^upIvs4DZ|N)Z+`Dev4u=2#V#`aGKLTusL1TOcIP~6 zz2}d2oweTgJZnAwwPe_Pe?OmlxUTEI?lT4V@9oj(RPi63xBOVBS<>TWxfG+?B4V-A zzWe^5-i>QY_6=k(j@LJO?!jDI7fKhK(rzRQ?`W>e?o0+Z8EVEjbgGX$ew}eZRbR?_ z%3v`{MP~P`N>00iqjA$5_qW#lHIL!X_OeoldvTP>=6F+@COISf*ZL5C&Pb+Je;+np zU+SrnWyJO!p{_TpZ^IR3-I>GfA(P0LZ8X80F{kYQEc{uOXG&@@X?iZ|-fZP<_@J$K zD-#tnEsgk_;}`(8@@WSRAbEYT%<1qwjVIAXZjo*wif)2Gbpo@lInt~uy^qbf%kS;i z^=0y#6QlPRyP?fulMKf?ol~Lg))&RBn#)7D?3oV*vbO8Ly%$=QUT3(FAToN)RR4gl z9OlAw1fLaaxm!mpd8J6_pK3x@yvG}OVAp`a?-cuY^O6q*w_n-0$ zNHU%_xB|09Ue<5QOdOw3!mNDPiSWNV#GuyZ-_TuBU-lb5?7>=uKLWJ?)y#i0Og4Yy zY7IR1W(2Kfx#RA?biA?h>a(SF=6&f0DZ}?L15PKs0i1^9VaONDH?^y_HUZ%6z)Br? z*xaNr*F{Arz@B;6?_n7O7)v8c5|oWG<%J2=KK)~Tz{Rblqa$Nm`*(Bmc$(L9url#A zHL8{hs9Q*a7yY|N>+EwFZ$Y`K3@mu11?VJjr>77}VU&Q5;feQXlcbW?%r(I)C!e@> z0xpf=kVq8LB)^bHgsb5dOy&drMPWLL$u)Rym`@3y_W2CU^&QT(IZz*o8K$1c1`6O> zVzO`vB>pn4lh|eVb+~Rd{o*jm82TUf3DL3GptFFQW=9u(QBuu*>XxzlW~9wSU;tl` zekIJ}qN`Ez!c{$MRb5?urgb}giESr(79t9TKLBzOGd$oAwn&f(4{F=!hI&gT1JC?v z&9(dF!7gB-QYcq3&Vm}?7lQ7gzy3POi`nq5XF*Gn;^Mk>`MmfL9#!RpxuW2Gkbpft zvSYgpl5d`S?+UC^XdZegct4oc#n5+UJeDAHHkFmH^6x+om@R@9A=|S@V?R9J)vsph z1yDj_rVpFm*dnb^i(VELRB0#*O@08b%+Ojo5JtG3fj!t?q(B4&+_;czV{1Uuj`r7OT(?(3>o6Tlh zQEIXbGuozme;=yhmcPM1s_yrNrvTc=FPN^fxXih2TR&VHV8-yzg{)p8M$?kZ5FstQ z7xjOfm{7uSZR}anA7pBgxH_X-V{d{#nWTy=kb}rUo-! zz>kkJTfndhJqPgM;ufmK^&v1M>KNbv#h^qInqKwi{sz5Ytf0mQgljY7=;81>dNVaC zq~i!dtCcPTBg7F1f!wep){A9cW)O;&Wdvh9y+n*04sL@U?(vBdfzVWh0T!t-eF8D~ z>5clPmKJC1^08J%bB8gpULV^iMYs2^JB_2t^AR_OCGm}$OXJKx?L4uofG^!JSuU%% zzt@M4=Dt!*97;V>_e6SuRk0_27bb#BaP^^NCyV=mKkd?K9 zXl#}7vKF)SNEmU&$Kl6j*JJ}vJi#kVqwxDJXP*L5B3rNT_G%;u+SCoaLvzy4hvVmE z?4GZoun!9l_xv#QcR!jwtuEWG6W?7nyXFRP^+|>!f4*1Oe*N96bk=~DLVOa;UVngz z+5@e0D)?lKBLCCJ?SI!VOgM>;fMtWk(xBfxEs(g^(^6Kp1kDbf%rC4h68i*H0r&xo zJ;E2?L_3W_(L0aSQGp@`O4YAlvAlQ<;Rn*)^J`p|-?6F}ww47}v`qt%3wZ%JjX29J zM4XZ2S6T-}MMV>~HJ|S`!NI*-SXjsfpIX zn*KIcKEAcjo!Phs-e9Gsfl9c^>YAB#<7){1iFi?1&}x{WwhxDSM#{1V?+N-jn=;3% zEjG9fr{VCKB&P2NS?;AnBhQ0U-r-imJk`;VW%xYfVWyP7yhZE~i)ug*ikrN*cYpDrgh*yVY;mz z3S632;KYlR_*FEdpIwk5aEog3A4s$o?I-+ja~E-w6|Z4kUL{wbn*SWx&>*f35DY9! zesb3y6T`Y1HaGq9tg60YP->xsG`%9CeLe5(=`9CB=q|&H$bb|0RK5TFgPpWqOp)0x zct&t89ef_7$}PSMDCMA#=y?>;=$oWM!F|pS)l_L8OKzrRot7KyxQ+o&cORNPL=$O; zvHD}4(pzoB5Gf2GS1hD9i+1xw%ETi&KB}?)i(N`+X9I%7D9z`=YK057RcHBqPatq2 zI~cEbO7y2jbEMspxRrwsiZr$1xcIqq9LSm%CQZ3?!AnDXlipRLjFah_um?@@s zBu&;%z1*}9XqV||R#w)nYnC0X(q}dEeeT_cp5QRM3wfI&@sp*Gv&%bj@TKHl9`Lw9S_KJmQ?bTAQU~KO*A#3(xI?Tk-g#|K7YP>%%$gJbQ!;isk zlZ+$)5b$P;+>!`v@AlTV-#DjPJ0uTtgwNZ;7iU5GZ3swIGhhiIku5#4)NX058b>R@ zpu?4a=uW#Qxx$_KO?c;^w88d++>^Ill}E5}g)WdUUK1j+vW}xY*oPdsoK(`G#HD1A zllSxV{h*hJM5y5Rypv*(w#D$)Zi{2ul@tOpT&A${IZtIR1%pxwE(_5?1B%Z|#dIE? zBBpASJS$s_@3uxsq$F}*-7yJyyCO|P;{!V<`cvmmzqu9dJ(T>>ikdYraz=DOo6++E(RCYiQ_#*%MV*1*mb2}hS_HYcg+G5( z8&R+QWDJWRXX&wgxxV&uIJ%~($HCZb{GbiEGdZ8a>?Yfvx_!CzJzdTAktRsuH@;Sl z{J1?S_c$ln3!|M6QZmGTma?6VdAvXqTU6u{=qp|{BVrax+t1MSxcTLiJvQ>6+HOfS zQ$MkcIvJAseV{7-162}bprAtNu+Bq{A2G7eGkMyNV>JL(a{M-;qT;RI@m6y`;pQ#w zI`PH?_3J%VV9dKU9HVE)FF~^IDo;(ATmzdL7#OHvJR>+S<)AIncuDjyQ@S|$sHeUmxMqLh+cSg&cZNW>aiiz8y?Rv#^f*7}LZ2R045BX9WhFB=;h zt4?UH&Q+LhX0qn|Hx@wsj6qf4GhuXvR+&~?sp_f77Bf`_aB!^8?1qSCBp*8ITPA6|=y4#9Zb4mLH-?99x zT^<+SrYO)HXmr4oTx=VRq2gkI7QLBP-jyQU*^B9dE}8aw9@|Qr52~1o?{y;3xhI*2 zjz&wRyfS}e#J|?+!Jhqt(CmL*ci&1IqrpA2DP!T2R!srtXnC36sqwd;yrAjsm{D>6 z1G>bWWaSTeA}thB;4SeRBM2?wjkUxK3SWwWM6)fPJ&sfrRKDum7~C;=nmv_2!cERA zW}IOilrxYZs+uIe$0pR!lDw?E=ed-CK#z3t-^mv~6W$Dn(s~I*W>e2Q*Oq3+Mn&1T zmiFbQw0r-B)+8jPTs!}YR!DXDQfYdmx2THsxWz;Vl#e0zE~#P2jW$AVd4hynACDC3l%PUtP_ zJL=O}DMt;-RbP+YHxW|#`ymDtE_ZEgiBkx(AgXPmsFo`m-|Zyh{G$UkTa6~y?kn*j z&NpU%C@t^$?p5P$8k9kKHU-IkMuUnI-;o|LaMcQw)AY^0Xa51p>0+(Z6@gd5iK{3Z z6j8bgX%WWn;w37c9b7_%)8FPp3cUByAEvzZ^#0Vb0&tzp)HmehT`iUfg2>y58nlLJ zK4n1yJU!FXU2PrN32$v4Uf%pV{>(lkY$gT<)I|^1lSvP3%IKsoS~-Ym0L7QVE_!BS z-tykwapZZ-$-hU%g#rv!$$K>mg9X@T#Pi5E8R_9&FCd^~ccb@^JyFb8K&0AVT(=t)WZoJ4-ZE3hDVXGs_G=@r@5t>B1}oLMmB0%eeHjA^o2t0U4RoEnU=9f^0^ zj)`|q4qVu0k~>bAuxYaJ?T|4Js1lNtJOihcV3_p5+GGgQBc!m;c3I{qoiwR1S5t;m zjyjQT8NE2F0OMQYtkm}CIME|rJH^N&Cj_z!jdX^h8{5UKvw6{1xH{d9U>4h>4Iz<7 z%RUS#0fm3MisdMe>w`Ad0{Gcer@aXvCtyuswb@(C`}FSzf|2=b-OTMIj2iU7EmSUe z=dVuURoaTpe;$X|Ay;+~G*~g*vKjE^(bbKjKOBcHcM0R;!pevXO=CEEBc!R1XT*#H zX|%K!D2b|L7F4R(_h3hv`Dc<$s$d=2;*1wdHwdr#$_pO+p1JqQ+jE|x07SVvYd1~I ztK&l%laA3KM8yDGJmB{R?pHBB`f;C6&JLgyj$=m&@qGKj>eCpwJ`#>Vc2(SjraR??^FL}psEC5MgIVeXVVx((F=NW z;Ys3BA|6Wrt5=U;&;P~vL2K%?Tpg-#o{UX58`AripZ_fB@N=dyoMxuKCF0r3fFDSA z54t@D%Qz!rLKZga-`rA>mod9gq*kx%_o3XG8H>qbxq=08PM6%h*ul;<*2kKZf9aqg zrX3BWoAZZ+E7Hcf80HyhsmPU;tDv(Uw2qMTDG=l+7;X&?^Jmwoy#TI_k4AcIy9%?t0tE?E^D7bg&8`5XBWS3ptu^hc*z@~k{k&5vv zbJ8_!X?19ve~a?7CtiMoeJ;-$GPo2pn4^Z85u~8?`eyJCng0-E@vlAPi!yI)H(UZ? zywa%LgyVq+pIN6eIy#CIti(*}!4S^)_dU4S7)CY2qN0k01HUnKS2@fS@O}6|Mt1GK zV=T7DB>fUc0T2Nh85yV-F|*(T%8kFa3_Lnm*Z0F(EQdF+b+Fs$9{NGhu_QI)jMM+6 zoobK5Y^aLQm=>s+y4qTuSe^u6Z_V9U&`}C^H5rm^C7N)H!vr8tRX^{(IuDyUkc*!% zBcw(S-u00Y>I!WFS{1uIlPtt8k~$coRKO7>TQJ%uN}1>PFYOV^Zr#8dYzDdZ>|hjl zV+Z~%6)TvjFdHi-frdDB!h?!V80qS9h;O|F1`k*EE!CT|Q{6i4+Gu*5k8x|EVE-GiY0CYU&5y#Z`;}GK^k83Lve`09^%Am-9|$Vc~4Z777qO z+Dl;Wv84qYN|TUF^DCH2tgFNLgm`J!k!rfXLLTULb__Irs++I|W-}FID4nbq>MMob zvwukRdkPT=_8GE7Y{seh-WGa= zx7FMCz1q;baYo>-RAFFlpYxkr4huuTQb1i7<3PZBBb=IvUF7DSucW`I=o%Y zYVet%Lu~$VeV%Z6`P>?HYDEHo0CY4HtqI`_&9pPR70486G&7GR-5-jE<0;0sl7eGS z_O6)Kw1ZZ|Y!ee59u16dj*(djm~K;Uof~Z?*0)GGezO;r9h6u)*2-{us&Q1IQy(!P z_%G`f!hEwOjpHuI7waIQt_?+Y2zo!X8w zs<|kn&}gw&vz$ha9^uWv9=ReW(%BKjrPKb9U?)y-_748MO5Zqe%XpOvf;=Pddng-T zJ#T*O-jTUwyL$w-B|ZfTf;e`%v*@wfZuKWTG_B}r7DgH@LegM7J4_Mf_KbHo#=dR8BD7JmLb zWPq3^$jS>(|TtzSQPxnggs zTELz*p$nqHDV%ceQ}(sjNs+1pwpNYuDCW{Q`FqmjtR}f{y^cM^moNP{xpE@<-;gW9 z|4;b#{5HCaCr>7~1WXwbflXnS`INv91R6joNSy<{(unA)SJnu%B}Z8(S6@t|B+VgN zVyEaN;sZubue$7yR}&FwA`+z~C1>h>56_O&*B2JLKfk;TVakIzF;kqyh!Q|;<6pn7 zs^gI}ViEENI9c)-l(n&I=hZOrr&^btFL)OP;g<5EW3a}+%xPL%G8eGY8^rRG;0UW?9@Wy znvj8*1=M&z;ye#pMT~TwrG2s)frg{Blr+U()Cph@F`bQos2azwT0qf|7k11y9pWy` z%IBc8vYtYxUXym5p%27rGCGTv(9<|n6EAWLPXQAGDsw2nV%q7ig75)Or2dwB9vEO5 zy#cF5(uBZ98G^)G`W|O`qj30$k9mH4iPC#aS2G_UY`XZ-2VnY{f_;EU5vow>m)zdI zCHLj`PIwa_r2)sJ`;aT*uLe*oON8WPKrL+Y`;JKr-q*AQ%a(;H+vet5RGR*6(fTpl z57odVL4{IIz+$}cV7mjOf!PwU6xZ&&grY#7Emjd9X-dqCwsEV_Lj-jrDRdS!pGXWc z*mhgDi)3Wv7xlC>%^L5L_Bqwvv3G}+-8jm07rLe#D5ga?i)#gMf*xa_Q5Jc-mJ|GI zZqEMPdz_ZoD237Iz=grL0jG^N7^w{~S+@$El6&#_M6mLHJb;aEAG zx2y5OnfRPHWkE^02sw;;zE8?aLfH5 zW@OyG+xM|CobD7&IS#wW=d2)rtB^to(8pbis5_!Yr#lSRGur&20dK85ii>8YtU7_E z)z#DO$v&tU4YWTi1r|{rqdH#=CAO*e_}!Dcva`jdZu9v~-7nbax}&-QC^YDBUI9-Q5jm@x?vopF4Nv&V0ui zM@Qdxv-jF-KhLk89r!~^DuF_L4y|k5*63?d3O!UFng{6}csz(@8Kd^kSdedPjP&0-5V?6F?V}1<3 zMDj+zR7!Mx$EKj_?qHG#y{itr<#v!>I>{g1ap!r^o}f9|*?5?GN^v=E+(~g6IcOPu zSX`1*NBQs#ky^+~67j>g3RI#+ug_5E0zPVpAKG;SEMdJqE5jj~e?$BbOxW=i%1fJG zumJ*m+z+b$Gn7|1;u<>m66XKRmtZ6sJRXkfVPEp(@}-Wo(o#|uTbyiOPqQ!l9m+8_ zvoR`_Vu{VpNVEMBWges1Jk#s{ksHD+DIjBEvFrAP(EfQmZ@pQjlF9OcaXl!lpDxpA z)^7JAOLOd?Y4i8*jUW^-Z`vaTU(5V{9ujuFBEwH5(PV!V^y&HWVw8a0TJLzV5gf;9 zD^_W2i^Fbz^?T!*A5I*#iuL(s|5UM3@ojf7hRAT`90D#|2DH~_RPH9*y?@OP7Vu*6 zG~B-iP>=p(So*p=Ki-*4m)u>=XtCqd>vXNQd$Sj))zjqNtabX!$;mxEJ(+FjCa1I8 zVEt}R&n zc{-|JQS@}=Phz#utTmouU3Sd==KWEa?R=@uYyqq&_tm7_>v_l!QBn>_)v~XWd791F zjF(aSQZ0hZ24}jR#_ht!vdKn4vA36>zWp0*@T*$g=Js~cX@4}?#mVc5qM+zf>%xFV zffz~S=5)Qa9GpCFXGg~^78+Wvd!6xAP#?F;^<)|P{ndd;pn2P!{tay=|3?J;5@`O&d>=(i z`GOyWU%qtFR9J2Fv^rm@wz)d_!{deFappCC3R=k)3BNj+IazG90o#85*T&jf<gyD|EKr)+u)of9w!lpZSyPh*p zPCXU`Png1B+*gmgEsP@uz9%hEP5$MI-yAL6fC~XnnXf=QY&~8u`qvI)DRFU^$FttO z*}5i`HrKl*y94VAr;F{2ozVqNU!g#=+X-o2cG7^gA=j549E-=Nn-!!au<~<4d~D`_ zp00JegECd@`iJrjSOO{G-#D!CGtSN{tl*>Pl0kvhce%YByYwh~t zqFA%F$;^zdip6x6j*2RnJ#H^_f3k36Vc4Z-Ku|72oWZn zs*+9A|7APbVppjz4ha(l#rwiJ8~%xohbIlnN2x^l3_RFSs|K*)G0uNsrVodp;=XtB;-vo&t=q=cL)H*6tEg-vJt1^~; z-xPtzV>@*h4TM2$ByFcZLVm)*bSbe4YA7Xx)S4O@S=b1bT$<~-D3OSW$inmCY~=>y zD3?H;6}`;SZSz3fR}+`103>3}Kz8v~JPuoOBBCt2gK5L!!islO3DMCT2M6N51YC|0 z^BJn3Z*>)3A1%lkp{Dx>zwfo&BTsX?R_Sq1V=E?&!I1kcXi7{Mm!Fe^=sENwTBF&% zmV0nk*eZ@j!x+bLC)EM@dmPh_`ne5~5C4`}4S$L5JzA6Kj4a_v+XIa-7U}ZgT=m}R zZTol?Gzw|UF&mAFkA@C#*=(4m_COvx19*Qs|F1RWz8SqFi+2V324>ohNK$lgpdk7-$O?2 z5DNH(U^54KihTM~X3}Zb&2!#I-0-WBV*k$L<;G*z)YOz(AYPI0$JgD$Bt{4bh^xH` z|0d^EPsqu+y@`CAxQ?t2F4~${!U+B?lQ`M;eKe!-KYv@n(|)q&u#<{RWNmpoA4K53 z90OZk%k@kMEj=>Xuz#zs-rxe*TQlI;YJMN4~( zcrzExT_Y6#Pr2QW(An{oijD{kW;bEnGtaCR1l~tF`;*V{G!#VnO-{YCLoM#iiN0^?eMRQ74~LK-9OvD8Pv zX6(pY)gVz8=sEcPaDCLN-A*U*{X3n0xnXX8K3S^d6=Zi;Aj;j0Bj+&ECbal~V(nW- z^oKC1;=OGac*7yS&bO(_$-#J`>?K4AUa0|Ivuz)Q{dXus*nIk-x}1Vy)F;*GKMoN_ z;BVw(>yANOUHmf^@FXmkSEIMy{Qmq4a{>nHBi%x+;?Pe?2QkC@1%^kHgODDqZt9(B zH4D2`Qa?KT%C)z>eA`+dzvs>;X=*G&m1A!p@?v2+x{~L~n)y~aE!3G6yEDK=pX3BAJ7Hd|^QT)dz{jE#0tEzbG zLx%XB6|;r9xgLVz4Wjn>S`$XddNc@02RFm}2OD9iDBFGu_0@8bkdX8NA@5Par$v<1*1E`{T@-zup z?$MTT{Cl`>7Ihugrc2c{99$MjZ*eQUPh+F0QS9}{9OL$yl8&R-v*{sAW(O$`56}lZO$kPw&*Mrp0aD47bPiL$$(94hW3-#M)P3+gGYtLxi z@rgIBm*3mC9pz5>z4NHlfFjMT+*O@*1y2f;g9D!X`ja+u`QMlGAD$LXKmM(D|I1Ze_Ud@PEZQAUYyRGl+Ovf zTumwcx!lC;arF?l4LEUI}1r4jHm7OazF1U`?LXDegHTRKrFGuv1NlH3uQM| z@S-oSpsR!+rW8qYopqi3c?lCL)PR$qWmyft$0OLl`)%wH#F3%i6$B3m;(hvL>@E1kTuu^j8 z;pETGIHn?tJDt8K&9MvnD=bK+I>WyKQ1kS)^kXi871#*@~YD%a_Ywmq;cu zbSE6?wEfJP&_zlDwVj@w9cz?24#PoY;tmT5$ulyHJmR+7UH5|#o6R=d28w`?sw%dZ zPW`sg0Jv#+%_9hS95vQkV)7wQ++o{2p*X~>K8C&sbDgAafDB?%AmDQq?1{%?VPWYR z0X$r1p`%Xf_&3dYpCau!ibNdK&nmm#WF}0c&SppI3OzLM&s%GNS9G2ykPBe^mPb-K zrIT4o0dy1Qs5TfC9$>Xt9zsPV{$2MChfb5lZZj%9xZ=9$`+sWzpVi-%b!kcIAQJuz z=QC6)oC3eLg`9Ge=)kmXZBbdY52Bqk>Af4>29ms8C6CL&$j5e>Wlvzv7Q z#Qnu6@4}O4J|j&j%Ns(Ie>u?iwL0A}ekt3-$#Pi+X->k;M2j9TPYu88%@(e^F|G;|zDF{<>{LbU;;XbqilzSIA~K(rlDD z!5IINCzUEz1DL_(!OUp4BrRyc9cZi8FHMIGjQ~cR$~U}-eljIFq3?^Dj6%50`rrfSSTU-syx{Qk1CH!f1`f zYq|Hoon~cx1*8xkKdwvvo$;tVX!823j;dn?8}Ah#Kht2f0ru&yhgcrmADHvhgy_p6 zqY&T51RHz@H}jIsi&U!f{QX6YjrW&ZUABU!yeuL9OKhncZ2ljYUi1za+S6b$Xbd~h z@|EfD*xFWUz$?~ z;r4bTTqFcDQv=`a;TlwfLVM9owGS2+Cx9awVL?257%fdg5(Nyf_FstIKN}+RE11TSX|! z+h)1n9LDq`J+E!Z(y%}$t81CV%oP@|D{2UTT>Q2A*OS>~dXgq8cwdKKW>pO8hN`^f zUx5tq(CqE)tv`XgG6cX`R-1j1(9qCK%*6V8|8kq{4uoq!wY1;+=Nkb86yEDu-BF&0 zL$Hqu*DYHN$FpeLZoTx5%r8M_LcpZ^Oim6J*>o|&sjv#zIVhLl1~ja92k#_%!2e#dkV8`!l9{ZS-=8JACG&BxAw z^B1NYP2@#74MYDLh>?Mgs;pmeZw9P2=Ae3%XG2r9Jt_?~9v2r)v->hf$#QbDVGU_( z(rTtb!HV0v^_g9TL}#%`VS}j1aZXc)goxDKdPbY}NT&~F;PSNKhaJI7pVe7(_9HD# zpvTs|wOpS>V0fr>e@g%rrF;RM)w&>dKVTrv3ug6&d|FysB{10UCA|_8mqMc4avZIed5r`wFK=EZQ{UaiPBC<)E(S^vj}m_afPUh-^NluS44&>_4J0O> zFt-Nd^BZ&W^NSG^7=8@^)HIPTg3tw9s<+Gvq&%RY#i6r1Um6m%oOZwp_`$8+0-aHS zH9ITI)IyL-tHtpQe8lftlgEoY|0(<7a%-~f7{ykzW$L@tBbjXRi9E@E1ZZSP-uF?? zr>oy&6@%34Oy_2_JW>&ZdQ@s$07NikWhmNXoPL!6_$a>T3;4rdrZ?K`EL(PdvfH2h zwzcQ-C4fA8i6&_E^_kRJB}(iQEWbi1OxK^E=b|5_9_=zlAQgzz;1m{o)@|I`GL2Qz6Vy%{({UE@^B1w5 z8vGs0%SFV*FHOW{Y;8?iXS=zQyC$)zHxQY|#zh&!?<-uWHk+GaOe#z3&~=*ALM6A6 zO?;I^luk;raUaILfxO`??Bgd=NOgEHjbs`O1S%l&z9aUV<{u=C*y(;Fp?eGDl9@6M z6W0CgJ)qSja=X~8tK;%=b8{Q%a+%EIES37e5AOk?5eSl*!(#-+ilxRg-5@Arucj` zLD@Q4Avj^r<17 zKp)-j_wR=k_tWKsUZCdXdN3^m*W+m?!X?xFKhWq6lHUoR0SQ^u(+d!5xZs3$vNeFc zM=e})05-NV6(u z3z8A%p0Tlm)+a1`FU+b!g^cVTK`S;U1``Lb45xiAz}nS*<~C-t%W7?FEZb`1U-o*G zoNN@S$g^&UK503_muM#0Dq`K}C>>(Cp6;I(&Jec8?0 z{G$uI)}8~c`u9}#i>%JJbdaOhUE;)_)AjX9yGiau{E8p6dwP4X;b;tU5);dWq@*NN zr>3ZQXh;@#nI@@7D401pnJMO|m?pKv!*Jp;xo9Xztkf<4ozAvo{-yC9%CYK;F+g#x0Y=ZAZ*~VSC@C3WIM;h7^eQ4V~*EwHLd0}UGr9ALoAjO zkJr6Lp;*ze->{PDqw@f0W-C>{#23U3H_4>a1btb}=5zK;2xrk%cHfuhD5~&2#Uq9lNW5lgsJ^Ep=Aoi=sg2K-EZYr zl6yAZVVGwR{V&NVSk2b3y+(hSWH*U}&H0l2=vGJWhkkQhKE_-C9;6|Sa75n1WQZ^n zNswr^()jL|I(%W8Z-q!YS19k(b*IBHYve!DMI<6FI&OrHFz^XI0da0W!6X=sO896_ zID?9)y^F9IhsE?SV<)QGAVL%CRe6|=wRHkFThG}!0{o3wNFY8BJI_?{;>x@%NsY;< zhwJCWLW;tz4uOlw@!~~Zq<ywJkH^qEr#_HEC&mSSnKDl^Q8E z6ZiTYjh!3ER;@L+yoib6EMUx|CRYo_D5d_9V_<$OYi+^&#K2fBO2@`YLBY(-PQe&) zIuxV#jH4W8nE5^Q^lA0E^j)pA-r*Pb|QrK_RnVs$5YY<1ZBTP7SFb(hOCxNnu z9Ws!Bopj8^IL}CTQ)L2YKgQtkbfqL|(VFlsCPCMA4in3^(xUCoZ!c*t8zYDZ;trCn z?`@vv*+g%ze`6YlVpidvs-I#Sk6RKuHVUh)$i$BAKJ_&H2JcZU)(Uvs@tC13-q@2w ziwtw)_C^JZz3rT)@u46?k$vodVnR_aaony*7y_co__p6SG|kQ)>aYs1dTOwYqzW3tP;zm@w^&iBni(&l%}OLSn2LU9#w*89Q6 z@15TXIi-6$-!pC?N4NZYB7V2@Poww4AcR8*7XI;bH@w|};~o)S(sXt>4~NmeFD1Ip zp=K}ZRygS46k*a>tazpIcG#wtdUzAxP)bCySSs`XJ9&&zX3phppc{t`g4viW!EjUn`NmXJ?ETb@skraRh}F5#nAX9Mf1+fj>JdJG&)H zjsfp*%lg^#IWe$*&#CP|;>k9ROei=6?lGM@FaOIrVZW55)D_INLzanVlj}3pU$ce9 zLEZ{6eOc?}uTjXcqUnjK>B=;eL}O1#*<#v`u`#o=G1hDC3g@<54Y+s1(>5A3bYt!2 zH$}*p1wXT1Sl9k)H0U+o^zY*J#NG`yN%YB13O*WL%C$`>_9I$k8?-`9HX1*|N8kBuZO zW)k-#NW0AEd$+O!&!j^oPH$7>R{2X;)tGIfz_hNeZlv91j4xa5XMuw*Gp~ye6e2AV zTxGISfil^`b6cJ!Ru!uryEEnKMx+;#gj%O@i|!9c)O!W#m@N&BqKF-dGA=Mf$B-o2ds$bsHlLUs?y4s`>l8_qV?NhU5!m+c7IJps^mP}fE}Sk z*W+uOfu7)K&RCjEyXIUWwSu2RsM@HirhJL&_o3+4%eA%kHH{Z{KxHmfr|8+(tZ|DS z6GclTg?mcGaA#uCBvCG^!~{pl&8$&_^ZK_gsq@Hs$X*5|qi%wJI`&!x7VBh9c4UYW zvC+sz)sAs3jkp};8aP@@=n3jcSUZk}-D(}mkz>p=a&QI43VXbqVm>+8+6r1T{VD$7 z5F$Mj9GjX}LrKF!@kAg>gMo{d*=?`qD~ECMxQ|Yfn>w~_1n0=&*fxZu@^5#!m2)_} z$Iq?v)PnWt9am^Wg#wB-HTiq4GBZ<%l+{tL3plgdl;efUBb_8|2$<&!C~7Vpj11-h zmyA7+KmlF;8D;!TQHq;@ya(x1q-uC07xp~pGFIJ2Sx-#*!R*??$j_fYzrpw*&XkAs zS*66$_ER;#jn@Gxjb}szB8<+ym-cO;)*l{-`eB4Nq4UwtdIA5f1w^Ezm?kA@AStWp zROzraqX}vs{{dW4^#vra>Td|f^81PIxR z<>b&p1mbRblqU+!2|2dtluyk)J&EkWrCzRjVwUMt=&22-|vxKv98DSsj4QOWgc~O z+CpN9OkyZ8u{Jz`y#R7H7SL%~#)bVem&2EmD!q)Po zQf0&Uz*a|9u|ZIs2gNKT9Vl?E88+KPiNG&>UU_*+-~QoAV`(r!G?Vy8PvXXtp-#ZM zx)4?<6r2hY5>miYY5g+C&yEjAs#)5wnwSr1`BtNlYP+cB1)-6uQ_c_HC| zWG17mEy%{#sK82_+iP`4;|~o57VFdf)vQTRy@2HV!kW`lOZ={00uS|kDZB+eJl2Ep zp=&*Q$!YXnwTPd+*V$p|z&qQIyS4##<3etB+poO6 zpkW+I;ep%*Aklk!d#_s8_J`)4J!OQjg|W?KrDD)kQIjWCvpx)Sdg$WNhVhO*nT@!hg3s4d0h>0I>Ry^{9ot>QKj@rm#WrsIGyJ#IixaagyDge1?~q>9`~Yw z4pE}f%;I$bR#tIby%q<4DNpN(0Z>szX9;?7z5Yom|LK^fJZ6M zv7a51!r}4EWfz;67}&v~*axtISn7`#!}JZ6W3NTdhp|xIjhbS}2{Xg<;g$nMPZ&8| z$@pggS&PfbyrH z`kX8|taMLjoGpPk1|ZXnC0}Y{>%2tI0YF{>5Op8t#pC&oOqewkEwp(fjFaiCd=v5AK5A_}Ag)){47Xz8SW7(u~2!9e_+ zwNbRIyAdkcyQYi~eN*edX>>oL09Kg0%$O3zQ(RP(kawi$`vk9Kt!^*;xu1p~p>S*w z69w&beUZ&)i%WaGZu*F_u;_RsaRobTYlgVyBPNK6gm*=>fyC$mcnVK|YoC*kqY4jH zRM1W6nO*ET!on%^UJDq*`N-pit4)BF1a>_l3M)NpE{~HY6PLuQWHQSc+o|FN%l1fW zv3(ES-%~wQ1GXIZ1h3osdwgDZTmshm2jG@RxX*u?4}!9mJJ)6X7opJGW2AAPywe@jU1H*3L@f`Fs^T++< zp|*?WBSMxL076OPYz=4=46c9hik-*UUUoSV`fPa6(?$n{`)>HH!#572a@#k(e4SPL z+W}TSN8a24IKA|pJsl%J?Us3Tg*|T24Xaeob3X4@#52y_OdHCE-&CBq8Ti&PE|?-k zQXP>lBEn)*a-Y)LwYw5 z-!gZ9M0A*yR7^Y>8bJ9Y3yRPsR+hhvd<#VGDH%J9j=Hp5KtP{^;n4%V&U>*3YmgSTDk?+aSe07%1Y?NccuSaP6 z!VHbeZJx4Uhn;YJ|9DX~)oy2l5u=tq`ZQgR+#+_&+0cHVk}qC&Qv}bHSle2M@E;=c z63Wgx%3rqTlj-qGH}|P)4z~70=zk57IQm`z8B1y^BiFv)#&-*n+Wcun3%L~}-+!to z-7Tvznm8=%rt(7>V#+(cLtnfKV?UNp)vwkHtmgKnOR<7sJjykv-(`AI;H_PWz+=-4 zjbFA5u%R{frk*O-(lQJ0kY)(cu)r>$*`z5TV?=}F<{S+<(&x@=_&$x^tj1=-n-D$Z z!sIrN2|Dq10%|le?m9K5@jbF{Do#*J1h(CjxW5puqC>2~qND^)z8N>$e=NX~5n74V zMzC&Q`}yDE5#`-yc#nva9tr-)tcvL{wHm|rbNJz46|U3?soPx~u}}0QhQ2f`OxlED z%Rt`mie9#k&ctU((6~s%wQqu}iKPdp6Z9CAD~T=p6S8^H1g3juSSdU`*^zn|?4F zkAB`JnIu%{<`g{Xb~HdGB%P6^F%@ni(nQ)mNwV23R`33Yj+fx99Tsji@ckM*i84Y- z&(0yb8F}SJRu0?SaF}77zQx1NbV}LT*?1N~(tlN|>e!Y$YMxf-*JY|~19$ute>T75 zzqKx0-v8+*$k~OW;}Vy?&rW&DHtvJFL_uRY%@*pM(PE5)9iomMUim5XU}$H75^Bv_ zfn6_IWn0Lpfc_;>er+LBsxM*VKbFq&4}2d{$UOecC3P8h9D&)(P&-y1joaU2TGR^l z1iN)V#-~Au;h$QVd4DAc&vtaSF;^g2Kh;3E<%qDirTzNr#lziY*+r#}p>ETt8^%d7 zd#n_75=S2Yahoeq(8QE+4>N#0(8JH5-SDR=y|F*o1;;Ccf9JkREFk!?n-dj{C{xoz zyx>4LOKFnkO zcKF;P-+Qu1rB!q)I#x)kq26>ZtBuRai0f`MdY@R(w{>Npy9y*xdED*|hxG`@@8o7$%^lo7UiSJDV=IV6oHjEGw34wo3Ed=`A(c8Nwhn z=nW;%_dvd=));yUiQ-;qL>i>Kpj|e-B{U5YuH&<6Tw|-tM(ghG08cR8BT{k_!@1QW^=YQ83XcZ{KXFgf+ zQ$XGhz}%i0y62OZXIdJXFwT*5-ak^Q8~_xKP%f4+Fh3#WfnZ<}i)g#NyoZ9`VwvOF zdO|vo<`V%<{r){b!&n|x!9evW45xu@c^mVA7rsMp3b z&-@<;SXr#R7J#{Y&(OY#4Ltsil1k&6yN-6TpEZNgO^Rs;rW8IB621GQBh0U6fA0+v z85xZtIMQnvHlg4S@}FrpBb+B}%|6C@MS@@1(bW-Qg1l^F<;&C)w}VmQ>?L{yfFc1R7dQmJ zH0n&TU|yq*KbdNcCO*Q#Ldc{WbS`$%)ju?S>X`{bqk4s?Fo3K5j!?5`MJwI`x#;is zV)-f z!r%7@p9jb>u!NZ_mQ?FZ_eu`G_^wANxWezU;oAc<>7Fjgd)EUb%kl_3`L81O%s7l$ z-(N<~6T57xxYbRfP7Dar7mfn4%+vW6s4IXN>bXGkvpb$@TeBIA;Fj5)6)H3v8&Jy= z^!@tsT~w65wf1OhF{y|+5`+Vg+Rx}Cr4MhwCOQGt$CL58`DcpmLigAI)&e@ya`_EE z8jG+N;VmT2XSgSj`}q48C(J$v5D$p!-`|{sd)aVy$%hsOFc5!2ftS@qW&KKQ^GzQO z6J|1Y-ff(TLajjq@Wskr|$+|trMTks3^1jg~eSQ6+B{(*^I^w>80a=2( zPjGNdb(^!bCQ6k$-D4DbVavhZUL(Ts72;#3K6(ZQ#e#H~yI+;n66B$34n}h{=H01! zczD=8gp>*}xj_ms93B$8hPm9(g&<|ssf=9?tKgOsNp2udhC(z=z&U;}NTpYgda>ds5j1b6&lN9Lyoi6mrhdNUjYL z+0rdw1Ii*XFfhbG_Skw59HlRLF}Zyp0bI(hb|lqstSW)A7+p zkHEr?supj1d3KRRgo&oAkG}v$${2%P3Cl`nRF>9wZ-TDQ5W{eNbJtljzmbuV#NRVw z;x36P=6LnjYfFPOB-eB#PT?YMJ3d+J+#-j!lK1Ly_olJ_J`g}U@vg`#5EiD4y}gE^ zA0MlyX>@qlZ7(-IgkGS#H*N=+By#qgrVVfZ-bN~~zAkjt^nvjGrsmfsp4(OL1}#hU z!gAhdf#!s~hX=!#L-d?I0b1eKrLealteEHfS2z>KGea!C^pXSUoyp}aq&>n`_JNVy z-^jm|Evk{+O1$P_YcrYCL`)6jlXdg{vVDqVpOC(sI~!sgrCSl%vI-&M4nz83zfd}I zXle5Y4I+=qDrR8gNTzwe;g17?JvV(UyWfnL-S@A&rksRX*WT3_zB z92=7#O35pRv1Bln5aCU!B)}*Dvj9}BKYKWKmPwtOZIgGUCv1|*J?++L^x#GVYQ)n@rsn@Gxat_ruy@d#M=gl)Tvn6=N~yze25;|paj1Nv7LZvJ&AQ+FN1IDGA|hVvS0t;L2} z=ej13&QGkL4=@|yzRY*)HhYS;+B zs=0Be>L7<{$&$35I_`Y2Kg6stMS}>+*FUzcw{)4YGedyKQfK{MFqy8bwitri_HkaK z=}fRXY=DX2U}4S$DNI|Jl$2D*L3hp1&yPV{+f=i}8aj`B&E9oN5b+s>x-Rmaq9({9 z(>JLEbe{e^F4xeQERcCm#YsnpSPxC>n}h-do#zD+ams4P?1g(u71N8ivU~>h!cPV|{C)iSxOU ziL=aX6$g~{G^0|12O#L8+&x$M-j{7wpgE&xGK3By&I+2EgkEB(NKR zR#qW9r2=pUXSg81;WAD{uhAefsT5@pF#*XiBo%8fywL3={h@|M8V15$M=&VXFbG1N zQrm$cVXqTx*N1cJ$rjHTUsYowBhR`}q(2`N@ZQxI)6)pv55`i>fH@a(yyHH))f}&C zxpjKf_wV0(XP+Mq9mdR-A%(DHu0?Wh43!RE=2*#Osv}}9Gt#4QR+|Ved(cN`6KCnj zNv@ND(8s7a1Cg=14u`#o`b^lkRbVu|Ri)VloRf~=RyWiPaY7E_3Oy4S5mCw+Cy}#) zv;B5a+FE3j!cbyB8s=0}w*-Y(XLFJI&M+!bM`t#iH#Z}@VmK0J5%u~|PCp*;rL}M} z0-;l4RziEGOy>oIFZU9XO!xs7QjsjlTkeU+5PNzkX#RF^M;=lgmKzoP-?P%TkM#&H z)msouZ;fRNI2_GS{U^u+hUE=Fgy3Q1Pqq}Ow^(@wu~e-J?YExZA3yO6Fl!{8QJ_?r zEwBvj15JA&hTa7Tx30TmnLui%25}4BIXfx$yRCSj7QYF825Q>)_;>*qjbqF`m|80! z%#Jkb2^o~pTj&G&afi)0*ybhXSQId z;Z{%Nf`OBrMnCrDH0O2l2D5%>jxrMppQ0=XS}H_RVh2827iqsN8YQ~I%)7NJTBkQx zu!oei6#MuOB@6u&b?D)c#7ml0e_-VrMP>27RBW@!*YT%0j0>p}0C->vV)W)yC}4`bEy%`TPD3I7a6u zZZ}IiL}U#n5xk2OnwpxkeU7S@il5hoKTL$Mi--Oa5Pr8omRN67+AzYqD&zzx?;QpL zawjx>>QZp~Z`4UEDJl4BlwP*~j6k^D??|2u?ol54=5?2eiAqX~NtNoXqxVUOj=&#c zs*g1M{q!$dXCqoxRxV0*BAcO_nbUyZ+1T1x?7SgCul(?`}tR&Ws;IU zJ1rCLI9xdc4LwP#7;+;5b-W}+3%~c-50myx&1gAU##+jk5jA@;**p(H!?ZA$*oy%w zR$}SiI{G#EQ>(%9EkRAtZTEtFEOH)x%u}6|% z+=eT$8`9e#gU-ue;Dl7))SA#B`2nUdMF`w%|K*7CKHp|DvO?*%*^lS+_QFXACgCnI zbMkP51gAz)s+qCfdQCuBF@x*kDJ4ZGvF;Gz7y-!>K$^f5Cw#2Q%65`vXv zt+9$--O`>y5~*W|22|du8E&#f1*Ko{7+xKB9|8VMUfY(6HQ1=fRIVa)2rn>O{`t81 zL^04N1w;Yn%Jxk1Y0gI}baZkU-&JllfW9qZbi_cuLl7`Q$j+^HBfPpUB`rBsq>Y?C z&*F|uy9BSO^x#bY61rK~Vujp%PI?v|6c@J9KPbEDsVVXNX_@LIV=F%?SB1*tD0X;n zR_|L@MotoyB=p}+LcPSn!cCglRhflI&FxXl?kgmae2Ko1i1vcz|EV3y`}bQ|rI$)@ zXN_RHmB9wACYWRfy}RCE6yFu%JEgh#W|eZK&g@kmmFD5>tg`7fn1@1)4_-Q70`b-k z>}^n3RrJ4*4hH5h+H6Z8x0gyZXngDmCy*ZS$v!FIQVmQ)9vKB8#dUJl;RFpLVLj6e zAZ=_kzAoVp17U1)u@Ax-U}P=AfNPcJTv{)VrV+`&DmH>Dj=Xj-Q%ulS`sKC^sr}hA zGFq;x^&N3mQI`W8LRf$(y@Wb#4xO7L8>|QQffGo?gh}AxV__?kG>|QCTDM0c%{TM~ z^sP}eq3}b_UHoV4KwVZpcB~*^a;@aOaQ83gr_urieonvqYCWuRlpBWQ-Gl-OZlRYJ zu7a7j#4bJMpw;Xh+VRD((Q#8O5r_n82BqP(>VPDpZOY*kJ;$hj>J7TCpsl(lvc^V( zzlWZ!l9{#0G14skNt$OQy+*4}_G$U8e{aHK2Nhcp$Sc5Y1&P9+%*l8Z=c!xD`=Bq- zb7fJ%W`fRem7vjc*Ju$1&lOn`2j8FJj z{Jh_5_l(6}G2P#CzNdwKUK&N^?OH5IuAIZIF%e*?g#|L`UP5gOME?iU9$Nj632Np4 z|8ED#{(kbCSQ!IgT#%=Yp;Q>KKani91oQQbKr7^O`e)S(_l+E;FTDj80!~b$(RvF6 zQ%t6JK!^25AQ0|l{zfi_s-Yz6?0gS_)AoFC;!sAU54t#;BN%M4Xxu{Yg{oTvS;`9l zF3X>0FrC^yEQ78P&ikC;U8&nkqg?SUx1*mtxYzz(2K?qRm8+t0Fer69R=Bpa|O@QQY2kq)-xmSRV#cLt^ zqR-q~JJ`)xaMKd2n{?;&NHy7+Z}oz8294w3&RFi2;jj4n2kr!3+)=@gOn%_RItc^O zt!;C@?XmYmtILfrHz@wQ+r&0*TExr~)nWCsRlkBaMm+Kw%tw8F%x)a2SI{J>>)7r9 zW&t#&9QfL69loq9t``Cb+%X9WY!1hZzkk0$`&L^4t{s^{e+V<=^THrrCwLJ98{i5) zK0Y9_uHri;1AK@79c!5Xl>u@Mz|aF0-nC-6T74OVGT;F;vd{lX1M=$P;h>?Nz`Qip zPCTvFNNb4d;P!&I4~(X9Cnr9fZS+c-_$^??o`MO# zNDqlj5cl;;M>YHV`|X$S`LEe{XhQLrW6%N}!NATW33yS1$5HJJ-5IHLnkzs6&EL~a z3hfWY&hLP9JulQ*Yj!c1tzZ58l#H7)Unn$@XQru^Q+qhUaC)A*5V9EJlXTKnQN|OQ@Gjpab29%kdOQyBDQL1qB75c*ghYE%4wGpx7SG z$BF;|IRqeGam2?@*sfsHGChD9_qkF6I`+RGgkjR1wz15Oxfm9N`=mc&PGuSHj2s^% zBH=Nt)oy)F94n11fCyWIGgiDP`5!*USMP z4T6W9&pijq?byA`<*wE47$L{|@Hj;LWiawC|3T{Pu<~6PE<68VKyYw%>mvPYz9c*} zG}kE z(_v+=R0>*N>aB&HRc(9P=@TqB-R>sb$uH1`$i z^g4jo3U5<$N416Bzem9C_4oYFKfSzsTtPTlRs1?=uAGK6?Qu9+7_Gzc!5F`t&|N{` zzL#t$naOT>z$X+3MgP*G1ZNcAQ$|i{WOt?UcjeuKyI}4l_&{0E0^cSF@+j;(OXZZ30`FeBstSzsQ zJ#M~E0h8`82%~s<11mrm%&Y;P*@gZMYutP|^m^z&-kyQq-bx3HsQzwm56ra{kRe1> z5l_G&*h+u=tyrpB=_iqIqsU(OtN!4*XvK<8#jxM-CWYN*%)BW)?*vootBjJK_mCWJ zDY@1E$-^@F>vu7m;N&?{bAV;_#aHMQq$RA;UD~JbR|C)4z*`H{=2OhP!q$KU-0O7< zc9Nk07hMTlkAW)w*94=_p&NiFS4(;}Psmo5zRH@aue01`Akw@11ggj72M(UE_-cM+ zk{ACjuLY|!Bn_Lsd2%rBN3e;RCCI?^R)67Fj0f5Rh}-1gN@v9p)W|!-iW>vZix1my zfQ_J$i;*!J6}(|$x>%|F`RSorpHI;VUCfC-tl(&JQr_4*?&uy}y#dUyS8r;=@OJqLAtv^KtPm~?(UG>Gzb#X-Q6JF-6@Tm?p8Xb<2kwh*LC0bJKlGU z=fnMe@Pm%Qz`fSm=bCdK$MKsn*Jc5dwn`2WTYey>138~&@M{-)92FXJ7w57enzOES z4qVpub%M@RmpH2sO(a9un7F(73&oD&=g$Qk+QkcYG>RXV2(LEb+)aDLF_tvA1{_?^ zJ8IM4jQ9>(crQF;iJa78+8wWn>fUpWnKzM#}mAkF$-7>rmv(C_`}IrGo2BmVZzeLIYPFNa z2CO!qxqtF_R+2um8f@fcp}mPk6m)$DsT65xX)#;8GYT%)`INb-qAlC3;2MycO2q%W zXk!kHYWh6((M{-3v1$|;g;|tY4go{N9b|D#ig^B-E!JWFfgffMHE*78Ox&Wq$wd~4 zl9_QrLv0SVZ&V9BXV}}b6D{6|snnO$kbQSJQ4?EJ@>2MIGN_d>8fss=ShHDbo+kF( zLm+ZzF?I2k=6ZhlQo`-!UlK1L5g~KJy2BB7$}e9|18PQPp5F^V6uGHCbM22ddmKG7 zjX5>62Fj(8-B>*)b$Xt9x!%Ufpp>Yw$qWt7Hgi)H%gUimnsZS7JEZ38{JSMPp*L1t4p!}tcz^RuKBx_#=A<+B7uPf#G|$6}MjELZtRP^Vki*ec|yjH^$=Xe-yocq}*^%-2>r zRA&4^mbgVs*S=70$wo*h4Au*SZ|+xeX&-lvM1*dHCB z)(XY`l=H9?I*3Tm2VOSYKD3%Cu%!bXA8c-4?MODL7yld?ae^QjN&y?3Yh-AjfPyrg zgn5@PFwtwgb>Q|gn8Yi8W~hlj!?$q1G^g%{TNs5bDmAIEnhRQ{ZFbQq*vg_?KZHd|}b)6(Zf3?1@!b zg>vd&TF2GJoTMtnQC6ZZ%fsJMj9{G>w-W1TEg8HUuLGWmyWH#)aC(+~{hK9`38Ip$ z{Ysd}_B70IR}p#&#$fWp+{(Y2@vzoD_tB(SNN;QNfT zT@1$>*@`dIZLRqE1W76J(a~$TSgF5zE{;)bR#Pe|C>fdaP3JlyJG`03D%$Td6sWlk zoj(T1seO2tPTfnL>nZKcKlAtT_!uR`0z0)Ox<&}K@Oz*6}dcOzJ{d%H5 zOh4lFbRD}DGY8zt>v*3kol25pd<)#5D1=RnC8g~6BTr85j|b>w3+ypUD*Sf7IrE7N z!&FVyHVVYBPLGc3!>f_Lj^+MwP3L!$2MjJfLk_QVeV@S`pq zk>HwQKTf`l#OvmajEvhE16)IyifrF7y=HrBLK`=I0OtW?dVd{u-3?4WbarVLy9HL` z4ZNRyBKZu5pc1XVX!X2>Y%%5fPh8au!E*Br@#GG($d{l<#j=Jsm5jFB8B%1?EvG%uGX_|tlo!{Nylto%XKw4tl}aQ|<)N7f@A$=WOT z81@!1$QPc8hEJ2zjD&2vFMgLLwo!@|cNZ}nsdSrMbSOGHcKhx8lqGtl{!>vx?r6#N zYB=82z_(7e6!)T< ztV&2|S)EWqlH%5B*d{h4g3;=#<&Z>Oy>Zd3+fU(fFnWn}wW6)d?HQPH%e#=M%~pJ3 zTA7Cg9QX$;nW9)a!@$7sAhzhd>b?+F(K{w-vVFCM@~t>* zW`Vlov7#`w2$tGvM6akqN+~V0*G|*H*G-P_kh@j!Jh?q6AJ&*kBe>DPM_Q9{jRTvk%(87R zo)6EWdQV61Sft^LZB5?MCgHFQ@qz4pl1lN1&DIa>K!S-!W1Xvz_x1Iiud^Pyo2W~| z;j9RH;Kc4ln#gj#)nnXvFFPHM4aK$oF!Z-B)s}ssS*INq?mx2tzc*U8J@yBU1LR%W zlSpW2y*S4wC!G;KaMqW>A22spBaV9J zC)1H8VFeR_f6pQVrhUJze**#kBg6eK@PKMZ{8(Me0Z#1}UwlwIEN|LXXQ zR|zYCbDz)Ss>0*Fe1ie#_kaFRxy>RXkG>m3!p*H59-f@V06j2o92p-E0sIOJ@qmGW z5B>LAR+Wrx{Gr7B5Wt^Eeh^VLv@H9lhwuCA4>)%lQzu(C9~FSb)1bEp6|3x}_zc6x2^1b1f%(>zH%PH)C09YAHbLb zR2iWe%OZ@1COzfAuk6*AI2v{@P$SyIpZho%#-44Vb0;HUQAfn}#kh-`pIg@Y`bc1X z_X#7&A<{sure_z8|7Y`O3~ST3Z{IjQXMO{kLkVcRLAoCNAFD#1a=`$*g@WP?GS_Qs zYoPsMmCd3BS&4GB%5~s_Spw}@dE3n{$XcTyBUgRW2LdbjCN8dnH@@l{Ew=yJm4Etw zbme^8jUb>38pa*amV#M<cVVu0#f)6%vHIf!T-|z5yM0VN&O-Nr@QH)MVF)bui}y}n%8GwT>fIKx-vqi?!hM>a&XPH@B&|PM zca|Mms&CL;;41Gu7-egmu6yq*U-&;dUGZPQo)(MlB-Yq=wI0&`aD#$>1Nw^f_4R#~ zn#7uH0uZW>InK@k!4&A8dFAiobx(}bGI*`*-7pv4Ko z;KqNw0VfHJImjUNeBa+K@Zt=>TKGR;t@$93fbZXgBe$>NC~%4$57L)&*eoU{f}lKq z(G-YlkdynmUIJ;Oad2gYG;5{FiGJM+B--tmn-@Wdp*vJ8R(0tUni43msE|M8vAT_< z@#B7~0C=-BM;cs$L0Tu?jTak4KA@Q*6peVnkE81|opYOf_~FeL3&bqh!p)~ygw_61 zGj3zSSJX%gN!0)%cvuqdZ{vVMv2Sm~j(F`S&N+>xVm5*xlg#HN{TT0+Ecc;8w>R@5 zrthM$U1UiA>}>z|L0{;`SV%vue|U&}M72*Y%pAYaGS6B5$d#V@?;#O8r6iK-|vtV z9q54pG_{)V5-3j(;4}bO7m}Rkd|p7l`=vzjf)zBI5`ttUc$44Bw%ZR{Bi-fXtqygvJ2-O z54u4wvLb1JG3)8;WzWyfKT+$}vv+p8gK;d%$WwXjo*yB^^Yk}6AE`VK7W(nhluR1T ze^vSczs5yX%XH((J|~NiKECo;#$Wn z4>mgpYd_&veku5bYP#GNp~YqTT69)W!j^0qY&@Cvu43ga$cqs_P(QMvRt$bLA^OyR zoP&-RuT>(&q|=g!gwV(D7Iu9%YZ$@0iRa1=N2o;%m=GJHb~q#5(0)z+tf`Yvnk~15 zII#|nM~9(W!e^%I2e?>T)U&3ucNGH07sn@O=ZMEAvr+LWF>wyI-RC=+Y*t!$>IjOz z*kn@&_@W@>^z_{Q&;@ABJE)@rwC-(W@OCF+roW5(wtw#aP;l_BFcqET8OkwjbGemH zCKaN%FFp0*@SnKS5ucOTUca~kwnFAHFfSCB( zqM-}_6xcQ^f){`rmu*sP22vBZ+d-^j_s<@#o3 zW+t2rLy|2vBP4Y??FDK}Qi|T69aMFSMZDMS+ zd3WoxX~CQ9zB#LtTcB30{P>_C83+kkwwJLc2o5TOy(;#K_#W_YkpJmXAQcO*Qn zyd9&ZARD=?6V8fJ*>8tTI$c>ShFw%ttBd>H1WTRy?8xm63h#RqJbzem$Jwf|P| zE!2PcLI^W+y~LM%xTnWDu0C3O*I{}JC=TnX6ON>ULdZm9b(kz(b`1_+tKpatcBNUl zL8K4pg3s}(ZR2=itl&7i3j+=f-)|&4D|jppy8KelHU7|%Ol2o(MRAM>-fVdS?6@K} zvfH_1)S6YRP47-V}h3znHIP(D+8cnh+vd6QG=Hc$0XXizr6&fDt|ufwNe?L z>FQ0U3FL6`XDc4H*6R#|&v|s{^hxjaMD-E~WCSj3tU*7!u;aW5FQ34^2Mun z(qmP@->KGJ>(N>YQwdjNJKmHDkc3B4eewpw)+hT8a5gKGC5QM#)EPW){(xUvB%k#> zhd`xq4QFPNzKtCyNj-^vmc33K!ouy|4>x_?<#U<(GLQ%o9z)6aK)Daa@m|dvI7bzW zx>1T#Wsg--FOiY2HOnmtC>IC&J^l5OjW;4s%H~QwWyHhqGEkXVX|sA>PowTJzF6Fw^hN*1!bUWKNCrhV;lpv^`?LQ>v(k$ih1!|n|PC4i7?bhtJa zG9J^&@}htMr)jD~*88m#-om@SAHTA!tuTJ{c^us9!R&vQy5W{-YLM%VZ@SM)p&}Yb zCXLv2c3HMBr@E6=>sV*fZMy>nFbL5;1yf7k;q%z)0cc!p_6P_Br2`57fUav{!5zp0 z^IH>u>tX2aHuL(IqAcmfv95P=@opu4dHRD*(l&hFk$auAi-^!-s^efv5x^d;dKHlr92xlVKon01uT8i0b0{fa)9x149>7 z$p6m5HXDI!0`d6tj|0#pr|dw94Paf$ z%Y|}-wYFH_X-=Ejt#|s7LlR9RNq~& zhDfzH(e<3gOC-M%_%TJV(Yk|QCXmySaFsVEb%KQ%>? zMrE;CYNln~IU}cJANim^4&Akj|IUAKqWFwF_L$~&fPPm;$BE?Xmb{z|I~`w~mA;Lo z@qOMi85;SrRNH!UD3y31>}C1xO1p4y5K&>qa8>(1?Zw`lX-2Or7A|h!yF_@bM#%^g z#FtHvpnrQ44rz|a(FH)FHHMRGkZ-vLss;t?cQ|6TyyLY%(kDAOUdy?ImsEh ztbASYO7jLc6-@8R&PUlc5{1ZcK);qF8j0mt03s)g>%AH~OXdHW1>ou`1?5;`(<$ls zu7I8g+jlc-1GL9a@MwJ54_Sa$|DF&Ki+|2*Wcs~=X?%MIAVFUvA|k3^M|zqi|iN?tLpXFSAPQ zyvPce??wdHTRLW!z^bSqwTqBLsLWZ)WSUg(Z}k$Sd+n9XW6{M!Kt~l4f20VxXt8QM z44}&s(iyz(L&y??X3qGJTdTCG9Piyl$ z;!dAmm!SG#vofmuDjrPHO}{ajSYu^mHp(cuo5v!LFO(l?w!@8U{e`AMdRwD8-Bd*B zVUfDr7TZxJqx0kVd_eg3-$%nk!Zzj+8ihHpShg_vhoUuCsS%gIo2t;_mNwtD&CLLO z-gXBBg%H*-yNG`|MuXXI2-SKOntx1auZ~hKkSheq}>@dkQ8OE5LLM zP7u5P&`?yjeCwO1AQIrnfrfAacuLK0B9CwO%8%x%5uha1HGtqYK$Ae0j7ZMKKYtHw z{d2}uAU^en0dwHZ={YENd51y`Z@^O~Rz)qHcnoZd*$lwXWvHfxhrm-imCpiP6;~zd z)uHZSM1f2V+tkf-4n*|Ne0`{0tf>fS1m~Ryq%81wQJ}pK)3akH>fwnkk~XE)!vqtX zOB5UivhG|lA#H)zj@ICp#D@QVGC_iuF7{O4sQ7*ZN#m}MNazwl&!nw2H zYZ}E_&s%M1d=U}!TaJXkc8lG(EPJOvAwtM|{ZCNbhJfX=|HFLWrPpz9jBfAt;Ytvt zm&cARwu|RI4(@2$h}JQeYSxe5*1SB}xKhW5$qZb3Sz{(IZqM0v`z<@@fx2#Q zI)7Dy&)WWxu zXorhlRb4$n0G39q(|fY6djR_?L=|wE32(c})duh_jFa*E&w2Y&C3kGe^d8qeI<9(6 zeZx5{r$dbZr9O}ZUzTKeR@dvgw}CUC{>&{@Wqspg)ev6Mn~>c^emWU$8K09NSnMhV zNe5XAiyt44fte8WY};2?CmX2jp)g9g+2*fPjWvy{DZVG8C-5AynBVM6vmc?-ecXCs zZ*N~Hh8snk;TzItc&xgeg<@JgWq0Uv#LA0FF(NohETfE&`*n4D379eyyZcQp=%5wW zqs*G2vDgeB(w9%?R%S?Un|H@=u&|3Ow~M^eg+1?@er-8;&41V4hngeH2Biw7oV{1% zF2Yo%nPg5t-e`RwQ?a!vgA(^kP4h@p z0ha7{bUqV!aR+JApP5>~rvn&4@~8*kKA`6263zArd){!Q<8M$`dj+7$th^gyHAIXV zA=yo?%8^lgS3sv)RwByt&KtBVU!#W9K@UV2sV|WRhMnD9FNLcNI}gh2OPEYx!;_o? z_Ri13tde2)gIym0@BI1wUc|TL1+4}>?|uhwA{tM*;=yu8A@9=&ikS4u2yZUUMuO8r z<@F;;TOoe>%Z{@1&PP++>z={NyK=RnDq{k{gWJKodu`7!MQ`H=uO+lNPo2B-uDR44 zQo;V#2cf7hPWSv>{`-o(<;)4ciTM&{P!dV;$RFhV7!JCwS5_Kz`5zOkc}~*`Rw)J4 zy3ajNVyY3mdCu+$z+}2Cwb)OGxUd_vxlcc^zQ=KS5hV@NGqZwii zedqKh#?0gdcwKsfd=@5|JaZRS$o4xz#lN3SncY0=c-eKn!i4T{0BqhFu*x;YL-CCR zp~SOsJhrwxnez;LMW4vHxGp9nNv#3jcF(KsL@M<~Tu;SIjcOB_ek}ae<5tZ;LxE>k zwP|@@>v3nePQ!#is~4AqW_rS0Y|m=5RxrKzj9YMqE`>lBfdt!>wK9{oO2eL|6qG}{ zY-Jf${A0!Mdv{4-T$4K0_w5t~7vbiOSMNK{yuG+qj|=-TBHZ@N4KKy7 zX#eI1A)MhTjBTY$>DXPE?fN@3g5yQa&|Sq!hv5*sVb-aQ(a;oMZ$v%ZfrR;5`CDJ} z%zS2&^|9W_9=On$c_wv^kT*Uj9dox3u$G}?C{)K#65351NOao$!dCSNPio$?%@^F)gMIc3pzyDuXpADVKG_0S@as**Zvt6^r@j6=hi{OQns^8~k)GBA{c=uHQ z{zJSUF2n2zsJ!M&bqE0l0py?nl>;Q$2=<|wnhd$h58>DA)e~- zOqDldM#RRoXZd#SXB_7NgZ)B>Zf`D!9}lbOVV1@mtTP@_*smQ=gNOZD=P5g%DK;Ke zv0YY+>g-4GdR9A^PC<1wAA&^EADl6xA9SD}%ZJY%+GQyRZ_}ico!vBBE@m2E75AwU zo`@ZGk_NlGX3V7}wz{`cy(WrZWWX!10Gm|=S0LMac;7LyME#NR>Rfz4#KAcEbzejN zr4DX=GoU5|h>dA?f;9q;XLkTvke-W1+Sd4MchbT&viO_m^vRGzHt>r)lha@R*DtKPNHv8#CtYBGua4+p#-x8545{r=F2B%tvnz0T)J;aEM(Aa)d`l0UBq1vC&=FD~f z8>@}8yqzCQw}+J7%>r&DOsqa*u9oXI&}qi?)@6Bqpt>(D(BQDvK@4Sj%L2!Sh`2$L zX;AOAUsph$YK8*Ck~EDT?`jJ#rh29rp1iQC zl>hhq|NnkFmYU(1RMzqF#RU_Hhy!NS$Jod|+tU9w&$7|ee|p96-744i!1pt-imD$B zF=?fwf;0ut6skVOZqcx){satjz~Vu3@&Kdat<6on{-O+!Z|?jG11nvAdVK5x%#o>i z>Y)Afa1MR)Cq9{KxhZrBK;Q4Y>{?)g$)wdFU#=tQYyiw)%1XBcf$;Cx$Ah0~f>iVz zbZ0pQ;EX|EvAGIF&ZhuNtz|mc(gmtd@ORH$AdHYoL;1{ za`UJG}#@sg~10`tTsIe29qO01P^SO%??SNx=v5H}iR8)JFk6zWIhljuX)S zTLQlhD79VIgQ$s)!2Cmuf}r0K{+DCu&q(t#irntZQ5eGP1rG2jmi`cTrZop%-yM|% z>Z&E63uzWGEh~I|kdH_nY38`p;;?i5SQetzc)QNGGQ(l=&2FQlRFS`ahr`iYBV2|7 z`VKmTLY4s+nGXw>K_zyOh~G_c+kktk8`cREo5m#-lSBLKosynEGB%JC69G?}yYZlI zL231$MFdgLL)XD`TKEq7&`bFgErd8eMGLd~l}pqVpwuwnMu7gXKlsnDyb$yFLvZZ@ z9c$vs{H^@~K=O<yLzQP>`a(X$0myU=9=x0s1efY_|Z2BU4Dgr5TRn5WHhBjX0Q?Mmg95gn#ri z%6EWn=bIUXHc=vTXIvVP`tP1{GQe6XB;A zJW>Z- zNs_qs9EJ`(7vW$k}v0m|o1SF8#?ZV8u`TqavBiKDIk!{2q2 zDp+-B1Ax&yvFHQ|N$uo}>aUFoRD$TV&zEMQvLi>M`hoqdOePT*3ZQyxGYlpHHj>m@ z!L$~TMoF^#`xaI=Dqx94vn*m8Gcx>q*B6E)%|$h$mc){u6cOXml#(x}Chg(N>VJ&B z_jt+tSF-gjWX zo!RDxI`c80}DAKB+a`ydA8=L`pY7PhA;&)|YYn zT8gg|ZB0#0y+Oe#pas#sIv+(d#0F(`M18`-D znb_D^;JlRsy!9tRzRsG^cXTV6sRTT4H^BYok_rZNK-aErrKO^y-_Y{S>EmEC0X|IA zB!6Na+f2ZKqamPbv_{Uy)TpW~2HRq#a)K`nM{@H4ptoxUOy zJYfJ@vxSKMe+Lt78D-`wNz_mqz{9j7uo%lveqN($8U$@f%Bje#0ZcP*Z|?vaTnvAk z3vd`)Ls|DddmrIhBC25CEaRKQly?2f#~@11yxz{W8ll^}tao!osI?-6klWnMa~RvX zAvpiRvUfBn$d@6Mgrr25#Qh!Kd!%M#tKlonzNW*J3@fmuFZ-)iZb~nI+Dn0X_$(`}Z~Q+D(2}`u_Q)-_1$qY*tS>RH+&jrJ4K5 zFHg>7Nk+ovBVdKD;Fx3l2S$=Q8Qgbisyi8@R4|cZW+f zXSg5oc7196tFn0oxWPb*EmtavPWIFRdciPrlH@O~C?_V416?qoc{&A>*syp2HLa=i zfY|)bkxzEQEUADFb`*W{d6fA~8F7E1uFOUJ)GuJaY# zuX6UAaGTIk|25gCCffC_@nfhKHrgoT6a*2Zm>C zT23T5?VsV;fY*;TGi%s8Su=b(zg)94qPLWk`mJma4#)}NY_H7PP_Y9@VYg~!QcZ$C zQ=IQot5oOn%MtDQ)Qu`({zm$SAO8Sid^JvcD$pKQF_w;`5|C_&OdOU4Ycb_UklrgI z)LHhTyWF~MZ(qT??59=T`r$-6*{&Qid=Z{Xc!0bHNM13D-+#h6jvfrRr{1by*Dv+OkEzQyZ(}69GCoKwRQ)g?j^-}N$ANe(J7CL@?>gl= zS@P<=<$*AJgWNLnm-Z@iA0ZM#wndU@*<4D}zkBTFUgOhf^f+VMEiM_F*r8Hc()1L5 zDueAV>}IKVLmmX(zKv;omL=sZl)YS%XhgTTYZ60?g@*3^AoLwW01H2jH2TVeAs=7t zGU=N^7dw{Y;i7tT-xCaY&EMx|u2f^HONYxdGt1%JtLtB%n6unKde|V|&uQoCIW1O@ zUy5*{~nA)BY~ZH*tJ6yvZ*uCw%}rK)_+9m(0`s4pb1ldiLK!f+}B# zNjNl%4j-Ri4AUDOb`q7AeEI4;z044inOZ{Bt-vxr-I&(=#jbu}vtqlHAdq8+y;N*6 z)~0+!-Xbk7%8s1+v3bYPr_Li&@i*jWeQiY3T zAk)aV84@cTTgU5IBWZ~6f&EY3O7}s_gZ#sW8sx!w)*MA>sXn77r}=o*<1l)&WIIu- zi*B3L1fsb($I_y=aDq4=4?V~NOi0C0J(Zdt7g;4IhqTpJq)BCNaodDAGvLw3?G_Sn z6Co5^9QF)xz!^Z0tk(|)QztkEtI&u)X7ij9A`e?{4Jo*&;&be^ScqtnyNNQ^*H zRb;S5s6SnPhk;jJn5B^^wn9Np&hw7rgpTF7$w84IuykNv#IWlzF92r#X^rWAG-p^x z^v;v8TrOWn$7EiDw6BZo?=7PpF8N(Omyd+ohG_ZSLJuu1vZ$ra^{R#c`T_;;2cB&m(!?^L;ToE!*BxERd3)dj$~f_K%^-zn>x;D6!mQ9kSR^xJKJ^6R(?$i8*_lZ)iX9BP!UNR2{iw}g0oKB}D zcU3SVUh~VFqHOgeJW+L*h0gEvbc8&2{q7ZsOs^di7HdjF>do}in(KemIiJigx#ph* zEouIGD0_*q(h>QUfo_1q?(E0V$ZT5l+AEyw!1efuoi8p$f*xIb7=+Wj!_zw>L_^&R zGq>JvLc0`7eXF^K@#aCyE6dX1`R>&`Z{11Dn^>R()%nzLZ$k!i#bc8sHvVLG|2k4L zf6pp>yU%_DSFd=IB(v_)`H>LKuTz|2n?NEhB^XbzI1XW*V`um%z|C(5m`_IyW};&-AWvVY(Q< zT0nWehuX7#>Qa42q(ynX94qnF^9jj-BS$nAO~AxrqP&TG-~00`!eSaC-qMwIMXWi| z>-W&#uNXdkM$WAR+1KF>+e%htBU*T2wwdVI4gMWOL0Jm{PY%g^ijuL!Y1l1Fj9IG0 zWq^iP{AHC40yf^BS5Nhy`wGAK~4T;N?pTBw3Jr;%lp+S$>j zi=^@M^C8>I5l#8tjO{NA16RoJp3YK5i7z88?IJdV>k~P}fBy(t>&#UNrAu;4;|)Ap zeKnm0Yba9B_}DbSJ|rYi zlYR;|Iq&HlEyt{P|N6xx?P9GY8eq6u(5Ss^*WfW}Q|)o6Ex^f?dzpA$S`~gMD?2nW z7(>>_(C?9K@{?mkfGt|pY9ML4*Zq2kPzlW>kAZ}bHPiXXTt*;jszy9VlAk$WYRY^* z{QqStCY0-IHc^YAnm?q4a^JlVI{hG@|#~I`P=fM(- zzLI^sjN!QBHzZh`vyiP<3(fy7wV@faDqG`sTq#g{m^= z1Y*!+-h?q<<_!~oVq{}d&%sjL&waa_7 zj}A7O>pWyO#`AKG53LOCD9JkM_`czlY{5!k?ttT?pK63plG=zaO_5np)3wz6c$g$j z@x)s;bSYpo2z}aPxd8%^TI5Cx9CjX(c*JV`b?Bb`Ze$n?N(O(&(ZWdtE&TYYM(<+d zV5zvTaG2-T!TMD8ha0LRM!yFULU?qe-BA7MAC;H!4cNEHQ-%t$$4C~_J#|e}@M&kH*PP6f)W(S_@CM#uOgM&q^M;iqEyJMjL+>hywM3)lgngEd7XLkw zjo=f1a?FD`u3i$cYQsh=%fZg1S<^PwFz$AFe)*ctUl6fv9s-V2kUjN53QZew#G*)c zO?|T$4|~=>-MdLVS>>Ey(nf8oc(nAg-bMUl0A%DVx4~5+$(sfTb$d1biiL5%8p}`h zXN%}GY%!uLOLl6O3Bg#0qBpQ6ngHkW1V8~O>#AQHT?Wm;m}_l_W=weKLPA0SO5HQ> zbix-%S;5)lZ;A7kaBUj-c`6+bQ&~rX981=dqkyUta%88?4^qg@tBD5KKISDbv&bg%zZIT)II(}HB@s?kq)jK@-lDIsZz0z}KMcCWN8muT zz@c72Q(*S)R}yL9K(faTpFDGI)HBg@dpVJD{=f<2x+skJYt+dCSvkPGxCO;5Ubzf_M5ml}5;7 zgI&J&ra^sWZbAZXH&P#4KiHbAsyn%<1e9EsFJNn5n0pif&I+*oB5^ZlA%6zmg+YGs zIf0Sr1st69T$T92=PymAc|JQj-uZ;8r$#^D#Ep$_C60o}=BcMf&TDHZPpW;v*xt%l zbPRg$LIhKfC|)+UXh%d3;D=O_Nw(QR0-WY8bFj$>dexD;qX+=!aM+>;MMtr7>kV({ zRCsB}d1(2qhgp5i#hh~gu^sbSQ_<1}Nr-<2jqhxWYjq`Vg1OBRV1s~ts=(46A20(9 zo&-;T2QW8+H{274_K|6of|hN;`Vp~a6krLqfo~^5Wu=a5sbv(WUvSSX986h+A^Uix z5a6E%QxyDHa!|p&2PV0bb&f@_FBvpo9gfbDzY3axhq`z(?0jlwP`}c5?SP_06;{JFRY!NXipFT0gBxrLw#pw=PW))BhZe%RR*5}zlZEMu)M1ICcW0&@MW0_ z@+mVl7{R#LDwOBDbD2vyI)ztKnf+0-{!XiL4HTAF-(_Uz_rYAt8W||NIX*uyMAxe& zvi@Lmh-|<{oWEqyvWkCl#^9%`k%Rq?oxk1)EnO8Aq<0~H)~q%hBI~5%34q9Q3?Dydwr53yeLNyKAR?9r5^R{RUZ&tv`_GWn;*N~oA~Z`08%FeP#}Qx z|APt*?7I_i{PVJENSP*W{v)z=FGPiD8yFX2=;=mgIS0{eg4Paz@;!d8e+9&J$=Bbd z;VT@FjKr{NP#ggf0(fj${HX_8Ko2gcWA(!yNJ7OFrC6ID7M9NV*Wzfgw89tWc*;MN zDjDG-fDf2(C)x#s4kp`hLUlr=>8dbApasqlG;Am#DL1~nlW}Z#ycm3;#o;H)!h>_X zRu>OE^8CiU;FoTc{Q|_Vb!E`Z;}?D7&FAqr*68wH3d@~xF;W6Q^T=^HIce+9|Rdk0LH2Srt#LDGtkbo#eI75W<2$% zqTpRFV$ZaMP88O{m(nO@lfAxl_d+^tg`$WqM?pAKlg@F%gTjL9SHb8dbkDdwYN z(bG%A$K*heuCJ{D@WXQ9<}msRVsgBXn+^HDziWRQKV2w}@nAEQ@7A=jDYKujwLF!E z)qB=vyY_r+((#jAdP0=`X&+4)uPZXDQlA*NMjAWKU(h}0g*Q?t@@-y$5p8AI#;kl= zULS`jS|kzPO5*Sn#nO^vq%{A_MXqS*i82&dxN%S%JlG$R6&jMn=N}yFT+@gl?$i2x z2D*BT*#;akQ^|HziHGWvq#e`w-}Idg^OFwkrA+(uB%cq!WBxJ3iwMUTTUX9dn+XZQ{A~X(P23nt-<ImWYE8TRA9e~tUT(qVSV zK^X;k<(oU_3~pYViG$&iVt*NT*7SMSq?!GX0f@V2BG=?6iWRPn?;+rbjC&1IHf8nR z9N<)BOSWFPg_;=XyA;G8fNpat?AZPwNbm zFPPMm;5#HL6S!0P)`mO&875xdK34tG^skQl)`tOrHwZOOf1Ym8&+|PwZJ{&mGojvo zwN>UepMcDkeJ5gXx-#KV5g+T)FX%ZWU(QDgi?d|k09t=z#r@v+rSY(ejb)z_75#9r z6~%vj%<8@l7ON5tMAcVt=5~Y&!UW}lvuh2mX@*42f_srBsb6cfha-UrZX(}~^Ve4D zfjYvVsSE|z(h}y+4JF{PVV#aNS7Bzg)-ny9ly;u2W@Nr#XzazQUU>M1VmI(4Ko_El z+b%{e*%?ZiY?XXn+oKk8&Dp3F$lTd@kruNSXa@2Izs_-go|t4COu}l&ZOu}K4`hEG zuC@D|0`BkXgN}DkPpPyMYb4oc>Gwn%B~$v7tkYI!jI{^q(aOvpfPD(WaEUov|3#N* zn#fRh<3j(92>Zf6mjEWJ*Em!%yr>%lZ)8?WCk6J#QEiCF6W zHEEn;oB|9tPDl(Y)>VGe5=DQV zZrhW)mNwP8KnlMy1QXZ(&`R?YEcfM&;?L;UmrgifPo#SXK~8n3`E^|K9ID($-cD2& zleldBH~E@w$>52_qhd|f=D`U?Q{e4W?GBaXHIn|%oiq&I0}m|c>(V1TT_3@{iXZ@! zu54Doq1q_Kh`Il?Y_ICW8<6*n3?2>+`*Vgum-X*J%ol6(xn@Y0*t6B>imUD{iTpyOAwG)O_Fp&~4`TV3FFFnWT}Wcu{9i!c z|9c@1lqyd+INS#rAQt7zWstmjm4p5KNl^lSgq(JjxHsHgTxP8)y?Eto07TI&;Uf@` zh%Xh(z>wI@t%*M&WqKEk9%U|RA)6q!0_a^i{H)Ap5{C%`;US(4F9`^40PouzE-)$( zsBV|Qr#oH7@NWfAdljU&{%f78=u(0*%}wk$@^_%PnKfm%g7W8SaVIh=3JMh22N|2L z24DlglA@KcRa_CfCAvm5Vy}0Eq zr@@AI|3FhN!P~fN*Dllpc*W!ZRV5eH0n!|zds!G-UN*ieC1ED)(MJtrf&cZZD6%B)EXkFCfl1Sj_@Hw}nY2*?TqMxOQ}` z3DIcX$xnGnfKCE7YJt_4;6zt^10qCK=E(q$HX99e&^q|q>cI7ViJtxe%Cx6+9#DTA z+uw(e4Rsu@#nUMVe^&fyR00fpbh7_!f5jms1$MHJ%Jo3z@d9*|0St2je8nhI*Uc!9 zc+qe$Qv$Z@RVhj;s?SU_uC{3o7KZaR=DA|*fK1p8WQ_ylz2CnjDWR`H#W*G%5(yk) zZ9ohFR^5VSut&B!Gm{KErtb{YJExhhfCy7(w;}N(%{1$@eCMnV1n$PQ!n&gI$wBfk zz34Nzl;G^h8~1MpF)L6uNxU>K`cC`i$@K|DJBbJqnZ1620?9e;Q@}ulP6Hz`&?EQp zlGHbWZ&)rvNCs9A)KR-nyKu+_zz&jg31h_^igO1(EJk+#d;;EA%DaDQarv;3Y%}1A zz>es&u3wV)vWBIUA2SM+5o>lJbmQN^e*}!AVsJ^KGm#5Yriv5+GL-8(N?OKCsL>IC zV}erT$EQEt5TRgz0R7b;fKD8o*#i8w;kA;=<3EGGieCeKw>P~XphAbt(LdzQNOX+k7BDW{1ESB?&*+jtJX%7|P{;x&9SPA52rQ?&hVP#64t?88 zjiIM{!YAa!p&en7cYP~Qu7!HE>d>6*jML>E!)Do2Ef@Taq2!8Cj;y!eIr&5P7(wXDS}Io zcP-cRr@E9d6Ep4t8nF)cHD=HsTKjJ#w4g2#R$~xXod$3;n zUNJEBi8p=>{F-F8=P#vMCe`DHIMi{$cst1s{A`dG?L;MP!7J@pl91#~$pHO5wcgM#<)>17C;1O-+q}_SuBt z0l(%JTz2TWLXyuD(!Iw>qW6_Z)lb;4PP;mzkcq;ERFujnb#t?FF%;GjSo5aQYjBPX zZUzjqs7#>ZZCf9?94_)Qb$S(?WHv6!@?u1pb0i2TGC8K=Yd&Eo21BI;%&PjaqO`Y* zy!YYzo}M)Go8%EdF=+z`JfOD%BDsy`2s*j9egNBx|)SH3{BP+H>SOj74{ z8JqMb(4^SD&56*4idMR*1CFOm!$(@jHAoGy*=M|59vW>e|ASQ%BP&t{bgC{j(%GTA z9vqV{wMKj6VImo4;>>|rp+3s@t0jDW>07#?ujgCs6!`=G*y5V>NQbd5%M2MOGd$Q) z?j4OCUswPzFsi1R(U68@A3wN#;Z=B)ul#2IG!kHCkvG<+-fh(Lk zRlP^}ret0`e&EE_T$b!p?$`!cG*ydc3jZ}IY%gHK7`#y#-tukF6*??9DQ#S5rzDO| z7C=}Nw~1i!FZqOCPC`$#i3zYLz%uPH?a)br9~K&42FgyLF219-(mtYZ?jh`WYZhC= zE)gj|InQ*RLftWix3}K+Id)}dG24Yskvz<{1()&c8!)#)08UFwqao>|kvpk3(9xk#7F;(?yUXJF58 zLdky(=4*x)*+{CikDaG**#YfOL!BI_Y{@d+@=$8HBWzP-T-;xv{qvNC&v%iNq`iuOA^%+TnUXKATGg!b1#wJX z#{a49%EPhT+pS9GGA2_+k_=@oBq4+-b7aVrA-uiFP#R>*JXRuPN~Vw@L&=z_qLL}| zl!_ulNrs&D?C(3*Isbguxvq20xBuC$_I~p`@AG@^VcqLqtE2y3hAmZk;45yDQd~7i zaI;O~9N|22x11mq)Y|6u#!A!r@;C#^?T_@dV@kEUjTW{Vi5oIGzgpSRPN*1n_6@2X zVcY)EYda=&He|Q)7N9C)oNwQ?M;AK<%XEpvmD#DM4(s`?>_%A2_w%BpR80RK168qwNJ|o%PO6EWte9rU)k* z$KmR##2ET3L2-|6ZKh|3;Q4XZfJZxuDi%2Yxl$%_!o(!Lud8kcu~yc6bk}yG?Whf? zbm=VyC7_!Sp0<0*@@KzZdV}-hsxm0fhV%AhrcaVYf0NGJ#%VxmcAT0gkb#qB=gw*r zJ%Exbz$6xa=XRW>xk^pgIIm^!<*o7IUBbq^q ztxN9@c`dpX$%KzVaN+C|$9AltMKET;ZchIS%V(9+zbvXtFQR9Ft%^OOpy4&x|3KV= z*grz)&+(8v@JZe11Y#EqhqPpJ6Z9CvROSjfuF6R9+}>^5v`_Zp7hO-?a*~D2hG%&5 z9BDhJvD8j_HkpYUZY%e}R*eX@)wMMl<)u?GM{Ai0RsAvHzyI}r@2mcG2d7TkR!m7n zg_@@Oz-&VZD+-zfUYh!@*RiZKKq6Pc2m}`Yj?N!M8z?dK|L6p0Pb_>p5$sMO2oLN6 z*9g!cTQIrj@!4Hnr1u#wL5}`*vMXE97QhR}n$VJahkmj^U35|yWzodh<6VISkSi=a z1r(~C_)q$xLIaJVy%%DgK7X$U{Y`q#o8F%sYctxYx#{m8b@aYG-h^$&=OD6|5gwy_ zx+1&`*MH@2CA{Cu2i#v{!T%wxKd-qO+q1^|(b3}AZDwR-{JDU|vK``9wWu>PwlN`i zzfW4JjG!T|e#^}R1Caj^!ihwQx`t+uUCi=1hLN~$i5vJD{K=YZcgg+LrAKTUg1>$H zMl@#%5Hf&-MXkgeH8(Kf{^VO$Eu+DZQDzEo4zFjK0gV(NSR*DW*?QyH%MLt$xXCSr z*h=ax38Ht4bH=ak;W#~$e+vz_^JYr-b?jJEVGF;{Ug7VrNr3J|#rpDBG4uX{aW)ZS zhSMQlIW33#aBGRU8iIO-w&T8>M`oBT)*Sm$|CYXfakHj>cz8INxaKZhZ4n-=xC3jD z*gxpX@2*?yJpSm1MX>RvY>T*D3PGX%5J*W+nHJI8XGo0~nt1DBVV&u`a+9l~DicqV4% znEUtF2**ztuo2@wHkk#4*f^2XZ%E=n>nk~Qy)7JtNegqQ}pufhhZ8Z2I*7hMIin?H@KkLXTAUBvLQ<^53G=L95sxM*>Cy({x&i36ZBW6572+XYzZmS(v(I5TKHTtgk6cz$l^^mkkDbx|y1yeX9NFQ@n#yeXHVW`7d*H?UwUMdE;fdq2I9?#|- z-k6`$z4itKk~H?zT^vylbegeiyX}B#Kql5LMj*T!E({P*xuVa&@bu|ZukvJBx82_N zBy0n7ud2l7cusYOl=u`Av`H&)sT~D0_CMGxCFY%L13_E6sQ#RB3|?|)`$?742w0fd zclKMne}2h>?j)-VIMM3rfw}UcB+o^xa-Tu>f%Bdt(s5Wa|G_7xoHKRpfCe105Mokk z>(%@>zFUL-@TrcH%&I_AKQ5G5tqVV*2wOPqUGf`4(-Z`OgI$GG<|HrmRvz8S)IAr^ z+pqKR^PAk(c!ybQmuUtC>mTSeJt%RGqjSHJ>9j5c6F!F6me7P2$ID%t>_v^jH&l9j ze$!*=yQSA?8y6E38DxE<{4?7YZfkw-D-~g+Fo-kAUcg2sz`{A}gxk9xpH0d1b3XSjRT=PhNu^AE#Os@N_xQNXR-hNc>x+e8-hQnz zCWGW7n-04^yuSXYp?$!L7(Gi&ojTTjQIOVq65`y~ZrL<`J7S0>bwURi!JpU&yf=$? zR#$NQ#g?}?n6n$@3|#k-yVwIZQs2JUn;|vo^-bm?XG7hrO;$#R)j8JSPF`l==%ENk z%7+I7Rv_2hm{ZT2b`6x-(>ke>TG<^yd;p~#_cr9_*S|-i+M{-;Gn5KnO>hiEs4aLG zu4;vy_u%2?4inO;@@Sz6yKhL^@WrpxYG? zCfFvPT0c#4ZM|4nI+rKM9%{->U9&n*&-^4Tz=`^jy1$%#K<&^v1gtozcx;ErFSdN> zGvOQv*0=2|Ki?JFVs}f9IySJ!j5WZSqTliuwcX30p;r>!&x+}38-BSqylrh&@SaJ+ z!kXwAuA@;q4reaQjOOjOxo5E>OdXd_=*x;kq%6f|Up4H{R<*n1dBW%?Pqxy-aoE|1 zuv7?<1G6`D#OL2eJeKDdJh3IgcSP((pl8ze{=o#bPN-ga0Y{xw6`9`M!5g{j=$j3_ zUedQM{6>oXmA4dr(W;XeWhPM-Ht+P+mYa{?R(!DSR#@m;6SYd!QkkpjA>{!7E;wxC zPN9|B_NP(r#g~b1UXa=;;22b4KK@k8T($74Oakd#$5JfWR*Oj7$xG<01~BJnGQzZx zAWB4}pcvfYbwn$@lV@FaO`~H!>G{42*)O6OkL*9H*wY>=jN9}P7r&sVqyS6eOU)t? z7mFP^+1LW|#sy4ju2oHz63RVd7iJwp{(5Z#Pl!B8sRwE4m)u3E`7gC57gp=(H<>8x z45vFVU*gg$sld0#|M8|nobFEYN2j{;xgA`mdkN-!qtUcvs*!b;h<6ZOnmMc&r{eE6 z?A{|X2psXDz-Y_fN3EO4jU$v zctf88l@EL-n}2XAWb;@#F-P{jE1k2p*_1O!F<6@u{OSQ;{9!05)XMTl%O;TAz}6o{ zLfX^vjos<}fo|-OxH8b~`-UWB?*g)|_#pk*|!ZErcVDHh(ki7Bt-^UB&)_ zb^E~~*8*6U>^ODvC#5;-5_`0Qs7{hjL!CSddFikqjtsCaZ58ZhpXg9;mX>^xu;+kh zK(cjGC8%&EndSCZnlAi=_|7{L2W^W&NXfSlr?=@rUYgOTnpT4@E@_%scj|rLzOjHM z>F1On|4{*(p`hI*ceDa&?NZZC#hKD4b4^ETj`glgI{K4kZ2Fv;&i*8&l$ZZP{%afC zlO>zl!z*^t)p#BWm{aF$W%`PAar|_~e_{d9s~EMz9$ShEwfw3Oqt5mFscvg3cXswFaH{@Zm7v7b_@$U4hkMsY+pHLl z>tAA#Z78}aHg&-PqnCs)y(L+LkN7`CR7 zHw46c^hB7MMXehAgS-kOE-h^FagNWd-X8>%CV>{8y{+jgzucj zw63|295ZEF>OS#NW8WgeZV8e(JYX!mlsM4Zx>{ILBT@5X;epVF0(Y%7`3SdW zzR{z*j~{=>FI--neza{Lm`6JZz{6NbDSjo~?kCvgj zVqY1QbvBELW028a<1Uvv*m@1diKw`|Mrt>do+$pBgf>7xNOd$aBqZ%E_MVxJiV2eu zuAG)FU+-gMnMJE(lL-6KDy*|j!9oH>qJh3Xs#;YZ7*PE9@nd9U1X+^sJQdg@FMk>J z#*#I$2jn~R^mt{c)xIgL8%Z6d^^_qE$a=PB69O!y3r{R$&c_|s&}acBfq7hnJgOSg zj`Bqx7#DPnlkflI`IMO!@`G!HjC+IB?e(oh=OXGd;&?>rp?-~#PS!` zVoPdoifw+-zgX`fKedFmY5Xk1G_>ZdN^GAa=h1bTRoT!SLn>qX%A` zC`+%_L}p$P97YWQo=S;U+BfGw{bXj5x8aqUIQ^rq41x<-@@&n^6J|mq!owl!@h~$n zG~P4b1)pdND+WLkwDU5}1=*~=@(bTvEmqL6j*d53t5Du;f8y-7-O?uwswF(SM_W%5 z%*y`JwgRsE0`F0p;^C#0<;5hZkGLxsF6BtCNem+Mx4M^I7>*n~qAkeBcOy11gjG=f zbqLzsWR)isbJ4}JF9Q-LS3&hI$}{ru@;bO)yef!*F%ri2q9``<07XyEG0%6~%>7`~Bx2CTZ9K|yex(__7eDR0KX{^us> z=6G0GY`FDdAcyx8+L}j(ohv=RW*#*4s>AR=V@RXphs#5)SdF?~Q)Q+ye%P0)Gl7&d_KfdTq3nM0ef&3tOhXW2|S$}PukijP$NS%`>ld&d;k!ZSCtfY`{t?+{I*?X<)a2U}1YF zA~;y-{`Ag{Er$lgo!)0)A1{C}3qm(`eu9r^{dMmk;*;9b8=zH?gd?drq z|JN)Q6z6^oUq3Dc>H>EEXfU>XgLsKBRfrk%M@@?%h$x|(w(&uYezrq!9wJfz*%%3v zLr%^d)7wZ3o?U6Y@Dy|p_j9ep%YnP-r9vi}!~@bjoad3ZdXn(A@V_?IDHKU)w4nQx zt;{J}Gs9zooWvK74Pn)ov%j+cwYc~PQ(u?2h@N+YexjRnPr7sG2LdFy^nG995y2QMd4=5kYozz1e)kkRrr}+@p~~`!BeVLx+dn|B^axiD;=r2? z1DAqhKZ*oU=>`v^YVE>022x1mL~zNr-zM1H!B|}8Q4xr7=IQ|5c;eM{%@VAK`l#@2 z4a=gDmU#t!Ogwn{r*G^r0RweoL|@rB#sVV7t&>CQgf66)bZGd>X6oQU#gzEpOQ*t9 zAn`{aLSUwOKt&7`1@WV`>7SK>IIVhvTJeAlI%AQegi5N{IiQ!QB41~4doUiS%gvwk zEw{b+$T@~(Yc#`iYT(K~U($l28Io!!$2cpH3cB{r8IP9sSV|4B-8rqpg>#Xr^>J_O znOOtdLPXwJv9rlf>60$>h&DGpu8+DfhQ zmt=N3zqCIM#`53#%OCf(@U-`cZsy#(Zt}`&)O*l#d)7cZ$#5Rfb=F3`D-%+6uk1e> z)L;FYUp~`Y(tNUV@VSuC__%sy6pvi}siqT2dJ6Z^nC8%ce{JX5Q8DoLZIoc})3!lQ zj-_8X4^0aXXyGZZXQeoU-)N;XzNUM$i<^GQVa}A1Q<8G9?wV>TGmVQ9!+D)UO@gPA zzs0j%uEG&T+*a<`QH&ks17>A;_B+VVBY8f!djhP6AoI03#w7vmxP8+VfN7WwjA>?7 zxi8B*cZ&+^?)Wt`$SwH(;UL>%Lm;RT-gNLsiduVP0VE2?NKfZ_b?DftVQn;|I@o(i~&VQ8_o81o5Iw&;SxVYwOPiyI;8;DIqE%LT}JV zQ`h*GqiH1I+ssf^B4N}c?wxiQK+2;rD=xx#ljjPaylkrJ$yG2ww=mZPBo+twC32r) zdwpxb8y$`)-$=CesIr`6(Z+HX=g0tCdv z@H1d1fQD|{Ji9V9S@~CyMu6h^d6qxhPMKCKWHm|}dj1;`6}Fvb{236$MzF8Fvp6?5 ziC1FMh_icj$s8G14T}z^T*J z)HJ@I0k%+>))ZBJ1P3Ty+UY%ilmZJITZ68&_l&vB5<**~>d6$ve1Pq%$CT;HQ&NUe z5=#g|yujLRzLQ~eUez?pvVt4awVM!$|!?R%0OlW+(l;w{F*`8EWj{KI!- zHkAQ3i=Y;oiO3=bey4o;E1gTt;Pm+$mh@#wFdSNz#&KxhN+l+E-zr7#yTEzntu zkX?=9F%nAL*8qsnPlcYb!M0_g$JT@?4Bt*rX40|m9M@G|N^ z`J*HD95f~5pokP2p7lsBnOy8JnT$a>d>zDscV8p$2`*_Goo4P1TntjQZEH6Wee@rp zQBggi3{bU3!dJO}?@DKZg)dCEWYzbLgZ*F>aOV!2JuM~I;nE(sBc6(hQ8|Bp3jCd> z8$KF1KN-CHX8=pMfccMlmv9n85;WxfB%ToVeFf{sM*Y-@W0R9k+x-uq78=30rGd?e z`%~_I5+?!`+J{vI-PwP=LeqF?w0+zwEp;=7hhgOn(_$E?m2{B!@^DTlpJ zvQjFGL$6^4-7*6WP5cqxgOU-~jVJRKqoNX1mXwk#!W>dDWNSJl>ZlJ8HY4qvoIK9} zsBs*FK76zHFdEhuxmEbY1i}-DkrL}xFPRU~NJhj)(5tCc;8;n#a4q#kIEN}|)2XDB zogsT+il=^q_R!vg{{2cpYGnj={K9PPQz`11tKi&-oGxgU=z*6Iqmw0O-+&=$>nfUT z3qkHO7GrkiVTKN7AKJOtX7~;nSeRV2x>(nK7NtidbQoD#SY&H2)muH-JyM+2lJJL$ zfW=?c-4ZxKPR{OelC1!eYZ2~&{&<`%J}PnZOQg{pTOO_@kLm7V^V<1A(98&5E?eVq z2Op?>(KZy@ySXF3gVw*KZt_sIPU3}IEN^%GN3rUq-R-FT+UoaSi-qikquO7PX28&D z`eAg4xE%!r#gwM1vSFO1uvwX?0aGbi9wl^bZ7l%&OTNAa?~&Y{mn(2z%!A`Xp3_vYJ^5=i?Zo1O`MaX35vdC(thb61pLi3Oq5Q zsxl@Dh4T?(OGsih#AQmT92r0`nfS+ZUbKALHr!$|*}}Un7x9>Wo9Z~ucbmHYZOrk^ zLoQO_-;)yhJ3$ofA6Cg9Vf;1}gYDq`J~rTR)i{xkVF{wVvm|uefS_}1Fx+%e%x9_S z@%sp)ftb=|Mv$n`b@!b`$ciCyR45pN9;WMgkU-MFU4$2N(}mXnryUa&``sr0CzZqM zf+VD$1>TAtOBQhRj`Q6F0cIqNejiul7L)}{ji$L9l?tj=)%$;z@#96k2T%0ilpj-0 z!@3zT`HSx^#xCdbcw_xc11@wze4&exdCoCGQOODBIWN5XWv4aVJ``qn9siI>m%{r@ z2jgc4{V}D9^*Gz&w8>7fxq4ALv!u?P6-8JJooUN3c38ZX7OM1AAWgvA?-U$w% z#MNl>MpS3oX4G2BH4+`WNDJ!Q?kL56KCA9rP^ zZ@*iH3l2;>Zt&=Q#KD)-1^2Nm3dZL<#mC12{{MOc*MWct$1_wv)#h9&A>53f1j*9t z*l`cMkz%8kgJn?1v;Of;;m8Th>4lTPfCtm|Wo)Vo;2m_>yv)n3$q2+drB3x&R>yr5o7@4x{ z;FqOgRz$1CD&x6Q4LYqld~T(8YMWqYG3j-@*#=F|C_$&8Cj zNZxPF34RK*;LIOhg{nJl_eET6_lt{*d$_y*WFdk*naJuk&G5Q8DyhJt*S@>xCla4P zwd~p-O;Ib9&#E>Zw|G5V$U3#om9hmcTH8CM#Q&B8XuE4Y`oeL4(d#6$TjLGKpSS#t zguA-FCSWq?DOM?Iay|Fn=z!p*pvM2;xzXXv<*>6*Yx(PSi17vp_r>HE6Q%w zCZl)Dc~aOX_TRj4L28MJ0b&g;cW^A5mpkb@IWHUW*~9{unEwBLDg2~62yr_Dn$WG|froEmuYT_7;kbgx^G_!f zB#+Ap=eNt9GOhYh465u^;(FV4-6p5QXkuY32HmH}^Y-~d1z|_QCYRGMoBn=&H3-I! zH>crIX`gNJU#s#2Qej)$JK^kOiV12fG1(wpf~h_iIvr9 zrchz#8;C5m9)1<=FAuSD{NFAIDfoDKQ>CZCBmeG?D~Tq5T+s=~vz*epp2SEL9_DF3PI>-b~&w) z{%&viaCKPGdZRg-%y#{mS_Ia(5ADMTsWG(*U1yXZ5ZyRGqQD=z->$mO_BS+e@~f7p z%6PRn9iqh$`8?U5>TX^gPHQVDD*pT{Ss1O|=wR*_y*ntesoHWiCDrP2J11Z;r2n8# z+|<~p&(D)InBnu%2;Orjo<=T_QE-^^VDSF${yZ}@o6T&IlK3!QjoDT0FHF9WPEC>6@hQZc7GHRkIM+R7WBvF&CN~q zs>mDyK6lnx&YK3i&9`|~w`KlIb_kdbI|DIbr4qY{zU`pqV}pgaCr9sNAz4mc+z`l8 zUO^fiTfA4D9lX2P7I-|VRw+?MEzELx_s1|2MzH0nHb`27zq! zRuqLfD!jg-tWy{b2dBYyo&TY@pr8OwyUq%iUSby4VQ(bF1HuEJ1<|(VZo5CldAE|i5v$Nh)v6Xh677=F=URK;&4bU}*Ms~>XQE+P zl|u3@ZWqdbH_zmSo~LH|qxc^vJ#J2>^JRolxa9M)$F7yZb_F4j3v<9eODK?DuT5IU z!TbhGl>hlk>1+dxDoLUUt{^)InJALfdw(o#<_!hOACTPgL>^z~lQOKKu~)v5n8= zz=+w6$LPLRxT)LfE-EhWcyfBW+UnuD{SEb5v({p>Vq4q&V;gC5|1mf;V?5_(E)sve zPy?iQZD2UK!#e#k4_NF)BKWnz4g>cjjq|uYTW$GP4U<Ow^E;ZEN7A_xW;AsreAt=`_=1FSytWm^3X_>0+%P97_1!Kf}| z_m)@?DuMcva9sJHj6Ak_LTuaap*pi`#(DpSUr_Ud^QlxIJ9!UQ%ChM*{W}53BzZ#5 zmC~H4!3b2bD8kWijod@hBa*S?#0@a=#kHHib!+*s>{dus9&gX}8Xa~MnGDs5=9ppf zu@lFY_t52d1y`$%I=uAN71td)>Xiqo$N8l=9Y%%-EmDpYZ&JA&qut_uWnpCPGZ z7dju$m6|dt`}}*p1qsqXN3GWsW0QXSulZUF*KAey+j@tgI4X;{t+B1<+~Xx6g*oOV#*yq(?Kgq@WR2uY#-$N3l8?ah0DSP$s zi(cB{Q|0i_E=`-5DQ+*f)2bF1)$(E~Jx0Sn`Fb+=*iV)KV zx_>6#rknqE#Swrup*RJ7=x=Y`IQ{CIQ#30*dgoA~*NHoViqO_t@bk-;x|(da1`*|F$&{WpJ5 zt)G`jeLtfzYTMlwymapEn#cHox7TjG+Fi5rv8u-+iQGt4L@}be{(`HzdUEed-;s!4 zyaih9rp2YZh_TN*8I39j~`RlghR8g-K#`ox~^Ez55w3rqL2u#ZOUNtX6B z9AxBE0G(cc7Ll($csyHezW!`nUR8L&DSX1<&YaI-5P=!BFIe4Rz&hNL-kvDYcNam+ zIS|c~ohzpBU7W}(u6>BC?DJ1)`_vze>;}0$Bfl6jOf)VPiKdl4S)Ppery%oPMSGW8V74bP`MF<0=cKa~4}UuPdl&_2z^ZRGb#?gFy}e5*ywmw$f>=o?oWbx{ z9n?7sji?z1vu1;x{tL5z-(*%3`l@<$Vtw*-PhX$nZ)hUV35;@Y`T)BF;xE?IP}GJ` zW*GK#1hrWj35VfCjVL3+{m8ECsO%Y^=lNvAgI7=!K3~u>MQ+vTQ>sXHM(X2sV;D?n z2Wp}zL$zIN|L}0S*b=?IiZP+_D{?rCyIR2(9I#@Z-^%ByWDI7BQz2N@=_tioe@`Pt z4(o{E=;)c|7Oi1BLnPx1B5e_59<%FJY5FA#INN;~=*#` zvj%1sHx*D;>j#K6U~5d!LZX$p3?)VT7J3B8SU=dK+`=^WpQ&C4S@y@TckVP$5X>O5ZoJKZ0)FEm!6Hj02JUx2yv32Nw! zJ>TFuJdix)+tgoNSQMM-Z?hGA*8HOBo27p>s{e-zcpXzyj&>&oA(J9f>^ ztnFe|peQfaCwo?aY>qX>3{UH(Xt~FF9sF@Hk`VM?Qb^4Hl`HmOv#ew6&+GZjp2VjA zXL#@&E;N?flarGV6`Qk$OH#k+*~GNky}g#}tRs$n$>Si5pNygVL2#QAFo@Y?T&*#W zbuU#HP2~4_`1f)vuq%;wOY)GvHXQJ|nisL`N9OhjG8`s#Zn}sQq45Vznqb2z)eoVw zC2Ai;jX>>^+*?**%zr?>O^J?5uF}v&qf)%HQATx`rCO$W=TnH1Bh&h|^Q}#Ja<>9h zLgxJq2o1BOzft^@XmA%Tv3>jcJa|J!=Mk8(#0re7O#Q zlgs5gJf&9LIP6s9?flDhO8E%zs-RYigZM!^$b^PW#6Pl#`Z1h#sL_5~jM)>!duwi8 zfI{5XJoQ=M{SZ ztB2EnV_>Im~eFsq41+KDPy=z7e!&+a)njv0V%=^VlYzhkaame->mnJ^1|e zR{usv4HbGlQ?Ip(-W{sRcA|8n^xvwn1DA*Qr>HYjr3t;zc zK;|$yxpXGS&Cx8pN3ZnsSCw@(xl=ouas?l=C# z5iUZVGmx?a+-xVG8>T(=-fhzV`TpRWbOhN~&r}%lM=xfol64Lwvu6hPDMi*0OAbh!%u8l-sYYMoCI zTN_JqO4pk2F?HZnMNVGNQPw5L1U0=SBQZU53QbOvGiM7yi25;zh+6VL#dPp}5i&O=c z_W97R_=PEg^9Z2FH7G*FBJhq{nJOzQODQ+BO`ceub;VEu!gmE+;$i6Fj_X-WM!ud# zI>Ym!2tV%r(lcqDPp1(^d6#z8@I|B{(8*Ws9#9&kd>hkhG~=N1mHpTS_@WJiT=9n8 z_&=b|r4NDue3oAr@qa%5Z%&Y8<^R^DfjMKpq=N%9nTBJ|>ZIb2ls#Mjs~8Rs$2e\n\nafter" + const { container } = render() + + await screen.findByText(/after/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.textContent).toContain("@problems") + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps the shared regex boundary rules when a mention directly follows a link or inline code", async () => { + // Matching must run on the raw string so the shared regex's start boundary + // sees the real characters: with no whitespace after a closing `)` or a + // backtick, `@problems` is not a mention (the collapsed + // component rejects it too). Replacing the literal regions with spaces + // before matching would make them actionable. + const markdown = "[file](/src/a.ts)@problems and `x`@problems" + const { container } = render() + + // The anchor text is a stable, unique wait target. + await screen.findByText("file") + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + // The text still renders verbatim (link + plain text, no spans). + expect(container.querySelector("p")?.textContent).toBe("file@problems and x@problems") + }) + + it("keeps a whitespace-separated mention after a link or inline code actionable", async () => { + // The space is a legitimate boundary for the shared regex, so these + // mentions stay clickable: the masked regions end before the spaces and + // the match ranges do not intersect them. + const markdown = "[file](/src/a.ts) @problems and `x` @problems" + const { container } = render() + + // The anchor text is a stable, unique wait target. + await screen.findByText("file") + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(2) + expect(mentions[0].textContent).toBe("@problems") + expect(mentions[1].textContent).toBe("@problems") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "problems" }) + }) + + it("renders a standalone mention with no surrounding text", async () => { + // A mention that both starts and ends the text node exercises the + // no-leading-text and no-trailing-text branches of the splitter. + const markdown = "@problems" + const { container } = render() + + await screen.findByText("@problems") + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + + // No leading/trailing text: the paragraph is exactly the mention. + expect(container.querySelector("p")?.textContent).toBe("@problems") + }) + + it("makes mentions keyboard operable (role=button, tabIndex, Enter/Space)", async () => { + const markdown = "See @terminal." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mention = container.querySelector("span.mention-context-highlight")! + expect(mention.getAttribute("role")).toBe("button") + expect(mention.getAttribute("tabindex")).toBe("0") + expect(mention.classList.contains("text-[0.9em]")).toBe(true) + expect(mention.classList.contains("cursor-pointer")).toBe(true) + + // Enter/Space must both post and be default-prevented: dispatching a + // cancelable event returns false once preventDefault has run, and Space's + // default action would otherwise scroll the expanded task panel while a + // mention has focus. + expect(fireEvent.keyDown(mention, { key: "Enter" })).toBe(false) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) + + mockPostMessage.mockClear() + expect(fireEvent.keyDown(mention, { key: " " })).toBe(false) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "terminal" }) + + mockPostMessage.mockClear() + // An unrelated key neither posts nor prevents the default action. + expect(fireEvent.keyDown(mention, { key: "a" })).toBe(true) + expect(mockPostMessage).not.toHaveBeenCalled() + }) + + it("preserves regular text around mentions", async () => { + const markdown = "Before @problems middle after" + const { container } = render() + + await screen.findByText(/Before/, { exact: false }) + + const paragraph = container.querySelector("p") + expect(paragraph?.textContent).toBe("Before @problems middle after") + + // The mention span should only contain the mention itself. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + }) + + it("matches the full mention path when it contains markdown-active characters", async () => { + // remark tokenizes `@/src/__init__.py` as `@/src/` + init + `.py`, + // so matching on tokenized text nodes would truncate the mention to `@/src/` and + // post the wrong path. Mention matching must run on the raw string instead. + const markdown = "Run the tests for @/src/__init__.py now." + const { container } = render() + + await screen.findByText(/Run the tests/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/__init__.py") + + // No stray for the `__init__` part: the whole path is one mention. + expect(container.querySelector("p")?.querySelector("strong")).toBeNull() + + // Clicking must post the FULL path, not the truncated `@/src/` prefix. + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/__init__.py" }) + }) + + it("matches mentions containing asterisks on the raw string", async () => { + // `*files*` would tokenize as emphasis, splitting the path across text nodes. + const markdown = "Check @/src/*files* before shipping." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/*files*") + + fireEvent.click(mentions[0]) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMention", text: "/src/*files*" }) + }) + + it("resolves mentions and line breaks together in the same prompt", async () => { + // The raw-string mention preprocessing and remark-breaks both rewrite the + // paragraph; they must compose: the mention stays a single span and the + // soft break between the lines renders as one
. + const markdown = "Check @/src/file.ts\nthen review @problems" + const { container } = render() + + await screen.findByText(/then review/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(2) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + + const paragraph = container.querySelector("p") + expect(paragraph?.querySelectorAll("br")).toHaveLength(1) + expect(paragraph?.textContent).toBe("Check @/src/file.tsthen review @problems") + }) + + it("keeps placeholder-free output when the prompt contains no mentions", async () => { + // Preprocessing must not leak placeholder control characters into rendered + // text when the (raw) text happens to contain mention-like patterns that do + // not match (e.g. @ not preceded by whitespace). + const markdown = "Failed@localhost/status code 404." + const { container } = render() + + await screen.findByText(/Failed/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.querySelector("p")?.textContent).toBe("Failed@localhost/status code 404.") + }) + }) + + describe("line breaks (breaks prop)", () => { + it("renders a soft line break as
when breaks is set", async () => { + const markdown = "line one\nline two" + const { container } = render() + + await screen.findByText(/line one/) + + const paragraph = container.querySelector("p") + expect(paragraph).not.toBeNull() + // remark-breaks turns the single newline into a real
so the line + // break is structural instead of relying on CSS white-space. + expect(paragraph?.querySelector("br")).not.toBeNull() + expect(paragraph?.textContent).toBe("line oneline two") + }) + + it("keeps soft line breaks as text by default", async () => { + const markdown = "line one\nline two" + const { container } = render() + + // The text matcher must be inexact: by default the newline stays inside + // the single text node, so "line one" is not a standalone node. + await screen.findByText(/line one/, { exact: false }) + + const paragraph = container.querySelector("p") + expect(paragraph?.querySelector("br")).toBeNull() + expect(paragraph?.textContent).toBe("line one\nline two") + }) + + it("keeps blank lines as paragraph breaks when breaks is set", async () => { + const markdown = "first paragraph\n\nsecond paragraph" + const { container } = render() + + await screen.findByText("first paragraph") + + // Two separate paragraphs (the blank line is a hard break, not a soft one). + expect(container.querySelectorAll("p")).toHaveLength(2) + expect(container.querySelector("p")?.querySelector("br")).toBeNull() + }) + }) + + describe("file anchor validation", () => { + it("does not post openFile for traversal targets and still prevents navigation", async () => { + // Task markdown is untrusted: a `..` segment (e.g. `[x](../../.env)`) must + // never reach the extension's openFile handler, and the webview must not + // navigate to a bogus relative URL either. + const markdown = "open [the secret](../../.env) now" + const { container } = render() + + await screen.findByText(/the secret/) + + const anchor = container.querySelector("a")! + // The click is still swallowed (preventDefault ran) but nothing is posted. + expect(fireEvent.click(anchor)).toBe(false) + expect(mockPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "openFile" })) + }) + + it("leaves non-file links to the browser without posting openFile", async () => { + // External schemes are not local files: the anchor keeps its default + // navigation behavior (no preventDefault) and posts nothing. + const markdown = "visit https://example.com/docs today" + const { container } = render() + + await screen.findByText(/today/) + + const anchor = container.querySelector("a")! + expect(fireEvent.click(anchor)).toBe(true) + expect(mockPostMessage).not.toHaveBeenCalled() + }) + + it("posts openFile with a ./ prefix for plain relative paths", async () => { + const markdown = "see [main.ts](src/main.ts) for the entry point" + const { container } = render() + + await screen.findByText(/entry point/) + + const anchor = container.querySelector("a")! + fireEvent.click(anchor) + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "openFile", + text: "./src/main.ts", + values: { fromMarkdown: true }, + }) + }) + + it("posts openFile with a line number for links with a line anchor", async () => { + // The line anchor must reach the extension: the posted values keep both + // the parsed line and the fromMarkdown tag (a `values && {}` mutation + // would drop the line field). + const markdown = "see [line 12](src/main.ts:12) for context" + const { container } = render() + + await screen.findByText(/context/) + + const anchor = container.querySelector("a")! + fireEvent.click(anchor) + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "openFile", + text: "./src/main.ts", + values: { line: 12, fromMarkdown: true }, + }) + }) + }) + + describe("empty markdown", () => { + it("renders nothing for empty markdown with mentions enabled", () => { + // The falsy-markdown fast path must produce the same empty output as + // parsing an empty string: no paragraph and no leaked placeholder. + const { container } = render() + + expect(container.querySelector("p")).toBeNull() + expect(container.textContent).toBe("") + }) + + it("renders nothing for empty markdown without mentions", () => { + const { container } = render() + + expect(container.querySelector("p")).toBeNull() + expect(container.textContent).toBe("") + }) + + it("recomputes the prepared markdown when the markdown prop changes", async () => { + // The prepared-markdown memo must track its inputs: a stale cache would + // keep rendering the first prompt after the text changes. + const { container, rerender } = render() + + await screen.findByText(/first/) + expect(container.querySelectorAll("span.mention-context-highlight")).toHaveLength(1) + + rerender() + await screen.findByText(/second/) + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions).toHaveLength(1) + expect(mentions[0].textContent).toBe("@terminal") + }) + }) }) From 3a92bd884969b8657e6c4f0013444653ff553f31 Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Thu, 24 Sep 2026 09:25:30 +0800 Subject: [PATCH 2/3] chore(webview): address automated review findings on the split PR - stories.tsx: use providerIdentifiers.anthropic instead of the raw provider identifier string (zoo/no-raw-provider-identifiers) - TaskHeader.visual.tsx: keep the visual test to state setup (expanded heading wait + overflow check) and the screenshot; the behavioral assertions (list/mention/br counts, scrollable class) are already covered by TaskHeader.spec.tsx and MarkdownBlock.spec.tsx --- webview-ui/playwright/gallery/stories.tsx | 5 +++-- .../chat/__tests__/TaskHeader.visual.tsx | 21 +++++++------------ 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index a2f357d501..9115b76ea5 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -182,9 +182,10 @@ export const stories: Record = { ) }, "task-header-markdown": async () => { - const [{ AppProviders }, { default: TaskHeader }] = await Promise.all([ + const [{ AppProviders }, { default: TaskHeader }, { providerIdentifiers }] = await Promise.all([ import("../AppProviders"), import("@/components/chat/TaskHeader"), + import("@roo-code/types"), ]) // Representative user-authored prompt: heading, bold, inline code, a // bullet list, an external link, soft breaks (single newlines), and the @@ -213,7 +214,7 @@ export const stories: Record = { return ( . + // Establish the expanded state deterministically through the heading + // (rendered only by the markdown pipeline in the expanded view). await expect(component.getByRole("heading", { name: "Refactor the billing module" })).toBeVisible() - expect(await component.locator("ul li").count()).toBe(4) - const mentions = component.locator('span.mention-context-highlight[role="button"]') - expect(await mentions.count()).toBe(3) - await expect(mentions.nth(0)).toHaveText("@problems") - await expect(mentions.nth(1)).toHaveText("@terminal") - await expect(mentions.nth(2)).toHaveText("@/src/billing/invoice.ts") - expect(await component.locator("p br").count()).toBeGreaterThan(0) - // The prompt overflows the max-h-80 box, so the snapshot captures the - // clipped, scrollable region using the shared .scrollable (VS Code-style - // scrollbar) surface. + // Content assertions (list items, mention text,
soft breaks, the + // .scrollable/max-h-80 box) are covered by TaskHeader.spec.tsx and + // MarkdownBlock.spec.tsx; the pixel receipt here only pins the rendered + // state. The prompt overflows the max-h-80 box, so the snapshot captures + // the clipped, scrollable region. const scrollBox = component.locator(".scrollable") - expect(await scrollBox.count()).toBe(1) - await expect(scrollBox).toHaveClass(/max-h-80/) const { scrollHeight, clientHeight } = await scrollBox.evaluate((el) => ({ scrollHeight: el.scrollHeight, clientHeight: el.clientHeight, From 06491514facf518faa432aa28a7d6ddff1c9cc6d Mon Sep 17 00:00:00 2001 From: Eason Liang Date: Thu, 24 Sep 2026 10:36:22 +0800 Subject: [PATCH 3/3] chore: re-trigger CodeRabbit review

QrEc2zyr1qiyMM6lH+bG(j-~O;Ui5^Z|6 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 literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 02f696553f..bddef6db83 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -3,8 +3,13 @@ import ReactMarkdown from "react-markdown" import styled from "styled-components" import { visit } from "unist-util-visit" import rehypeKatex from "rehype-katex" -import remarkMath from "remark-math" +import remarkBreaks from "remark-breaks" import remarkGfm from "remark-gfm" +import remarkMath from "remark-math" +import remarkParse from "remark-parse" +import { unified } from "unified" + +import { mentionRegexGlobal } from "@roo/context-mentions" import { vscode } from "@src/utils/vscode" import { type AlertType, remarkGithubAlerts } from "@src/utils/markdown" @@ -12,6 +17,262 @@ import { type AlertType, remarkGithubAlerts } from "@src/utils/markdown" import CodeBlock from "./CodeBlock" import MermaidBlock from "./MermaidBlock" +// Control character that wraps a mention index in the preprocessed markdown. +// It cannot be typed into a prompt and carries no markdown meaning, so remark +// always keeps a whole placeholder inside a single text node. Built via +// `new RegExp` from a string constant (a template literal) so the control +// character does not appear in a regex literal (no-control-regex). +// Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests +const MENTION_PLACEHOLDER_CHAR = "\u0001" +// Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests +const MENTION_PLACEHOLDER_REGEX = new RegExp(`${MENTION_PLACEHOLDER_CHAR}(\\d+)${MENTION_PLACEHOLDER_CHAR}`, "g") + +// mdast node types whose raw source regions must never be mention-rewritten: +// code blocks (fenced or indented), inline code, links, images, raw HTML, math, +// reference link definitions, and reference links/images all render as literal +// or non-text content. Rewriting a definition's destination would corrupt the +// reference link's href; rewriting a reference label or alt would leak the raw +// placeholder into the anchor text or img alt (rehypeMentions skips anchors), +// instead of producing a mention span. +// Stryker disable next-line ArrayDeclaration: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests +const MENTION_MASK_NODE_TYPES = new Set([ + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "code", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "inlineCode", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "link", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "image", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "html", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "inlineMath", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "math", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "definition", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "linkReference", + // Stryker disable next-line StringLiteral: module-scope static; Stryker 10.0.0 vitest-runner skips static activation when testFiles is set (false survivor); pinned by mask tests + "imageReference", +]) + +/** + * Rewrite mention patterns in the RAW markdown string before remark tokenizes + * it, replacing each match with an indexed placeholder. + * + * Matching on remark's tokenized text nodes truncates paths that contain + * markdown-active characters: `@/src/__init__.py` is parsed as + * `@/src/` + init + `.py`, so per-node matching would only + * see `@/src/` and post the wrong path to `openMention`. Raw-string matching + * is also the behavior of the collapsed component, so this restores + * it for the expanded view. + * + * Matching runs on the raw string so the shared regex's boundary rules apply + * unchanged (replacing literal regions with spaces would turn a preceding `)` + * or backtick into whitespace and make non-mentions actionable). Literal / non- + * text regions (code, links, images, HTML, math, reference link definitions, + * and reference links/images) are marked via a throwaway mdast parse with the + * exact positions remark sees, and a match whose range intersects one of them + * is discarded so mentions inside such regions stay inert. + */ +function prepareMentions(markdown: string): { preparedMarkdown: string; mentions: string[] } { + // Stryker disable next-line ConditionalExpression: equivalent: parsing empty input yields the same result as the early return and no mention regex match is possible on an empty string + if (!markdown) { + // Stryker disable next-line ObjectLiteral,ArrayDeclaration: equivalent for empty markdown: an empty or undefined preparedMarkdown renders nothing and the empty tree has no placeholders for rehypeMentions to index + return { preparedMarkdown: markdown, mentions: [] } + } + + // A throwaway parse with the same extensions as the render pipeline, so the + // reported positions match what remark will tokenize. Mark literal and + // non-text regions (mdast positions carry absolute source offsets): a + // mention inside any of them must stay inert, because code and links render + // as literal/interactive content, images, raw HTML, and math keep their + // source text unchanged, a reference link definition's destination becomes + // the link's href, and a reference link/image label or alt renders as the + // anchor text or img alt (rewriting any of them would corrupt the href/alt + // or leak the raw placeholder into the rendered output). + const tree = unified().use(remarkParse).use(remarkGfm).use(remarkMath).parse(markdown) + + const isMasked = new Array(markdown.length).fill(false) + visit(tree, (node: any) => { + if (!MENTION_MASK_NODE_TYPES.has(node.type)) { + return + } + // Stryker disable next-line OptionalChaining: equivalent: remark always reports position.start.offset for parsed nodes; optional chaining only defends against a shape remark never emits + const start = node.position?.start?.offset + // Stryker disable next-line OptionalChaining: equivalent: remark always reports position.end.offset for parsed nodes; optional chaining only defends against a shape remark never emits + const end = node.position?.end?.offset + // Stryker disable next-line ConditionalExpression,LogicalOperator,BlockStatement: defensive: remark position offsets are always numeric, so the guard and its body are unreachable in well-formed output (NoCoverage) + if (typeof start !== "number" || typeof end !== "number") { + return + } + // Stryker disable next-line EqualityOperator,ConditionalExpression: equivalent: i < end already bounds i below isMasked.length, and the mention regex boundary lookbehind prevents a later match from starting at a previous match end offset + for (let i = start; i < end && i < isMasked.length; i++) { + isMasked[i] = true + } + }) + + // Stryker disable next-line ArrayDeclaration: equivalent: placeholder indices are computed as mentions.length - 1 after each push, so a junk initial element shifts all indices consistently and index 0 is never referenced + const mentions: string[] = [] + let preparedMarkdown = "" + let lastIndex = 0 + for (const match of markdown.matchAll(mentionRegexGlobal)) { + const start = match.index! + const end = start + match[0].length + // The raw string (not a masked copy) is what the shared regex's boundary + // rules must see: masking would turn a preceding `)` or backtick into a + // space and make a non-mention actionable (e.g. `[file](/src/a.ts)`@problems``). + // Discard a match only when its range lands inside a masked literal region. + // Stryker disable next-line MethodExpression: equivalent: mention matches are word-boundary delimited while masked regions begin and end on non-word syntax characters, so an overlapping range is fully inside or outside and some/every agree + if (isMasked.slice(start, end).some(Boolean)) { + continue + } + preparedMarkdown += markdown.slice(lastIndex, start) + mentions.push(markdown.slice(start, end)) + preparedMarkdown += `${MENTION_PLACEHOLDER_CHAR}${mentions.length - 1}${MENTION_PLACEHOLDER_CHAR}` + lastIndex = end + } + preparedMarkdown += markdown.slice(lastIndex) + + return { preparedMarkdown, mentions } +} + +/** + * Rehype plugin that replaces the mention placeholders produced by + * prepareMentions with clickable spans matching the styling used by the + * collapsed Mention component. + */ +function rehypeMentions(mentions: string[]) { + return (tree: any) => { + // Stryker disable next-line StringLiteral: equivalent (empirically verified): in this unist-util stack an empty node-type test degenerates to visit-all and the visitor no-ops on non-text nodes, so behavior is unchanged + visit(tree, "text", (node: any, index: number | undefined, parent: any) => { + // Stryker disable next-line ConditionalExpression,LogicalOperator,BlockStatement: defensive: unist-util-visit always provides index and parent for non-root nodes and a text node can never be the tree root, so the guard body is unreachable + if (index === undefined || !parent) { + return + } + + // Skip text inside spans we already created (the visitor may revisit + // children inserted during the same pass). + // Stryker disable next-line ConditionalExpression,LogicalOperator,EqualityOperator,OptionalChaining,StringLiteral,BlockStatement: defensive: spans created in this pass carry plain mention text without placeholders and the visitor does not revisit inserted children, so the guard can never change output + if (parent?.tagName === "span" && parent.properties?.className?.includes("mention-context-highlight")) { + return + } + + // prepareMentions already masks code and link regions, but keep these + // guards so the plugin stays safe on any tree: inside a role=button + // span would be invalid nested interactive content (WHATWG) and its + // stopPropagation would block the anchor's own openFile handler; inside + // code it would corrupt the CodeBlock text extraction, which only keeps + // string children (the mention text would silently disappear). + // Stryker disable next-line ConditionalExpression,LogicalOperator,OptionalChaining,StringLiteral,BlockStatement: defensive: prepareMentions masks code/inlineCode/link source regions so no placeholder can exist inside code, pre, or a; the guard is a second line of defense + if (parent?.tagName === "code" || parent?.tagName === "pre" || parent?.tagName === "a") { + return + } + + const originalValue = String(node.value) + const matches = Array.from(originalValue.matchAll(MENTION_PLACEHOLDER_REGEX)) + + // Stryker disable next-line ConditionalExpression,BlockStatement: equivalent: with no placeholder matches the fall-through rebuilds the text node with its own unchanged value (or drops an empty text node), which renders identically + if (matches.length === 0) { + return + } + + // If any placeholder fails to resolve (should not happen), leave the + // text untouched instead of rendering the control characters verbatim. + // Stryker disable next-line ConditionalExpression,MethodExpression,ArrowFunction,BlockStatement: defensive: placeholders are created by prepareMentions with self-consistent indices into this same mentions array, so an unresolvable index is unreachable (NoCoverage) + if (matches.some((match) => mentions[Number(match[1])] === undefined)) { + return + } + + const children: any[] = [] + let lastIndex = 0 + + for (const match of matches) { + const mentionText = mentions[Number(match[1])] + // The raw mention includes the leading "@"; the posted value is the + // full path/word after it, matching the collapsed Mention component. + const mentionValue = mentionText.slice(1) + const mentionStart = match.index! + + // Stryker disable next-line ConditionalExpression,EqualityOperator: equivalent: a zero-length gap only pushes an empty text node which renders nothing, and matches are ordered so mentionStart is never below lastIndex + if (mentionStart > lastIndex) { + children.push({ type: "text", value: originalValue.slice(lastIndex, mentionStart) }) + } + + children.push({ + type: "element", + tagName: "span", + properties: { + className: ["mention-context-highlight", "text-[0.9em]", "cursor-pointer"], + role: "button", + tabIndex: 0, + onClick: (event: React.MouseEvent) => { + // Keep mention clicks from bubbling to the TaskHeader toggle, which + // would collapse the expanded panel right after opening the mention. + // Stryker disable next-line CallExpression: equivalent: TaskHeader's root onClick early-returns when e.target matches closest('[role=button]') (the mention span itself) and no intermediate ancestor handles clicks + event.stopPropagation() + vscode.postMessage({ type: "openMention", text: mentionValue }) + }, + // Keyboard parity with the click handler (a role=button span is not a + // native button, so Enter/Space must be handled explicitly). + // preventDefault keeps Space from also scrolling the expanded task panel, + // which otherwise receives the key's default action when a mention has + // focus. + onKeyDown: (event: React.KeyboardEvent) => { + if (event.key !== "Enter" && event.key !== " ") { + return + } + event.preventDefault() + // Stryker disable next-line CallExpression: equivalent: no ancestor in the MarkdownBlock/TaskHeader tree registers a keydown handler and preventDefault already suppresses the default scroll action + event.stopPropagation() + vscode.postMessage({ type: "openMention", text: mentionValue }) + }, + }, + children: [{ type: "text", value: mentionText }], + }) + + lastIndex = mentionStart + match[0].length + } + + // Stryker disable next-line ConditionalExpression,EqualityOperator: equivalent: when the mention ends at the text end the tail slice is empty, and pushing an empty text node renders nothing + if (lastIndex < originalValue.length) { + children.push({ type: "text", value: originalValue.slice(lastIndex) }) + } + + parent.children.splice(index, 1, ...children) + }) + } +} + +/** + * Rehype plugin that drops the lone "\n" text node mdast-util-to-hast emits + * right after every
(its hardBreak handler returns [
, "\n"]). + * + * The paragraph styling in this webview uses `white-space: pre-wrap`, where a + * literal newline is significant. Without this, every remark-breaks
would + * be followed by an extra pre-wrap line break, inserting a blank line between + * each soft-broken line. Removing the node leaves exactly one line break per + * soft break, independent of CSS white-space handling. + */ +function rehypeStripBreakNewlines() { + return (tree: any) => { + // Stryker disable next-line StringLiteral: equivalent (empirically verified): an empty node-type test degenerates to visit-all and the body's tagName guard no-ops on non-elements, so behavior is unchanged + visit(tree, "element", (node: any, index: number | undefined, parent: any) => { + // Stryker disable next-line ConditionalExpression,LogicalOperator,BlockStatement: equivalent: hast elements always have a tagName and unist-util-visit always provides index/parent for non-root nodes; mdast-util-to-hast emits a lone newline text node only after a br element + if (node.tagName !== "br" || index === undefined || !parent) { + return + } + const next = parent.children[index + 1] + // Stryker disable next-line ConditionalExpression,LogicalOperator,OptionalChaining: equivalent: the hardBreak handler always emits a br followed by a newline text node, so the sibling right after a br is always exactly that text node and the checks restate the invariant + if (next?.type === "text" && next.value === "\n") { + parent.children.splice(index + 1, 1) + } + }) + } +} + // Codicon glyphs used as the leading icon for each GitHub-style alert type. const ALERT_ICONS: Record = { note: "codicon-info", @@ -32,6 +293,22 @@ const ALERT_LABELS: Record = { interface MarkdownBlockProps { markdown?: string + /** + * Render context mentions (@/path, @problems, @terminal, ...) as clickable + * spans that post `openMention`. Off by default: mentions are only + * actionable where the text is user-authored (the expanded task prompt). + * Assistant-generated content (messages, reasoning, tool output, todos) + * keeps mention patterns as inert text. + */ + mentions?: boolean + /** + * Render single newlines as
(remark-breaks) instead of collapsing them + * to spaces per CommonMark. Off by default so the shared pipeline keeps its + * CommonMark soft-break behavior for assistant-generated content. The + * expanded task prompt (user-authored text) enables it so plain multi-line + * prompts keep their line breaks while markdown still parses. + */ + breaks?: boolean } const StyledMarkdown = styled.div` @@ -273,7 +550,7 @@ const StyledMarkdown = styled.div` } ` -const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { +const MarkdownBlock = memo(({ markdown, mentions = false, breaks = false }: MarkdownBlockProps) => { const components = useMemo( () => ({ table: ({ children, ...props }: any) => { @@ -305,6 +582,14 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { values = { line: parseInt(match[2]) } } + // Reject path traversal: task markdown is untrusted, so a + // `..` segment (e.g. `[x](../../.env)`) must never reach the + // extension's openFile. The extension re-checks workspace + // containment as a second line of defense. + if (filePath.split(/[\\/]/).includes("..")) { + return + } + // Add ./ prefix if needed if (!filePath.startsWith("/") && !filePath.startsWith("./")) { filePath = "./" + filePath @@ -313,7 +598,13 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { vscode.postMessage({ type: "openFile", text: filePath, - values, + values: { + ...(values ?? {}), + // Tag the request as markdown-sourced so the extension can + // apply strict workspace containment: markdown links are + // untrusted input. + fromMarkdown: true, + }, }) } @@ -394,6 +685,14 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { [], ) + // When mentions are actionable, rewrite the raw markdown before parsing so + // mention matching runs on the untokenized string (see prepareMentions). + const { preparedMarkdown, mentions: mentionList } = useMemo( + // Stryker disable next-line ArrayDeclaration: equivalent: this mentions list is consumed only by the rehypeMentions plugin, which is registered only when the mentions prop is truthy, so the junk element is never read + () => (mentions ? prepareMentions(markdown || "") : { preparedMarkdown: markdown || "", mentions: [] }), + [markdown, mentions], + ) + return ( { [remarkGfm, { singleTilde: false }], remarkMath, remarkGithubAlerts, + ...(breaks ? [remarkBreaks] : []), () => { return (tree: any) => { visit(tree, "code", (node: any) => { @@ -415,9 +715,13 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { } }, ]} - rehypePlugins={[rehypeKatex as any]} + rehypePlugins={[ + ...(mentions ? [[rehypeMentions, mentionList] as const] : []), + ...(breaks ? [rehypeStripBreakNewlines] : []), + rehypeKatex as any, + ]} components={components}> - {markdown || ""} + {preparedMarkdown} ) diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index 2c56fc418a..04bbd62ca3 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -1,13 +1,21 @@ -import { render, screen } from "@/utils/test-utils" +import { render, screen, fireEvent } from "@/utils/test-utils" import MarkdownBlock from "../MarkdownBlock" +const { mockPostMessage } = vi.hoisted(() => ({ + mockPostMessage: vi.fn(), +})) + vi.mock("@src/utils/vscode", () => ({ vscode: { - postMessage: vi.fn(), + postMessage: mockPostMessage, }, })) +beforeEach(() => { + mockPostMessage.mockClear() +}) + vi.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: () => ({ theme: "dark", @@ -217,4 +225,553 @@ describe("MarkdownBlock", () => { expect(screen.getByText("Third level ordered")).toBeInTheDocument() expect(screen.getByText("Back to first level")).toBeInTheDocument() }) + + describe("Context mentions (#559)", () => { + it("keeps mention patterns inert when the mentions prop is not set", async () => { + // Mentions are only actionable where text is user-authored. Assistant + // content rendered through the default MarkdownBlock must keep mention + // patterns as plain, non-interactive text. + const markdown = "Check @/src/file.ts and @problems." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.querySelector("p")?.textContent).toBe("Check @/src/file.ts and @problems.") + }) + + it("renders @/path/file.ts as a clickable mention span", async () => { + const markdown = "Check out @/src/components/chat/TaskHeader.tsx for details." + const { container } = render() + + await screen.findByText(/Check out/, { exact: false }) + + // The mention should be wrapped in a span with the mention-context-highlight class. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@/src/components/chat/TaskHeader.tsx") + + // The trailing period must remain outside the mention span. + expect(container.querySelector("p")?.textContent).toBe( + "Check out @/src/components/chat/TaskHeader.tsx for details.", + ) + }) + + it("renders @problems as a clickable mention span", async () => { + const markdown = "Review the issues listed in @problems before proceeding." + const { container } = render() + + await screen.findByText(/Review/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + }) + + it("renders @terminal as a clickable mention span", async () => { + const markdown = "See the output captured in @terminal." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@terminal") + }) + + it("renders multiple mentions in the same paragraph", async () => { + const markdown = "Check @/src/file.ts and @problems, then review @terminal." + const { container } = render() + + await screen.findByText(/Check/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(3) + expect(mentions[0].textContent).toBe("@/src/file.ts") + expect(mentions[1].textContent).toBe("@problems") + expect(mentions[2].textContent).toBe("@terminal") + }) + + it("posts openMention message when a mention span is clicked", async () => { + const markdown = "See @/src/components/chat/TaskHeader.tsx." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + const mentionSpan = container.querySelector("span.mention-context-highlight")! + fireEvent.click(mentionSpan) + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "openMention", + text: "/src/components/chat/TaskHeader.tsx", + }) + }) + + it("does not match @ in the middle of a word or log entry", async () => { + const markdown = "Error: Failed@localhost/status code 404." + const { container } = render() + + await screen.findByText(/Error/, { exact: false }) + + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(0) + }) + + it("keeps mention patterns literal inside fenced code blocks", async () => { + const markdown = "```bash\necho hello @problems\n```" + const { container } = render() + + await screen.findByText(/echo/, { exact: false }) + + // Code is literal content: the mention must stay plain text, not become a + // clickable span (which would also make the text vanish from CodeBlock). + expect(container.querySelector("code")?.textContent).toBe("echo hello @problems\n") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + // No placeholder control characters leak out of the masked code region. + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps mention patterns literal inside inline code", async () => { + const markdown = "Use `@problems` carefully." + const { container } = render() + + await screen.findByText(/Use/, { exact: false }) + + expect(container.querySelector("code")?.textContent).toBe("@problems") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + // No placeholder control characters leak out of the masked code region. + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps mention patterns literal inside link text even when enabled", async () => { + // A mention inside
must not become a nested role=button span: that + // is invalid interactive content (WHATWG) and would block the anchor's + // own openFile handler via stopPropagation. + const markdown = "see [open @/src/main.ts](/src/main.ts) please" + const { container } = render() + + await screen.findByText(/please/, { exact: false }) + + const anchor = container.querySelector("a")! + expect(container.querySelectorAll("a span.mention-context-highlight").length).toBe(0) + expect(anchor.textContent).toBe("open @/src/main.ts") + + // The anchor's own handler still fires (nothing swallows the click). + fireEvent.click(anchor) + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "openFile", + text: "/src/main.ts", + values: { fromMarkdown: true }, + }) + expect(mockPostMessage).not.toHaveBeenCalledWith(expect.objectContaining({ type: "openMention" })) + }) + + it("keeps reference link destinations inert and preserves the original href", async () => { + // A reference definition's destination renders as the reference link's + // href, so rewriting it to a mention placeholder would corrupt the href + // (control characters instead of the original path) rather than produce + // a mention span. The whole definition region must stay masked. + const markdown = "[docs]: @/docs/readme.md\n\nSee [docs] and @problems." + const { container } = render() + + await screen.findByText(/See/, { exact: false }) + + // The reference link keeps its original href, untouched by mention + // preprocessing, and the destination never becomes a mention span. + const anchor = container.querySelector("a")! + expect(anchor).toHaveAttribute("href", "@/docs/readme.md") + expect(anchor.textContent).toBe("docs") + expect(container.querySelectorAll("a span.mention-context-highlight").length).toBe(0) + + // Masking the definition must not affect a real mention in the body. + const mentions = container.querySelectorAll("span.mention-context-highlight") + expect(mentions.length).toBe(1) + expect(mentions[0].textContent).toBe("@problems") + + // No placeholder control characters leak into the rendered output. + expect(container.textContent).not.toContain("\u0001") + expect(anchor.getAttribute("href")).not.toContain("\u0001") + }) + + it("keeps reference link labels inert and preserves the label text", async () => { + // A mention inside a reference link's label renders as the anchor's + // text. Rewriting it to a mention placeholder would leak the raw + // placeholder (rehypeMentions skips anchors, so the control characters + // would render verbatim inside the link) and a role=button span inside + // would be invalid nested interactive content. The whole reference + // region must stay masked. + const markdown = "See [the @problems summary][docs] now.\n\n[docs]: https://example.com/problems" + const { container } = render() + + await screen.findByText(/now/, { exact: false }) + + const anchor = container.querySelector("a")! + expect(anchor).toHaveAttribute("href", "https://example.com/problems") + expect(anchor.textContent).toBe("the @problems summary") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + + // No placeholder control characters leak into the rendered output. + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps image reference alt text inert and preserves the alt attribute", async () => { + // An image reference's alt renders as the img's alt attribute. Rewriting + // it to a mention placeholder would corrupt the alt instead of producing + // a mention span. The whole reference region must stay masked. + const markdown = "See ![a @problems screenshot][docs] now.\n\n[docs]: https://example.com/problems.png" + const { container } = render() + + await screen.findByText(/now/, { exact: false }) + + const img = container.querySelector("img")! + expect(img).toHaveAttribute("src", "https://example.com/problems.png") + expect(img).toHaveAttribute("alt", "a @problems screenshot") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps mention patterns inert inside image alt text", async () => { + // An image's alt renders as the img's alt attribute, not as body text. A + // mention inside it must stay literal: rewriting it to a mention placeholder + // would corrupt the alt with control characters. + const markdown = "See ![a @problems screenshot](https://example.com/problems.png) now." + const { container } = render() + + await screen.findByText(/now/, { exact: false }) + + const img = container.querySelector("img")! + expect(img).toHaveAttribute("src", "https://example.com/problems.png") + expect(img).toHaveAttribute("alt", "a @problems screenshot") + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps mention patterns inert inside inline and block math", async () => { + // Math regions render through KaTeX from the formula value, not as plain + // text. A mention rewritten to a placeholder would leak control characters + // into the rendered formula (MathML annotation included), so both inline + // and display math must stay masked. + const markdown = "Inline $x = @problems$ and block math:\n\n$$\n@problems + 1\n$$\n\ndone" + const { container } = render() + + await screen.findByText(/done/, { exact: false }) + + expect(container.querySelectorAll("span.mention-context-highlight").length).toBe(0) + expect(container.textContent).not.toContain("\u0001") + }) + + it("keeps mention patterns inert inside raw HTML blocks", async () => { + // Raw HTML blocks render as escaped literal text (this stack has no + // rehype-raw). A mention inside must stay verbatim: rewriting it to a + // mention placeholder would leak control characters into the output. + const markdown = "before\n\n