From 9e2a967c0d69344b735086a207181a5e0388d93d Mon Sep 17 00:00:00 2001 From: seeones Date: Sat, 10 Oct 2026 17:20:41 +0800 Subject: [PATCH 1/3] feat(chat): restructure user bubble, drop role labels --- webview-ui/playwright/gallery/stories.tsx | 4 + webview-ui/src/components/chat/ChatRow.tsx | 89 ++++--- .../ChatRow.user-feedback-bubble.spec.tsx | 223 ++++++++++++++++++ .../chat/__tests__/ChatRow.visual.fixture.tsx | 44 ++++ .../chat/__tests__/ChatRow.visual.tsx | 30 +++ .../chat-row-assistant-preview-dark.png | Bin 0 -> 17769 bytes .../chat-row-assistant-preview-light.png | Bin 0 -> 16946 bytes .../chat-row-user-actions-dark.png | Bin 0 -> 18171 bytes .../chat-row-user-actions-light.png | Bin 0 -> 17340 bytes 9 files changed, 341 insertions(+), 49 deletions(-) create mode 100644 webview-ui/src/components/chat/__tests__/ChatRow.user-feedback-bubble.spec.tsx create mode 100644 webview-ui/src/components/chat/__tests__/ChatRow.visual.fixture.tsx create mode 100644 webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-assistant-preview-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-assistant-preview-light.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-user-actions-dark.png create mode 100644 webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-user-actions-light.png diff --git a/webview-ui/playwright/gallery/stories.tsx b/webview-ui/playwright/gallery/stories.tsx index 17c53f40d4..b30a97da27 100644 --- a/webview-ui/playwright/gallery/stories.tsx +++ b/webview-ui/playwright/gallery/stories.tsx @@ -128,6 +128,10 @@ export const stories: Record = { const { ChatTextAreaStory } = await import("@/components/chat/__tests__/ChatTextArea.visual.fixture") return }, + "chat-row-conversation": async () => { + const { ChatRowConversationStory } = await import("@/components/chat/__tests__/ChatRow.visual.fixture") + return + }, "history-empty": async () => { const [{ AppProviders }, { default: HistoryView }] = await Promise.all([ import("../AppProviders"), diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 952322084f..411f81a2ae 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -58,7 +58,6 @@ import { Eye, FileDiff, ListTree, - User, Edit, Trash2, MessageCircleQuestionMark, @@ -67,7 +66,6 @@ import { PocketKnife, FolderTree, SquareTerminal, - MessageCircle, Repeat2, Split, ArrowRight, @@ -1208,13 +1206,10 @@ export const ChatRowContent = ({ case "text": return (
-
- - {t("chat:text.rooSaid")} -
- -
-
+
+
+ +
{message.images && message.images.length > 0 && (
@@ -1228,17 +1223,13 @@ export const ChatRowContent = ({ ) case "user_feedback": return ( -
-
- - {t("chat:feedback.youSaid")} -
+
{isEditing ? (
@@ -1261,50 +1252,50 @@ export const ChatRowContent = ({ />
) : ( -
-
{ - e.stopPropagation() - if (!isStreaming) { - handleEditClick() - } - }} - title={t("chat:queuedMessages.clickToEdit")}> - -
-
-
{ - e.stopPropagation() - handleEditClick() - }}> - -
-
{ - e.stopPropagation() - vscode.postMessage({ type: "deleteMessage", value: message.ts }) - }}> - -
-
+
{ + e.stopPropagation() + if (!isStreaming) { + handleEditClick() + } + }} + title={t("chat:queuedMessages.clickToEdit")}> +
)} {!isEditing && message.images && message.images.length > 0 && ( )}
+ {!isEditing && ( +
+
{ + e.stopPropagation() + handleEditClick() + }}> + +
+
{ + e.stopPropagation() + vscode.postMessage({ type: "deleteMessage", value: message.ts }) + }}> + +
+
+ )}
) case "user_feedback_diff": const tool = safeJsonParse(message.text) return ( -
+
({ + vscode: { + postMessage: (...args: unknown[]) => mockPostMessage(...args), + }, +})) + +// Mock i18n +vi.mock("react-i18next", () => ({ + useTranslation: () => ({ + t: (key: string) => key, + }), + Trans: ({ children }: { children?: React.ReactNode }) => <>{children}, + initReactI18next: { type: "3rdParty", init: () => {} }, +})) + +// Mock CodeBlock (avoid ESM/highlighter costs) +vi.mock("@src/components/common/CodeBlock", () => ({ + default: () => null, +})) + +// Mock useSelectedModel so the hook has a stable default +vi.mock("@src/components/ui/hooks/useSelectedModel", () => ({ + useSelectedModel: () => ({ info: { supportsImages: true } }), +})) + +const makeUserFeedback = (): ClineMessage => + ({ ts: 1, type: "say", say: "user_feedback", text: "hello bubble" }) as ClineMessage + +function renderRow(message: ClineMessage, isExpanded = false, isStreaming = false) { + return renderWithExtensionState( + {}} + onSuggestionClick={() => {}} + onBatchFileResponse={() => {}} + onFollowUpUnmount={() => {}} + isFollowUpAnswered={false} + />, + ) +} + +describe("ChatRow - user feedback bubble layout & contrast", () => { + beforeEach(() => { + vi.clearAllMocks() + mockPostMessage.mockClear() + }) + + it("lays the user feedback row out as a right-aligned bubble", () => { + const { container } = renderRow(makeUserFeedback()) + + // The wrapper is the bubble container + const bubbleContainer = container.querySelector(".ml-auto") as HTMLElement | null + expect(bubbleContainer).toBeTruthy() + expect(bubbleContainer!.className).toContain("w-fit") + expect(bubbleContainer!.className).toContain("max-w-[70%]") + expect(bubbleContainer!.className).toContain("items-end") + expect(bubbleContainer!.className).toContain("flex-col") + }) + + it("uses a soft themed background instead of the inverted foreground color", () => { + const { container } = renderRow(makeUserFeedback()) + const bubble = container.querySelector(".cursor-text") as HTMLElement | null + + expect(bubble).toBeTruthy() + expect(bubble!.className).toContain("bg-vscode-list-hoverBackground") + expect(bubble!.className).toContain("text-vscode-foreground") + // The previous implementation inverted foreground/background, causing harsh contrast. + expect(bubble!.className).not.toContain("bg-vscode-editor-foreground/70") + expect(bubble!.className).not.toContain("text-vscode-editor-background") + }) + + it("still renders the message text", () => { + const { container } = renderRow(makeUserFeedback()) + const bubble = container.querySelector(".cursor-text") as HTMLElement | null + + expect(bubble).toBeTruthy() + expect(bubble!.textContent).toContain("hello bubble") + }) + + it("places edit/delete action buttons outside the bubble", () => { + const { container } = renderRow(makeUserFeedback()) + + // The action buttons container is a sibling of the bubble, below it + const actionBar = Array.from(container.querySelectorAll("div")).find( + (el) => el.className.includes("flex") && el.className.includes("gap-2") && el.className.includes("pr-1"), + ) as HTMLElement | undefined + + expect(actionBar).toBeTruthy() + expect(actionBar!.querySelector('[aria-label="Edit message icon"]')).toBeTruthy() + expect(actionBar!.querySelector('[aria-label="Delete message icon"]')).toBeTruthy() + + // The bubble must NOT contain the edit/delete icons + const bubble = container.querySelector(".cursor-text") as HTMLElement | null + expect(bubble).toBeTruthy() + expect(bubble!.querySelector('[aria-label="Edit message icon"]')).toBeFalsy() + expect(bubble!.querySelector('[aria-label="Delete message icon"]')).toBeFalsy() + }) + + it("stays out of edit mode and hides edit/delete actions while streaming", () => { + const { container } = renderRow(makeUserFeedback(), false, true) + + // Clicking the bubble must not enter edit mode while streaming. + const clickTarget = container.querySelector('[title="chat:queuedMessages.clickToEdit"]') as HTMLElement | null + expect(clickTarget).toBeTruthy() + fireEvent.click(clickTarget!) + + // The bubble keeps its resting (non-edit) treatment instead of switching to + // the editor background used in edit mode. + const bubbleWrapper = container.querySelector(".border.rounded-sm") as HTMLElement | null + expect(bubbleWrapper).toBeTruthy() + expect(bubbleWrapper!.className).toContain("cursor-text") + expect(bubbleWrapper!.className).toContain("bg-vscode-list-hoverBackground") + expect(bubbleWrapper!.className).not.toContain("bg-vscode-editor-background") + + // The edit/delete action icons remain mounted but hidden via visibility: hidden. + const actionBar = Array.from(container.querySelectorAll("div")).find( + (el) => el.className.includes("flex") && el.className.includes("gap-2") && el.className.includes("pr-1"), + ) as HTMLElement | undefined + expect(actionBar).toBeTruthy() + + const editIconWrapper = actionBar!.querySelector('[aria-label="Edit message icon"]') + ?.parentElement as HTMLElement | null + const deleteIconWrapper = actionBar!.querySelector('[aria-label="Delete message icon"]') + ?.parentElement as HTMLElement | null + expect(editIconWrapper).toBeTruthy() + expect(deleteIconWrapper).toBeTruthy() + expect(editIconWrapper!.style.visibility).toBe("hidden") + expect(deleteIconWrapper!.style.visibility).toBe("hidden") + }) + + it("uses the editor background for the bubble while editing", () => { + const { container } = renderRow(makeUserFeedback()) + + // Enter edit mode by clicking the message text (the clickable inner bubble) + const bubble = container.querySelector('[title="chat:queuedMessages.clickToEdit"]') as HTMLElement | null + expect(bubble).toBeTruthy() + fireEvent.click(bubble!) + + // In edit mode the bubble switches to editor background/foreground and + // no longer uses the soft list-hover treatment. + const editBubble = container.querySelector(".border.rounded-sm") as HTMLElement | null + expect(editBubble).toBeTruthy() + expect(editBubble!.className).toContain("bg-vscode-editor-background") + expect(editBubble!.className).toContain("text-vscode-editor-foreground") + expect(editBubble!.className).not.toContain("bg-vscode-list-hoverBackground") + + expect(screen.queryByLabelText("Edit message icon")).not.toBeInTheDocument() + expect(screen.queryByLabelText("Delete message icon")).not.toBeInTheDocument() + }) + + it("renders the feedback bubble without a header label", () => { + renderRow(makeUserFeedback()) + // The header label ("you said") must not be rendered for user feedback + expect(screen.queryByText("chat:feedback.youSaid")).not.toBeInTheDocument() + expect(screen.queryByLabelText("User icon")).not.toBeInTheDocument() + }) +}) + +describe("ChatRow - assistant text and user edits", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("renders assistant markdown without a role header", () => { + renderRow({ ts: 2, type: "say", say: "text", text: "## Updated greeting\n\nHello **Zoo**." }) + + expect(screen.getByRole("heading", { name: "Updated greeting" })).toBeInTheDocument() + expect(screen.getByText("Zoo", { selector: "strong" })).toBeInTheDocument() + expect(screen.queryByText("chat:text.rooSaid")).not.toBeInTheDocument() + expect(screen.queryByLabelText("Speech bubble icon")).not.toBeInTheDocument() + }) + + it("anchors the preview button to the assistant content and opens that markdown", () => { + const markdown = "## Updated greeting\n\nHello Zoo.\n\n## Verification\n\nTests pass." + renderRow({ ts: 2, type: "say", say: "text", text: markdown }) + + const preview = screen.getByRole("button", { name: "Open markdown in preview" }) + const previewPosition = preview.parentElement + expect(previewPosition).toHaveClass("absolute", "top-0", "right-0", "z-10") + const content = previewPosition?.parentElement + expect(content).toHaveClass("relative", "pl-6") + expect(content).toContainElement(screen.getByRole("heading", { name: "Updated greeting" })) + expect(content).toContainElement(screen.getByRole("heading", { name: "Verification" })) + + fireEvent.click(preview) + expect(mockPostMessage).toHaveBeenCalledWith({ type: "openMarkdownPreview", text: markdown }) + }) + + it("omits the preview button for simple assistant text", () => { + renderRow({ ts: 2, type: "say", say: "text", text: "The greeting is updated." }) + + expect(screen.getByText("The greeting is updated.")).toBeInTheDocument() + expect(screen.queryByRole("button", { name: "Open markdown in preview" })).not.toBeInTheDocument() + }) + + it("keeps the user edits accordion inside the right-aligned width constraint", () => { + const { container } = renderRow( + { + ts: 3, + type: "say", + say: "user_feedback_diff", + text: JSON.stringify({ diff: "@@ -1 +1 @@\n-Hello world\n+Hello Zoo" }), + }, + true, + ) + + const diffContainer = container.firstElementChild + expect(diffContainer).toHaveClass("max-w-[70%]", "ml-auto") + expect(diffContainer).toHaveStyle({ width: "100%", marginTop: "-10px" }) + expect(diffContainer).toContainElement(screen.getByText("User Edits")) + expect(diffContainer).toContainElement(screen.getByText("Hello Zoo")) + }) +}) diff --git a/webview-ui/src/components/chat/__tests__/ChatRow.visual.fixture.tsx b/webview-ui/src/components/chat/__tests__/ChatRow.visual.fixture.tsx new file mode 100644 index 0000000000..67fd99ba07 --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ChatRow.visual.fixture.tsx @@ -0,0 +1,44 @@ +import React, { useState } from "react" +import type { ClineMessage } from "@roo-code/types" + +import { AppProviders } from "../../../../playwright/AppProviders" +import ChatRow from "../ChatRow" + +const messages: ClineMessage[] = [ + { ts: 1, type: "say", say: "user_feedback", text: "Please update the greeting and explain the change." }, + { + ts: 2, + type: "say", + say: "user_feedback_diff", + text: JSON.stringify({ diff: "@@ -1 +1 @@\n-Hello world\n+Hello Zoo" }), + }, + { + ts: 3, + type: "say", + say: "text", + text: "## Updated greeting\n\nThe greeting now welcomes **Zoo**.\n\n## Verification\n\nThe rest of the message is unchanged.", + }, +] + +export function ChatRowConversationStory() { + const [expanded, setExpanded] = useState(true) + + return ( + +
+ {messages.map((message) => ( +
+ setExpanded((previous) => !previous)} + onHeightChange={() => undefined} + /> +
+ ))} +
+
+ ) +} diff --git a/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx new file mode 100644 index 0000000000..0edd5ebd3d --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx @@ -0,0 +1,30 @@ +import { expect, test } from "../../../../playwright/coverage-fixture" +import { mountedStory } from "../../../../playwright/mounted-story" +import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" + +// The production ChatRow dependency graph can take over 30s to compile on a cold gallery server. +test.setTimeout(120_000) + +for (const theme of visualThemes.filter(({ name }) => name === "dark" || name === "light")) { + test(`renders user, diff and assistant rows in the ${theme.name} theme`, async ({ mount, page }) => { + const component = mountedStory(await mount("chat-row-conversation")) + await applyVisualTheme(page, theme) + // DiffView reads the theme on initialization, so remount with the selected tokens. + await page.evaluate(() => window.mount({ story: "chat-row-conversation" })) + const conversation = component.getByTestId("chat-row-conversation") + await expect(conversation.getByRole("heading", { name: "Verification" })).toBeVisible() + await expect(component.getByTestId("chat-row-user_feedback_diff").getByText("Hello Zoo")).toBeVisible() + + // Capture both hover states so the action row and preview placement are visible. + await component.getByTestId("chat-row-user_feedback").getByText(messagesUserText).hover() + await expect(conversation).toHaveScreenshot(`chat-row-user-actions-${theme.name}.png`) + await component + .getByTestId("chat-row-text") + .locator(".group") + .hover({ position: { x: 2, y: 12 } }) + await expect(conversation.getByRole("button", { name: "Open markdown in preview" })).toHaveCSS("opacity", "1") + await expect(conversation).toHaveScreenshot(`chat-row-assistant-preview-${theme.name}.png`) + }) +} + +const messagesUserText = "Please update the greeting and explain the change." diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-assistant-preview-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-assistant-preview-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4c972fc0749444b2a04451920eda2dbbf057a5be GIT binary patch literal 17769 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≷g`0&8b537<+!2ZkY2P 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 F|2J99uZ;iz literal 0 HcmV?d00001 diff --git a/webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-user-actions-dark.png b/webview-ui/src/components/chat/__tests__/__screenshots__/chat-row-user-actions-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1804f55587a3c0e68c0ea5bdf41486a34a42a6 GIT binary patch literal 18171 zcmdVCbx>VV_a#VhcMF<_y9IX-f#6OcSa5fDhhPcr79@CZ_u%fqH3WB;Ir)CmGgDL5 zHC(zsL_uX^$*?X5i%4M6xw?kNfjulSL@*C10pndC&Tb<0xntR4!CX%k&>{cH+TTgogA{|{I3Pa;pxlN+u!ouzL?@ixRO^-!}YdPc@ zr*&1FM)f{0zva52=Ft_CQWh0^r5s0U>i=T+Y1A)Ge&Q=a)=5!pTa(k8&rMsZ+i}yM zF;oskMa2M2@$gGFJVZ#a3^p<+xZ?hgUsFY8DGLh=U0q!@=H?t<>l=v|M2VM-3=GJ~ z$&U^XPx~af+0n!9>sIJCEw?^ijxe=V@j()cDV$2Py}kXw$e6Eboh%+B%d@TFO+)iW$L?r4Un0HJ z)34~q$Hze&k)h$?sE7zWs=@Bcj&^+fq_ngjH;eaI`@6flCZ9hehKSajxAHkrR_p9qWin{4OOc8>s;yy=0Vkb-m7kNSv*m z<1za9_;}rTf27-JCB@y=tv~crUgYI?TT`L8dReY6=gz{!#B_iCx7@dJJ>4!#(Bpih zZHS-m%3GjVm(MJ>pxWVLH;RB2uh6sK{M>}j94~qH9&+n(%U3S=Cp>0>1ua?@^ zT3r7A^f=&lfk+nFq;uCRw?sfr9xIOE^>BUk+r!I?nug}N)#_%;k0B;8Q9bPXNQp(b_t?wtftgW& z*!B5$-9!$V&?e5N--C^Qcm6x~xzW*b)i89EAzm^eSKXDswl<&AB<3HQrAb*?zIy}8 z8Qqs9szZs4JURLu69ZXM&fOAEqfF~8GXQ2} zWMrKYgH+gY|MKtt?2k3nju1Jj-8xn_P6SaS>p3y#Yq((=NCYEZx zeOpuOsa{mCpD!Ifl;qItbaOnW*J3{*jYiy^$z`!z?0t8>09RS3Rbyjdu+r?ZxrIX} z;!$?u12K5_7WkxU0EI}8dKiGJ9v(*w_BQU2k zqo?+x_?PX544&?Ej<||nzZxv{ROtJaT4~mL-wr5~NI9(qJUu+{6jzRnmg{^UYK22l zGBPrnIyh=*Yi-TT&u_3^Ds1?sQ{>NMmOPf(+SYm&^ZTcbz$aRXBi!@mjp%4M`cFIk zvDuBy2}@7ImEAR~N8@OuoOdXi1jz;4ejiQ|Fo?8DHOk2~%7Tx-kO-4FhIT`O5WKuR z%GXY(uSvUBT3jS#{kzY|zsSFrzq38NNoLVcW%nVn#ak{_rBxgvI8SDNfpBphJ+bF2 z=PfoSey6Tge5%r0;$A=@CjDI(1e+n~vhT3DWuaQM?h{Mwb)PWUKxtd~=-^VG#&vjf z1glPSdUk1He)m8vC&BWGMC97%Z_UPt_B)8mhjNC~Gh;~w+8r+N zi@9;PQ<-xxaA>^|PT-r-US5*hx};e#>>|BxMHQnZlyhh|7fX>i-)J5+Ox)~sIao*`Dw}|xl%Wi%~voh zPz~*H4TC?%S4T%{eNX4TOw{hEm-9(Xwawu9j(Vxa-<48Y)#_O%7HEx&#ByRrBUNrbT_%5~(+&`psi11rj8u91o>kB>{ z3!F&4TVpJqD>(CiemY)h@w;Ab!uZv$U#cNLDh+~zh{rk@B_vvd`Q!ERqLtU_n9Y*g z8xMOYr`cr!GN?j_2!it*KV+8Uze-ru*jy_^Sg$=gFn_t>MWgQ9wC)+#rajM|b6I%sZ}`6FgyKFl2V9AO26`VZ%W>!XRPs>a4f z6av=nR7*Y4g%_!)j6ove6W zck*s&e^)Uq&g|CbY5co(bJG91ONo*qEWrKP?cuFquNZP8s1u6m+(N#OFBiHPZf=Mh z!Dm}D)P{y|JV;--^DO&0ObkShtZk|(ku@vz5FU^SNN|Wzjyj16o{PWaQ|=yawx?=q zr^FIeumx_?1>2vUKa`f7@2oUCA1~+nc%5xb7s1JCA(CK9M-y^eFI^w)rwtA& z_C>eEE4ROpyamVW+2OT1ebNtOWJX50F1m2~-sqVGwIU9MQ2r8lR*EV3@B2HQIp~zu z|JJyn#qFf~huw1R-4%^ITXD`3>$xotI^2CCJpWJiE$(SpyPuD(t>b^ZORjp{d)7#a zd=IVz?K=_1W*mn_xGn z3bJpu?fAO2JjZcbF^g&=6w3~Rl{)f42@dY*;d-&kVXJzJ);_HGB--qH4bkJyL&~yi zrkCo>Ve=rG*jOhT0tFW6MBUbJHaM4M?^>}7k&MtQ~J59}nUcZ#;U2Z4r_k(o3 ziKQ)CMFX-N^;c2R6J4ww_sBiW;B0}T%f(pr8_(Cr zOJV6~X)2Yrq+)e~=PNw=$u5q8icRi+Iq=`-JU}1>Z48>B)p*E-sXM#l=^w8_((ym< zRsk5rxW#A54>m^&BlvTV#~qJ3)JM;&-&|#F;kotzyuEp~VDI1{c6`>K+oSZltjVJ| zOP%Wh)+$2!{$*VFQN2kpq$3+D7maJwQ56sA{cSeX|OEWiFa9JlY*w* zTwgaR2wYY8A(jx}3kmP!-sQJ*IWYZCAnv|;r3L?Z-6BPpE%{)#x3b!7B3CAj$O=Wu z$vzNhM-cOx3;D$N!&;SsBZLYzgi)iMh|4=gyrlQz#opPLjBk9)lf&%*LH4M$ubH83 zK(JcvTSTpDR|J$G0a!-Iw7Uqz-GSn`_*9RJUHQ>NJk@8r-ElYjDv{HEa--YuzMEL# zN6gS2(_4A=n_h~g!EZ&v*+M8&p^sRZIJAjcmVRcZ>)ZhWnDT8;^O7}=8Ms4{uoqA4KQm{la^flS#fw%)x6-@$HC%)wOYMp%WXA^s%rZG$qy#UZY-x*;2t zc3xu>S4M0j<8HG`mQ7?Z!ke7XHg{3E(7wc(F0=SX3+d_dHlO_ZJrrH-_5k1a06);q z9S(Ic1@5`|hNqSNvVDn|$M&_3AWH%aUm>9_kWvI3fjF zq-J7i7-f-eq|hMcMLr#QtBj1{S1ZrHYi}kDLR~qhDW1$}h&U7_s@_{{SU$eQ!QtV4 zqs(07w}tXgPn}&LG&6=0y6%72s)ExUg1{=2MDfM1w9lRP=8u2UCX3fi$ey<;jA3AH7T>tiEC0jESO$Qm#

&fcC@Pk(=#I9%}&fa#Rn7y7U_OwNm|V=VWdE~ANgYLL(Bo?md8s0=p5 zZmfpB<9$fCoGSw*dS`pPNNKwpwKPPmGN@2ASzNYO6h{Xs0_VSJ0q2%^nmKp$=;Da+ zbhzgKo$H=TxOmB9gYQus<~epJTGWz;Vw0#WY3l3O_(UB-l8EuVyN=q0?H$w70W2W} zg@tLUsX96-)9-L79PGbsY9ywn{(Y*T?AX^s20QDO5N7~LxUmg&@)Ove>VkL z`PqjfZQpNknBr8(MV1AhLJSPD zbjXi+$dF)M0~3?k64j#Lbyn#qDa9xlB)sWQ-7YB62tu=PvK9-KDa z6nLw-vWTJlcd_UyXU`8OJ(v%-w}>I3SP0DNw zPG~3e{`y5^fgrwCZQTFUWZ1OWHwPWM{O+(=Ip5mG1_uXcGHq`(S`5<6a=1?mydN$6~e*A8yawq(Db=f?`C3Hvm!B6oFl0h!?GVq7G|OzhvyJpCy! z$ON^@$M$V9TM_i~UR1yG~jFnk=i9)NEuZIcOkUY@M!FH3s>GV`{^ zSbldb(`&u+m6OwjM!60eG4}^Le25o^EL21-t!1&Q&5|+k6uo z=l4cu~plG^USer>p zA%ksRH%Uy|c{kdhNu^1eX&$)*#1Zclm0l)_X{7EamH$f?^F>el7x{4itFFzsU$e6- zpOY~uw9nNEOFGF9S=GZ?>u-y;X8lC7Fe&7F)738OX9LljYsK_v3O*ZdXMGnje4)%*WKpOU>m@d z@$y0%hwo%+cba=z)C3KY#8%4DS7s7?d?L-~9{Wg?$&8B;BBdYOmHEEyt&ZbQmBN>&bt1Of2Cso; z8#oTFoQM^Y*z%>`8-uNL zSj7ztgL?rD&WwRS{xPTN1?-SAk0cXX5#|Q=|OqNx#(7FC?QH_a!trr3veEMyxQhgauk47)wX z#Pa#1*%)gw837>hGg}Ds|`0p*au!^~%(HM`|jUa^j6onJoNaO(VHX*|$(UvQvZYI~@ze;%!`RQXS+_w$^s{MuP;;|!y*iO-StvJ&yJ*!=%1}7zB z9yz&>X7A)0p7V*LxVD^XaC(dr#KcZK3rtL?KP`ToP;GmnDxfmh{QH+aP9-|TtjJAZ zxXRw`&r9D_S()FVsjsuIN5iA_9XpYqU((l-|2|#QQW_NOS z#+50d5n-e*68{z>-?n2xugLN9vqItltgD5-5bfua5`jla7zlPKR)1+gNQ>Ve+oPxF znA~X!h2vGPLv%maAk6m?|9gV@PgWE$y+JmtRO8?N^KoY<73GDwq>$tm=?>-lo9&de zLKN}PRBh#(o#;#1H^ajhBZDOg=?8JiW=B&6J;}tT*0TtM&Yltk)s#=p!*OB)Z<+EyQ`ake=??$7ZC|l8DJtg;i!>trVr_ zPviL|(|uK7`p9qb{8uLAl*4^6jIxqqE^s~LV{M2Bvh&}5v65Ql5~o-1=Y6xUyMEXC z(fm=0K=fGD5-W_#o6M+9^d;dmRUg_OXoMzb#%1M5{*}2#JU7tsW%D?-ZH-xgTzh~u zcvx?hP{>{@r^VxObabs81ATO=WS!4^Y{|s+uyM|CfbHTb8@>hgq*V9r?<#C1&#!2! zlan-$n~91$Io5s#rl-(oLZ%Lqg?xp(Q*GBEt83Y06nW=pb4vV*}Evrf^9y^t4p>ZLRU9&JeH@nqt#_Rd_L8i}&mHa44vn}m-<~aO*%aLnNf>td9+t3hJh4@fU zu#$g7u<)BSYgijb?yoc-d5jltiKOR=6OqigF%I~1ttOVgLlonDhHZ3pgZG5I#3}9c z1f1Dxz9j2yG@Jif$@wsKCNeHb6HF%TBY%21U1OP?nvhfFP{;T!EA9<%Q=`@nmEfRT z`_SE9)=>q- z`2|sY$N$1R;FKFK$X7o8exoUFX(92fSjb|Q=bIYF){S= zdAEM(a(g6j>$}K%Sxt^wT2@kIPLIEIQ{TQCvDjp_Z%8`EyQ)$#!V(iFE^#*`CF1 z=CmrF?|$}%T@g`n;+sN2KkfDc?_#0IdnK)=WaVE}Vn6eZM^@4w76*4&(9#5`^}Gz| zDsKBXaOvGB;ZAnBmUogq$?to#1&s=PawVihxOZYym@0QF+sdy-o@O)2@-l4-aLhpUC5p|E+ z2<-rC?Wkg@g1Rlh#rK|`YHhii@3+aqm-Tga(rHCI;dp}q-j@q|?f9^me)qPgl^+g4 zZP*kz|DGPhkE!HxEBWc?3p9DhzI-@V-cHEqusbD|c(`P)D9-TpzqU;>WPjh|)6AD)hNq8(zY!0K*;y1lRZk@f_ z<;%~W3GPO_Wz2@D&=6|ShMnyEsWDM?R+pfBR>FGM5b(9f)ep(Ffx;;2&+A+Y(g zQeS5WXMuixJ*#s!*sY-FM}?_klp91tL`U8y>>tab+4$ShYg}WLp+FzeD~gaV4st*WMMv_-DGHdGkKfzS_*SofIMZ zug)+vllL}($4%SWM*pr zMYG@a>Ih{%W~5F%+x2+kBh8rBPtD2g%nGh@v^l1ateuok-UG~ufgc}SeTzzrPP!Ly z8kQYT?p+yqQf(td!(nqpzy0Z|I4-!m;E_L3TPa@+bNXYKJy)HE6`?99+;G3u5ElJc z!1&_3BooF^*{}eTTkK&QiPytas@&`AL{j9USah-hWzxRd?RXPKN< z@60*dvv(|g#opD4EwN$tH@)$vx5aX_u?4)dm3w)rDg%(fxMY+}7!NX)%8_hmspHlA z>0G>PmSy*5bF8rCU#qKa&l4u4p+Crkg$ESMZH-M zHoK8=6wk}%k>XX@ezt11)L}A32eWFk=j-Ln4bPv*)C$e$w)5U65AMu~-%pp}dX;0t z&8Es=Nt0}U&;QU)p18GAme`;!wrps3(DO?7y1r zKdOJ?e2|xqtO_c#E{A_Mb&CxZ=00Y;P{~Ip?{L+>!SQG!dPx1PVX>_*eEnGRkZM|= z2u;+~mxX~88}0E~BmbdOtS6A)wZg*lXgM0XWK^|ax4CV#U4EYXIcZYUjs_3+yIH!1 zZ~5pF>Bsp&6cK_uw&QB4%!;SAlchpW)4im1;c4GfkTFV{K`_ z!!nWE$O*FdSM4VzUInG|N!ukW`lV(H8Q7N6eoGbH3f0tf z*M$5nV?un&k|T#l!_YgQE-N3NpuASJ zX;a#OE&?+ z`q$8Ub(ZRFmMTCZ-k&WU1|m}ta4O`)3JVK!b8~msh@t?6jf{+}S+OfIAFECAuaSjC z#1OFP2zgy+2zj{zPX<>u^T+zKprD}p+;87hN7J~jntdssCaDAky?a8@nxXYdRH)k? zG%9poPkmv$J8D={NaI8z#RP#SO(T;SLn`2UvP#Nv19US@&}%MHd%j+>+gF1Xe{1{; zl@7f=ThJr0s46}?o3&WYalJF3T&J!(RO>ZgXQ6z$=hgmfi<_OGw_G1s2p-$z@US|o z`7Aa=VDe~Nm^t4WmJk>3C57aGr>?H4>2WnTHwS7^JURv;8&oO`EDs|iBM;BbR;)<7 z?-T!!$jjpe(DOu{TAcqnf)xf`hupCgcH=ZIt57qCPXw%=BptsdC)3vFH;8xO%E z5z(f{$4?f#$1y(!8r0;^z2)lp3_hn`Zezh^tRzrncq*YhV9-XZm_>qv z0~1ZgWjO<6C}?PCR2P@MiCjW#d=_0^^NAd=PCDA!UC^c3A(~R04nVU*WF(6r;hS1p z^E+N{DsFW@GfJ^7{-HIk>PYA8>YBx6g?}E0MJfG- zm>-MMXVu*}XT2I!~h4PcUncZOb{C>nM;IJ7UoRglz^5=D2zqY=HC^T!F}G;R%Oq_i$k`5q~X7|%Tw%?oAv z6lZWHLC2*6P54oADjX{(bias#l5%zlJcAT6>ipkA=vQ#RtLy4!y%0HFKzE9+y_t%h z{{0ukxNK2Hh~<6}u*FQ~7(lTjVTmD3NL)#vG83@qVm4UK{s{5Ik~K(GV8R+@>UKtj zk-k?Yj3E>HvHA8{)HG8Q6as&E08sKzTCt8g_O`ItiiD4UB*aow2WX-N4QbTU!e-IZo|k(8 z-v!;=+^862lDJd}Mmq^cH(RTMi}|k2=QwAw|G-P&>Uu;IaV4?nMOwx5NjNKlRmn2K zG4F-DZ2%hZenI!_ES|+*;G6kT0V5GT*nXRe98TnnuYtSz+80Mr3>j$3jB_(1ut3ob z-qtA}lVRW#QG`F5o6#ox)Vr8QO3Y>el@|)cXG+hx$BF9H)Ynr;ld%Wq9WPIIAfai& z<7UC>au>83_Jr{h^mH%P)8Zz>;XrYF`jL2 zIM%7Nk`PtZXgW`rwy^7AN;CQ)RW0g)&Vs)Jgk+)C0%wR-uQ}NHcExQ?ugc&RXDQg7 zH1gEWZBox@f9NxICce$U#zx+O(px4}_e_2lgI|53uHe3GHQ@XM{hwC$cfCzi3bAEW zk?+fs8zN^0FaG7k@6G@iE(ttl`?9(6kH%lH)Uq>rM6rp9qb774Xpq^rQHi-x^|~Y6 z-QB%UyATK~vKGl##t5(_B?$8-{FHMHPbWV*OT2XlzRftW#NmCK`aWDHLkYlH*@G@I zW5CRgFt3J&xcNi9)O0ir&LWhmT(=23k3MNUTZCLZ)C_KxHo@<9Bkc8C({L~F=ost= zAPvJMCTx|k8~-ZqfcyjpcJLc*&yo1z!{uKmAh?6xiWm#KAmWeNR*=o2?wFwWKpV#O zaG{zIYC@=BBn*Q*^kPazP|5Q^K?Fn58kPdtStYYH8L} zQZQa~z?QJovrEK&`7*;*Wov62N7kl*$&F*-zgn53_3@*Zheua!x7-hu__v=we>V3u zl|YL@7bv?cL1mtpZTER-zghK4)88lNG*?RJwmGfLZL{AD*T*c_L(50IdS~}1y2hvv zc|?v=g#T!7FWk`J=6D4(U4Tgb1NWu>FsG_2`qu&B{lKfAC=xA%NUz>_hkMo`pR9GT z;-2kUzNtgB1oqJx5B|@%`7vjxuV`b~Rwimf@ADfjeszhem+NpjBRxb?gOcsoL^4?q zQW)FUXAg35z@7Dkk2LlGm|+T4V$7A_G7hbd(< zmRA-{>$p@oAAZUVwk5passa?a}y0ajDQG(<0lmwxlR=rL(){>Y%x`GB^cQBF> z1XjnLU8lj8`P(2mnIN4Y0RTuJ+dS*&CMJ^mW64FF2uRS2>;cj#)vQF`wo_464GIkG zwNX`_X6<-9Ki%koh7^R$99Mb*RFPvj`@`*IRj0UmBqXFS1cl)GWUW$tZE~_2 z6b}I4WIlXwc5+&(HV$iQ@+eZs6c-o2zx-QcGK?SImu}Y{!Ht8BU2n4#YPtDIC#1$~ z+||W}l;3$Tkx>(zXiZS1GBQZaFF)F~!JQo~))b|tE(X9LOduQ{Z*5KIN`!Hk41G2= zH8nHK7V-O3BL~`}Vv6>N&H@}9jsTAp2RS<_r-XYLLZEbB;BFAv(^S%EIUJH(9C9vv~ zZ6VMw8X6jI&cMDC18a9+W@55olt&T*nuDFvYwbP`0(qoW2YJ& zj8Urz^TZ`2ZVnfX_u!6JT6ikH-iKICmI$CZ5p52w|fXVN2$t;#G@aX91gmP5@Z8_G}GK71@x0%DJ zQRYtqjBI$Cc4wP?=J=ZMfRi(RFk>_I2HMX^7sl~%v|GY5?0{;qhwGZ&c7dMooSiwh>vZZY*$S%SHpL84uV~&{SXi(n+Q*y*VbUjvz8cRI2n)k>=Dh^f#85Zj zBS9F6GofsBR;OH~sWuusD&Z$2}@CO1P7{MqPG_|?~66;>g%F6G01W2fYj)< zx+~Yv4=}R)OW?&6uy&mBB0B+ zHQexmQ$>0TfeTHQdINK#nIiq>7?HZyX7W$>ckx)v$sGDyx69W}vfwiS^((1kr6TUZ z2qs$z^*0j5eg{{~{8*=fFasS%NkL7}zzz+GmG*&M5E!!@c82vBmz_l%_|7LKGW zp0fXvGeB3Um|bzlB#k?w_A8dWQagOi*j$poz{9yMBp6fdK0D|aDyfsD1F`mL%Sn5w z`YQ{j-Fc@!Vm%ktG_Ol%4*@tf<5?rpYXNKk8V_ z5K~N0slePxpylgRkY<%A%yBdp;()dtpVC9wGb@hiG7jwlCr)OaPvc53&!8ORB144~ zIOM~sRVC`g${D`*`ezK5$>rYUfJ!e0mXV2y5*jukVHMrYNY;T+PDm=>@qJB>r z-Me{xzw#!OJiip94_2HgURV2dma_~Fthzk9Hj{}5%)y+-U6@7mrmVrOX(^&yu!E}g z*4oQ$TA!vF!Z1+@*$k!%-fv12dGm}4SC?40==1!afA_m)%KAkV*3=U@?-e-5O7jXU6$(RJ?|ap&Ase=`eY z+4w$_Mz_aIwT;*Rf%J>)>qdpP1{RI#oLGBTC82PxIc!7XI{Zb+-jGT&{K68;<-n4RmUD|YZ&Ytz+%G#o%>oN%ah8+prT!0rr z$N+9o^qJS3vU8-nQ=>!$?iocHYWKX`4u;9Y>>x-Xz}EA>0tGcz-rKZ8vNYz7ArvMo~R z4htaA^!4>MrtqjZ0zw!Omt_XOi!2=lFfKjZUHs|$2e&}UIs`7RPXAW`9DE56?{xL_ zY(8xT4yExF_Iyx)_P_p%AVGH}U=Vsq*^JNeM-wB}w= z_Gf3WfM~?W$JZRKrKOd?sL4V@V+ydqzBnDd;K@HA_4e%T+fd`=Ic)E$zczAf2Yk+Sct||y!uEqcv1vzkv z$$GhwJ^15tsBFyZxA0$?HQL?JC{$3)Nyq>?>;T0N;7bWO^UXMj1U?W%wDp@DskxU| zR+RrdoOJYeg!2w1v%Yj8kfW0DvQbjP{6qWyNWTYx+V7{kKiN?`U}&m%`iDBBbvUUg z8#t>p?x*}N`|FSooX?qHlYnLH9dP{{8vH}N^465qU0Q)hV5|VZ)75q#;wAYsPBB6b zhfT>#oK#*}07)@h5y3X|Mjok>$naTPTR%QM^@Zu&{Q{E9*$lun2xvsLKqEqA{H)Mc z84>Xw6j(5o_tX2%ag_TE^G77wA@td-W7&j>47YeJP`CD;Zq|~AcP4Dl=p|=??6cP9 z#WMteG`IDFzu(j2W6l6Tby9G(q1eSWbK0WGxhnutB6dNR*&aZp4m;4)6x{&4kv;OC z0%iUW0zv~nR}A3WAi7LUOt@@*t9c{VJOcfLE;Hx6iLK^fu3X~hm*Q8@4K_>M32!Da z8GCAtZh)uFL-+_7U^7OP*^|aM~ zjTd?7471urM~A5SY@~*e-&dser+^>LlCPQr zwEmX3H%9CG%za#4U7ZV%VMP%ktREbFXNjR{3rRryb*1GtlLWvdy;81VDbcFlOrTfo zRn!;c(dv?Lk4}7l2Em7PJl`Mu$AA~x1)0$(eH;9dc_+?5?5YI2&8GVyiaDH@pPwQr zB03t3pKgcH@2+iPiVO!#XshN_>b2lwV{-uV;O`Gbs3JM8WLC_V^gEcq03@$XTAnv0 zKuZP$9#gR8_C1EV8xSnx0}P18-hp2OrVK>!Q#N{fq^Q)YJ5Mf8kR}KPK?H>jZN8I_ zbB9Gh0Q-I3jq5~(3<MBng@qN`z4r&kM%d$Aaz2()JV1Vqv65|m zAPvo@2urO*We2EnI^>6x!Epp)Q~xZCl^l;k|2_Nf|0nNr4LXaHhLTXfFLn%~P)`NxJ}m3M%2{##PO z`w?HLK{uio4yiCgnM0hI3lWu_~0wM0)WkJmK&Ad6a<6Z zZW9cwqH5(jS72HW2qgq^X+OX>ZM5I$etvqW+vl;E+6Jlv5ZYbs?X?mwEt{hke*Xp~q|kctXYqAExnB zP0>ho&|*B&ifq{kwh3sFbd)?SpJA$+G^z?L=2TD03aA`B4qM}O5 z>jq@|-qZ8(y{5)v)bQSl=3&sRcs$*ZxI_#2Ct!?En$>=>1&8<53L6(!pT|aB=XX~} zM}Eic@Z5vg_ljVLCuIgnwFgUsYB|i8BiY&6^?k0?f!^T&17_l)@L>?pdxcs-rKr$r z5s#^J?K+w-QY43^nSgFfgp|dRZDTaHg`txoZ}5T;0M!YA6fj~aVpVqyWF|wF4xlZe zVob>H!3ATV$0sJjg~-avs?5*WP|?vLHn)QE?Y8DKKRt~@4LTeB1Fs$;tUoU|I#g6t z=!98;mJJ{onCa_upkmw1SFCLIMdecB&?@xSU}h?cJaLMM_-%BDDB0uYNwOr5XYgGB zQvQ#>0@9mb%b;QjyozkuCc!WSiI$n#;%xcyc8c^|9uD%0Jyfe$q9ef~0PGSGk8^mwz8O7n& z9bgmhLNtt$e1Px^s#MgEaw(u8aH1RLtqxTgG^VPmsJwX!r_ZS=hKhw>^SRnrFE4!a za{=oo%2VKk1Un?N7()oCIoQ|#R(~55mpvHQ;HR*i+M1dmoG|{*%dVz>x>o`p^XUu_ zgbiSFnZ~b5h6$aMirK=Xl{DSo!FEQFO7nU1RNz?}MFvf3 zdM7$iZ~Sy%(p5yo@T?Rm)F$LU#okI=r`x~7giJ~5U?JGDIlwfqc*o^n<8DJ$r5f?U z%D7eT?U_4B*qJOZ0G&#w-J7o$7Y3>q<=&_m#{3mBqiz4MUzX*ci4atZj|FMw6B*P4 znP+QLo3X-jrrwBg{Spo8eJ|uZ1XKrRQD?S~Ve64x?6wfjPN<-_fjq%qySpVq`sm<^ z&}t%l9AZ+&dainsx|_R$H@zoulz&&D?BZA5$;`6wB?w4UKD;efTi+MU-P}f|0x~CnsHTsB5_J zIb#Nj!t1n(n|sQo0EbZiDC#s-3UR9NT38~t1Pvrz><`tSEL34!-m1LzMOJkb1CYGhKB&g_n>y5*ulIYkHaY-FkBDPW}7FTXuK*BF9=F~ z0Q#wt6OfVv8E`r=LlWSB;n1QGL?}T!h6)-E#6bdO8L{9#WC^~e!F7m?&)<_e$>m}+ z(8c2Eoe`HjKwhWVq7HgZ@J?2yhL`Q&6P=_eXbknN2ecA08@pqoLY0IF{6a-ChGK!E z(mJ{7pMkApHKjGm4qj1)&W*@S2S^N=-3;GsQ3lxA zSn(U;HzJh_A*fswfme*%c;>K6r$JgWz30hFxR{6r&!5`8J;d->-{^;)^)|in3ekaB z^12=pGQI6p@cHTB;ILQY9#j0KRfaPiaOb7oMMLxeERjglgrG73-%^X&A9y4}p(Lm>gxs(&^W+k& zyXsn3co@vr_y%aNOQ)eB*bG~@IDE#?_Xs01)TT%OJ9{prDK|}5P*40GXX_eEeI`>oh0b_OLr-eehn1D;xTK+s*A%K`rO zhm&@fgSimJ3{H!$x0piNLSFT^9!MbVM6F6#UEw3gAojTnxbv~qZ-nbGRHA%BcQ>S* zjZ=H0PR{38;Jzut23n=aHLMlLd!PK&L~}j=24W7XaKNTLGQPFzinUDDks9SRcC-67pAA)SZr&b#@&_Z{Q@ z^^Nbl?HHcHV4U;tJZta0)?9PWbwb}M%VMIDqCI=|3{zfC>cg{V&zHe}MHD#jn>6z) z^=Hp;p2nCr~m>nbQSq4qIt-sr_K3)z_9A0M*3#2M_`H$RgR8Kp$z}#9!F6+Ho zG7n)M!?C9)8v{W&5-7K^3*gn@?WOi_``ih6=e7!H;Y&cC`S(!Hg$GNMg zC-03fTp&8p#mR|-4_|7_j@PNLpscj?M*lZvyTzu(#l;|;_L7{OoL8@2rHT2pXxBR& zkiPb9K^1U6V^D8?_d_BGXI17UD=RCwDy>3-J)=637rsP=uM4<7ABwlP_wn)Z!A5_U zokVZ?H)|9q{2%yTXoDQqXA~;yFoge^*PAI?LBWRYN7tL}JlJ5e+kh8GEx}5u=?Lx!T!^v#g>(0znf$DkMmUNUNuh{ z+NYexZ!mBE<#6%7r17ACFlFls+>YhUx5L&)@4vr4b+-n!$TN)RYm^%nsugbzrB45l zL@vY``!i*;*fcvmUF&wb`RVsZ4)WH{D%%CYNnu*rU*IvZg^!*E`rIA&8Oac7vR-JY4qtsmOY3$1SKYwCU~}O56ef1FmHmYnoscE} zeKwMFi&Q9Hw8(`Bh;p)iX z4j0=ePdQzSB-})snEW$ zY}w}K=2`pEEOFvDYFXUWI_WBK!)zhc+x_{uzH zb*4ip!*jz)9RBcq$y~4~3L%*YVuKpDgZcXTk7*6g`~OS^z7I9WvIe&e^$q!B!r1GZ zhbA`4GZZuUY^_UBg7vD*-y=C{Co(VYt4ESoUEv=LvO7#HwxX{r81$_luJxXf}<;{H5>;JQ7AeIKPLB&9ydj&NpWkYT3M%n~A#a z+by>TWSqt*mR*t?hlfjbP@|7D%@yavPv{{A6j= zQV7xAZuvTm7t4SA-K@ZUoKc%=PM7G6qzeUeHryTbyDWLhrk~lQaR+2rNv)`e-E*4` z5}(EX9_5_+5rY*6VHFlmV_m5n5p`^()rjXhx>}2NEHNJ+5qngm5!l(D$fL1e>xpL5 zswt}PDNxNDk9~(t1jpf2(z%A&A)aiO#OrzV2YHLm>(%QosLoq-^#=@fe`C4+fyE|p z`3Ih3Fs2hMn=FUzJpX|t?++RuSh~x2A^j;V5*{|_i0kj?S0_;TsnEHr@&0%0o27Ak z53luS=i=yT`&{n9{aH%jgu(u-L3j>_FZSo~HB@`=7xLfJI9|COEsGy0YrhioYr46* zvNtpG{8wW$kYerExWYK382^qIVtPSLN*cCx`tjY1f5E4#Q!ozRA*@D8bn|B|FV3a% z%H)KZs-AbTsOBoV@7LPv&a#N7AFE!mU=S=Gh4J7-k788Cy|8b=#lc@$b-=7MRkdQu@?@#)r zkdQA|iO*1_`|}si4qtz z$RXBaY!28-R^w#Q<~kere`{As{TVqUtcPW#ZTnrl zJ$ayj*>ZU-;g{fu@))}aF0+ms5tU1KPM^g(1PpuuY78Dp1{oxEuUb7^X>w{z44qor zg)#>5??J z*%u%Dj4D2|JSZ3iSrnZu^b^Nhd;9#F`ayqLwYSyWsej)&!xYA?e2|uXh7ciK31?wE z?90pLveB-Su@1~1F|n|6(^=Tjy74~$^bg4@gP<=Mq2ViLn#A-Wj9M9^41{7!*Vy}L z^CT*bqQl`UqrlQGw8Z{M`sn{P%3$UsOtB<%7`8}y`w4|(1%5X08jlgirVyaMF_>B( zgUaV$|23Kp*WqbrKdIqLzrUt-y|ve=1pHnFgE3|PRKbON^V&YycFir@x`3o z=}e`7p@_qJ@0s%um%g`or~UeiB&^-np3T=*p2FDt3g1!P(wBJ1ht1mqP`z%>38-u>JX^3j^VW`L!3Di5jXSMqy7^y!wOzQMzs(QCMZ z(ljJ-`ja?nR=LJOcj+k(9vz%*8>GLc<i9q$BNu6<<&kTLF)FJ#(lkS}%x89#wXHfy4b!6dKd=O_ zA3}mq;Oi-qUa;rcj5p4OUKQ8qP&kZI>m>2@yvqumw~1J-M~C7o1}%rO(+LX`6!wOp5?UxM?G(SmK(Q`57?Z3!I~*-FQ-$5&rJ`k@vb@~T z5jYDFVeIv87izUFB-|SPWzLE;fD{$UqHX` zvqd2~$wauH?`$-|)eB(1=3Tomo*prlsyw}t2YVbsiy9`xj+lm7-!-|BhR*a5qHb@ObJ}>eH0a0aB8zSjVR9`p z72kK-t<-D%N(WaxMn51HU!c0D(QE%-^_TqvN|rw18@5tgi6nl`PkWTlkRjm^rO7_A(U|ki!TR#gbpI_22%CIa%Q13+{C2L=Z{`93JQ+vb&D{`#x z*5@Fwo;U5MhoGn5)|_SS{-S4J^FZ)|4W|!hHkbEaRS6j>wdDr$ zJWt|4BzN^3Si_8Wt2>RH3ABKs_)Pp@}G^^M?4K0Eh!NI%sES#6`$d}H2(11 z4vv_2jLpz>`$fMX`va=5pgHQ9QZMG~QHl8!R|0ddFv`y+0#Q$OWTDbG5_+Y zP0)v8QUcBk|3lWB=P=3;T#1>q&d$!e>(j=>x1ftbBVzS@xVx^aoL_mKiONsoODKVo`ZMHzd@KKlcIZJx zf-0bwppk;x=HKMnp=nM}i`VUNhKLpagH>nIgSza^&oCT`oY;hfD)X_QL#cdv4PW}0 zKpSAv5rm1^Z}xB@#F?+Qnl{aCx0$OcKLL-=$A7gRui{EVLSkV|Dorkd z65GwzdiSB#`yPPO`UIb|G1;fKrc}2%!}CP`j*S-Nnc*x*zypA5LeSNK%uGr)kV^LN z4pQw}l9Q4&z5ZQcBLRC;<#Gcy`$`YzqyV*Ei^M+Q^*u$>O(YVAN5rI8`%^t(RoSPg)c zr@X3M#B8l5pQF-;Dj*C!iq6IppG{2pJU z)&Dma@Sjin_En2I-}TXF3WN3u#NR+|bTCUZ*Yp17JoyeKxChbe?#X{kTw9bPO$cbGK3ee7Fkh(Tqmu%2b7`5~g| z&%@%>TguiqKCM+Bu=mpEytbmspxI=Ig52fPy+-?VSf!6_8a8K_+wXB7#JdKa-H>^A zMDlgMHEow1s&33`hCh6W^EAKCFM#eNRTsug17<}Q&TAlsywY}a2K6oV2S3saVjPH} zt7=>bh-=Y`{LXESB`nXNURJNX5>Mostd@aVL6 zvw^QDKMPx~uQvDm#An8E_tE}5ZSWm4y}>=RJbRj{^-hxe{oihPyN20c<>US29BWR~0UPq}+G{m<$==c0cJ zF-g|zO0yg;J2!1dPv_Qpv>&W5<$H48mmR+&D=Hp^8meR4e$$aJGVU|cW*QqRHr;`+%*V~o- zeHaXuz8Tkis%Cy=9+`YkRO0?+G`NrqQ7_Q&8d1Hk(MY0HcUO{>2h(PzOqr_aq?|(N z@_?VaYWjDTSB}0Nz7Za-xt*9@YgSAiWGFz8UPjUN_X>jJZ0q(+v|a%&5k)%Qoq1rD z)Gv*1F=!9Fkwq&%(k14J<+AKvoP5W|EF85O#aF^?jX4VC8DB4v*vbk`x0`L456 z=IYibls|4QqBS_!dFov^l`YB{W0V$BW}8eYi^6SF_w-u(;IYpSCMQc{rtzcGOFk^= zJ&`U$i7%bQQdLvY#{7oY4Mq=65_6cuqD8Wi30}dgab9ago;#9%C90)=M>1z;&qj2k_# zE2wNO@u(N~&utZ=q3~%f{@~0VXL%RyMv{>+RpYhSFs#;HA75Y(rV@LxjJfG&;<;=k zxN!K06;$Hz%D{P@uHnxgg_7pwUXXE{{EbQq2v7~CCXC+Z`{J}XT1I;FxfaJ+2DhhJ zynS&4UnWYY{BVT0K|?P3!9QaZc{req56_$`po}q$KLDpacgx7R77q&TPUh;aca%{G zJ1&hAYo!Wc?@ONO{Wj1W-_x7A!6w%yzC@bU>v2hnj76NMLf>;I=+a+^sheJXPy~G) zvcPWNoABw_BAkPat}4Ck&qTC8oit18sF(gBQZs#$ReM44=?&)gqkZjzkuyEXqbSJ% ztM@|0G?HxyPe2_St2R3xe&kwDWVYQb&z0e~ z@T3H*U|<)=E)6g-eXQKC`?Ip&e@!|aVAUi9WsXZopqtPXhx0gf;e760lH>_SIkrK^Y!q#^ji*7cO+Q>82sJ(Dh zVnc>#T2U((Im>Og)r2Xe3cnNROfgxPrj?V};4)hmTRx;$P?fv1Hwj_m6XUjnF4o-t zLzH4m;xO8o(r9&Xx)qzN@&2mrFj?_{zDA}NncnDXrSK~Xzk?FvVl*I!f;kUEr%s5r z%vA2-qhyE=0)pU#K^54-Z^o;8?YUmknog80rtdiKoOMPN_lyUyG8!H?b;&ygM-r1m z2zVSd*9!*!#*;T%v{xjNQpmFGP0x6AG}S}e4cQ*s?iS^b^Hx>wJyq8Xjn+P#5)EXM zmRm16ly>9yL~ZFYn(j0yaYXUHlCt|;CdBU9xz2X$_R)++zo)2}($xsN>6!~#!dHP9zjR4`MpGwwJ;luBh z-QDz>T+rUoP>J?!`|RDsH(kTutI}L{d%QqD5+S5W-_rWK#Jv6SccKwlE`x_^j>G1b2$egL!zVFvK$Zfz3{j zZIv`QC6BH8vHNn@m6cVY-G+p+)+)gzDmtYyTq1DTLp3sp)pO;HV+Tv}2pVJ~L zV;PjPy8+v^%E>){eis?8@~M-mL?n#Alc$F{OMqjQV zP5r6-D;E+zPY~bw!M=g=*X_W;oqs>cSSq!lD!w7Lx@;Gjgtp_W(ba!zpMD+S|7fwg zIXB)cyKFNV^YPwe@Tt%J_JK%|c-(ouzd2XI9Wh|?HBs$VWQ}AlOSIBCD#rHwjLR{Z z$nHg^SJ4OaMum)k@BGxQvE~Q_{glh;mM^JB311zD2#C2QGU%L6B(A6)ZcKT=;jH(#$G&YAbSn zl`?zZ(NK*-adiWGA4*b8((1Kgd)T<6cIMKg5b>Gw%d%0_!u{5jhzK^V#0)lS)z!3o zRcT023$#cg7y}%(QA}TNdbHk&PQI_uuC-cpy(&Y9E}X@wuNRRqSZ|c6le4+T*Eyb~yWUVGsYW z1ZC;LHcSTJ=u(zqj_dK9_wiBs#nSI$$-)QG#n;U zkQAe0pVacKxrhPC(LYY;fAm&B@V*4(-p? zQi`}w)-jnoULGt&?gqbIYXvGz)XmlL8dyxz_3w_OfE&_j@vJ{StTgJ0f(JnJk%2X` zb-!j#&}nBK1~W5`oyb$MTWH`B5SRr`auS(j*5&>jtb{I+O)n}c>S4cj2?*lLEqz_# zL}NV*jV^#vBT)w(>*12mdN1x}?FUuWg7u@7j=h7hb6_R#26V%o`(l&Zi16tkP!rRZ zBEdgEo#}RWbpbwhAbWQtOJw-t?~esm(Uf})mA-nfk?y> zC}i;yWz2d&<_7vOzd?Jzw4RR$CnqNmg#h&;em>}eOZp0F+qhmXmb%HrCPYCwQ`BpF z{MUExY(st}DMvs8HKlE|v8->@*vuhel7877B&lTje%P?f>L`hj(41uVw?wDW^>`I< zYo{}xC+#-}lPP`fIQ&w9S`G9~pxPD#;kfBFMbKF(=j%GMB>Cbi0@}8>`66a7R182AcO!El@6lWTHv9f@(Dk zb|wp^)WV6_GC+g@p9OT_I)jcNQLmdppjV%PC#-2=`CP>?-tAW~%&(-DubMXuWQ-t` zpY15CKO}=)(Y<6(`oF&pf9ZYPMf8H{<4aw+5!s1n4FQ1Vqe=t>7I^6S#b%FUm(Wm) zPZ}B;z-Zxi4aDCfpzDG?@UWR`7lcjuFu>LtW1DJ~I}IMz#SD;J*kX6=`<|BzE_^os zq~bAx9S>(KVH7U&1{ov>DN*zu&O_Mf1}@h339HoQ-M}0%kjiHVI6LC8wE{-ju^Q{y z@mjkjkAwQ)T8R7B4`7zi(pvDo-7jsvAoYvFJ3axC7)fMX0vw;n0UQ;G`AnNH{8&p? zRu)jW3xJIvpV;m=5ds(f8EEA|ZqJ6&zWuIPS^#)8R7^~14US4VV>vk#PRr(S9HX?3 zj*j%d<^QcKS@3GPly}-7$<{$@$r0GuNW@@*S`D88t~8@+4_)PvLCt&A>B5!-VmNoz8PzX<1;qV+Mhq+B4=Z6;KKD^yE%*`)pLb=PLSIho6 zGY5wii6CDIB=R42A@1E_AisbA9;op2n%>L4$VD#cw|Kud>OwfvZXx(w%gUu9>X`d~ zzR5~S;rLBFXQ!7BFa*-Th|@q;vgaDx`-)F~Y`V3!It3qorK!`{@)F@x11ASA96PUB z%Ygl0o@OBjmFa7Ir7Y-oK}uoQ(d$BT^V;)1USYaE`2LM1*@&`h%{8V^zxk0#a|qQK zR)*2pn!ehY2|~fK0r}|@VCE;ZChkIdfwRH*o0P2Vn$30^r)~7xH7;z`K&hil?;A#n z7k&I($zSk*?dn3C&$mRq6av4`2N?P}yViv!x6{4ZN{`Ef$SYpU$zHc=0mn@oo~*K7 zw3RozQ^kx$nw50&?I5WiPinLSQ%t8D7S8oz9dr$tAv891EM?A$M-<{eXKm*HxUK+~ zan)s#rG;*sZVu6G^5XByQhH6=d)CKhebwO_Nc=-j*^4u3G9fi#dJ_lohMRW$cP@@z z-wCp0H$iVgJ{v3wPV;DwH7-;eBL;S_n=h4a=tQi>3KQf}C{%lcPT~BchQ=s1)R^q# zl*n{U`@p60#}BdC38xb%8KRf-j$1U_J0MNm_0mKqZLAZ6AX$z53|vVP&dE4BvUgb{b{lQGfr*(@Nj#$5RK?KM31M<+!%nUGRXi?5P2MNaB{_#gnbqt*Z zT8H{+F~+~OMOPX}dxd1xUmffn)N!^lFM!hY)5vkSC=kb)M$5G2Shpjj-Gt)ytMM&H)VBMN3 zQ0-w6mvK2#eV-cQLH5ND1WAR=@t!6s z6)C_D6ahsGygiUQxJZ%~v0b!1MmK;Sz*yEj}y}do~zG*z^AC%r#E3y!` z&bqM~pnCy{O2BH0W$h+5CT6tCLKTKrvIpFDmMBye?dP~#i0Fhzm%!h43k*nNSIh8~ zIKI3O5THIOC@DF`1`Ton0~grjDR2}JNJjEw^&zM?;e@XnfW@p(z0@}3F_zD65tEEJ zX&{kRX9v_lpNCUQNt9UWz4KOgy%tZB=5Ba30DOSFwCU5(pB27yOlz<9WT2NJT~UQJOZS3)J))N7yj12D{6E10tc?QC%WHX;855&qC7he=8iOfD2ELjEpqcYt>kPE!Q#o$lZYq>R>^9p;Xe3VOw)uVGF=;*zB>fzGZ+@-50KDtZFT3efKSH70?x zOF+PFr9E(F1;7&ICs9uYBp@Vg$P>DK`1wxmhX>U;jl3~wBq}Y#p!l&}>Oz7Tp0v^^TZ`Xu8?s5}?G^lYVA! z#uQuTG zZ8;qlBIC6Vska)<`ja8zff4*jZNmVpoE&g?77E|E@~O&sBnI)L&SkzabhfQ(rE**N zv2P3}<5L(QDwM6%ZGwaNry0k@td)2Xpz8WPzZEx7k3;gHbz5s7E8$*_j=tmV5ujE% zK#pV6Yw3Y_U^s%p=vWnjcQ#fP434H$XjwV2%w+uW^ED*Wh_@m>55m>SqW|Fdn!WGc zr~Z_$9t>@L#oOcht#FUQLM-yqPtWrhvDvSBW#@0 zM!rMeEQtM4)z&;$tGAu&W#N z8k}OqZXjHiGwaXR4z*vL^ygD^a>jWh#)mhJ^JRG@tQ~VK=jH_g`=)+jF($M}aVU9U zgJRiiJD|u>E>SYHKH};mF^XQjMBAKopp!G7>+>Fz?TfcIsXM7MqSst@w5S4&j&eKD ztY;W0B0jatm#G;Y8q;mRK%>HFM6G%oV9B4GN*vvoq+k~FHiu-kedu_aMJj6u@eDFXT!LStsDf=&4#jIHetjPW=&c zX@GX!)BLQUc}1?H&$v5^;&##FP@uKZW{%f^IC0CLE**FSfJDBzIP`VS=m$=F*&{5A z(slWHZuFoDoWiPp;)^6RnwOA`w!3FRTykUzf3!&kfT6>DA{X;!qkPo9PVTKF*Vh8M zK}Jr6s0g_g!AQlgnx+jSRXgOk23R6tiHXw-E=xmH?4iM}bS-Unwbp|F%>}%r&Sss% zV~asI`Zz>m*r|`ky-9%EsZ@D4p(2L+j^D0}n=#(5lkN-|g~3C1DRf}So-&zk$-bs` zdj-liRlS^pTVwxnI5mb8lTtK|e~x=?nBLbqcnp4k+dn*2mr6Z=&SZRhLoX7Vbb zt>q_3apQR~FVH=p#%kbOa{LNkd$r|Q?@H4TYgcF8KY-xZoAdmY?YvCTAhK^j(EAAA zxtR{WTf|6_^86E|C}9}?-Yj9Gi%74kJ>cvm_H3(<52#ggANg@M$%Y)9!$!J(kw&2` zhKZ;B(J^!y!j36>pwIM_FdX1KO^!g?%H((6e1ZBVt(ICq{8ld5f(kc`1fR=J-YV7< zO(6LTM)x<6p9x=oW{(XiHVwh2q#U{avKX*MX=5Tg9C(I<5tQU=%=}woN=f~oJSHk$ zz89QLqSv1%aaPr6Q@6FPu_W~~bT5zjCD?&$-(n&+ITlV(f+=kFi)N(JE0^vxL3(Tm zI!PJXBf9Z~zx-=*Y9UTN!yESBuU^Q|z03u9{EN$t4{`(TI!iOe&le8s--ZrWTGg~j zaNoG@V7(Grau~NzlA=U>T>>jSVsxOy{OUY0TsmZnal#*vDP~8*_$?rr1RW(1Khh!K zVjOYg7!xp1JV!*LECnE;Q>;Jo_2`>!U~Q>48-dUzCf(48us?VK=0Pb;2~WwV4Z+kj z_g?@Gb>aNclQ)8o`G!a6NfrDrZSeokuL6;&u>jVBT91H?4D0_kfFlt?7Qefe6^udh zglPv7*%}i7Gvso2bu2>&T5Ag6WIuNRL=Onu;rOosFe(5n!UKSu0yTTS?laB}K#Fv) zUTM&F1Y={PqjLq|tm)+S=rswZJ03xVU)m?G-)n@3>VM_r(DksT?i)=g*@i z(0>d86A>G;fc@eQ0Cl&Qhio5m@S zzLf<)6dl%U{Pt0F3Aq*Dii8H$)r& z&0S{|7KI=|PvGL=8c%gb-p00UE(J2o-l{;l9NV*r0Z52#tD|D5?9 z*@pG51A*%u;GveBrgbtsPx=7hRRecRr0e>JzzW~__^1PW0{dxlA(hwWCpO@_sU4r% zY1O=_WQQcS*flVnfG})-rA>FqK6$k&>~^9roawenqJY9Z_zjFlT(rSsFMs+E^c4iN zDAo(=!^y%fy#&K~W&4S((pv<8-uoZ|k5f)@ei?@>bO@M>X)G~sn1(;z$)dav3%;QKR zNyM|Cs~5$W`2G0$BDS)vDu;*VE3nyW43OhS&4H6T2o(`Sj--y~%x=%kcRE~LV3DN; z<36^g05)}-B4G~Fx~K6DCIL$28=Kx@ea=(0gqsNBw;~{6rXVM`4&xVa?S5hSy#RmK ziIqjIh`6BYeB6yG&UQ1*35_bC>zrWgA3#Gxsfh{j(sWC2$cG%zjw=IdzEd~aJ7orD zeTID@#)1eF6A(z59o_7f-d@8J0I{nHXukIGx!I;Kd?hI8-Wx+TctYX>?`N@jUo>K2z1UO_c6e^n z6BMrM{9qO^cVioF@pmLs?67?JsUfL2kFz!gY=iMU7^u6mDLJ)+CS`8CVNMs*elp6f zZUef-5kRUf#+|+Zh~@Cd)MGvrbo95%$`Bq)f}iBLxE#<`DLT9%75A(KGCo^jryYWU zs^D!Yx_eMe+Xnm)(KmGx23?i)WyL9Fz>OfMgenO1PNF7$O!fVAINcbj_HUE zYQ>*lVM~V*6lj$Hbi6Jz=!n?{l*C$5rq9DQ0Op_*DePYI=QdjJjU9aRb8=;6MXv0e zL+E3wHZ?bQm2R`UUDI(l7-;J02j`oYoVOJ;eV~!cMt55YB+}mL6rU&q(|zOFF+bwt zUrt$DfgHHB+2Hk_mP_9i6(?!-En7s3VE)9?($YdS{tuAUV}cs(@W{wK04sjhGGWf& z@`sq1IO)$Nb|5HLGoP~pK?Rm+ee!GaO8=Lu@Bj7J4Nw~Z@x0J_0>D-zSOCx^cJr(N zx>v|~ulMd|B3H?3wqhdy6@R=i2Y4z$c}RtFRXFWVfoPLFa?U>kq*Ddd#_j%m`bh?n zL}`qhsDrR*l(pFl$AhNv_&<3N&;`WPVWllMzrlzk=s5cZ`=5sHz<3)V)web_oc?~B zi2;V~U%9!wHvhQS{(?No?s;Xu*6pi%3d{640Hp}HqlN)ra0Ze*r+YJKeignkIc<;A zf)13xcBbq(qb%+2-@<7yhL)%VYJoj+g1M+fG%)q&M-F5b5kQ54ICO)G*mMP2esG|3b3hr}v;_!|H$qY>O2kVh{7fe5-VgEw#900JKL z44r78mRy4-+xcK#v&r=sOuU^C27*bGhqDQlXfS~}XH)xrYi&)E%0m+rF28~2h8IIO z9If1OmWN>KNZ9*gZ??c5-1*qp80g1uLHSU6aau>JM zu&b*pkhn)!w88ulI1O$VDNxokz&N`y18xK`ks$Y0X?B3NShLc8r5zmhjkI?Xssbh8 zqu&7i3Y07Yng60Icqje74ZW28oOaAb&oC|6p9IeljSk^|+fXL=Gri1%%BHlCq@ z>72e;8e}#Qxe+~M1~3o`C_ZwQ4#&^u{miArSR+sTMRpDOCZOm9j60~D<$S=M&o~(y zuY)qmxV{Cd#FJFUY0{sy$zwTrR7V7p>F(}k)vO3WjBa$^1R7eFBTu3QUcWhE%f&w{ zFl^ce(h|-RDCgb6_Wj5}AOlpxDW8Bqay!Uq_KO;ktbY{aw@~YF_Mm_i31P_#kw9<< z=r4o~mfYP6&_Gaj;o6SlOF;ZAo7TZHJjR6{(|o}ubx6`yvgMLQAu|F#C-A=VOaRO< zNx7GyJme>&5Qr{NY5?th|1|$-X1|0+HXxW}8_f*n9W#ST^3;Axp-$q^_oBIS>#pkR z{BCbsHGV49H`QPskX$HKDO(F4sc~(wU%n$e;zf|67fIjF8Vw6!hOqioRj$NIE4+OcMWS%o~X0J9BRPEJe=T5`&f6v&8J zt~aPddnt}5qmtOk9dK0E;my=olSA5V3+(KCxI_@v9qpt(PP{zPm=D&i9m7_(-fB&l|9N^$3IbD^T5LYKnweOrk& zJ_j~cSYyp>f9yplivjU#s;BD@*~(%}I;&lD5C0+fTh=E?t8>_KFG-0TJRrDcMJ#X9XpX`7pyThkSW=z|f_1s5A*xKm=^g|X-M4(#<))iMd! zjUJb_u)+~RmYBZL&nL{JBQO2+19ViC6HPyve;-vEPX*L9axrWWztUCsagS(BHhl;$ zkzE$0(SXf&)AtMGilzj?{DhVn`&W{p!Hz+kIeWP_5bWRqnTm-*H0V0&)A;8K@mQ+( z(O(|Ogi;^iX~VBb)e(6{FOwu)%{~jfNs`0pB|&i<+W?#;X_Vqu212`mSiqrv)AnBN z43)#Xm@Pt1mP`rdXa8|Gq|XL9uCv)@!g{MML8QbGhn;Ig_%h~QO3anQV&I?V#~M(CxeIF;sj_+ZOi|9(J&s9eIvk>JNYr31?Pkw!Y;y}D=P#P>~K-) zH&cJcU*Tz;5<|lgD)PAodeb!N<4yUe-eckHo?Wb#i$GlVo8aIR^nC8WRR$x|<0>E4 z#Y}^^&81Q4UqquDJC(DJGNlAlnBtcdHL_~if5o7QF`Y~^CEiZ+L4yuy8#+##?!j|= z0A)M~hqpr)>mLQDiQh-K4S+^)Z$Hx<50)w}hkP>bjkZ`tH49LtiuVXeMM%fEAlcU9 zc}b{9=>(wuxA%gCoHOZ;v=H^SKF*E6Q5sJ`oJv?l6n*`N$G|1mW8ol0j$--NyTY&w z&B1sQc?1mbvvCf}h9v9cRP)QGF={27`S)=vGW5xtn=?$9n5Kepcbf5MSU8Vz%aU*Q zT8N_e4KBvLriYoA?V(dDBIg7H2~*hpqixMprNR1i}6^yLXH7=QIoF@9QxV=$Goi%o3)G)WFdmr_(j zUTZ>66T0S?&;*TwRW*%lRF)J5K@7x7iR%+z?LGJo0s!Ns@(f#YHae$(zOQV@27xYB zqwnD+T5dFL`$kmI7}zTijL zB*viH8;YbFU8VF5Agx?#@$$%Bd)IuvJIz&|oN?b;uCMz86tb%=F0*0lrIvI9Or5b$ zd5;n^2&iYph#euly>e&hD*f{>#bcnVUl~pDT!GV|bC#SaKJ0@T6#wOa%{u8-;{V@1 t=W*f#zIx;FF`$vD4g7%gbeQ0uS?sbS-b}Op1HXADFRd(9BBAg1zX2OE)l>ig literal 0 HcmV?d00001 From 5890d613f407752cd15353e6a811bcc636c9f18b Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:32:02 +0000 Subject: [PATCH 2/3] test(chat): apply the theme before mounting ChatRow visual tests --- .../src/components/chat/__tests__/ChatRow.visual.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx index 0edd5ebd3d..67c320ad84 100644 --- a/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx @@ -6,11 +6,13 @@ import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" test.setTimeout(120_000) for (const theme of visualThemes.filter(({ name }) => name === "dark" || name === "light")) { - test(`renders user, diff and assistant rows in the ${theme.name} theme`, async ({ mount, page }) => { - const component = mountedStory(await mount("chat-row-conversation")) + test(`renders user, diff and assistant rows in the ${theme.name} theme`, async ({ page }) => { + await page.goto("/") + await page.waitForFunction(() => typeof window.mount === "function") + // DiffView reads the theme on initialization, so apply it before the only mount. await applyVisualTheme(page, theme) - // DiffView reads the theme on initialization, so remount with the selected tokens. await page.evaluate(() => window.mount({ story: "chat-row-conversation" })) + const component = mountedStory(page.locator("#root")) const conversation = component.getByTestId("chat-row-conversation") await expect(conversation.getByRole("heading", { name: "Verification" })).toBeVisible() await expect(component.getByTestId("chat-row-user_feedback_diff").getByText("Hello Zoo")).toBeVisible() From 53340bbf40d1798b5aeb7b9929f95cd935ff763a Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 16:05:12 +0000 Subject: [PATCH 3/3] test(chat): move user message constant before ChatRow visual tests --- webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx index 67c320ad84..4acff463f8 100644 --- a/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatRow.visual.tsx @@ -5,6 +5,8 @@ import { applyVisualTheme, visualThemes } from "../../../../playwright/themes" // The production ChatRow dependency graph can take over 30s to compile on a cold gallery server. test.setTimeout(120_000) +const messagesUserText = "Please update the greeting and explain the change." + for (const theme of visualThemes.filter(({ name }) => name === "dark" || name === "light")) { test(`renders user, diff and assistant rows in the ${theme.name} theme`, async ({ page }) => { await page.goto("/") @@ -28,5 +30,3 @@ for (const theme of visualThemes.filter(({ name }) => name === "dark" || name == await expect(conversation).toHaveScreenshot(`chat-row-assistant-preview-${theme.name}.png`) }) } - -const messagesUserText = "Please update the greeting and explain the change."