From 84c23e7c4ef561e03d824793297d94787f9ee750 Mon Sep 17 00:00:00 2001 From: zhaoying Date: Thu, 19 Mar 2026 14:37:36 +0800 Subject: [PATCH] feat(web): memory manage & memory detail ui upgrade --- web/src/assets/images/common/arrow_up.svg | 14 + web/src/assets/images/common/check_green.svg | 20 + web/src/assets/images/common/save.svg | 19 + web/src/assets/images/empty/noData.png | Bin 0 -> 97333 bytes web/src/assets/images/memory/clock_orange.svg | 18 + web/src/assets/images/memory/debug.svg | 15 + web/src/assets/images/userMemory/aboutUs.svg | 18 +- web/src/assets/images/userMemory/ai.png | Bin 0 -> 6364 bytes web/src/assets/images/userMemory/me.svg | 18 + .../images/userMemory/memoryInsight.svg | 33 +- web/src/assets/images/userMemory/user.png | Bin 0 -> 7990 bytes web/src/components/BtnTabs/index.tsx | 49 ++ web/src/components/ModelSelect/index.tsx | 6 +- web/src/i18n/en.ts | 9 +- web/src/i18n/zh.ts | 9 +- .../ForgettingEngine/components/LineChart.tsx | 12 +- web/src/views/ForgettingEngine/index.tsx | 85 +-- .../components/Card.tsx | 46 +- .../components/Result.tsx | 647 +++++++++++------- .../components/ResultCard.tsx | 78 +++ .../views/MemoryExtractionEngine/index.tsx | 286 ++++---- web/src/views/SelfReflectionEngine/index.tsx | 150 ++-- web/src/views/UserMemory/index.tsx | 6 +- web/src/views/UserMemoryDetail/Rag.tsx | 146 ++-- .../components/EmotionLine.tsx | 15 +- .../UserMemoryDetail/components/Habits.tsx | 2 +- .../components/InteractionBar.tsx | 15 +- .../UserMemoryDetail/pages/GraphDetail.tsx | 119 ++-- .../pages/ShortTermDetail.tsx | 4 +- .../Workflow/components/Nodes/AddNode.tsx | 2 +- .../Workflow/components/Nodes/NodeTools.tsx | 2 +- .../components/Properties/CaseList/index.tsx | 2 +- .../Properties/ConditionList/index.tsx | 2 +- .../Workflow/components/Properties/index.tsx | 4 +- 34 files changed, 1107 insertions(+), 744 deletions(-) create mode 100644 web/src/assets/images/common/arrow_up.svg create mode 100644 web/src/assets/images/common/check_green.svg create mode 100644 web/src/assets/images/common/save.svg create mode 100644 web/src/assets/images/empty/noData.png create mode 100644 web/src/assets/images/memory/clock_orange.svg create mode 100644 web/src/assets/images/memory/debug.svg create mode 100644 web/src/assets/images/userMemory/ai.png create mode 100644 web/src/assets/images/userMemory/me.svg create mode 100644 web/src/assets/images/userMemory/user.png create mode 100644 web/src/components/BtnTabs/index.tsx create mode 100644 web/src/views/MemoryExtractionEngine/components/ResultCard.tsx diff --git a/web/src/assets/images/common/arrow_up.svg b/web/src/assets/images/common/arrow_up.svg new file mode 100644 index 00000000..a5105d46 --- /dev/null +++ b/web/src/assets/images/common/arrow_up.svg @@ -0,0 +1,14 @@ + + + 下拉 + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/common/check_green.svg b/web/src/assets/images/common/check_green.svg new file mode 100644 index 00000000..a16b1ee2 --- /dev/null +++ b/web/src/assets/images/common/check_green.svg @@ -0,0 +1,20 @@ + + + 完成 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/common/save.svg b/web/src/assets/images/common/save.svg new file mode 100644 index 00000000..5970236d --- /dev/null +++ b/web/src/assets/images/common/save.svg @@ -0,0 +1,19 @@ + + + 保存 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/empty/noData.png b/web/src/assets/images/empty/noData.png new file mode 100644 index 0000000000000000000000000000000000000000..5258d466b892412ecb531b25452e6a689e75fc99 GIT binary patch literal 97333 zcmcG!WmjBX7c3eGu1(|a7F>e6yC%511^33?8tvc`oIJQgaQ8-or*RAJ4kz!q_x^;t z$5>zXr!{KLsxhnPjMY$+$3!DR`|#ldrlNw3)`t&p68}3WNdNv!C71s90S@${C?omB zclD&p2U2=qeDLVkpW|F(^t;_KZvjoGE+UNHNx8*3x1KHRBT{&uSzT6WC~>c)4RVyL z9>InGW->u1k|n8LCv-X8Y9gIgxj{~V>SC$BnV#o<%T;qg{`Sl5E8Rk{ zfhcIV+hy>VHwWvwS@`C~yt;VTTh;5FbS?G)?d>?H-MZc6s^Pa~g%Xwy3N8}xl^&)p z<1u)(puGJZUEi~Vg|Yid!dmkC2c3X;_rsaOI>R%Vjn||3!Gv-g%zqOF#qoA7-H)ns zrD9~Ppxx@=Ji%Yybmlzom6T7-Nrcofry&15X*e6CyQC}rHtG0$f4<@H{Q6i9&3}D2 zhWLoQj}++M@CC~tY~>hh447TMvM(y=6t7r zJ(m93x@idcww7w}?Rii0AZ)43;p&f{<_ps=Kl9~$Y)u?!7&EwE$SHr=9CVjm!oy>Z z{O7oNrgZ`7sGO(a#8duRHDn3QAdK*J3sv;4lFAsf{raWKub@$+O0&s(E6dl*pnesY~WvZjFrQIzu*VRPY zL$FDFOU>HiSa{ZV*{wVXw#em}zsYK_AO*^N305m6=w`K_Bv%B*kGu<_`@J5U);cu5 z6h&rser~^Q*XH3ls__;+Y%)lz?1E9%dt~@g2XR)Zp5bt>tAHj7k_=A`t595YBu{ZW z_I)NfoN`X5)m~mS0z-!Q3E{1;|rhQsva1Mx^_}yne1M40IeIR zB!;y7^&kJ_!qr}s4*7+%X)B@24OYPPPgdmJR#4(){sUOD2_*3l7kSP@vk5iQDOIi<89uwtgP)U-AxO;*l~a%5cJ?Q3kg?ZifE3|30?f!(tq`Sh2{5C`^L>taeEC zsEA@{(yW#ad(8!0VVcjiabIpt=b8xS!5jJQeeYXowEZJ)jk#p<{A5LR(b1CNtkp~$ zz#V%mrfB}5QEeqK*Wy;us0GV8=9U=>t_%Mf=b>&M#?Z8nT1--;P>L(EQDMdqyrfOJ z=N(|}^*?6f)`9MQCVx9@A%6{g(!p)MfE9Pjj(*rCKn&riV_|e->IX_8~O4NbNG5zrBikv2pl~HK#Qqy9D@&fLvX4&-I(6rijaf zSBjiS$45^%vs|PIJ2Qe<}QDK(}L7E`RP_^!C|78;nf( zFbRUYGY&YN=(>E?(IF^kd-_{hUej^*YkO9n@^vKA&f++}%jpfNA+~brhia0Az~Fbs z%(ES*v0p~)m`f}IKM;iJR21M8_#y}HG63y;vT27ac_@W-#gfLbuG3X%pZ;o7KQCy@EJwygTYRF zM73721=)N};UPLj6_IH4B4CB0rn0Z-c7BKHsa|P2d9qEd)QsL#O;PS&Iz#7&CnvlPqRZ~VX79+^dn*vGpp@p|DiU=+(I znJGn0cFOoUlLAT2xHg{OWCmjuRj(o0nG~ogR<{N(Pm9fj0dy+c*z(m`uq!!Jme!{p zhQ4*^nHi$gm`t+!z*#1ti5KzGQVrDtm$w(be$wcZC`vXFzt!mjD)1}SQCe1*HEz8< znZpjNg#}!tgreVXa%?a=JjH(rwZPsu7pe|+kg_eW?=Fd9`VR}M>hP-10LOBacxn&5 zd|j3m0_JQXt53-b#mNR_fWr{@zAyRpE|zKN9T$Ysl0ABi$rSwn@o_+fOw7Xuyw3-t ztJm|K8O@zJ?~1pH;iqx>oY(Jinn))V_$S8*Cu7s~URpf5x|3w$$~Y0Zmx&w)+9Dcg z6yqMhv@|%#xSdmMX^U(~=g;Tz*Ay3xrN#(CS$a`P481Mq;4>C3t>Z3Jhj-zBmhbyl za{Ty>kQOMP^=SG<($Au7)(A7uHSK%cvG=r_c3WTkAy1bt7U+i6+P)rUd6jTA;}K&e z<9mV{&^R!Om|+2tFCljJ05u+4oZ0o4g%JQl@o~8cloc?JCQe*wq?>ug& zQ-V)4nfX$R@%2cB()$(zB7(R|vj{?;O6C=k%OuJLB{ei0=_+(E`NjKkbp0bn_lyg8PZ-zXESa&-CH^WUme9bsBS@WbKF2TL3`>e=NwmC6=iCcc6 z{rRdEAsKnBo$wexeAhgzQR_+O&ja#{g z;K0FO8dQ?o^-^ZlGDP9JaQ`JgG*h@+BbtjM3(uc)`BG-6e>(`DI1c!+R-REHO|L3r zuYsrgk+Ood?*Ep{ifbczk&u)uf+A_o{a9d#k>Gf~USly%_~%WGpSOC|_P?dp%_5qS ze4H`uSxwNt6hn_0@v#X}Tgxkbv$k^O9)Q%%Si*+yU=9x*e%-bJ$8bu!n|A+OPQC)V zqtb{Ziqhcjdc9o3VHGwi$nd`4oUIkmHH^(Ywm|W3Cm(F+nPly;BL1hns%TcI1kT}y zf+UpGh~ZrXSSTQ!2}KjgV4zyXjB{!qMmK!d!JCsNQ;qccmfV%c{(cs+JwDKymTzMH zl{rF-=^Uj~9@SLC2xE&PrW#>Pi(g6 zDt_>_4%~o!kxh09>d*Rl7D0j|yWufDq6%IWO1BIq9 zxFzIq_$aqfn6JoO(CFfZZ&=k7zHreg{Dp*5h*fC1_#9T}?!fz`n|72;y@Afm>zYDQ z5wd|``WE_Q{UrJ5z%y0!?ra;8PT%yMcv}HslGIg5FNma2X3De9TCKiK%|--loy1Vn6Vr%^4Kd#VZ-#(FgO`H$d6(phlFHTHa5L%M!{2ylmC$$y#NKiW^J}!4t)I+<`Tqk;M3XhC;NTRq$%%d zlETU|&goIn{~&Rm;o$jdq+J84$$+E~frbUem98I$7yzSoqav5Jw@1ns|AX#N`cBS|w}l8tlsVdBIsfv5vGx{o`6S4{4mtjZxKW-g!<3quK4Yv*g& zQEm7A!ub4mdL4MZOU&Ng@O+e@W3+>zQmGLD!w+7ud^%JAOmi`_TJI)E(N}B@lOj>y zoeL;%$s$aE8WlfBZ2xtL)hFXyzd#@An9nKXMT&>9``vN((+7R3ygnzaw&Do&(~i{H z?gPNm-v|RZ_#ILBcvgAN<=$`35-Ho?6e~Xe_d5y}(#h$x<^yQ=Mf!rlq#7zA zxYPg*I7m9pd^mZAR#ksl)ce<>HcqNM2iAHhZJcy&Aci#%ZCfi;(0*|gE*2?`Jt(R$ zD>AlhAfIy>ZX)5*B-@Pqfd}VyjNo-etXA@@R{8a>!CEB!9Ms=%ze11%&E^z zV6!$H^{negE-aRq#&A1wge3gXC*?RkW(uFkNh*IUZv=$SFhU&u1&vS^;g#aq+i57@ zu-_h2Ge*_Hh|hQj)p)0(5@(q#7mj+i8ZlxbSu(7S;s8TOAGQ#7aJC^&jIgYyJvpTb zolNs)c$Dgy*2*`}qvb%qVl7vB<~17g6s1Ea!9Zm)4ym5z6uBp|7wq?oOohALMa*6C zBd>%~FRG_txqB~IO3{y%GSpiDIoO~2!ofYy;kcyw)+zton@CQq0gl+xPS9#Lu;gQ9 z{VO#=5`=nTU$BNzz#9IS&gB=AgNfrr4rjFP1?&e;p{WfBZorpQ>&C_c|J2PCPq~AK z0%zFJBCWcGu8u35f@x|wtyoF9-(kO_27H_+f>co)#LN;$@Nej6Uk*4__y{}{E(-3= zh~5==4unv=CV0ipbBpDMk84@hM2-n;%Pt;bwrfPj@)bl!eBuwHldPE z4+b;;CB)@3AXrnfeWm!Y#JDoRXkEoyELEe%&GoW z5Vk`j!aTB>4F|^JG7}lkDVE0{4?O*`02WDRS!x85o{8^sUFS~s*WYFT#}-zt?2}7Q z73VtGX^}#TCUPNBQZo>)-BcI$;&VKZpx|!I zzp~RUV{cE`mig=jjeXJAc81|#zG#fx5S!XqF{NClkb#SNYaiHeB|u$oLen*ZE)jRh z4`lox0v~#>;jj3sb8!7Hv(4f(jV=`6rE6}P_A_8~-am?V0W}Pz5WZvv1^>qYicC!W zM=bnu-+>!m&GPWhcZ#_w%<-+{hK&P9CY_wLQL4dXKrQbuC;|CEbQn^>U5dl6r|lJ? zH5yxu;m@*LI($TAh*3w%qQJi$#UCinZxjT_;}{78Zx7r)4|Z`o zHM0Kxzw(H;m%xeoc(5Md$%b2iU8iOVmS&2~!1<4eI-(b(?)qlQHgA1%NanUcWj76G zDIQ?A&TwHxAwzyn}>d3 z7=T>%uucxZ_^+XptPVw^Ezuxi)wds$NBovIgCea|DB&Pwt|_$HVh2|$-HE3_Ocg1^ zfLlS;%d@;^?++Yxo?fZq-gZVAX$A9q+~^?@A; zs`{3n?-AU{CzJcep56Q?xmE}9iK`#kUY4=D<8*tj84qi!J?;|MDr9%QNX1h1F6G`| zp63}pi+@V1La5u;A0&7zHi(iJIm2JXkSg$UEB+b~Ok7Y##mjCwg3*DuqJQOyD!%%` zL+r$H3J9T%(A6{EnF7&qEcbwC4|)=Q!_8&rdn=2h`B%;-UU78=FOTS5sbA`nEh zl)_5n)=vQZ*@q=ji56b~iHKYY8j>o>bPk)fPABJJe2UrmdsExuS zaN!oA|6tB3+jQ+8wn!FKr^0S2lKyiG$Zzb&JODZ)27#e~hgA7+l9B9r85j+sUD|e| zSmXs0eTo!d(V|~~I>rKm29Tn8aKS8vfg%7qfIrH)S``wO5Uah>f!x2C0s^9fQ0moG z`>iZCBvvF;nvGrq*D@LZi@7-r=@vu9&`^{rLWOf8=CLd&*{y(-LS4w+!GIgKf+7vQ zfn&r%LKL%kiyGar)c{Vlf0_j2avK!A`xps!9seHX$Sxk^gB5LS;UD+S#gB(E=*id# zi`yWNh()9@nXP)^9v)kVK;JI}f0_nyXjJf3urN|v%Y^Bo{(94Glc$sAq92^cLJUx& zq|08HHAA-o?8H;An1xs7FuSxLq0OnokZ2^};SgIt?+fIq6qQO62+~l}bjqTjq$XGV zVQ^?d-6kSOU@DbB%k|1^_`&3^qGW&+~W;uh9B00|>rf|pX&Q~)kkGUFcq5nRiF&=(0X=5WGilRY6? z1c(YrizLkST1;V7GAMnV97N+0CUBb7vK~bP>fL*#FN?vC*hY1hEEL0$WL(`XEiOBu z*zcIPx0p7zzCg}?b}IDj=G-aKRDjEch%cceIni1xWZbuFyNC2;Uhkr zC!1(EasYlapag_EsT6&Q@J5718FjIhoYdg>%Q8#)DtaO2r&1ESVXuL zQY=oy+NsY(jlDOk>icfP>R;L?7(GIZ2$2ni#Bri1(x_J9*^E&5k0dp=XK{i1$b(SY z9r;~MGI!d@-Q^3%RItiq&?ITeFSo;aR47D3f^Img8PzmU6n~1wYx6jjNUQLbFkzaY zL_qKaG32HDnMzC?aq=n0vw7*l;pvcEJfa+xJM0N*3G%vX=uIXn&WLjC_GU}3DJuRx_gY+;+$XntKRSAI#-qsdPvaH;Lm zGM5OUsd_0}$i@-%ld)ke`>j;`iz$m?iwfrYxYVRNRM&mJ$GLcRc>qS7W;x5;r8FS5 zNa^Q?xy@=z-tm}YRfja~Lk*e>Gm*#rkXak-NXBNQ?}KzxST;*)>FNa*-VVZhOxB*e za5l~RT~ow~rv{r8hQ-Q#cTxN8;1J_iuknr^rS_~X&lu12xjtf!dWLc)^5!w(ez}jO zbdk(Q)in*>u;NkW>}u5Q5=kPZ?FyL^D#+k!>e~}i^I~a)dCdLWacJi~{DmF!@@*>N zb@Rr%WfW9vts8ksA(haHmzUstQ?1R@w$j?$Tbdj`&Ut^>Y%EI8jdadpB{(*eCH$F(V-K)0W5};v9Z#_NXp3TZB z%D`%rmeVrO6@r{y#JvFdcAj(kweHPZhgY+ zJJ-R6S(fzww1YbuiySQ@W2uH53t7Cxi%bq|&v0iH8JCTMt}j%=%AG)7Z+$FM3!B~j z?GPS21!qecnA*Vl^Ybz5B9o`P+Otk3|jTDA8+SJmb(6(Jj=|zllEPp$@74V z)!G?3l?W_1` z1kXBHre0r)Hx^)fp+r?3dMz3~2Xd!Iv1z^dcpgAXXza$kNSx5@du}g>DU^raezE-; zaG=V61v7m&hO$-Hc}?)i{P>BO*lQoR-q0P8?ExmvrPM8r#M||QKFu;N2V9t^pFPnW z{qeDUlAiO=K|OGLzGr2x&42!C|LRG1qK?=eNUwov_CI)nh$aI>YkG7P9^$5Kk-mP1vXH=k)yaQ|MCbue{J`< zO4)c4O+OC~$$Apm+r^_jwx_O#x^@2z8KI7#Cr%(*z{7M*>8FM2rn6COvC-E0!tOiM zCu-VrJs~@85t1QXdynfSLxvOG=p35|!FvY}Q|~uxH@`#;@|Yo%I0_o(F*w<2>J$gK zl&`$HQw#b}{imLkos^($y2q zjlXn$z%CBSDZ|EXvG`#0+fJ=iehRNariip1T;xD}y>H^ko}->bQj4yZ+IAS{3uB@@TfBOh28>H=3MzdW0<(1#s{W|rs&+(3>YHL4C zeWO%@f%EAHCEd#-$15m*UC%}-re44yGC>OBrQnhRGf&G5A=Gy9w z4*WlOuwK91ikge-yBATpmSF{FTdy zEj}s;%1p#N0n^slduwRXy86=3SR>W!!i3LvyQkkpHH~&o>KT1+4L62Q(h-%k&8Bs| z8XIqHP!g8JP&dH#zdjnKcxDaW6=*T8A|4Q>{!GkDo=cW2MuSsovmXhEl(i91dYc?Uorym3()$o>tQ^Z7GY9MYN zi+Alja&$&@bl-e-&?@>K4J5(@H0(MZd{E9Q&m=Czs9&aI(AP72{=HOpyia)bVETf1 zwP1gds^RER)T{iOa_;{!SbObj9sfW3a@^UubPaxteM8i)_CJW_umlA@MHYYID&nz0OELivuU58dxS_7};ask`vB*hlK*vu_obaK6z zLG(Q+P+S2cQ^#DJY>W3=9!^53!eb8k_QA9o&M_KpN!3-}#GdGQO$ zrtf$|DD?P?ex0uJEG+-mvh3r6?&YGf{uWep%&zUm<+R2dKfzz@e6rbg2kOpDM3X5i zJD&@l%^3>jv-a-txzF29-Pb{J+*u2mf4HL?2_R&S z`5~7Kyn-;sfbL-EO6u58RFkWy^Bv`a7hab5@)f^BseKy;!G>RxRvjOY09%NmEDuf& zdW2ZHr3mnNibO@yk&v)Z^al;*2S1+vN|Lb!yp=yb+=0i(zK@2%L_B0O4n8s4hXI<1 z2m}Ws7N>5!4yaQ$;Gua(8K4w~AljA)H>I1JYm%CVx#**P#jOW zJ&L+Lxe^Mud0I&-v&~>VM`oPi775 zu_n~CB>9fXxq^~`>BkBiZwHrW-RDz%utmgUUP2v^?v8CGsQs8rn0d_(0sJF|mvip* zHP+T2zby|_pO0PFn`DbZ-X?W9r!Md2bA2IlY`eQD+OGatv5#yB>S8g3`SdxL^@V2t zk$Vih{Smp}gR9Ed-kIJNL!rqAuY9E7&Vi{nlM*kAG zA-@Y~C~0&L)DS{?+~k(1rrMa5q!1`^Bno3e;@-vy5sNUYtXY71 zxcIH4gh`ukX)!CSfNVMo9)R?Id%F9+8NjyH2g>!@#AsI7NzU!MH%V<9{z4|@gIV}l zJ)OEX__w4<;4Q^IqXX|Mrd4u6G!Y%#pDCOqwi>sMS&#MS!B6D`86yXwdPy&nxJ|+D z14coQL+cm)q-|H(m3FPdRx2njBeWfz*S}^CJr_2EE_n0ehtYC%1|hSttOaMbiMsp{(mC zlF7g#M+eOPV)t*#10oZ4PiSAk8a9lWQ6RcM9J6gn0`r9QKi2ykl0N|JoO1QHCvC+? zx?hn|#P7MBhO!UL#!`m7#5~sq*1ddF7}Z!U6KH4POBWvh zyIx)s@o)wspMfIo-^WbdhVY|(=aV{P3A;{)P;Bc<`-GDw(9<)Pj%sRfkVq_*o5(1C z)Z`)4=?DdwxAWv!`#NOhL`j!{%}hP8Pc4&DX#gfanl{z8yhYnY9&X#`xKo5y!6dQs zyAcAvT}gyBwC?h>v+zn}jmt3UWpRDwurwefg zamkZ^@wOwW`l^1C2T1*ZQ9&CyY%3b)lm;IypHjm?jpAy48qkv;MkOgQaA2I5^FpFc zJK@CAD=hC!&r@mZ_xsHL%^j}@EP0ILNZyZr_H;r{_R9|Y)<)#6rb)_Ia8Z!!U+8fl ztuAt4sW~n=y!3V=t)hBvvtN%4_(?s1wvI2n;xWJ1wr++K;nrJcdiACr6x-8zinGY) z(F9odn1n(n#hi>rKQch{@_6wX3qH4T-RFEjT4AGUtTA_H@LZ0X?&N9_Q9SyHvv2UWTM6dCB9^9NerX zGimXrC972q_p3xd>a%=QWWoBvlIV!Cg%b9G4KWnRL<|@r!DsR$N@TR{AW}(0qlHlF zZn!}|*@Fj3G|d8;zJ>7niL2n2J~j7!2^L!Wj#|w_XqxI0@W~`)QM7sXoDKZNag(&V z*5qOCKDQ!2`ycei8uI+(dGEI>;~V(-c^w=U9s*W8UI^7}%MzAIf$PI7Zq&W{RV+A= z2N7Y@rerGkh>&@LHwMV$J@SGht_(0DY@MXWI3RWQZsO511t%Lw>`*etN+CMMDE7i^ zaxKb1T_Kp8M)i9Mg#7x*u|?J|6yb`&kF@^2R6x7Tv=aQ+eDG3x7b~ty+bMA1T0=^b z3AM?hvEVAc=UvembV1k5Swf6f)hKXW52XPQA77r|OrKEr$vIsPYDP5Yi$B$#+t#%} zg@c|(Rwmi7|M*0#xx52U<>LE^a(z(FHQ}280;PQ*E26@S$-iQ{=c1#9d#aP;Xx0F# z>f$oCV1A+oJ0%0)sHj=;zwAREmY{(Aah&Q0XKIknkMCp$w2|`mky>zt1QC}H1*y&H z0*bD(iq$JJ0@8pXGo@094h5y3h$InBsl0ORV!DKVzW|Mb)E6RJ<@m&7m2ZEPc` zva@9?B6^8;C&i2wj%0H0p#iAf9}3(jg}pVozmb9E!T=N{Wvu9T_{S=$ zXWNPh*7^XYNS)Ln+;V-f*75#3wgpzbLs=DL1 zX-h&~=DgxVyM5SI9&ed}FS3?mn8u}e@F9A@4Z8dx9W^kCS$Uk>Hq#cPA)$#?!y*7B z?b=zSa{*indv=3E!q&Q)kyh8R5gf@k+P#!d)W)_zvm66cvthihCzFQaqFH@_X$!Pb zF+bdc%G(0!mHoFdvd~m@TB@z0#Eh8IHFb(Q<8>{n&W1ErJ$S!T2gwRdH zHB?gVT?X5>?x+o;&~|iyQc<2HZ+WsNIpt!C6ix1cA5_87ej`H>Q22+Yf0uGk+ zI(HAiwcMY}#vwCQ<*?=vyiAHR&e#z{#LF)`$PZd%xZ zgcJ2luU=-CBr6Pqsz+kAU2TkJaA4c2iU5R&LYn`6+pBrnO;63hy1_rmJM3IGB)Pd1 ziR2HNB(?x$gP6#fTMT@pW{qOryk?@fA}=#(TLajlUVXR1+dXerKey`qHphVn%AKw#rrVu+Qkddwm>FuST>SdT=XC(JRnZ;CIexYlvl zcucWu=tUYlv(5lSICj-6w9ji&Q;Ch`Sz=ycnm+g}v=DcUiPTje)3K9gLMk~#E#;WM z3T(5ug!GyvjaO9~!Y0x!i zRuIhR=NF0!%jeP^GSMx-<0M2+3u#+a%Vq*|%JsBEEMHb1cQA5WnF>cRPeM59|7czH zysnIlfsSQDp9UPU*I(`o#f>8SzhYe&MznUFe(P)h?V+1g)#fd5Ra=)&+QDM{Yl3C8 zExd+#yg>qw*%?e)ay(C2vPQ%L=7UH zN~-p5U)A3)%ih`T1nes4iT1sn&67END_qLAn2oIZ8KQ{?L{6mJD9Jq3GlRid@_6#cJX^``Kb^Oq?n{IMrekT)g8KNQ) zH5XHLior~FZlOu-Z0<|XGU$49t)a5}yzx%#0ITP5O1dY=|IfeOemLr0z2zvPFt;iT zCKcJ1K3V#b3&=7NV_U9!m|r^i4)Z3w%8DXc4v{5|B_R=A=%g7cDp+zhq?S<#m|V@vh=xE1&+_`VZ7u)RM6D z#Dx`WZZL>&1C{ZwP@<@>=gfxP$$v;M>>(*uDK` z^chUwN4R%7XT&FH!>6X_VttQeB6@E$^P7F4T7?$ zpU(_Rumfb7KiQpS&G0xb#(Ef%Q1D8!L!2dhPW0l6%;S*g_f^h>D6m84H(rp~yS6YI zSVuk8GMi>YUH(uF_BumPZ1+Y_J3bJW@pzYM#}OsA zwEk^_dBsQ+_w%Au&Rv0Pg-1-^Yg%0&=Fe>(mpvxSJZxwp02-m|_nyqjh`dM~0ZNlf zOtI?agW~$)Q`)u9LM@&dBjQ(BYOMEJ?PtOtjvZayEr%DO35|@4e!pKc+TGt-1U%00 z49nH)>g&fmf%XRGK-z5Tdvv8MeE6S?2Qq4iY-1ObMUYgSSiG<91sKyq{SM7~>$-Rg|3#&w+HyucCfZG9d?^iztt?NEuw<@5Q)e*#u25BHcSVQAuK+(1b9- z!A%X4&{BqRSmK6#3YF3pGWnbS;(!CYnR3|-1+}8M^}h@%(h)L=n)8)sL1(<>&Tt<$ zV~zsA(KQ^8W2R3;@B5;ZyHs9epUCj6=@;FMGp7W2jEk3~3j9rs*acZ5QT`47w|?8I zUADe8>Uvy$CmaQ7&%Iy9tK@vv3Z-#C>b5|LssMhmhby^oQhN!=x@w%lYR%-%s&U)L zzxQxs;S7EX?0kD6u~pC8>~F`-?Qu_F z9Xj==zeSPymwjH2RT0Pltfs|}fbdWw{j#1OjwKJe%A?#T zKYzhITgkezuI=b=+VUHFB<(&hPJ(&Wuak$0`%r?W&jX3KCf`3%cVCshBB}@7&3iVf zKux7OXtg@v=D#(WrgqS$atj$Es}6n;S}C%lE~D3{;gTuQXUvdl{H3}v8RHfc8LyNV+t5d*Y7ehD7bg)Q%}bvy?=4(FmDdn}e!51BH@$b@B^3ZU>x;+(d18C?2q zT*HRqf;%+2kJ;|8|7+xNHrd$Ob~Le6Iduqiav89S0*)EW|MEc3s+qOkYCdRvUl@xnh=26jXKoiw-@cPh@+C1afasbDQ-+j~X2fMq)=2TbqF7QvB#}*qE zUt8G@J#KC1&Z=YY$3xL86gmX*YfY!2Q5Hb`e4pX{xA0#WYXznQZG8kf$o>A5vYCJ$ z@vg7vCoL@Ikg~_{a0(}~IvZrQDy=28i>ze7D!u~86(;TeGXIpe;1T$$9ZQKK#co>gsmx`YvD7{kYp| z{5n(J)#0=Hj~~Ks4~GRWao*3Ewg*R?oqw4oKFTw{!Vc~dgWf^4<} z=0TVE3MQHsGW5y6pqvHkxcsf5>F!O)jb1Va7Ctie<#wd8z_Hi3wpIEO)Nd%e3_k>C zZ=y?9_*Oa0nv*JKD(aSUw{`oO#UR*iO-q-*UWGgBL!S>)8rhtpqJE;V_&b;PTjpK; zEO}W}@@r!`ao7xg5M_Lb(*1V5JtYlY_kfGV+`GV<8b;#fxp7Uxv#oMAwQXoo%!D54 zD)XYWPY2BBm=5T6ouP?e!_+Tud#-RO+Jng9vWWn2s7mURU#m0*nOy>3y8@<{M0!OT z`P=JTH}AkXyh{ZKk=l+g)g$>^CK2d`Tm7EncdT{wU1L9=+3WotY1Zy@_t&8L+uP6t zbVhywkV81rkJq@MW;(A{#s47ejfeOI$}A>Db_RulwA2P+YAut4THLE_)ChFa(ASwg z)JUy>fGOg*YO3!)qrc8%qJAfWtA)|FRKu(E*^uR->x{XN4wg`|{|0GjqpVK|KNq`1p8xN$%& z`J;QiLNa*tDc=V?z~h}R^pSGIol@Sue;>-Mw&9VoP;IwlYd1efH;-LbEE*?QcEGMd zAde@(cnp!1cOWTKm0nZxeNo#E_B%j+_-Xo#BFt6C_3cP`f7oJds{6uP7kYW{KEHJR z^`Nyaa0e@fe(dHCu<&9~>fuQKUeM1yoFxN#)w>rj;`;7)Cg>5TkB%F`;5lgVM@LDt zod>DKcQ8m%^ua&_XT~X$ydu6*^_&rS!b4byM|EF;l8t6?bz%D@(8dnHwws&xfU4l8 zq7Ip9+Wi`B_L#`U7eb|3wZ^JsN7D@sfpAAeMVqeg)V>||Y~Ii{eh&3pyNFXh5a??D zzEpnn+8a8jOh+X%h(U z1m%qFW9@D7Rff~9=6%~9=Bsq%m~k$!X$GNxM?HOFD7BxdvF+}XT^5^)7QaR4xyVnt z9%HQan4xcq6o1;+y;OB+>$L&g5s3OY!$Q6L_uCttOhi;W>ScNKEgQrv7g2C5opdYd z1@&=Q@aX832iRj%zwx`BHK5iiH{?xtohxd_F%@PiM>1e33VhZy3@G-hRIb48AU? z$4_@sjciu55_9yOC#8t!W~~*y?=N@@#WsD9?LfRZ+Yxv06usZPTTvT#l+8i5EHEtv znpT_p`+d(r*S8kNLmgx$Pw75Z2rSgqW6Q9^fK-)0^s0e{dDK%RtsSU6-5`#h_SU{B zh+yX>(EOL0oegB6{!64`5|@6DgvTBC-UT14ONuQc>craM3SYZ%_)xwVPUB}LB|Y*~ zE3|k~-dZNvnFXAy)EZ;yXZk9v(Rlh3QS~!W2eWY^5Upa>yG1G~8Ao%WxGs!zj;}nF z^6hUgDaVF%mJ3&&+KQM*HkFbcAExX~@rhDD&V{p&a*xL5 zAqy$L=-s~MbhfA}OX-r!|A`Z`h31M51Xw~pS-a=XO&aujDkY?(;WJ!`5ozv(x_T8c?EcOI0I>vbfd0BZXu6`lr`}~A z1B0Q8HxYj14}jC|kg@PEKdM24&$iT$Wl*gW3K-n|Im!?|8=XrpqDslE`9y!1_Q2Mw zcwo1t>#a|z&}9;v*ZFJdES=A_z38;5=s@)%!i#{|mS{3)-za@Md zZu4fn`V;@;#GJW{tYTaypXF>--z_xnpcT94b|=uAD35h#;!M557Oip>gqXBSJ}z^ zVxQd29C`=|FWNSa%d9@BoUZkKef)MOysXDBY$&A&>X=+@-!i@yoH$+zk@`3AJy2tZHgF*$|)aRJrHI;|`^ z0!N8Mt&hU04z0iM$}hO*Rlv!L{j3`sTy(Z zUvBOfLco+JnCd@Jz8cGwOkYTin=LUKI#(mzN>fH(YJ5%V2_`C!qNX7K@dwV}{z~hI zr$S%k_%OWkJRm!rk0I!MC9xQ9S*UCH%5KclF=q(87Qry5Xw%XRbqFqSt}oHgp*EHm z6Dkrm0x+;m?Gv~K=8QdFHyx8kc*jjHrnE?Qddzi3ENCZUQQzY+Vjv`Vj@l~}bBQ}& z)~GNwlMIL4b;&yJg;nfP4l_Z-KpBiN1Qs8{Ha>MT>eCrS>jfw22{>u6WFy{2Y9)3M z9G9TN)3-ID{P0egRY-XVIRMfmMsYrdt zNEK6{j+7}1oHML*s9fxo*u?GejfEd;Ui?Kk_~QG<4dKS?a`Qi_i@$Jt{wVH?nDx>% z#@gd2*5UQ5!>v4Px{QoHgY^z;R?Ne*E{W_U>{I-2wAfIILcpPpjWV~Q4E2FbLW)sD zxB8$RV~|b%qD2=)P+sX`~;Ad>!G}MW&G_#x^)8pyW6qTW| z`g-LM84<746)4u!6H;kjLrcB1u&FeIw%x~@m0wg}c{!LSN>gwoXT%C$=bU|=svxPO zf=hSfoWkdcUwF7=l>QpC&uRD{zfsXJ{YC%L)Z2z3!R#y;Kg*>18(t9GIa!MMm-zny zbU=&0G^5#zSPAtf5K9=-c#6qg>hdT;gwhY872*X=Y@ZY2q)RS&V3#E}#wr(MfHerE zeow%hBgG^!_nh70Gmkz?-@qh5kJ3bC8kGIrU9R7}L3{G-S6+MZrGN03{=og;^|yZc z@!h)x@Qdhi_3G8osC@4%Y<`QZ&qOybldc%^IqN!3=0e{uI6PV*i$nUOJ@#+iWO=Y> z3}NXhELkl(io(&s(lDK9(u`H=X+$8~&0^~vjp6J1Oe2A&fmyT06GwACb4!_R?XaUY!X+8g!MHvw9qYysYlxhn$1L8eUC*J(>bJ6~sdX@}Y77IAHz^_?AKm)mIFoq(idU0d#8*~3aneK+7@B_}i& z&}_ve7w^KvnN!f>xSDrOM&cA>Ouc~Mo9@g)SI}VZl~LVzexY}b08vbm;vH4ag~rFu zf_sIVV1>F^3XKXTTR|w^EpmL3loz_XNS+X^YL$Y929bcK&O>b?c&8^K);+3{Q!)}I zXD^_xC-ib2LIaWrMLBnJlaj52?2^5#HWm7&(3ZgMYu7k=dCtc6)*tTnZ(YB7_3EFw zdi83#TL8aE9^dvC_y15ieysiEz(H~FD_?1auj%ce@UFqID76g zH^C^?8^z9Zs5tfIP5YSWiAgO09 zA8~4Do%375mtQ*1tG@Ir**v+;`iU)O8|(I7mFx*L1+Bi;)snK)08=vedzbWOtUG-qRSF z%^KJ^4Y2{eOwL9aDA47^V*il+TQ^wj?s9Z+NIE!RwK!tBzo74y>>l)d?E0MN%bcB7 zk?kEmaya9bOyJt1w0k$n?S$#QuP1Eo&^`4KVeclKyoYAKhK31wd4p!TK)24I(=}rc zCD6x+9PJ{xN2eP!qNFCm(M>n%pA1xPK+5LY>3V2`5=9Xyy!hl(oWAFk?egZ{ z5B#|=J@p$u`th3|zFPplfFF#) zyquDt?_3g6_t6^hF_FN=_M9`P?uXDCZz@Xal~tGN`V~iqOTJ>iW03^OncsNi4(C@b z4?X=N&rEu5pSc&+jNJc5j$U}2{@M$O%$T0Ih-{vw+<1=m@Fr#L0uo!aB-#S0X(>ks zwB0ROKV?j9Y>=F2w2(GVQ&J``S1gJ`Y?;nxOlLcsY?TMj&3NGa2A6jNmru^Q|ICE* zTaoQqU}plP6{}LnH00b<`Xi1yrR04t8iH!3q(p361T`OQvN^1z-a2hJ_fxVFHBwBz z1JI{oluZu!$0pjsBa}FuL7&K;@LasWNOnyf-kGV|bIG>RPKN(y#7NLuOq`_1K5Dzj zS)355*Fh=HeoG)o@NB|jk^MDzR=f!1@%K?_Bf*5rF%Gw&6)*AiruarX7dQuty3*9! zHB{7>z8hMZ`yOc;Bs4y5tHUgb`MhN^otkA*AgUTRos~tGk&w()(kJ$AJi`O8zIW%D zXI}jAA9>4(Z~dNkJ^JhydL8(p)B&o#J?_8nQ-6OmZvCll;kvJ&5L&Vt^QVk}w0d|Y zxggOxK$QSF8%P~(u{dI~h@vJ95w$T%>Kd?8ERsG%*Lp=lbPP$ver8dMOj-1q-6Q4Z z?jhIjbUe1$;u8;lmKSa=*bO_}o}TC0jceTe%x|(RYn1g5#{DNFmrt#+Gwo?e9^#qMlIePjp6dFJ zyy{7PM{K7yYPy*}uNIaLJ#^E(9SFlBG_m(52qHS_-zs?^;tQ7i-<`-1sjRBMk4LT|c*PuJH7Ww|QpwkY}G+AX}$6HJ@`j?sM_nNiMF#l?z+ke|o~b zCuW?Q3p=ySsr3o50ah#e)YEr2=?^liqK@BN_n`{XPDq^-<{O3p~z4qqcOp4(a!)y|7%AV_fx&AKVc*}A2Q zp`n9bPb5$p8<&HZ8Pzi2Z=r1|**v&bakK0H1e#DY2~1b$Bd$6wh~}YA;|HH1b4Grd zw8iB#R@&_uM3YKspV5-+J*qFb=3RvVC0d7QGqZc3O_7jukHiKQA%+G5%$lC*bcU8) zgEc&7K{7IH3wJxfFQCWn```AJQ*GYSrmZt6 z^$1m)7j22QV@0OFvWqa(WDf60qN;)E6%=<6T|#gvgN!bMs*tF64dQz+d>er{6RGN0 zkarDr>5uyDFM;4UxQJP)B$yn+?uY=5f=<|9!LPpmldN-#d$(I|K6jl<_nqhRy%#CP z2!&hl800WR$LS2U9f<`YBF)5-UrL79 z4*J59JxM0mR1ksUIADm4ho+j-!wvw$dMPHyqGY$E-~Z$9=CQ}0VcOy= z1%xIjt*2SHO<>kE%-e>xjjT^5yz0J7tXBO|*X{rDzwoYSe)bEs9(+;l1bOL~|MI!D zz(1MA?bmd@ABEoi{rj7$#rI8AeV;m}GeFVD#@oRHRg0WftjF;j^&1zh`*Mb#V>hk( z#CO~d<*cNSOHwTY&ai0hg50RDnxU9M{^P&?UamCHbMrF~^T^{bu^EooS)U=A>6a@O z`}=hJyL3l~^vfgiYC&18$g3qeTW2S#R`lE#OR*bPbMkJ;3r?=-pkBN~F!r>#KR8%- zYbz~lkt)YxpKyzpy`MOaRy##IRLaQgwv(ZIMxu4sL5BpDlC8TABIEO^U6yy*!{<>) zV#nU_QM-~z1PDO}l4WQaDppu&4kthy`Ww2l+I8x&Q8q|`(hnFVJ_4(cvIVuT3DNmB zyC%p9O&KlDRO8s9YbRB zk^BfTm@EMZxmX6C`X1aS8fdNJX86p&BMPIh$=V|_B?RHtbJzJt|J%>Na*zA&dnH%yyO(pPHkfa1S_jm3q^>icY_S_E zr(A2c+t3XEtVDr`AWgImw8}iZ#|y68(_y!92*E9JeyD|jXtFUe zI?-@!CKoUML4tLn!{=qCPY^Ul0Ckwk-EuHlw=r{{3iAWt5lz-Yt+o1#K1@vF@dZ#aCUKO z&IY*G8`q8L_2LrEl$!o=tn(p{c#q^f0{v1ugkqyo?Mj9&rEbIZ)&r$KTJesb`(<_} z9k;LFXx6e-N#iSW^7$n5jr88j|`-h~M7|1zu`oua#yb~TY-$LCY znhW&)`}>qgIg?A~*8Y;z9rCLCF1+U2oz*}33$MR)@@@hAJbc{x^&j}^iOk*>`?-{2 zi?P)S4O}`=7wpvag#-8}d7qdfD(Gf0GGx1{fqbu+Os3z!JG z;&(oV4r6r5R(Q3TWF;R zSdk2dxnetg89Jp%kY+4~1egER9#9-t&JHD{VftkJA;G=3qRZ8{_GY?pv#40}-s;5aCQ>rv=mPlBkN(4!-29DcSpTwqm5qUPNk+v^)V-oq49G!i)zK9&pgMAVRQ66Fm~4Yk zHEWg8_3zdSk_#cWgHEfC-9vryE&`XG48)3za)?Td;9ZGQAO^a{k`KP;gT$`qu}7a~ z+Cbmijg?bp46Ngr5?s7n@_-jv2V9>s!%EDW^@sZ2isG-kWW)RF6ZS%?YpmEB zZmI6YHKN5WW!|_-?#;62Qkr^jNN_uvKYuC7I=kf3pOk&nuOwA1P_7mT9J{W(6p9Rm zeaHx`#9Aec1Y@)PK&vE;;hn*4cY!#W&@_z?5vJkPAe>yE(KhZ783>v2KFQQyt)yZa z!d#S;3&sEY*{5G(HwSWQ|3v97{&z3`33m(N=j7vo{@QoXboQOOvo($CzRAj9QhTW? zMiq;yvYKPE1|t{*qK!I1M;nsWtvKK|5`q;Dslr%AG&}w#?q>3iMxeN~LM1u_+W7yo zo1-}RujsLHn}NX;|2^-0$2)lL`Dc0bv8Oh$c zudJ-4qKJEE4Yn{`%STQpl*C2Rwp-V`%b^(SC{+@57fCT}&krAU`<@gXq$pAk2#JGE z(ZtS-2cU48Xo>MQfbx)H3=$YrU?)m{mX=t$;{7W%s2gdG68Aa`VO>`$tE#tukqZCI(WU zOmflnLsClZfNSVx)ht^4x=@k}d1b^0tZ+qVOlzm=H=Vyut;IpT)2@;ae@_R3!n?I9 z+!*8{#Zq1jk2G<0QH&%S##Fy(n}*m-h|`&Oi2j^%vFDJB4U!VQJ7OR_jICv4TXUl1 z&LGJu)d|);1_{(b-2(VI__*;afBl|$kRNNq*4dmv za_6z*&i8p*hdTa5PQ&OI>**LOO2l|m3|))s_p2hmUa)G>@Kr;osJToSNs~Gr*HL*G z{|45Vp<^?nx{P6*^@z_voX{OD`NRi5!e^hn#WOElqiuyYSn&%XKy@?to(Su-9Bi*~ zOj5g1!^TWtT~mk4u>go;orp(HnJz8+LLg_2Lo)#F>NjV-@dswvci~n^OpT5gQ6wiM z_n;=>kYHV5jA3|gwUCv10F``9w`nOhMyQOb&b2cNj=zcoVr)ktw&+l3s6u03@|1J( zap+#w<_kMWL0{#&2)`K@T1SNaqgatzS;h+9j~OlAE``YxbS(54w8E(dpp zk2K~EutW{2{KIe9=w|ww3Fq1l!{Wp{x9Sk6%dU%cA)yL;YcY-EMQ``5Z&7oRtCV8W z3CFxRwnJhZk?Ne(5Tfv&pMNJG{>W!}>DDeHg(fO7sK+^Fk`}sy1AE?;(WPqUDyyr5 zK5xV;J<&u*T(IQq#BJ?Dt=p-6wT3uGS9#Z4a;EgD0-J+yw_=1<2Z$3)5}md6VA3#X z+AM&zhAfmyCOL~+>Y-Az{(NGN!WeRpt(a%*W)HPXZ(8g8ia(KT{$V*rj8(Tqu0`!w zatt-jtJLd>QHqj_@AeH29w<@7e^z0f4GhW%ssyz?C3da)bkeluF?UD+S0mV4;8>zU z&dClrCvn8dp{8xQcw)`ZF~gs4bi$|hlwEDcMNh8MR}B<|lnW^H{LCPpCgYm^Vy$jS^r}tMTCARW+FS;SEUSADHqA=D7{g_%S6J6oy<4}XS*jF z9|2oF_-{VIr$6&3FI{_yXdLxd!=4E#gBZ8siIvSPF2J=ZNCxXu1@7Z)!cz}D!bd*v0b*J4+zWST z+FJYqL7;IQspLe~WLwsnXaIlpI&-YE!qQm={hE7o%iw1XCgd*JIwZH9sTX~zi8sad zXek|&4@JW?L-DT*{yvP^ilN}pL>cS}v4)A3K{#S#SShXp)FFFsfFdeJt7el^8MoEd zpJE4{{obl^RF|G;F^EKDbgk5mx!NE@)qn;QNDsEZ;9aj~g4XZ{85!M5yg9QjvHGFK za}V=is~qr1ACHlIj5Kl=4#j!cisPzZD|Y>rJ`MXv3WPd)!L|NM`=_9w5L zYTtcu?cmej@Gm|;qV>OE3gES0yLx`E`opbkp3135L$-7g*OHBxzF0zVDFeA7#|ZtR zYD{lU<2^PK`gK31d1x8jB%`L#ak9d20gK<@5=Nm(J@G3DH(0zpLjAZ{qK?JVG#uQ# z#jm~VoosE*`M1CNNlzoTLLWtFhAm9=8b~7XC?`tt zVre5869KVtOgt2{PzXg_D_EIZ41=q|61BL7fJkvtAq@Uz^^T(oyS2EOS&W?ygOec+ z0^(9TSeKSm3t`dZA*C)}S4HE*x??qhL{i2#7#ZvBBWq})H{dd8M8k0pb{Q>{R@imK z?F8QjCjvkJhf07$_=)Y>_RcCg>CfZ7JDRr1dO`^*V#pCo~me zYqFVCGV7CuH(j}eXph7x66PGqlsjRaTSrq!GhRD=f$er_1ukOOlNZ6zG$!(o6JnT9 zqG7WKtH8!|#)ZrGzWSwwzU|)ilRwb!G!OmD?|ALIPM&ICJh|O``rI=8`uV^6?+))4 z!2gdP`q4kxF7o8>PG##&X(|f9J>nwYDkuqcQ(3(!+zDcxS~OtX>uOQuXMg$^IFiVxKJsby z7fWW7YHEiNl-NYuQ-RWVJxK-amgr>SeE~(G6oscu{TayUuteexA-`&!<$trp}&NBW;7;&DxNtQg1F!Jxa^p5*Kb|XSz(nR zh{l0wMru}}73bm!)>V!q&Sxt!Co$<_Nh@`@?C&2Yv?%NHu!*ltHfM}>H zkz=Et2MSb?D`kw$qT1nHK<(SVhMU@(hd7(^kze}_p1*#Ln=jtxg%_?fnN)(Lj%Pv) zfoa>)wvFwxl|bqet&4gq5o8&z8Ptkp$;s17WN<+Y+5Tj==;4{_GBU$;2QJ>()#X5H zudU*&Hg;Qa(qW|6$<1#`EwDWGXNcXE@(YRUUP`xx`d zgn8R=a{DA(Tf#i9u__Y|JNT`mOI?_z@4XaWyq5cLaW-im3{7|wxqOKf-E1ebXUXM{ z1nsxU{kMds{q|WKPOenwG;wse;`COFlt^i2+`dzyl-Zlktj9Msgl|2#mfj0Ia<>5f zHa!mhufP3=CP{uE=DFmOAg?@^Zj>tEouGl>CL;+o;dk(@x*(_wl>VAs{SchgC}UhwU5i-Lj6DrGwk@d{PlbsvS{ltp2ghaT46BsP$_r=@A^hU}R5gyh`oh854Z!a-;fL)z6|nQ3)2W?$LtN zt4zDIP0lm4WR4c4`Ss=YeDV0N|I7LjUVZD=ZY;0gIo;4dAnTj?Z9o4jAM!tX_YZ#K zSO1VUd|Ok}AJK*{Z`L>BQR+F`-Gu_DuAJoT_KeMm?v=y+?|swjb{_v+svn=%c9z>8 z_`xe{(!6UTTMy>GP$Us@qDVWwxFKMa<30u}7{?b_m+W1aXYzTdfq2&^4o+)yJ)xRO z-|R(WSEH_ntIPah$?Bk#|EfOup+|2Zj#~m}$OAuQqzD)eoKlzs&?CtWN_k4(~ znOS4WOHG8Pfk_jXx5CC-1TbLkSZnXRL&3);2oj&+w#yi}G}U818h z=J3h5;D=COrzhMT%RU^ffDEs<7O)^;!~=t|oYG8=kyM`OQolDeFJs=d+5t;;HeF3z z;?LJ&$?UTVA)u*;D8p!5f1cUMWU$O3;+DE>I>W}s&787Z$->}dF>!NnUL*UePA{}R z4MgAUCL+!jJFF3W3|EG6UR-oMUZV~pL^}jav9zGUpIu2L|2ipYWaJCPA!=(v$#!jP zNwzufXqRvMp%& z^KtAPg~!gWI@3!9=40b~EEvSdAvApSeZRrsqT?eUd5C4oOnu8&6viYGpVUIM?vGN) zzHhhqo>{aIVxWjnv{2nt7J4u;oyWT>3BijT1F=za?vAsL$A?)ZkHt@oJW}r&$eYS)=&yP-ZlH5t18-C z;A?1_!GWTc%pHW!3~Aw7(&#W!MKu|uF^KJ5;**s^F|Fe<@0-XN$bgU2QtcT!l)B;T z2E~CE+in-bfKlte*U=0KJuwg`Ethwu{MPe>vC{wE&@D4@5@Ehh$UUW*Tv=)V4Zu(Q z2N%G9@u>sgUBJ73^jp5{V$9|1*Vn?gY@VL|o)>TJ{qMi)uf6{td@k0J&r2Pks>=Br zyZ`-6CVw=o+%R5>d1{AU6XOVGLfs*T+3r8L3We(0@MP%WB4o5qi5w&I7$p~i;XTTD zs_QV8;ay`sCY<&BxiEH@dfZ!Du|n@Yo3`cSAN@GL`H9c++zZch?e?yv`VKKo^(3prlHr9z%om~}BdjXZo z-qw_t5C^;1F_!CPhn2b2=Y2o$t((pIU(#+aijyAoVjPlOs^9il!iLC*^|?^BVlXu-9SN45CS##7Sx6Xk zZ-)Q-#Vv+|Rnf|zH>;}=>*-u=Z8aJCSmK9z%5ZRlJdOi(tHdw-(g!%$-Q(jQe}pD_ z@RA(6U;n*GuPA}(Bs#ln#Wge&a=&6SvGtU(jSLxvL%jPj7P2zk5qqwxR=kGM&4Xm! z)Nc{@WA`i}n#Qfd0-jo39V1o9j7M|Xe;c$=N*Z>41ep*}vhNEHAsPYU&sijnLTu5o zW3Q`oeG1UxTY!eoMxBuI&eOY8!6Yc+dq1c`=>UOd%nz*Zn=fOsJ;O3Y_zzg#kZ7R3 z*TW!^YIB1z9flajt`g53tO2<-KmpT7mb!!qD5(sKnv5991ZfOjEXBif3#x(B+iSey z`~~hmdy4h7HJ52kV6wr@MdFd`EB0g!N}*lb`CW_M<+lPq{r>`AQ~uS%Pw}rF{+z8P zpLZSLwfFqRSIt!ZZp^cJD%m56oJgpO_!?;HK(kcQ@z4p4zR;R$7yPELIF<|~#MreB z=^WL+>2INceZP-ARmX8WW^m|=7*F{j7E9%2#nl$)wEWULf0ecs9{ubSEW0%PEROvp zqo&&#Txg z99BntBTfbhql1GQnovjC0aF_@^y=RVRV;2Whw&yd=oHm)K-;NefdrM@Dycqqm#gG7 z6t9;l0VKRkvQmq(xb0B~_ltLyO>+$Q^$=ViZPjgTFAKy_9k57~p^m!3VHZJF5>%;7 z4VjfO%P}_ANfRTXSeU~=*w>(1$4f&9w%;XZv_RJ@DV0FdZ{rL6@p;t&-u~Ftop!JP;hAjR-**8CX~3Th6JnI0 zRFd#mBxsE|G8`+{-G(06Iqshj&k8Jf`iaC*9DFR3&(cP$xCGbzmBCl*k_%xRqg4mS zw+fx>%_q`Wp;95t=REY0kMZ!skMhJbH+b>ZKGWzyF=7H$6ICBu#9nK&1fm1=2=uF- z-1TJf8`pJaK?2&;i2V^j8Z2Gj!B~i?T7F)|Lx&Ez0)u0O*B~0NsWWwLq!etk>+(*UYe^qT<)jleQ?@{-J3>S^Q%&9SS zjy1u#3d7xErruo*-JDidINF|R^{`aOEJJ8Uy>{(BYDAhBI31$;O#@oj3FxsE4aZYn zY$wgAGZf$8SFy>uyuGM(ly~;_c;fj5wm&^uEPjUNodZs8FNk4DyS~Zl;CXWCDXG8o z#y|L->;LZE|Mc)~0sI_btlNeB<+aK7H+HKjw7yAA!!aek4E8q{GPo0LwX{t>W?TGT7n}!r)-83iIG!$y+t3=CmONFLMrjL^XT{n78 z>uV~>h@=Yo>oE_nTlb3Zu^8-ODrn7g^)-!km-4`BR{?l1ll_3E>bOt0E+wx_st(E6 z#R{)RUnMZIr@>Uf15r^$=XJCLY6Tgo`zA4`%!{V>y) zQy>x|QPlS}XJQPz{?Z0N^qwdA?DNmDy*6iOeVz5$I?}AMT&>7!it0rsTPLkkm%MrS z;?_EFw*dZ*>-|3P*S}*T(?75M77~_zghnU%!Wb$L>}CjxT|{y$$(gFXDwNoIx0f8t z8Tth4+=37}7EvWKW_r{NJWnDChJtwndmd#h?hST&7LCo|h^VU&$9y_PnudPa@vq=dHG7eY=YMq&fKe%wYIuo?Ue3fI)5OD^eE^{h*=%S-zZbTW!(V`{* zW=y^=wF7cC)VjtpjHYNX|8gmwtrv#PcH!9ewxKKYQQekX$-pvKk$NQyLTCr#MWQcx zs;SRGh8V7@|I4|!(s9I|RpQuLiWS59nNvfzLmuH7>Ss`fwXFk|R}V{Ss&=M`kwu|t zhBP0k!4{`BnYCnt#1j7M` zo9kt4uMEqPw1%m=XSm4m;Cvf!%Q41S9i*uvjQGejq$t<@As*ZQu7Cb>blm}uJo-FG zUC*=~;mcB>gs~49x`;YvV@?qBm0B^&IhiOrDMb^JNNA^M%7gHDNK9z6dIeM3dIIdL4m#JJ4*YQ1wHXy8f{k9#Do9 znYtw{9t%X!(Y@h&j!k3Odgm;o5ZoDF)#ETnWrA(-)3{T_-6y3SOVH7Asa6eIs39D6 z+R)>lSES@_SeKBCrLY7kgO*WLU4%ZyeGSRgl^>SiZWP9D+xMTuCZeef2l$DtbuMnr zc>K=T(5+JD=H4ArhDq3jc|zMru#R(bxi~uN8G;d1rh5G<@lKBt0N62 zXh!LWyD&oIgpx018oR{Nk1b6cFt{N4GH)%41sHgjYloJzzLia{MG~=0NDs2DyCBum zoNM>5F9Ta-aCZct)F`pawgef%B!<`R(O05%6W&;m#&OxNGtZs0g-F)DN2-O=S7i>7 zU#_{Viq#q{F~BQ2;DDObF-$pzv=31H#sH!lbcfU0ul>EcTg94w$TY z3Xx3c`;sKZe76Ap4n5xf_P54UvHhRsVe89t=k}$#Z=>{<73VSL#ZzB!Ol|^_;dw;(-)T>vsN|R-I#25_Nt4$1!84}{)CeR>Yr2`Fwwi}2OdaZ;e zENGO3*n}Yo5YxtB8f?ciZHy;o+jx+TY$H#SthrRBn&12z?r_f8{m0(t-1|yZWhr(X zEY)u;n&)(nf=UWsm6Hj`dRx+sJlTde=ubH&yD9S#&9hU|5$K$=f?ztPJ(5DyvDP8do^PIG_k6 zWLoNSQ^B-7TPD-CQ^pAZt73JI3^tlml7if;5!$wq>#{6y&7nQ`>LV?#+qZ;jVF|%h z*ys!%+L+;NU4Y63n4&`LT3B+`9>n7OW4HkRt(L*O@S3mtKSp->2V+-)DfIFJ6(EyF zTykR8A%&d}Hm=4=_5%oTl?=E;mm?~PIloUxdKHBe5ck9SXn3HsPwkf!CpnHN8%_g` z(r%hG6GF;?$w>1w<1xm9yMXuo$zP#dsBp_i??%@}Eq=n-;O@q#;s}KE$gqYapeun&V;hm@Qpu)RexS@rO(R>irpmpdlV0?{n5OWd}>t`LM~+ z18N7P-u(jfMC^3qO(5Q+Xbr&+I!SphtP;@4nC#~k`t=A;JhF;50z0k8*0e^`wOAgN zxbB*3vAk!WC_${>ZDvugAS7 zO_g2%N;x4@0-^-(M+Cz$@F(wjAGT&Yxbx13aB_2s(nzsOm;@6Tfq+7bg*6Ok7=_VeuHyYn%Bw)H zlgrpD0z%4;)lE5KkgiW(ToUgn%NRDPDbWq1D>B1Qs5!cV))}mck`fo0VXS=qsKk>r z7i3F$Q4*6Ec2GEIfMyq0g;j@1S{C$y=J|Qd$K?c6wLN;D0SY=(G%go)lRme`ADGO9 z)Q-MuW$rjAUL0j3ZIZ89Goy2MN?zDdmM7_XUN_oi5Fuc4u5*Z;cBHPiO6t#EW{KJb zl0gjVW|iiG+`C?~l*i^10W-rm3m?R_;|X}mHLEzaGsF4W3wWV0ljno#f7@%QFd8lTkf)9xSlSoT6qx(IXlH zn-Ykfz&+WBRD+ObEWJqCAQ}TZgmm_&lRR+F1y}7-Iq8cS#9nE`{re<4Qm-}Cqf1rd zO>cZR{`w;y!@LRj@a@MzAj}x()CX#bQ7}-DY^OO&u0&xNh3z}UGzUw>)~x+DjLp2UP;o=L zkcwH@k3oKk&Uix*DUOw|#X5)JB}@6x!K-l9>LTtqy@vI9gXP6Js&WaTI)v7YV4XqH zOu()LIhrnj=8xq9__yu|y!ok@ua@L~t+dNGgf4*4iwz=Y*opTUNQ z?HJV6;xZuDZ%l`Q<0>wVil0hH+cdnVys2gFmXsu%1i>`m{|>ygDP69Q`7l|YVX6^M z9y^YYeBdKk*t>|=+;R_2F>nTqQ_MIE;5>j$77^Brfmr}%fiRCi7YSajb4m4zGV96# z+}ib45(Xb&UJpv4>#eFcoMbPmALfD=x9iCq4 z0KY^J=9|sz*5Vf{yZCLfiC`mx?-Xo=OzKr;UI^&#zj|8Gm_xE81<%)dT-Fym_4H+A zT^aH*f;b?WbVNjkqMFG4_E~jiMrUSefX*O2YEhnL8J6uShCnQn4_G2+mkRA?e(TV6`9+LfayS2>31w zk5k44Yo;vNsN@Hkvck;$+mZ6?(!5UFW6H;4>6(y^&T*)J>o=$AI8CIT(%|Qq*VCGN zVQh*i?YHl#^iP0Dh?+ z^N&?OUYgPW&Rq#MKBJ5b`lW&BpIzRxkx9o9k|Gy6P&op-G0;v2xwIM_LpCoyvewI_ z0eprJ?P3c_zOT!#JJ!OI1z2hBXT%mzuqU@{ibYA&q--u32pV6wG|51yXlgLghO z%)Z=xQvlHFuL5vqxCoSyPz6HU0;NMvX-gEB5H;k-FrxSHp~GlYYG){-;bi>-8K7{v z(+VK5bEUg4>kg?GO!uKrG%#q# ze8R}PlGMC0gCh0$&$iGA(Ew84uBDzTB#RiGSd#D!#r`PTE3&p1+s8htD_I$dg)_;q zL+CmHMl9jh;l?AYI6@Jt=&?n=xAp{92I9|ki|L~poq^w~xy-nu$5jXSKKX2gi5MAz1^#=w{oezfYZ6u>XRV{+@uztvIk zyDl#84MD?QV*i2`t5Q%Zi_Pg*tg;um#TMYQ0+WN8Z6I(5vZZc}<>E7;QyfuG<|WN= zkioXecX8zG3MouB8PTl)AOTBh6Wt@wjfzqA$kpkK%vb;c))d$}bsX<~=lijA^e|ri zXSZqbQ>)Xk?He>nR;_)ci;+1PTOKHxQ5ccKbdgaiumIL%YnIUz)|PSN(Pw7p{#y1?;3YUJdw(%cdpDBo4f(;Dh8MfGmtF!Sii-VHIUk z2Fhkwiw6ea1R9{oMeY&R|EpWugk8d*%gF}ZRGMJ~a>)pu;8LJ< zlo=qo0>)Z(gh)DC*R>cKBZEcOEu*!A?2S0+WYodJeH5f79uJUM>LaE>?rjbp@4L!$ z%#AAX*>$YctYT7!M8<{<0j)ZUFxDY*Kgx}|4W>TwssBIsa+wr!nPn?l^s;j$3EE+E zhlp(J(=IMKGSbFYxA`$$nK|1k9h3Xnw0vJ7-*6-lK5euC?*qz0GGZw40d?zc6ygxQ z(5fZq-H22t(XM-alguo2Nlz{<;vx)3)YCbZ4<5kE${w7bY~hY>1zWTP+qHmg5Q`Ef zGK?u&<| z=L?Nlj!98wLBD@c*a*h5%0hA z1OV3`SMpw4nB`r4JpElhFU?nPK=_vC}oah4Qc?nQlqCVzydrF zK|M0?mO-MNCkdBIqXa@kXj{O00JlI$zmPHTO^wQTSUIp4pL_5$&R{`piw4nFu-d(b z$Y%}V?NFFoF?gh`ew`uDaEx3hoY-T`g1WA+_bi0mE=>5Z1 z=ZHM$2z9p?vq^qn>&h^5BPMoEF^p*wT7XHxqES<5?LgE~Sln^zZFt)sei+~K>?h(C z@4Fj51{f5QVS+x)d|Z|&EikG^IDF_Z3^TSS+t}QkplKV_ZG*b&Fz*6<7qQsOVPTX7 zn2L2|&fQfElJ^^Z*LQD`;as7^e|17o-|Yxdy30$Xev6B|JjnXnB&<#%Yb};RZ(c(% zKpHpFZY5v@VNPn`et=7;Kd-imF>w`ARD4Ij|}fU{w<&6j)LR zkU}ps%1G1!G;j#zfk}G%pzgljpDVD5984%vXBBPtXN#DZDKUDrwZ-f*v6=7JFa6R+ zJ};V>VXX+I(}^d>00gl^ikU--_QFDioy{%m+kXIO;uygdplS&r5-b@6mTtan+rL`> z=r5cA{{58#_=P^6wEq12PwaX3zo9bzdf`V;o1UEf=XwkrI&uinw=mX#VY6hxXe=ai zkS?n#@Uf477O(m3H(~ws8mglB>umT~uyC_V)nS2A*i#>@+^N=}H zN^Bw#xbdlu79HYhN~N=f!-MzSi(h%!Z{x;m529FF#q0k1LCD0(X2Eajs~8qta9Epo z+<#^hcbq(f``0#bdN#vm>oHgSlIGFDr2RHC+QnhphCl!kHlOm`_JWKIh+jH4`f1LWG4U~v6F3a;WP_N= zv>WG4Vb&f!&0v-KozeMO&!kI}w6tNJH^!hpW0I^FAZJSxu&Wc~7*s#V`M3!^KSUq< zr3fSoIo(9aDsn8Ow8EhI%)E4vKf8}r%OZ1yjH<&QsgfBLwGzUfErnSA6|-%oDzA~v0v@2%}arIXgn z7@R$O4hN201w$1=P}9F6^|_q@zL70&(2W|UG&EMyu`Wy!gDq;Fu41x=iF9Oujgu$v zb2q;V`$mlGuDuGs`Ijd^rV?A;Acjn4XbylF_nStY4Cqw|ny;q)B4<381d0naCh7|X z180IEBgdl{;kyo{6MVgO4k1Q_rtAH^sT(2#Q&tLi+@LOKY|bm}1yM}^O_LyCEcC(B}|!BD+@P70jZ1&y_Rwn-|U z)@b&VEI~wurM$^}4~Uss%^LI+S*~46kj=g6@oi)sM&l6{O9SIQuGzO2$L0)60VoU{ zMbPpgklp+0>21G!=1KwlB0rA4yjB1B$G``{Z+^2qwQ}-#cYfy1H#~S|d+E&D z`v3hy|MvIa3IHE_@z?#{zVXt*^3eXPmRDDoRu1yL-~CIUIPtJ=!Z^TIqLQN&a4r)X z%LY^xxb;J~;?=+RNBH)?_jmD(uX-Au_{^_B*EK*h2imzDqqKu#M6i#rO)p; zTG=rq$L8RraHrVP7+Io56R0&L+IE_O#(}#e${dfAwT|R6*ZE=U;v)ddjNl`TGgcM6Y_$Nz8{41MqS1^|Ec zi!XiAKdh&*xcPVA{jv0K&wka%I{+u;zdJAaF=otn7JlwcQMj0k2*Z*?M8tdl_^pghS`)|h&z3{8>!FzUa>#>b=aOt}r82J&9Q$e+r*;Jf^;ZazJaVhhq zf-DRooB>KEw4p=oBYce5Xd_k|plw5+%to3u!4ZxMaE$1h7OotFeG4QXFn}03=~DE? z)O&1MHt(jlwZ$kxUNWL#gN7GnrBDJ$Bu!x)g!&kg8T=SWf*6~n{BLqEtGe3X$%uN!b0?b(FeVZIFq>}k&H!jlo1HB z)bIga1bAl~_2w29Y>T&jdXC$U&rnrMa0`3D{|v}L^&r|f{9f25nC`tELCG1*}I5wQNcNjgZuVjdCvkC3J1p?+iU00 zHFI!i(ajoc>}+AH4!S!x`6eI-QJGo#&LbKnEt3HdV61^v_d(VQlR;#!%P6gD3DWUnKcg5$8_Eo{ZKv^~9VoU4^9J+j z92<3uW9L0S{*cEN{q=9g2S51fJBr2e8?QdF^k0AD!}r_^tl{l1e+BUJSG;Zd;s5l5 zCG&TtELHfXC%X{Agn(d6GQWw_fOznH3V&Y@x5xWL~D#@1B;wY!l(C6h2O!gQoD%fZj6{2jr zlU7r;cE%b_j?-ZQlP32Kgw(<3?vfM_PifeX!SU4$0R~F`j*OmP&)QuH7$f>lb)%^x zNAJK$$7{x}r3w=GHPNs2`_8()^ywI|&i0{93Ds{Tlg2vj7Nal^DXK8Z+B{cf@AYPZ zoDU*(H)_6&0C_oSCrRyk&ShR@48mIsT|m=z=-LKt97u#lL*VT^FT#*VFU=0fC-ZjaClIMpw=DQDhRatT5Tw zK@1(rr4?8X2*Jxy*mshvo1_+0;KV(5;T>=OQye`o!nZ#E3Ha$Ze+GA--p(!sX-bCN zy8$pEgBJ`&uEgpRW6@dcte=H72J5F!B7_#c^_aIcCbJsnXH&FIi;<6b;sP+X3)v?v zG7FRO^o9t&YtXi>&d=k3lrjJtA0PNqDU!f$X;v8pWEc_i8Uu!yxEk6(P@5Z)O(w%8%Jg24efiT?-)~jL87&! z&tr6p%o$9oo)2sCvWP*5O)FMO?{f&1DHME>XMwxF@9eL(1ojcWX?39^&udU`dpB*+ z`G|Vnpsi=pZMH4uO^uy8U|Kh*Yme#n9OuqYapue>b|xLR8^*mJI37yOYz12_p>Ppp zS?H|Q!I%*`PvyAc;Zt)At3lJU&Jv67$uDaMQ%P1k(S6d=@G;`C03)!-3n z3P!|aHpBL8ipgw-N!y8U7r-)ry#`n=4GcthY{?9|p8-TPGD7Fk_zp`6Q>9A+4xukR z21+B5t|LJ{Sv7vrEhtnXbQ%KyaNG7M_rRLS$AgkD!edIuNhS?e%0o0|>p9KJrCm^i z9DkZSD+btugYENyvVFUEi^$h5$7$J;qd!_&jW9@ISh{rJ!2NO|JueuDs8euMIxz%~ zqAC!lEo|ECrsHx>u!?=O9{?(xQnVx5riBj?P2HiL&(SqCx<+nvOXL-qm zlo!h3uRO@bP^?C5u%SdQ#sAn(zY}um1P~D&JYFHl( z7#n+H3-y^RG1C<@b}VWSb)cpVJzE1vZG-!F(uY{gqlm? zHj)ET0kB0-G7_~Nu(%8=Dnt%23ROS^;80cL;u^@-k*^fMFSEz5{l!Ngm44~^Z~T8Y zw*LIz{i=`MFSyF>4Pgw=5j)53#b{|S#`_P6$C4T3dhHjH_?g5#&*$*$=R6(F zcm@CUBPa0k|L=C3+HUj+lnNka!iiKM9>4`;_J@pUXK-jx#}4ym0-)2Qb|24R0h9nn z#3%@;98g%1M~4t4+s8;^SPI!803k#a&WV86kj&)Bz!XlhL!!ufVpP_CLXnXmvZzxr zF!$l(X?8eRqo^R*YY3B4Qw*t(^9wJp$jbit#U zw`jW-zL}%z8r1U!JM$Vlvj*Gq25XZR4{XeF--gGD%@!LCW2f<$wXNPjd(nJeq)|i- zi<%wIdcpl$TYF=wi);#gd!*1pzpwlu#0;@g~MoJ32i8@f6@zoy}ai= z|Gc?U03QdBm2dsISFFGH7e2XI6u;x#_^ILa32@tB@rJJexdPPIKv~Mm(szI>WuDd5 zc*8qx!(9(;;D-Bd$EVIkeCYO502$Z>0PV+n`IVDHnY2SB;{aPK>Pe4GWZ=laql6(~ z>Aw*P&7&}6dmH$0Loz&ZDtZteK@O2HlxVHzPrg>!aX;>&2`i!=s z{>ZD_-58X0=VM-!h!xm_3L(&>;*dm)IkrN>>?wMk#mU$qCI^MHh+cGY%J)8h0r;QUU5sSo{4GHDHW zg#@U4N`2!p%ar98<3K!0csE)YPpf`lU5JhKWx;toUGqVoZ5U85?>zSm-zhvfxH zBC@0-r3#rjdKK8}GJ^V4GNYNq$!a#FC1+MC`>d5CCptmH1EIIxG@|}}!bK4okWp|c zS&@&V<%{YC1v_tgA+nAYjI#r8v3_m31kvGQc9%#ZX8=>kz|-V^21j%;$iIhxu4&Nu zfO@h8-?nI)8k^fwY)@O9owhhWX>nq$#$9LUIKJIt+XHRq!MIq^8V!n|*;NFS+($5E zsS`B)%@ia;`kdLEuQKsAr@;DV22cqsF84rI{kg&vFkJ(VEk?xO^u+J`gXi4$rtiM> zN&$QvJ>q;52o>yT4`@l}z{bku*v%1r3o1s4O%1oOgj+s-3=gbz0&LLY6WR7LkZd%R zTR;E?5oDs0SFC377CQDyL>RG#86vDM8eDsL1%)fnHXT~uqH80zwp(oO1elI-s3261 zd%T@V33b{Vu*?G!TQ&v{Mgc#YBQ7n8oF}k2D)e|Lvn#76ekr1{>-tSKOHh#+98uF) zfU=9hh{!juzbOMEkTPpSFS`-VA2J;}>emw$Fe}1omx<7nkKIxz?5NTsdqROpAuv7x za5;;SV-z%4@){$0B|-}*)~Lp_YdZK4(Ka18v|ukqZniVQ_PoZV?y$Bq!?ANyJg_mx z@vVUKGmrCg#`>&9;2t7-@dtgLf1`{H$QRx8Q z0=_|PYuIX>6X-ZbeB^Uy;3LbReGtx`NFbT|rlMWeyka?88p+qNh31qDa7<~FX$sU` zz~-z&J)MGg1dK3ap(gGH!&-tRps)Zr1FNQ3MzX>w>BVXx^By63)OCwJ)+vrENoem7$-@xJr&)A@l`Hmanp4F@o+Q1<}g!Im%`|1i9%Hg=}mi zc6EA`U+{fGpTt0Fh0xz8dJQuJU8m?QuaY`KtZTqIgiemhAx1E_XzLEq2h??qW;#I# z9$S+dXScR-X4>J*<`l;_Jswz}D=7J9s zwd*!u>y!!r2~9CJYMkg zKOc_2?#F+T-1f0z-_>7Ll?%_a2ne$|FxwI7MGRmLuuFSz>Y-D3@86sPnNnWJJkY}_ zVK`r`ES)5&4vuora7tX0wT8U4*P>u?c51Lz3&fymHt|GEF@r@bDlst=Fu_@dH3p?~ zdRzjW&akXCy19nB5`ZoU8JgQVhin@ngcxNw9z(`0CD{vEBhHW*HLOUE$0o|Axj%aL zU93X!az1c|vO@f?WDIO_fauMJ6{97^T4!>FE{LKW+a!sPGpdUifR}D7DrzcafG`-o z?H~>mLI@t6kLY}WZ#y*g9I0%LPB#oG29Ym*M^(;CON8$7T+!?E=iTdl`-!|*!0 zd}KxKkv`~xUo(1F3LhKvxp@%&BwU`~%Jt;IERwT!l!0;eZf; zay|u>BcPsvN+xvYe)#u3zVu#P&VzcT06umeM8p6-0N?|^bMw#q$0uBW{(0Z>ti5mu zXsr=XY-0Z{jPSu*?#8|68dzfm2B3LrqC4xea|NPlv&=uoC3O(MF4T3~&ULhT#Zs&Y>z~^J#J+>K88rD+n%%DA;3Ts|I%+Oj*ew zAKFD(5$(p%>BrK|YSfLVPN;-J5+T9$0GuA-71eHxMc@<)MfpgY=+L$(z%fXuIVn1- zFtU755Cg2q%a7dsCBd~GgAtQ1GwQg4;3K2!JU9fjZ42Kvh#cTMkLhHJwyDwi4%=^bm0puYLDh|VYiolW_@QU);pW=R?u|29F#DpW$(ID z03QdBn|}NiOS2Q7d(MaN-g@pw@7cm#_b%ewzj_(hUAG4z2vE}%BcLkrq1#U(qJ-g) zVXnPE#Uhf}+%&dMht)kXIR{*WKyD1OmBdNv-J8&86laG;p5yAG#iAitL^SMhf-D>b z6#BZToMZy0MSuufQz&@KST=};;0$3h>kwh!G{h$cuThW|OhLOnJs5}BW85=dK4=$a z5!(*nPLk-9*a8q-S%Q5Fj%nM=J<%l143pnB;rLVD$S`UT40w$+K>t3%HzaV^q4gbz zfOa-RJ)I%=7SVTTnilI@Q=FMJvU%N_;(?70$2J-~wAEtT1vJSo{6F>4 ztd;T%wD;=KKxsu_E6Wm-x9w0bbObvm*3Gts9gSp;>q%Hv-$ime5#L-bxWZLE4guyhkKWRELrv}KG!>^8au_94JImuW6U&|r8;mZQ!i zc%Q|?vSpU{jXtOiOrO7^Ky1@;Lcj~Gr{K`Fh!ODh6wwESrp3ITV`nTMxFyHY4Unv4fG7V@@{rCSUUC<<5(Am4z;%VXxAj^)n*jDLy0%5zc{H;cUFhIjkI>H1`GE7&2B)`YII+>-#Ksi&t+zO~KF8Tf zhb~(-!XrF(e({PPuxt5!>EgHROCao)!VJfPw%@*+2#zxNH0XWWJiHE7Pl=)gDe#rp z1I03&61qVaQ3>eiYJ_+#h$I#;qZ+OF* z7k}N0|I4uh^&8u^zOJ!&dc8CMRz&j;2xk97CmzBxpY~*2b7&t<96yDPX~1v3`wrZH z<_sp2DGF;5z%aH{=}3<>&yEOAWzb3&l@Rfa-6?CKL#StB>mUPkH6nXC4wDSrw}Zhx z=TTV$Ya+TpsK{W!MOX`zhA?(kpqI||Th|ohsojD#5uz&88&APPEA@IU*Exln;jn9XmEb+vD0*D!=qJd4O9xO(TRDOt%2LQGZE^t zX(nJqMBN5U%7nrBZUHN%!9flvY=nz4^C?Zlo&qR|F)j_t!is*4Ac!WTX=W)imK7fb z03o6(f!TbniD$B8C`Ka%0wl01DO8maRNrS5ieQreHTG2L6mJ=05Iva@ULF~P&_;x& zMca0gYg~5-ZHu~|W4bfJtm!Zh9<#c`$*nma+N$x;PQVh^xuhgRe?4VdRt<$Rg6FVwa^)e81Y6v(eyn z20P&(DtuAqgUS;`T_eUuMlK7BFm4fMzJv1Mp}^f)XL$C4bLahU0GM1UfRE9~5B$L2 zU-UcfA8bwB%g&seKB;K~{?0R>4re0fb;NAeVbauSeH8qXs@M8C%s`iB2*fTWSqzFE z^)CYIwQT7Umvl5%I4Wl`FcG2Qh)Eoyv@I%iLhLYOsQ^|gU|a%aVc`l%M{_DINmjUo z(Kps*A#^l^iXyhUh%N%;D%j8ov(6S8{G%IRwaZz}s7MH@sD%^+gf4)hN1Qjh-4^*v z+jf}O4YqdXn9XYVriSktcposEHCUUqSevytJqb9m-Qaok!gPTU*;O zMFAT+#GuO#&gmKXs+O6TQ@vd5#k!nkW{Ga1IHlC70bm5BOzV7%W%{$_9Zu8+Pab(7 z0?`;;z06psfTFM{D+h*!GX$5rzaEE`Hn5eonzI2|Yv61|<0D4;{-zos26+L+t^-+z zh%O_km>DJ{5CQ-nL7{~Y0rkAb&ZNQCWQy%cgU!ht^Vu9eGRkp@$`yEMYXkS4o8y6V zbDY`^I5YFun0N3o;PRqie4avx%N%DfEQA*;i1a9n>*qh-Uh0_KcZsC4*@5>rqx)5C z4~+|8o%d1i1twd_b;6x^o;wBMju!hRinT)Eau${tp_zickZOoVu&zVsI+$t?xSoqG zQ7GB5ZmDP;ts4{1cROM9^*7yA-SU>V%&!!{$G~IB+5_zUs5RARrc-|lw(u3O_=o#f zmht54u0vH8m`rPIO=c2A-UPsvuxwyj4~EyWry4h=KKxpd=xGbgDpN==m|a;9P@pH2 zwoek!jdV=bVl@ejCIZd_8A>IKH$_W;?CR8;qFs&oSSxP*zlJqV4tT;yJ%hFOMDEvNW;RHnFU_>w&sh{@Gw7u z4KO9Sj~T>x4t>EUcYkRi0%NjtibDg#QSyVm2dV{?&sZ2M!BrdyYzuH`WLsPnz-SL_ z<$;||pekWj_KUQrYdAy{V0xzK@xGaGG?;GEEJpKN~FMjbt z44XIA^LS)=|0)(L>2%JoZR6bL1d$we>N(~iV&1gy%~XyQG3fM9Bp&?+PN#rs88e(x z$MhJS+ku|e5mgpLF{t6a-x^EIaETZTY<3=>Xf2L+gyU-w3tNmO+u`8YsefO8gASz`67RXFxaOtC;S2Zs(68gMhi#?B1q zH*1{VoMLNxidh?RetV8_DW2Xv`&M!M^d_PuoS6ii+??Uuw#WLs#oA7Tox1q~mJIap z-)Ex2uyc!-C~TMN2K%u@f;439Vg6X3zZ1N0_IIg{FbC5=tP&2shjhb4A4WxrQ6nnA zRLaeey@o$I6_zu|Ey%}@t&BLl2iY!r52>ug%E>H3b9O-Vh%5n2+;re}j$+>`?4AQC z+8QwgSgvdCW}}70J^$-yJRRBR{nQVi|Ijb(Tq%H$p$9YQr9a&M^sFdfT1298HNw{R z40YXNeNuyp3TMu2fNh1?Htgp}rD-CaKqQ~(2AuK%-I_~I__2Q;|J&`9Vl37EkV2#rdt3K6I~2XbSe zOIR!e*g}rh?F?+>xJbs8|T8!N{{Pat@0m~SkL*n1Q`_2(C(~_Qec%AB zEpX=pXW)&+9rqtcv=y4!1WnTjK{?c7D}rQrkada`g1R7j)DjJc+ld;Je74-vJ-|Vh z57c*mL{UY_tlQNYhyxuEhg@KC4ClL^)aS^2PmfTi}bzWE5#lsL-blhkg~3 z_=YqBxkWIQAQVF9?xag+QvznJvp|4DtC0W>s1_uXq@IG^7*te9(EujM7{Y+TWhLy# zb_#dxGf-Gy`TA#Yjpg;(`q^8SmfZ5vO7&!pd~|7f6_(@M!bbZexBcP&xp}1kei?ty zKlURxJ!L#H-$P_+Yh(O^*x7Gs<~7c5P4LVoUXN4fHgWH{9c*n+ar*o^0vp88q4ORg z1i;TltH-4Jti-Xixd5g(F^VaAk#d$WGxdK?{|g-kfc)N3!U`viEr3>ZcpSi(fiZs+ z1xQ}#tChpy1&6DbOFZW(2ktBOQnPV{w1f z?h9gCQi*LcVRDDZbB5FLNdYSM!st;~M9&eit8=`mabv-+d9_-a0#udYt^rH|SC-NR z7KPx@IKcP-8ZW{Y4m@4}Pd8CjdojALKa$JT!D zp5@VVM}G3B)vW%RKYz==c}zrSKJJddH{EoTK~HEoPANLNGD zJcdE?8VBt?WVynSuyiRCR$hoyg1G}wU#2s;_*`tGX|d6?xN~EMzj$y5zx?M9Xph5} zIO_35D;{66$X;$a@%jGkLW>$*;{DM6YMU>t$l4t8M)v8@q9r&qh{1*serNMIFpFABmw;~@f})g>^A zh!{~xF+xL;Ibj513u4(mbBch(6rxX!Uz)3g@d)O0jE5tgE>?``GR2ZF(jgAtGl|F< zyM@ernL=o^^Sbcg4G6_WK1Q0?q6eww8^jkXz`pQ%Hy}9a_)?w&X&>xp5vJY(w+&zm*ggBeOM8IxcOy(&EI;%4 zT<(7Y?Sw<`+2c6 zD6D2Q7$=JnB`|ZI3q}}3kyYnK38}U1(YzQR%?tEWO`yT0wRC)$f_SmdYcBF{y7e69 zCTBrNFAC-qBfwr47$$d944;<|51+%OVi}MeIm{7^PK%%teMreLtR134A&?edh#-oW zmA5>+fbV{O`mHk$N}=Wlr{^Mjx8=Gr6u^EPfdj~mg!t?`P1GY8Ln?AFU|l8d4q_lk zr^mC2WEfKkGjfpBEC-U{k`4mN2S!j-EJmWOCxxe|^tmy$(F?3g8R>x0l}N zqWwGVguZuN#c$|lbGNp+!;?BvSrm9^ZHDcgIXHGGt3^;bMz^zt&^01G&>P!u9``SFF4%K3}*_I#O6 z=W@kz_biYG)3)Kq&tI?kkXt zvOxi{j971jTm_UP*rEWD7vSvDUKDMEq9{QT(NXy70|%R5I1l{jl>+z}c-(w5%mep* z{||YLUo>l{&-TGw>jR-7>zgiwbQjT?`AleDv*?F(5f=)2{AU zkLQ#G^TL!g=zxyFp#@w8<3?cUHRWeuSAyBWxC#`#e65CI9&u0kXNN(DM}y+mYXm8awgSgjA{ zv0ea=9^GlVjSu)@={><#KkHn4<*1}P7AzV|rVUJmA%<^TSaLANVrBUNmiHdUe6oQM z1kQ;tL+}lfHHo`A-^pe9A-NS~EZB{JLJ7}7K%xvnG#1h%il3H~&P;=7`tC@ICP_vk zB70@+W{RQHXXIwfu}| z%3aRD(4#Sj96&{sb0Br>U>Z zNSC@P#DUj$(Djj!y9MN|;q!=Ea1#_m)8NSE`QbNpvOfO4&jUDh(^uTIRzJz^?Ay0+_rw=8ws;<>WLH+sSVr_MRt{YY=7=r? zSdipeL=RUjqT31@GL$l6b?Zw6Q9g_!ePQ*W;M*@}6o1NM^JQj9_6 z0<5(fuTX-D5!j6+{?j>lV_>a;X=aGi9Z=iCPS$|c>)?()9d>CCVu&2-b2M^WPn++Y zeChhq{*PU|e9i9_CH*KQE9c4)_{;fm`?=f0=RWtD9Xj~5(sKCMBWsRUh4Wq8m6K^h zXCFEyLT4lM6z^M5QK1|yf(@bFUegzi135wrdLXhTP*}yf^mZsvugUz zpNv8gI;D%ZKvM&Ap+1LZ4lW9q16RZDy$Xe8R7-mhw%35JrSZrfT`6bJ9oJ`HUtIg- zH+KI&dv6|NS$f@v{m%K8yS%Ncx_XKujb`tk{xe%7zxlT1-+S(po5z(vTvX%M3Yt_jFfxEwA2k zx9>ao<9zqN*RxPW90?SsF4!1$*Q@uc?tAy#bIxy@AARe+uX{uL+$VqMv9kjBC;a%P z@BJ$enh^eBsOxX$h$=VSgtjS8)-9bZR;ZV2v{Yanfu>czw0yFM(A20Fb9GqGav&SQ zb}eAN>VVrO6+M7VGN5F;b)m%#r>qaOj$t!SQTluOK zTYVMXiENU*2zaG0I^Mq2F7Kr}LB6B=d+FjxcbI!>QQ~cEbo1DL$0QEb-K4C3!?S`>5Zi*1~1)aCXc1~DDGOM8N5%-AeSjnl1xbZEM0--YV_a-QnqeSvtTk{>j9G-mW@}3nb-|M;y{;n zi17tj>$Z)Oyljb+F9{s}V#V>Lir)(hCJ%hZfkLwNJulXdYz2My;1BVOx=0%Apn3#+ zOIwXrm;LZ5rBCy83EPr1O8Z3Z)CW*xC^ot~-S%zdtzBY|5(_a%wDaus-Fjd9A}5!& zM&qrUg!Jw&Lo04U$RL!fucY*!83ULSWXB*khL}P}{k8@|t11v?Na%pJQqx+|TZf53 z3-xFWGuZ>zYuIWIGn&HeTtc^AAmkGXH2t~8j6Zx7XJPGj-)eV8?|ZhIe%EaGzJHO^ z=v(m>D4cl3bbw#~9pCes3p*En+>yUay7rfMCzI!lahKLro7GiA$MX~TVx)Fg!f=_# z?%sJ=Kf-Etgl;tlQKqsZTL3--HPvAG&cP*5XGbm=lRAZ#zx&F0=lveBy23&-89zJ#_f^cQ|CwzauV zyApb#reT9_($-#(w#Vcb>;#EYav5AIdKfIiutgx39-XCBq^K`myj3`2a!pAHeKL~h z=}FWVOeF0#rI<~kVKk;Rf9hlTj+R+c@$JWH>2nXr46Z%&hpKYuC3+6CLAiSXhYUzk zCrs&v!%qJ_0d+7g?f(kEIpu3#BaeJVCB(fVcz_Q+ z_-!LzSAV6UC95Vapxz(jm$W5+n9@X4u=^!Hwe+gw+v9 z8pN=Mu@n6$w~cl8owJCRl64fP}~jykYppumzU`Gwkf%HF7x}sO2mjl$*(S?{ap_> z#Ldo8tHxG0m=qXyfFY?%>4ifC_IEBpZOLALRumjo>jkwQy3BD8(uE*}UlP9EV@TmXSNg`@SId zn@j5bB+;gf8Kc}p329w|&CN74YPV)GFbQI;^!+ocP%^-Pc1IG>dJSHmAYOa`)_bsZ z=uWO9zw~;@Xn#?OX%8Ry;RS$?ra%AWp@$x}7r(0hQ(e2Z5C0DjpIPGnNjyHW*VGRl z`v3XgKJwll1JM21cmIvMPwV=vnHNmQlXz=In9TNYCOP3(A!*SDMd3=C& zaa)TRr;ctr|F^3VjRkc&iiBjEKv6b4EJQ6vjP&oKG?x@2POMRtB&joj2Ah+0h;a=G z6^NXUT(VZ{{H>BFq$sBr5J@O#+D&cSF@2HDir%4`w!il!`GqfhniSMCjH^8bC3Sbg zLm}KQ3`*yqA@72=3lHp2;D_#1wn)^lDn~;q#KV5I1EdD?7?Hfn<+h4CQExbFQ?Pil zD3eWxDU#y!Qo-q8ce4rY5o;RWCw-4ckZ2)T0cbYoPF~na<0ZQ5{!dT1-f%mG2rK~- z*J{MU7BIT^6N*WH)Is{dsKh^Imw{{sVNEc^;uw5-06BLLte=9NIz@BUp)pfbb@_3Y z(Tn0QA9>{A4v*lszfx<%D?3`H4rL|-z1lIhau5Ic-XHI+?H2CDksu|Dldol;*Mg}%f)EuNU-_- zlz-gs#`?|GW^cFEeF|&w0}`c$lR1Pw-_ZL=4>I(HkvIN(eOv&{FvboDr)$v`1MWQ~E3LfaitDtzQ2Ql<0NuN2eo6%#-~{dk)^Tawa)ICYRQDtc`S zwLe4Hoc}Lz93~`UGi?+k8&F*a)_`a-JR*A-S3rz`IFD#EeLrHSx3R25=W`%5pyh4I z;uz5vpwT&)*uWMeiHl=MHlxT{)hyc|tAGBRj_?XQzTykuLk~TaFN6EKhUo3(==?XB zhQGEBtGgZLBHpirkc~@M-#YDzyYG7dEd<9mui^N{ZNzX2AtlAK1W0HQiGW~$(C9_W ziJp@7HyVIM02>8DLX!ZHWPqB4>YR#4=sOx#M`=m?zt}AyF~FFyc4aYaxNWK98MLc? zQJ`Kbw(0)v^kRCcF0iM_^u(iE`3szEkS%kR)N+4Th~< zU{6cwU!(6BH_C?|HRhpErZvG(P{U^ACreT$ z1HyVp;?uQ3mev^k(Se}m6v|OdBy;wV*e0^NfiWY*$cS=^P4>wb>->`Pr&po~58#e$ zEp7E}w1CNmpsgq^D5R;PX+W02`2;f#kx*Ey zBY9^*QU{QjNm1g|dI-hM@?DyZV{b?%sK!Fr4P6o&n*wUu%>~}29ahimXHFkrN?l(B z_Z^?ag!tBwZmIk~H_@ej*CnEHa)B9kQ)XD~>#{#hK|*P#)xPWrx--hLfBee@0T~ea z)P-%SR<=4jBvphKLq#q7PO6veNslQAr`PN0C)!PI;v*x#84#^fIZ{s)dsPbnfg2Pf zeJ423gea;!3^|B>0*q3`K(DDLr$9sOz{Vp|wPjbf-JxyMW&|RQ?miJWU9&0FT0Ybe z>OfS$0DM4$zZj$I3u*2giC_L5846;b9iv2RGZ5H`fG82L1=zVwDxuFHSpl|QzrH$z z%&#GK4aAKBSHi%9T?uO)ve}Nr)ttnZKruo9e{_y-Kfzf6{K`4nfJJ8LS7xTY{;8)P zKe>AK>K#7rfA#ym|5qJ%Z)-Z7M9$7lCsQfAh||>q=kLA;rkvp9#tN~Bg|y;x$KYRDEfB(^|TgEGKU%?Yw2tj${syTvB9w;8q8t*}=%sbCEye2z*Q}vJ5|^OZBqUitY{6!v`^B&Z;tIqb z%o9XuAaMzxewmw#yx{+(LMXh^9jEFiDNlx)B}8&iK86^BfCyO~1I-%LRtT}v4XU4j z{1_wwCLhC$c2Vq{Lss~%I+`2KE>Iwgwuv9bzoc+h0Kak$`H6r0v!8#tFaDSR(f8~` zgx64L>)K~s9UWD5WmfAIZ01o~!O{vw_q`5s?McMt5p1~+u^CzdXnhJ<-iAo0yfgOd z=_de8ufL55QO7M}B}a=yplec>!l?>HjV}ZtAOLQpafbk;t%l{e?tdx}7))6*N7Zge zf!efh8^V<~g7}xq4x!{WGf;A5GmK&QUJK%UYdOCKgCrzXEu%~V71}#M4;jeCls;~8 ziw;9W*VvPdBL$^#NCVIa;6(XJkTH54iY+1$gcY$ijzQT3WOK0ha61>^ zb}k?vPdi$lEMpsHT&BHl<35d7=<$j)M2&*iSegGuFolqD-@IOS?Rez#x}Czp`-_{C=693-8$$t?!ag(pqu;1M_BCuC2SQlwe#0~6>lO#DI~AY4R27kcX^Wbpm7PJ z5@g1R64K5UDL}bLSgnqnuxamU5;EG4r%``a&LN?f4@OXI(_5E8Pytdyq=48ds9h^X zC`N!&`Wn(m%@I*_w@7XZv~!TOYN8q{z>ERTK(>VGEMj}C02%ep(?!a0>2F9IlLi`$ zZhQ4i)X_NsULdE~SOS97Vh!o0m9j$;pvB&SMtcyG!DI#ObO&ZMLtac^3^lS?G0cdJ zcR)5-Qf0576~I@}QFq;+ny=RXEX%{YL&$Cxw%nU!MQQjlPF4-Ia5%kv4IyUW$$7M) z0WFRY=hqR|bHpB@l-@F_ON()h$0XvU--TXK$;w`RQ8&`J5Ic}byR@v(0@O9?-6kfl6#N5Een3!nNmh@X{?N?N#o6)5ztW_4iR1Ips*ng z6G37EIw*1Es7bZSYM(cdhqZL}@s3Ev3PbU;$p~Sq6O1jGR$#LaHdDlStenUm;T9S4 znH7b0L(x`Kgx-vx1Dg^+uKszc+mg`0aEWL#MM}F0?5BvPcYAI?(xmsYL=;vYD4S$p zn*nB$##`k?#;^vvkrpsF(=3;848$g(yLa00Z@NGR#0^?$-5a)vZpFh5MsFOVpQo6L zs3e#2WXyqV1S)qxE{Dqtn9&q&G=ni7ZaPB;a}vXiDLDf;kI>17=hsd?_DU^)=9Tsf zKm72+oG-6`LlxVPuIuVvPvfVoweK*_ArkYg`I43mV7$ltxzD0Gc@p8|IdqE?gtkfw z0}RXRzMUc=zZVepm4qaEQ&j7CKS?PC>c-qpue7b_O_?x|pn1N`y1yKNknUxu zFlNv%Z!GuwZrTG}rmwevv|3nWw-t?`^d8E_pke~&Gq`L7JDGt;GZ;kpatwFzHK@$) zKUhEi`8_zgoQ-Edq<^~jjsN0(XC2@x@?;wr17Xvd`naf5P_|O zSeqnPEl{uYf=m0Z-X$7I4FNJ>0)iyT*D%&@6K+#SNG}~Kd51LySk<6{?1y2z8&068#t3vqTE0-J1GSSgaMJH9Rzo-G^9!LPJm_ykAI!AbS;gW#{d_q`u@ZcgT;6T2p9L9wc`+)KSU z!fLUG8}B2Zo`*koKa49jciRE&^$>OtS3t57upS6CsH-8}N*C-g>dwy>5SyuchszMH z)dCXMK(j>bmI&Pfu{{MsqEGbno1rsm)5zT`GF~c)`_3KTi_0J<)YBox7JyG=;4pMq zS{yfqt2CgtscTFo17N43D!CK%v5Z93A z0AkgMLU*_uV_0y%!^EA1p+}h0el3PIm@<$Vr!8dwLZwC%TmYujlNPHKY2dZEa}Gox zR>z2;g(+r(F{$Qm5I`QxK54l#fPvV}wVN{|5RE{Tr}Kj}veQ=NQ{M@C0AmnJ7~}u~ zLYO1QV*u;KF0fiG*@B%1kH+A=yTBJ-4ZnXc%-$u)cn^UL!s%^T1Ng}$kTEc!z9IF| zW3<=(@6OrZ&K$#$m{)QEe8qKu|I>TlH{WI*ba8#MZcw9bN6guJx--hgh3EOnZIrv` z;YT~LIX>1L9Eh55W?{494bh=PPCYM z7-b^*SVWV?p{QLH^+>OdqZ{5F-N~xB03@WHoTkwa;101WZ$fOrTtavOiMl6@u~B4~a)?RBr=bE| z3D^<{E!a7Pc8Rz?0L)!_6AP`XO=6b@SDgn04(w)#-3`QU3AQtJafu<3$g5-mfq|>O zy~^nKgnjqf=RlL4fNcqh9gMLcTR^fYD4)P)V^Ed>&Y|g6pu-!;LWJ498*X}+Fgb}$ z#X{N5+Xv@w;F0%sSH9(k|2szaOH3WVk_+G~y7~jan_mCA^JuESBwal-Bwd6F;zst? z^VgaD2qw!xz63L&BM;#sE%OsSA~c||)~*k#{Uz%(y3kr3W4kq^slcJp@t6b%txB~9 z(LHZEi=K=^42j9XgtKImr1Tce34R%F*%rTW5c3PbPX??A)x$wL_ClPA{?9Ael)vsB|4wz-ULSouuy9DDCSy2uUicJ^GsVjM4#N z1@U_zTLSH=0#G(f1`%e=KP1r<;w^ zUnEvabZ4*cpK)O8^#&DFY=N~PlPNmit-F z2U|b=o{1lS{n-fo3O>57ILaxkEQyOveGO9o$|N8EC$D?p3Qm9jDo$@ai}K?AFeZmH zj1CcSIS^tBnsz`}C*D}v%^9^NClN@m{^)hQCb^DqA^;0?LC+p6$kVpyfluTZixC9-y(sgcwbQCdYK$qqzo zVuu(iC4lq_l&xHnfs`zr%Kduxo52EKl-3cGYNpQtVO4VU<2H%g5VPB3NPVn;Q*#Q2 zfmj9w0Za}Fr>V$_-ef2u!m6^wCZ}k!5K|_pU5jWZK&Z6NnqrXNK_X&3hsk$AHczAI z7?d>#^$MKtsDn>nh%3RaRK0k+QWqAeIf8^5=qiva!F~*BPC%SNL_1D~qWqG&e7Gr0 zIfHd1OrR(cTrCjWTd2E~4(PMA|1@w28hkXnB&OJd&kKRG)aCnVaQ=VXM}OzZAA0LspZnAq2=dB3s;a6S^MQ9RD@yk(0pVxbwr(>E+<)&y*!guV zpZgp-TL7b7NOKAa0_0;*F#_0ut$w&+a)=*;M(4qk%iwIPMNu@$lBCm&hPDDVrz&Y` zPJ!wO(%eR9ZlSB5L$`bearrF5`W9ldKx|i#u!MwT#5hkH&|VJ5FY~shY}($GAQdAb z2b1=GAyfe8U^~{4beN{&pqLP85`j6}ye2sXcVe^UJ>7E%x9J^7WbQ5L9vSTdr8jm+ zg>yTwiIQ0asqMRv)e#y7R2=|8LxrTRVO*&lBD-W&wpLSGb`WGBF7>f-4Oj;e0h=U! z>(;ufHC{P_tg07X7pNpJcIz!=jRm#47?6AxbG_VS*OeXKo0fnUML&3o@%vvfxy z@q^KXA3cnhKeG;emKTdAFcHsDh zdZoixF$3jeo%ljB=uDn<5|@zfHe&lcLi032^%SIj4rp%y-H9&ZW2c^Nh!CkDQY92I z#WW5i=j{oYx6J7!p{5}fKcgC30%BN!O$jnHi1cO(2_5Zoilu=_s|Y8%jSI7|cA}Ja zmpuhXwygMxh8O^1pNv$I00$_*F%IMOs*11B1N3L4&-J4mxTO0J#xh3q&?7)YVN_|5Ve}A8fmZLNtre#fR~UcP{~;@bZ%- zRgz~-bGGt2D}Z+#AA8SxI$kYn8|we&|9tN+A2dLHvTkqOUR!+O<{H;-FOc2!Amrv} z5RRS!pMNzl$`BXN0rdjW=0Gt9O!B>B0}}$MI@P=en}bIC;BpFy6=HXS7*8Pa1QO>! zTqX`3VPi?v@4$GVzkupQZ0<+N-mT_^Np72*iOqt&r@ttm5<&wuBSk1d!yZr2BE&|E z9~uP($bq;_3XtBqJ*r-o3}W&zltIq5)sZbhra)-dKn!5x zAYB778DPiB_P*8UiY>&bGY!QEwj)qBRp7*Ci0v^#bqiuRfnQ_Qgd3mqxN6QS?E(_I zG#O;trP=~E%dFVRPRmT0t^IUlJ~i5P?>@cp@vnoGZ)U`Id58agGR}W`Z-4Z}xpQT= zJGEgv;^$qK{Z6oZ|3^pi>xNb(v!T`D?Vmb&|(B(ySEV z@KaD;f{6y+A9)XE21RuxMln+!Te|=y*O5EpjCziof)$&;t81~qCK+9COxkNox5&_U zB)Dz=o6+Z_91)U;+fywTQK=siYe4FRLbi!^Q-IBmc8#*}XqH%|*hu>Vx{XcR;*g$0 zKs?f&moY$C0bLDpWAuK1s?DvmqoqtWt(1XmuHZ{-!FB?~R!PgreR_!4i~{mApk3A2aA!4eRgHJCZ6a17W_v;d+->~1OXIX|zv-Vgvk)~>Th zoF#y|wRW(@p7Jr3%6k1iwlJ(BA{b-*cuLu5dI3EC+}<0neDda_ z|MvOi;S-;jAAJ6UZ+Y-FzqqQy`|{F%&N=$&5ajP+eCa25?tRBEE^j~n)Hvh6X){~R zPuBl&IQ-OM|K2?DnUAmUy8pG87~%G{&p!Hzv$A&vf(#R*<8U!r^Kbfpc;u0XySIJI ze|Q)x9S6lQ(5c}-Fa>CF1Rn1p>|6m39|KNnpjkl1mm$RtjBA1V6frb9$fYhvI&~Z| zvj-4Pp8=ZVEtg?Qf_}RdBBbc0LJ=N74aidM?|G~{C4?6gygRj~8`XdV;1Q|Ulp4gi z0>Ua82DpTtYIh|PKs*BTu7<-)NGLEP$|})Y%wWH-h73+S8lqH_B}wgEl9t6`pN2#S zAySE8gh^UwRm=!kz?Go3Q%4*LN_Zxt9*NyTL6oHbm97Fs1&qi|fOZLKmw;tRCoryr zm@yDnK&M^!A}1sh!#^I6!j-d?w9UyH3%ZlDgGe@i|i19$N2U*;N#03zRKwImD zm5l+Lfe7FT?J7bC)2?)HNDl0$x`zsJQ>fsQV@Th{CG!FV0L%18%}|+nF#ddLqfMKP z4m?!pk*A%Q)$ubdb@YY-agj8-EgVq=JCrV|IAoKCE=VJ1mU4#H ziCd@WHW`Z;R_dY07GMuaays1?x)gpC0FwhkFt$+baaSb-R^4XUPZg<66d~m)#x%a> zU__wn^v1yk(k+#+Y;!G=q_LwE)=Fn0tEvx^GIh~GnmH&dAe5=&b5{eQQ6e%4VtoX3 zQGqa5YJrYOUVU@zu*a7{-3qck(y71|AeVzp1~Msn(^wc^!g~U##AjaQ?l|*43lcw@ zarNs**ROv`M$MNlp8Jm6y1VDAXMbdUc=)34dFJs?9lh<1ue)*e>ecS7?41?B4He+Y z7c+^^-SwuwSW)@4RU1HU1<&E*b~2s>SdXTLv^BU$V^XsM;u;i}Kz*WrX9oNTVsntS zDbyy_imn2>3PN7@P)V>)$wZY&!+m5JMQiQ;Ht<5y0f!fix&5e{ZHgcHjpjFzrx8~G zIuLo~z5#$#`Ul#zk(p`NC>y60CQ>P$&{nKxa)3_7k2uo;5-PCC6@W0wkvS|9MaF0` zvt^RsMZh>nY$34$n_P`X-AL7j%}S{>HUq^peiC$)rhjLHf^LnoC;5G+kg_>YwIVc-JLW5u|vSJJp`V1D=f5Bw!FI(%LSX9TKSREXE zNx;RM@4fi-xt9-r?hiioyD#^cv*LF)0)I)zDWA)mrqv6b?aj84ADot>9|Prou7*Ke zpQ_Gsd;wN~Fn<;?jkHwV2CAD%t#D(+d=IAB0s9oN9s^=^0;w0t6hOdC2%%GRduLI2 z#&X@FjW4bA*zf>pYuvRdfXJosvLAhcK668D;sGHKW~Uy6Qfbjj5;dkV1U6AxIPn94 z7#ii!aoFM-wg4=cbB&E8f^<#NtJ(#Tr{7V<_fBnT#k^NcgOIFwRHKc1`iZP5IsUY4> z06*FA%Gx=kIt13YA+b*KvJM;toW{u*Du5bzXW^a4DEGLu>o8v|5af%2cAHEP1x%9G zm{I z+C9a-`(vfkq*8|7dyu`#%-WTX*PQDJnUz2cpyo7ntZFo>R`#sm1u3mYKp`S+s|IRIe+xY-vNME-}jnlN8xlQ z82kCWEZ+zwl}HJ}6k~8X1GDCSn0yCt;}l$>hNjZa^+F4c+A%q$bxcP&&hL&fE;8(t z2A8KExoL4@zCeueMYnz$P~%kW1}h~c-D)<62A`93imuA`cS0#H$vjmk(>TZERuUy> z;qvNwB4IK3`XNTW$aRqjLy8)_0q4QlSkHA_BQ|w1j$kd=#Tdp| z1ymB+43~kk9Gqo{)f%x41|knF>*DaK$3F7&U$}PT`PaO8(mek7;Te79tN{Ko6~HU6 ze*;VWk=1hk+m5>bbailb0RY#Z`P|99mqs_d3%A+WKSOLL#xNq~^V_x_M z6qjI^lgks4S-{qT41rLA;_2^=bF>#n+3a=q-zAr38Ezilrh+@1D-1jZEY=lPT^MBX z+kM|gGurR{eCqmoBZZL65>nyoLz*CZv4fN{LN2Ky+`t<@6hXJ~mbY2TgGf&}BodPCi zq@8EiL0qXgv_LJWh}0`kqH2;uNc!ELHWX6fW{n<*D{zcjRGn8OyIH410F^d!IRh~x z)=TX)eFh4hCIAwH@~INS+eR(IoJ-kFsW^rF8A^8 zpBrWW@HLk%eC@^E^8VS_#kOhq@bna~IyXW_jJj!Xx~{P7Lekl4;me&<;CLv28Gt;I zl=}jeTwIWd#VNmo5I5$mq{au7!knT6-H*AM7LC{-c1wK?qs1@A4uh$C>fr2XUx~k6 zJ?J^$isU9kY8D`x%VA8OP~)E4m~_F`fjZssF*_aIeFlyV(CM0>H=$*dry%-D=|xt% z-Dn7=Q*#8h`sx6aC0?ee{<_Z|76P(~I{1Xtt(v47kyiJ1LQ10ngG!|WNn3+lq1?XE z0X~C>z~mFP#0okM&}gi3M|L1%L7~&a+No(O$|-of1C}lYFGbCNp6tW;LV>idBN+Rq zv#@;N-m>`6(eh|{c4eLwz(4ZiUElWLsA=f0#jyNupZL9B{Jj?=#!tp)u3tYnzkhK} z!1pMpL4ND0&wl8~ckUX!Kd10^%k4+TSvV;RziTXg92CFcoXZNX|3R6Vzq=RKKmW!n zJFg!V+21U@3x=?uX32R8VPGfWeEkvK6QqU5jUic`_sl`_a5SM|n zT+I}!LoG&8yDnxo&{&kd!oz>nc^aykKyq?+1-MzIePfEsBnz@$e~+FrM9lCw8JzWv7Kw6y#z=-S0HD6LDw5etwOyO zzV%vQixS)})elkB5=*)cY(2=A`hB5I{)Yte8F;j#JIB!&)HaZ=K|Y-#n_YkviD*wx zfc9;b;cuk2_(0d49G_jGXDIL==@Cs~&Y9)kd*q`Z{-SL8Pk-{e-~Zs-e&g4y!S@>F zsbJYOT^0`i)>nV_lb`y+Ti=>BX7ZER2`gGw7h%jdJ@@z@{8Iq<>)-h1-7qfxj&zpR zO{@aZ1TkWFQotI6Roh}*Fxoiyu^_V!-Z(6(78v@lUImgskdz8GeTNa6Odp=yFfluN{P$W6qE^a`ZQ11B&GK#)J)M(VGwG^!S0Ft#TOLL_vR75lvw^`}v zY5mYq_G-0A5uDEyxpgCbz3Ma(uLC%rXsjq(#Of4eN6KaFRzPzM_?bQ?c8V&uHQ+qN z>gx&TKv*GGtCU#hzyeLJD<+_9q~{?kA>IOuW90=J12zt>oS-?q4Ib~Ks~d7yy>|cd zT{lrL|8sBnIm7l{moHv6-|~*PKX&!%)iY4!|EGh`PQm}Tg_@xM6mG$V27Y z$3C_KfbajFZ~xvX?wc0N<~w$FMvvWp<#IL~jX**emmUX)r$7w2ezHUx10n*(#Te0) zs5>5rERvKXefQU=>kgm@C1V9HG_;+JIxP#d*i7yP@_i5*NOK#pIZ4IS4*Nw($#vWJ z$tVHrGNpAum;K}l4Qe|6JZN>GL~J)j6xHC8Px@WzGe4kq{3g+Oh}94Q0EHA{L{Mc1 z87*k+({531_0<7dIftB&wWt~gwk}zXE%kY=QeMR6pw%&qpMZ*qjFUuJ5SlfRO~9c+Sl>WcA8nYJSq`3D1~QM>t|48mlDf76R!L~& zJdhWl=|12s;^`qoB4S&EM^m`zKAPoiG!!vEywP^+qc`67Rad_64R5~ubE{j&Kd`@> z2P3Cnj~55MoE>Kc@Q?SncJ11#J)QqdwLCfcQXc=#Z+`omPft$YdGprEU;DrQ&4-^b zTo~^?=F1AsS{TDv)JpLI8u@ zkez_sSnZ=+38s`Hmq^hPT1Ak_B63odbZxS~f{wLatz>Cp7-03ryh z1^jpyCd=VRCG7NWckRii{k6|reRL;x4}JG{fA#$z`p_dk=Zg4|v#alH1pcx(?z?jF zxeVP~o_+4wU;Sc_d+4Eu@+rlyZ>!Z$-8x)6bMKX}x_H;rf8VO^-f;79iNbpv&KJ0O ze2R_;w@w!j5oE;$2$yJ9y8j+BXh{norC^~=HmnCInSk0NxjQQmfMN%jTn07App(xd z*2fTtdIEAWbeAfdBYn=WRwT8L+jTi;x)07Lh^L7Ey7nF1`Mi-60)mJ>?L zh-|@~y3NFHt({{wRy37JGgJI1(NYXzy#RwjE>~rXaatVP8i5$hR)d^K5oBh97^kSJ zHNg5rSC{z?m_^Cd`K}hBVgy>xHKS$!RiO2;c9!`Fs7?}+or7b5*c@V2yNs{`nw56g zvkPE9QvhgnphV_!9}N9DP|Sv$6Uxd>?6EIF^&H?#IfK3g9X^3*3K;L;$`QPEFa+3g zf^K!PyEwdY`Kix5^%Gz7HE+89k&k?&`NSta-=1B0X9e)f;`qS_9#|}A(tYN!XTI>o z9`|kEc8-o(_f%P4iYzi3Q~j#UWj}PXYWI#83yDN@bh^Urb%o>Q0&T}&y9=Am&@68% zbp`IugtwHlD-=LbhZCX#uv6VF#e~`#21dIuc?mkbhIsmndik-_an+O%NoJpH6GEFf zfPEIQ0C1Tu^mp%pWCgIg4Z8k0h!{kds})v0g-rIqu>kiO*aJ^9HsxEo&75flo zH6u-ag5+`_cF9#`1>-!#mIK;KXn}g3Jopmt5YSzoacWFJI=XXxs@W|zp{=Jk6zp*& zFq#7E+u+p#AsfSvc6Ar%awT#%E0CW6)@qK4^?EL?S87mK1KAj6a#6ny0aiK+Q!z^& zs%TmrJ0&|C2Sh|q605(A;3Y{!HuRc%*e_Nu9zXLZeIx$@BhsY zJn^%@!P)NbtN?!b9FIKtWPJ12OrE`Z^^1QnU%lS7JCo6ve3WaqZkWsa=l*hp`SaIr zE$GI{DV4d$^Cu0C77Z3v0C)y5BXremEl#kB-`5);D7o3#QZHHr5OTmybbL#RWN=mm z`O*QW&mvTF?GPyg#A*mozZ+zuq~Ta=oMWF+(VHFE0yMh>jCO#dr@_xZh6s;X&R|G) zc~VTYG#fxByWqM;Bm-_M#Ly++wzQLSFl- z6(HS89a%V6A44IK&%v$$W*5OH&wy?`h7brSc9gvAbo^wn?(fDk7&ed~$@D;gwt}z$ zXJZ91x>|u3b|9yQ28c@SA(w-SofQ8Gi1WbuM9IXy)UR6$gj)H5BHAVTT>pPa#A@px zHUm2gRC6HTLF5Q-D+mQ(y#k7<0wa=Sa&e7VuR!?($Z~L7tE&$S$mU>Y5vvp3LymW0 zydusp4rta8n<>w5eH(FpQ+*A`yC9c3_+0mia`-H0d>(#!9yFRjPHq7JLfgRj5lmhp zwzWup0gbu%Px8~x=9gXe)o**tn}6r=#~(i{f@cNrPsBl24-Vq*9v*hyKUgB4d~4>j zhZy|L%PN$ge(D-sI=4&n+TrPg3a#Y2y9#RnEu0}(OXxzKieJjBE5xW4Cv&8FD z1qrn)rNfNR1E@iv)=}7cz>mO|A*;Eb*U?1j=P3|LBaKrLtZo7G1C7@#CV()kvA}pA zyts+5Si)SqAAYib9doKUt8Wd-kD{uz540LKX-O% zofW`8F~_^V`|Wqn{QkdBf#2kqzKVc1-#lE|)2hLJ_ufNSpI+j$W=IG?y8=?+`Nh34 z+O`1@U<@T*poK_;wH}5YTsDDm6Af@r#ZOSD=dlpu!TBDLO?5w&cyu&5uN_-HR@dwG zi55aXh8U;+Rv&@03E;=-Rk%Dt3`%L?Y^39;b%@r1>y?_ux&oBtitG}Dx)$8E5a)F~ zcNv5{Q3=GnLTwnIbOJQ9f2`THsYD ztn`)+!WLZ45RCzKHK=X%cPe*4?OY#MltZR5#Trov7@vb=1-M>ALW5{L*g23_Dh<^O zL|cNh9HCi*%boNy0g{zU7h2r}o!$a$j%X~%7s#eNh~r(*;ua7M@(Y(We>jS+2H1m1 zV2TmQ@$w#i=6dG3cbuB@2Yb%^#%DhB$&<6I>Z|~M*&h!-{E&U^`PV*Jl;zvGjkh>1 zes_{h-xW=H&r>&!aOJMcc=mQj&)jN&rd4ZqD9AU;9qu|;;%L6aC^P6ngDxV?gn)4~ zWW@wUF$Oz}(AEg`N~12jkX)%pD$F14L42lOd)*Rr?ru;qR;OlPfR_iV${1bH=tu^z zd>U*rpuDJKxO5N^4fSCQF2>qnxeU~-z+DINTHs)lCturwq98g4ayg7Kh~BF!4m%Ae z%1X@w4$V;5I4==}U?n1E1x$4eX*!kLxnz|^r1`rp>4zmTp6d!U*;o2YB3(<@0Od@b zpu3ftlac|(Gw^5%s!qZAM0b#IKv;phD)9g(psE6S51QWsO)e@q+?VQbU9W-3IZ#+5 zERI2=UDX5=t9vyAG`|iBEsS(P+rdot;L07)^a7|;IiA}&2j&d1ULr~dxDm!h4#`Kx zk1o9bZRHa`KCk@kX=&c{Xa4kSZ#??w)y3Hr_V0e2@c{pbM&EaR+k>Nn->Tl~LUgOu z`WOGvFZ|js&C2N;yf5Ai%H*C)cT406p1xV5>uTK#Ni`6I?>j$&G%d!NMQ);!jnSz$ zA9)CQ6s6i|83Z)d3T^1rqRP#{*&bk=1~C<5zJ%{>Yb?QNA7m}! z@c|^?1Gg*4@(5xaObqH`v->Jwb^)?Jfh>;^4xd4L^E!wC>n+TMd$ijN0d8jsGrIt5 z9Aeud2w^YtrZtnl@JM`T_mN-y$@krRY4Xnxd2(isaMl5S`5y0l=R18t&0cqM_}qJb z?ITY-`k5!Izy4j{xLf+-C&uIbD_x{eci=}Ke;!BkIjQqX17`&>3U*7zeR~D!I>1_k zE>t+J8#Mud0ht*_lO0To0&Ez^$0ul-Mn_Cr>Ue6@@tJ4)Kwf~`S`{G|uD}=vk`_S% z%;FF{y@;64Kqrp_w;ol>$nNVw*;uWgCNls5+}2?4Azt@hk|igYt^>*mgbWN3$T~o5&|pt$hv(JAAG29fs`~kOrca-q zu72*mpZmV9-=!rYE0YhoDATMkM#xG+O!hz#+|GXHQl>{)LEoj{NJ2tcqq=R94Ampz zW{%psjw*7bOrBm5T$1Dr4YA%!08^zB+#xz*-y+9{NkH9qsB*fCMexYkF{~f$=7DKJ zCC$zz*I%Zr;9!ZiCzex8Ucq(+MTO7`Q)Eb85{91OhSV93_Yk^@!CkgD-};At_t$>u z$2Tv0{Nq>ozE=hCOZPnY+;jfpFWg&y{NBX?NeKOhgYnQZFVb8FA+K&0vNzV+q=6(ve(obOq79oyma^yZAbJ|Zio;Cf6s=Infq%qlSHSxa6L zkjc|AJ^&?9-XZEe^kjzcJx(a(@&s8-@#AaA(@zl3{{=x99iLQ5Dxx)Vlyr15 zL_%4oG`YbNs!>|zlv9M#$h=Hc=a}3nVb?JdW$Fy2AUcmMDr8K4YV?lKyz3rgF(%r? z`BT*>IbJ@$pb;jif9ivzNklPjRC?#JzutzxWKE3{_r->L7g#5?zhb5(#SkdU0+$Ibht1OtD0DiQ&*=`@gz%m!Fqg%ihPtz}lW|@%xTBAdNVjpq%G_uH2 zH0SaJx1A$p8Xd&Gr8#+x;5@3V$oG!YRy|m%B79X*SMQyR<6q0-MwzCWT-~gz4)FgM zPvJ=)|M1PD8-H{<*?*%QeBF1p*t8u;#9pbHRvDXiV7?uYGICTEjEkJs_MB~d=FLDe zxD-{H9bzWe3Hc1)ZHYsR9v|WbXhHH17bU_vq!v)`qlyAGngS71jUe=ZL`H!xYIxXl3YmG2D$e{+7yQf{TAPB6UAoe5TiZZ>Kwn>;5T!E6hx&7F|b-L z>H5{}x+;KQ(&yP{p2?==wXe$AhHT61S&6x#t`}~S|#a; zR0{Hvs1(v|k+UNN5v6qsF%mJE`lTk@KgMZ^K7BE{O7ap>5zFp-i6 z%Z^8jC6~)J?|Iu(v_oXk3$7hr!+J?JzD7RUqrUNGgcO9$f~ZPjIR%-a2^6y;@qOX5B^597*XXxos5*V9ZVF>}z zZ_%@x36v!bqO1|a7NZSfd@Z4!iW*}yQh+LJipd^+dW1N8DT$5`ZXk_DWCq!+iFt(@ z%~CN^DxtNM0c#V{#S{tFAR=mYMyw}DJVIrt=>&!bKR-p56{;SivI3D8h%7?}yURZj z$#N$&qS`~W3tR|@a)ioqbY6nDsPQyq8D|BuC?PoPc8!#vCr79(OC)O{i9<(J8ESTz zz!70cFj%!Kvh@^MjiA}4?_oK{Z&xUx)2yi+A!SV6;phNDi?aUc z4OA2C{Dh$&2nfu0KhLN8U#~=V_o-_BUC%!IY<6|k{@umm^J9Pi*XIEL_P2h+ zS8MIQzxN_{F2>#l;fBa$GNPyw@^D^hlbbBR1HG#;@-^Lu1gfJrdX?&M{%C*FeU zJIIUOa>WvhGA(UFBxs4yk~lsjE*=p?K#Z>;NBj8IIiOJ{!wU)72-%$z`i^1SV)6_* zJ%aTG-u6USA`6HV$dE+k<^BJa&7qXr|$65qUX_S zpeRa;s-~PBQSaYEW))q#MrnoIzlNM7_lGV@hA2={WAY*)m+XKUjqzDYc=fYbQ6Og5 z3F9N;!xs?Nr}^OFZL;G#=(0+)yq$JXdJEnr0B8g~o)MKq3|qX;5PgT49HiyM<}yJ; zgGWe#%uBovxMqc1Ji?C;(X)f3KUA7vdqOcu+hLh-Q6evhIwiyYe;7}%ma)J&6BFl(jK>0pFVT+pP;uNYK`m0$ZbdK7)0sRKy!){KQ z=7)5f6x!tbG>(`alUF4SyPW8(z-=!H-l8V^$ZkVuwy3hk51sJdi=o>hy#JnGxp+^u zA66&d`@PQ;SJ&;T0DfuB|DJtTe$V^KIv$F_UYka*Wu~m;k*%LcgUDsq?bQ^BSW><{7G* z;QQn;4qbyPN&$`Rq@ZVDkc1#}z4&?52?S{KN&L^_{{ zFs@5L1C!&<@8jo>AS>|QIt4VTM3@dypvO~!AFzu{5E2z36eCQX3Zvg_61Om)61ooW zy42A&+tdk956Q;+(6?#J9X-L>l&Wl#{!uE044{tRfKYK4%_)hl#jnoNC}96O!}2sy zsDmXqN4s1_+iqutX#e)lJo>l%2S50s_Ugu66~Hg4^XU(NIB$oMz4Z;B_^1`;o0>jK z>!UzvR=wkL-7*Z0&UW;+=WE{jCLYZjybs)Y;ucCvR-z^=rVMRI-)@n4oty$$jwB$9 z5}^b`*RWhIutSfi4^YP7VFZKDM=PD;Hf@7Dc{wdYnoCe6 zDl1S@AyfuB0aZaDLVAA2tRglGVz(gL9^W+ygrGE1X(XVFF|JuKEG|H&_)eh}N~pvV z96DrCAhCqYM-=s5lG*e<*dBR&2bt%|(c&$>@6v|aJ3;{Rdbc=if6p^?l2g)uYi^4#3BryUTpN=8ZRxDD#ZL3vL}><0GGZkvq4aV79-{gBA38 zOfz&eizTsdsIK3^)Jc{ie8B0P;5xi_*heqYXM3n}23mu4MCWnJ5Z8|p{RTBYB6>$Y z+ec5Yp`=6*@KV8cgD{HN@BFetqRO0XdPLkVsjfc(!P9k~Vfh#?9zr?A96w2B61gOp zjCS!D`S7!dC*Dpr8lj3D+bju-GrSe(x`w<+HnHeImBe-pz9;Am?2wY^yhUdfvK%3a zNNrH;(EeJY%Q3^SC2kTShQ1-zW90e*uSckQf>vS|2Om+@IHAG3NWVDz&V^zM{C1Aa z%EUALJW;wV3EKtq4Su^tjb}&^kdr;!;v#7w+-9kCg?gUlRhD=^oVk^q2PtXRpP4d=z`M>f+=_ z_r=5C8dvfC`)~j4?K{5d8=rgWw}0abm4DR%e(9Wl{h9AA=NtV4=W9K_Y&;^*FMO&p~+E>rMOEGw`b zrryW3Te2dd+WXB0*PJ0%=LA!u_O4;{jv}ojoezjtKYV`fL>RgL#OZn-3^SI9C) z*W=V(2Df_}_DO#iLZUC*KFMHgpKNKtBUB1>k`hEULMcs9iqJJgX^^7{B2Q0pVSCi% z03`)6F9|WAi;UQ9@LiA68CsWQlY{g<%1h+X6Z!$+T8aW_yM;`|Z#IyXh!Bb0 z8l)!AOM+{NSxvAT?EDm|1aTOU&J&i4gu*XJuvy_(7sT!2^@WGsq-@}@zQC<6h?g!nbZ`t(({0v>W)8&!A3U-w@zEp0KqL~|4O9p8m*@1`2C-QZ%mj)Frl?6tNdhY~ z{Q0Y}JR=_7K^uuMIo<~7w?y9~vt*M~QlK)EU;=iF3o#X=w%w7w0wP4D&Uew`5gmMz zu1JN+5@;aw4MJ&DmLW}%h&B=Q4qSlq>GKvP;qi;a%?goegp9~~50O_WsgOn|!nRfk zgs@vG#i4}|psa~*APfV}IfPb7ouSGC;eATWLn7MEE`wMycn95z)5vn@tTlrE6vnEvrA(r-83NByqxp8LW7`M>_r zU;Em<=5IVv4KL`mxQOxUIeb+BzXZ;E|I~N<3FrI|dK;*6#i-0_HbY!(dW^|=^X(g~ z8;c|I+}#u2{ncMZCgI+qOIEG0i$98x&90$@pleq2gT=O6Y`1~=%dmWaml~PZ6#Li6 z$73Rq0T5@O1tej58&Q-9-w>5TY!}!l=vU{c(-$EdrKN)p$a+j%oS{cE{LrIyjd!L1!lA1}CUJ-Ov+GK8x2QbTvk)6sjI~1u_Ot>^2Bv5_eE2f@=xZqg)Gl zi5yylF(?A6s8MB^yu%?Pvz%-+Nz#@)Blv;X^@&O?v-EkrOJPmH?g&^Bot4BO2%piR9*52&Z+mlk&8Dg&x%qqk2q@uSlU$1!M%_H7;YoF&{ymS71|f^ZI< z=c%BE09vPF<2@?VDGS6%lmMYJ!q6nqHzG-4x;4>7bY9|D=h)Q+!FGrkQ6|IWqeOt& zCGN?*f_}g^E24<_w!=2-6yDVB@_kK~NHo~wWXURo0J~nMFX4(2$o6Zyr* zM&s=9Papo7fBdeiTX$6eza-8x-|{U_&xrp(YqMwV@WU$Kyzeas;+0u}m}FW^a?Q>C zDisNxQROq=`n;ahna`_mq_XwlIluzp# zlrUtONjbF6L`>9_{85 z@!&2|k3e{oAT113POt+)DQvezTt2{;dr(c2*x4k_pYIx?R0&rV!OqW9?r(6gTBX^Z zF=!%cG)aY3X>^_wyd^jb&L&%42>9TMM&VaGX^0RgB_T+>RQMpEZwSpAyeCKr?HWSF z2aCvZ{Q8nG^w>6ecJ*k4%(K^hzq+ak+f@pgmojCDG#i3<;8O;PQic!#YYBOQ)EZS3 zgw34Tw~18kQ)*rR@N+41WbZnvo`6kHYnc^@@&F+AM1AaY65(uNC#2M^+G#)Jl zRZ)?R5AmZz8NF@7{oiz){qF6|Klp{i_x{R_tJ`-~0Kcf`1OMh9e`Dph|6v^3pX);R zjUWE-ul~*VUE`q0{F|jwXKu-?HMia8>0XnY{a`)_<-$&^h zv-bqq>;Nfc^889kxHv-w$VMhPGhX~OUe=JO&?LM|8(CuzG2)eh^%=p83Dq95sB!H) zIU_bJd_SbW)2xy(duZwV9=BTI>;NVw4n1migv>Ie)@UJ7Sp_i?T*^FFxuM@~k$`mp zzd9odh3lIX7CN*k(8;z4vn!t75xhk-TOttLkP_OYU|5_YWT0PMKv5y{Dv@lwPbBDO zg^&uJ?a0x=W4&XzyieHS{6%nts1q$l>YbJ{(4IaZMu)czL3qOQjIcaI&5jW&C)!A` z9TJbsYdCrn!f%N};uhyb*P(n&r0cR|_2MV6LyuO1tV+*zW^Y~@UHy~cwU0J-{=z#< zeCfyGnJY!dRRR3sobUU#Z@w)o-)V;C@BBCa_}72tfBZ)u`UHR(9lt9^b!?p@&vLXB zT;HFec4T9bm3->eGqy3Ks%v@|SX?}$?;5(r61Q%N)9Z+Xo0!chPA25MlsUu!o#zw> zH!xZy2Zn7CZa@ox$qRH*AcP`H0lvozML2zlp<5%$F=l#*t|w_3VAFFh`bCG<^_ zqlAbMIxz&hHNM^A`Yo|-kt!8CX);2Hgl3Ku0aZ=VdX&Q9oh5GO*u^hdvqwl}EiB|>ii*jNna>?-X z|HW^9^!d;K*|X0+D|@nU+qO=*p^wHW-u`7zGOkBt)dZQ9{NCMj&W4Qfc+AEH7LQ&f z%rEgG$HhPlEyeL2;Dx+a@UaIuGV z%Jqm@Mih~VL=qCErf-QZZHr|&M(8Z1hxW^aB9k&LJo=uPjUg)t%Zp_38;y{|miYKC z{^Ak39Fds}b9g6h?$7VhE$66uhSmza$0ON3|4|mN{0pL#WMw_50IE>$wKxArzWDV2 z^o(4*{1=MhIAO};1~9M@IxPd@jw6dkIet&Kihx&!q;d;OeP1Ch3&L0w%=ZM)&LRO)?MG8T_GxZY#Qs-2oDfMW? z=-MreR1D5BEKaaCd0s^|!4xGyNkY?Ny~nQ45Sz=C;#M6ZM%M}J3;M+w(qyPCLx=!I z;hQyFo)Cpc6lF@Bi!l|W;E`DgLSV`aABV&t^d6)^*&bXZTs$Idw*+sA{eUPBkV>SD zXy1cRn!D%%$`r55OhUIM3c+9HEY7qrn#&!Ff{4=)^#Z#SS2wtka&ti2i_;Iu+ESo z5JL|`3VL@+qil~00kRP&O^6n^x(kVIBG|n2309Y9qNjZ5gZT&qlj-h-Dfz$Pp`!9c*#j-)_G3NM9 zQ14UpOH5Irr?&`wi!MhPC8=izjO&`Js>w}(mEf8S!ghn}9m3@3qQFdQg0r~QIejxn zoWG1S2`H+yLQM`4^_aMs)346)2;9&!*a3O|Dp6^u_b}xoJ-Ka<2%e}*q?RB=V&JXU z#Lbcz1U`7^w+Z68xF8GzaTpNm%j7RMi6&jK`QKaiw^+;yV>dIL(>H+ z#zb{S5J@O`8GW+B4L!kIq}D{K5lSP30cjHPrb~c?NFD2dCCsKC(?5@!8J<;-y@~q^8#|wZID9Zn>Et5 zV8*D?K5@HZxOjlCr^x9o%>E6O2!x@dDy116@Bh)FeDVk6aQ+jSY2JVQ&Cg!@{LkLU z|M_ox?D~QHhgE%b53dT~7vnkn?|=IrkD_}YZvCrm zSj<<*5P0It-pTD7*O?UsBL+r$*U0M;nK4vFjuH|%Y?)MJX7vOiHOtin%heYD@+XOM zgxWu57#iIA5~(!KcMO{)EKgv2LEO8I6ky5%T~0x2OqLU5#M_4c{->aAklQsP8zV-0 zm~sR%5Ze_2O%O@=EUhD`jAnjL+$>Yq)T{~f%QP#~nrO0QBa=x=B7#Rn0m>kT^t2Zy zVeI?$f?*h7XbHh3%1TH;Q>8T_c*0;)zK0aa-{rPr1I$Dn(UFiH%^F=lIToE(k&-K*ao!^I=Q<9pZ${qhX4JWt7F z<3q&g8Y+6^^q43ksFZYu_r&cQw_Ol77pXhZ8f9{#)`V^Y+e?B{h%PbgA_40y@!n_B zcD7$5E+4~S(~L12rO@=eN(DfWn14I+Nwh=S%4UfQFhZs_>NtBQ&qU|t6iQLii z+A2p)4v~=r{R$S}ZGn);Ir#`-GNc<&fFA7;WQp9rowA3OA@r-f>)M+@{N#W4cRqM0 z-)!Fh{`Y_Vzgz^b&Q$^Yf}WrIzz0ke<&&uVzg*_GPHn#To|+e!boKh;8B%>Kv3H5)zh6m#AX5`5m@|ZbMKe zX(MIaVZ01+utYl`i%IJChK|rJlS3p#%(GaT;1oZ0{F!_C*F@mJN@Ke|IhyW zk8cLiS{rV7=hW7k_HiS{%NGrc&ZXz<-Z95FpJX*ZB`ZfrX&DG9Y)A?E)0a5R1y3GK zIUWg??S^~LeT?q$J$yDnwrfOPqi((lv0cJ)NpKCK$iQxKy(37CK6siaE0oDl;|b38 z^n=Cs4K7MJzmG5la&`mq8Bz%J#g(AprBOh5TC5ThiBNPm8hNc!3$N%S2_`6N-u zM0}QtY&0U8jIiAjeMqsK^_b9YQdb!SzHgH4&G{4ppXd0^Vh5cSpbF&pC}k%1J@f;R zGFX(*=yIC0m;DyMoujKMQkE!P<5x@HU!1wjh;O|4mct)`XXW>O@I&nff9mgj>O&v; zkiWW#|M$*SCdmIs=hYSi8heAgjVfgY8R)yVD=ee`9BEN2)xxV(=oN65Oc*3LSR?ABAFeXJy3Qh0>LP(;JY16y2$wg~H8{)1jjCoF2pC=~? z5fuXg&@yd)MOGl%b^6?!Maue!0r}_=PGv;e)U}FT*Q;`Z?}^(6uX4)Sb)xTy!z1gh{7O@Cbsj}e-V)71UH~ffe;SsBjNG{ zeRKzu!07Z#C^}EH3yPy#fBD9rd)voPewAOix`9^(@QZpr@PQAQC&%$m^u5nkPJgaz zgm}2h&R<(BpWZZE-hBOlYlr*1{CLe--_o0klat3R@4w9S;E<}Uu*(OGaqLaT^kLw+ z*B)^1rB_mp#2em4v>kGBg1Y%u%y^t|>{>%nrvUWX0d}=PXhW<=$kWdu58i?-M_3{8 zt4q}CA`$;4Gj=3C-SZAWu2Bv>T!+kW#12+^Pnh zp$G^`!o5pUu7xRZIcaWYo21jr5*Z~3LnI=kLFN@+Dq`0q!7_pnL2C`Y0N3C}jubj| ze?q1twswUGAY>9FM-S0dh~*{D4k!Y#93z4!5E-^BjL8v75xh*rHCUqaDQ+_ZNh-V{ zdeqQDJ%w&fXxETU2%!g+(Ec%kwhh=8;Q~PjG!RTl?3)xIm6uRdctDtn5J2cO29O~M zre!rHZZ4B+$9Y61@R`A%zf7Dz!WK2f^g2;X2G>j3HZg7RAL_iE{^;JH{>A6#zxMu* zT;0N}C-4{L{L-`EUA(ahZ>qd|{L&)(y$AE^&wl2zTHZbH?rb+J^A%4$#qH}iIazkB zbjC&3^V+BXfQ!$43hy1apMEo0Y?&#~@!pinX2b74|2bZJ=@o)D=-YpY7(t%iMNh9& z9bCu66eKPuhv*{5O!o2Z&igt!KrCMaFA<{@nd$9-I{WM{eQkrZJ^JtsiF9mxWmP4vbgmPp>OCntMn8_AY_p+^dUe@mqAE{FlB;1_@3x{gzJ)1Wmw{DpXP+7M7aT! zLUdcgPLe}bAhg1@OT23c-3nn6rXSb|xD`l+9XeuE#GUH{5>HSd)911SVfg?*zn_*d zN?}i*6ZZ7^V7F&|zj%c2R|k8A{n^>S@l#J;-NdT`_(eGv>-sp4Tz>CQ{?hNi@;E;8 z@~QvI)630UdfOLwZr%)qftMbfu=0vm@1Jn?+2p4SS;F@#f>0RR96G##9 zQW4JY5?3cF77|dSy%aRmw+Rie4B`HB#N`=L)kIYwWWK|=8|b?vQBgT@bD3l&Wu4;h z`hLgLi-_Q0=s}s3+dE3GmS`JlH5$5%)N zA|SgpVdw3QGNzfL(usHIEkv2-c){bB=deTF2kUU#70%k^J~276o}{g>6lr6fWysv5 zybfhjCueuh+O7c?66U^XKt+V`#PxzG%GsksgBCR#KWQ*RB-a*^i-;>;?e0Dmk;j~f`r&Y zgtx!-joc~+E^Xwa&p+he-4_WyLRM1Uc$(_qI?d^8RFfGuu0KJY8%{ficRk(*v~3yk z0=>B)gaO}f5GT(wn8^c%Py*eK|$;+r+pF1LEQHX(=+hjS3NO6r6tszgdDZ=*e}= z^cY!GxPFW6R>a4jO+w_!4b=V})bv`~&;&zp?eVY{kQ5%BY zVx1>i2iBvq45Hl?Ad$YV7}AqiYm_oXZ|Vnt9r0>jI^cO-@La@cmk* zjc~ApZjl0yOiuI`ng-!}Pz64K&_!D6cn2X6eMmxQ0m6IY&=CnJoujlS_8qp}CZYM_ zRdh24H72$lqONhl5!{xjG^*Ms)JH&ob{ob1Q?k1KwZCh|$6vnb#a2lFflS+%dTe7_w9=Ba@=D(rr`j>AWj(dpo zL%?L?B&!(KRE6Q)Z+n_`*YdG5$Jt_qv>l?FksUtCZ2t&@C)0*&d;46kG@B5(cY2Zp z(9$6C8X1y=!b%0FFQkhzx{j{*6J0t6;@N!y3N^chp52CekI-)jtMk-tD1+L+jhXBr z^9ogtQT2?xo{{ARc|9e&`G2tYrm?za*qVLj(o+t>+14As%u(y6*ro%7yP=UHd%wf_I#|7&c{x4)!R zYt&Z|Z@?+V1!UNf9R_4@-j)ROM42Ysu(vUrE}dCX5CGFwkBhb}(K4ZNK*byv;vDKsM65vZHPWq-xfo8e`A`Z@ftC!D?q=Q@&W=yz9ydKKz-eq(5k-|?fNJN?bC zee}EkkI($@pZ;UDUi`bK{`r^Qdp!O5f9*T|$kt}-*`{^J*^M_ zvxMe;()jUtxc)EpH|HPt+4$P;{`yn>TlYHYDq`-sR!a!z;SnzF`HkQ7KJFcNeCDR% z;(8C$fNNUXvv+Xs>=m4Eh|wGe+u#sU9zMHZNJ5Z6)vQo5z7%qMgj{?984k$NI|)Y* zsG2ppUQw>!u#V;E9@WXK_|=Jl45mm%2vtLM?_CxpSvLgl3AM-94bAol(M;2BaNAS- z{u#br8_d9g7ITNl+#7&ke?>lA8oAj!@;DIV4D)ESt~f4U1zFHmgFW=qh|kfwz||JX zBQj2ux`h&LD;#IaxHn;T-&=umj?(Y&tChW57nZN+g8G2-HNHEhcxRSADG(=g>QUby z-4<7Ml>Mc}iHce2@BxQ6pKu&eRlEb*EomCaS5Iv=TGA3ag?*#RnNp%jbaJ*)Lc2D- z-*B_Ydn`yPPd$41MHC_S*SKbl3*jxo&EY`qd)&#paJ8fCpD;@!LqC*x_0s#B_x#5H z;gz#8{<`1x9cO_4-2eKgeq`Kz;kTZ+^B*t6(?9yb4}P$_dqVGKfWIc^cm1ySHLiO9 zw;r^7XPKtBkNlY!T|$1fpmi<@`k)F5#}MQ|yT19(x& zG@2Jz4WgP3dz#}j(s)1*&(UfLO~;lIjJ?rUVln_KYjhkaaYkPeysIhRAz927+^q3+ zhpe}-dy0$$+HP=hM)&8?9wDm@;sT|=w)oM_u@%ysO~ONgGFz5Ox3#POu&4OON_c2& zF{B9@F39P`q&GR^oFL7b94h+;Fb`->h*wff$nH&aI+)II9`Ws(vOYyAXo;vO-Z?^5 z5vw)%OFxef$E0!4v1^3za{bQy{3pF@+uN_pPygVDpMM(u%irpR@Any|K&}GyK8Nf9kJ)>9e2x?DWh3%umYi{C({z{02#JAWu3TwBAY%+pqox z{-tmF^;}PZ*RBHBR}Y!b-=J;RoV@aGwq6N!&0&`)IpNxxi|b3ShnYAWXxlBJ-7xJh zkoK4u5BQ7M(bKOXyyMs74p&s`Q#1t9^_#H2MDM?6ahwEF$>?;z2aj*oNYxQmTjuL0 zlxQ2&po(icyK;(S9`?Aa3pjci7iuV@U58gEXkEkM2Kp<+S7fQ+`YCyHY{hBX!PrA{ zWOFq@6!LgLh8v2jfkfQzs8?Hj)sU%?RfXInKVMSOUksP?2bF!nk1&Rc!W=&dx&s~2_t~cZ~S?9Wc2K#eVI_n_oH6 z{+gZd`O%+v1pKPBjsN_E|JJ+J#s47G^2wa#K|tQwy4<|_(tX}}{3>nmeC{%_cY)!H zKTUr61&+Su571RYRkf74C#RVlNA}}2Vb!6oA%uozyM=PVxxn0Q2yc9X)EpzHUqxF5 z%4$oq-O{H77Y{ABqG}1jW^P3@3vUN@#imG*wWwymejL>Y+=7$joIdAhl$tWPh0d84l?2J&Vw!;0V^)bsOaQ=P3yz)SyJB+v zQyxe1`jl{VVo0l8z&rBICE+C_Wvj0#$FEQhJJi*P+Pc@(EAr5zX);f*7pgpw>m@Nx zu;R5pw-6|l6c5O54;QafoT3u&^#;0oCaT`pm3+K;gcc9SFQY|_m8g+84(QyAD>SJ( z`?_y$f8a0wz8~h!{&qJ5eEXa~_Q4NqBu?L2m;C2fl7FnOs@FDMSKr&L-GfcV{cXe5 z<<7Q|*RL}?{yCbH`#dx!6W3W6u&6;it;mq@!l!~4drWZPrPK-(qtwUL>B%Qyy0Y1%t8D{4?@0aig5c6``ctR>)7|rXR{-B$ zXH!08#q(pUkA8`t*Ov8>e_BQliZOGz?SC7$$f1ml{DX~~0hO}E;@VKJp(l~yAUOvRl z1L`->oZ_Uhu1&@))Ge+%LGeucbDystX?6A46N=D?ydm7 ztz5fc| z_};JMcvVw*Vazkb^*L1#R!yK;Z^TD z&Izt+$Z-ZuxVi;V=0i^|O3v8?z2ku-prOIdJ!OAwv69mP$;mP^oWre73F|FxdkS-p zT%S|ABa`H`N2qr%Ld`jUNRAmOl-L_hT0A0-k_OYvDW?5%HChE*GW0v*qtByNhYKA} z3(gy6OC7jzpoGq>Yyv7CaO9Y*v(-edYUKP4%A8S6EQlA7g1Q==dWx%XzCpbw_m=3E z`b)}TuN-L@C#<%){S3Ie+%} z?uolAfN!gFizNDUANgD3cYpMwV_oTfQ>S_rG+pg?`kr^Z45EDT3!mfY^xgcMzv%;f zH zk=-eNy+x-H?>*Jo16=KypMQyxCZt_KRa1ro#DVB4^8lYbfbNKSIN0K(Bm#mQzl?9U zCioRW)*C!(8`m@;^)Wtpa!M4DC7G@_j^8|4id&j(F@i_hBfAEpxExW<CWoLqQh=|VS za#06TE^RNDfZ{{1`@iN<5*xlSP&lA&bPrW{& zZCdJPP0)zeYn*tP6Ddy2*Oy4>2*+neEABdi3(NdYiE*UF(cBQLBihyJ@^T73C&JN7 zgl0v0{yIgM;^l;rvXP^kBjosT%e*jA5eu7Cn!+r1}DolSHV>dtu~b1 z6;u^zyg{BlB#K+Yj4V4uSS)+V$kh@INFXUwVj>?7Xe<^IuMzqkc}@@~d{yJ>4OFdh z|E7_gCS=&7zQ(VPtUH_z6knM?xxX^+u)5_jE4Kc=jm~UVaQs#H?$kJj*KZIn-(;Fh zE2-TBT+`vi6I`GyX?d7osuh| z+k_@~o#)8YiyKakkN6Gm`&#^T!!#UdaWo~9W29XlQA)uzHNIWrT#d_#;$fb4;8s*8 zuUM|f(Br)2*M_Dcjsx+qw?wwOwueiUIPNGZnQ(dP@#_<+^_Ft=kU7uzY8qI zO4W7L-8%WoUDxbBadeu$@$MZp zANtUT?w;X)igTv}{53j%=0E!F-lzfp)zm)D@&irZ69F(6B)%q~QSSX^!ua$jndQG{&A7S1<0b$TyehutR)} zZ(7@?Rt>3LGhaNzi4x9U#n&E}X3F}M==S9OmFWfB6^>#C{<+8BdzHvce)4I`$xFuH z!w~W6ylq71(a`v=K~zy+Arg>~LA)iJIg`(*M#wveH6?n8vt@h4Me8R9R?s*i@nF~e zm_RHIPKx2E$^tHs9F5kJBfh_(DCXfU36&ahMATEj;yrIq$>e3mSZOjqYcTeqOg*Sr zl3cfjaffE3&=gl$QFVsza&~LyVVz)kq zuX;a43o`D|O$9FCq#~@3@WD}69@(CfL-z~Ss zs*oYWG#;qx1}9348Qon_J@{H&sEBc5zJ5r$z694$bt~GFdx-iau-oB8DE*$qL-Oi~ zs%i0ci@HEA&kR{#)zGXhWld*5@a;WPc*b<`lzP3UI0wE%+H6aXY#p3+Z{E7VI3S@z zeL!$%`;u*_`-eC(q#Kk9N{gt8ukn=?-_(P6vMM}(h|PBpx8zf<}A; z(@0U<%o1wL7>N@!8zd(yVy?DsQyk*f1VFl#5uH(_zkuS9)d>9EMa07KsSf5a}TU-bbM|`LWbxnQx3MxW;`WkV6LoONToMG7y z&(W9+3stZX^ZvrFf!j06?d0zux)ut!-U~mp1ZO@2#s)1uuuGaR2O#QlLNVS+{|s zuA!)MvTdoHpk#(LF~NRCP5O)_g{}P95w#@wvz81VD)Cbbx60V;Twx>vNr1PgR*`mWW z?UL^sDC>Jj9gt}UlU>2fyo08p)HPwevAo-=v*n1aP^@r@MkF7Qe4yyWvJ!r4CI@JW z$k3Z@Z`@K93Xb+|Mug0GF2m@|cf%zNVg zl6rH3td4N~6-A(`7yF(QVksPk{^R%f2OmA|LVeU#hr1{3t^mF*&v$?KcaNvX?eAHy z>i3;rJ^fF-d$D5WAysX!2b8U!FA*`DKrLb)rc^XKrX1LiQbw@7Bc(^7N zC8vYQK2pT{KxsA%&)*usMYK!-dO0xM+B_R7t(%9Q% zud*3loHIx!r-%+aa(_daM#8;UDD$2?O;8F&1-IHRv$7MU-db^q2eYLupN}d|xb+s_ zpTn>t`x@t4lcR_?u3s6fGZPTZP6u{Hv?4y3o=_9yMCu1hWwt=X+4XxImuqEh|6R#8 zvzrIo8dnW2)Yg@XZM4NL&JA&d{WE0qz_!8XuTid_P)d*32eHmC%}Cwi%7n%qy*a0( zaVfl&6}j81acIFei`jaCCR80x#4z|IyeLdpjF(SL%CtE_V{ZZOenInVW{Q#iFh2Q_ z|K+>hyth66g|p4Q>F!CpD}Zmy^B?|}fBAk;{r!15{PF+oCw}6)Rxdr+t=H@Qx_0Gk zNUglGt&7(6rtb| zU(s$(@LF))5veFTjcAIb@qiP<0Tj(REmS_>kM2`d9!;|en?ps(5xggl2ZM{Qjv-By z6baiS;^Eqg&agvV4Xce=?tG1_TZ_0%vmxhGL?x5^=akFOlG1?qV6F|aEk!gfJ(6R| zRRc0eG5cALNSP3wEDTAMG98w!>RZ>$GK~<-M@%V5?P#TN56qHh1yk?rw`;ig<#j9}NeYq&KrJhI=xz2GTAZ_3&!xgz0rZXiebT`kC3v&= zsiJuz_vh&0f@$0%p|z}+qDb&)o=7Q^RLa276F}>l?`%uIXjU8Bwg!(E zhtw@GPe_bVsTH&siQ11_`3|JA(B_g50>tGNB zRnSOD_W%BN9%{49VqK?#_|`nbX+n#Q7HB%tKK9Qjd4xPM9d=aBhIw<}*ny#9zCOo= zjvV!7469E7eAoAW?xvG-CzyAym>6S@vGEmp9e zgy2^jyz_VwT#8oEs@AB{>l5_o9;6AE)Ur@anFq``k|my%a*IeXM+kW-h?sLiGiZ7- z3uKAJw5{$4(R{p`?8DoM}gnJCm|FPuf2r&dILp#TGfmUE_A9O|*Pt+vdc!JriS+iEUdG+qP}ndNZ+Y z+qO@>bf%SQ` z5pfkW)9~!dSFe(w&a)>kk&sKv4=OLev51Rs%glwYF3%Gh4@dkCcTQPRJ4JGFwoz$S z*pd3RT4n7eJ*bSq6VqyA{DPxgdk}>5><-cUJF~BByM&-C6m-+xU+o^h zMuO_C?Ab5%y4A0hHmC26!jD1uWuFyx`ZbBY!b-tu*W0b!=6vNm@Lt$8`(a2A!{f?@ z%h`X3ud{87h^E<6^-WH{tff#>xn;{ns4qpn;YmsE7aEmMa=WH{d>6B)ev)mhV`#VM zE9U(m$EOPY%TeyGJ1&uyGJRO4C|}b#5kIW%`rcy5Ik1nH-SS~v~ATpQ$^jE%{H;`7FQU$?HSb?{)felFs_|>xio-FM_8tKqXM+se3}dU zTqz4CylaT|xm?5{cwum#rii%r`mUV+WjCVKSCeSZ3oPK^DIL5BMBT3ulG_+IKF7Z59Q1hY23h*r9v3sCLjVIMJ3!9wgZaIE-CO zGZiMS_&YHR4WsrvBfm%NmhOs)5g_fxTen(Mibm4qo08IfI`Q6vij;(=|u@$dT=@ z*4O+#t#PhdV>Ba?LXQ`|*CpOy>^AQEeYQI7rdH3~99H+%;77uR zL-Zq{GhQb8*jf~rWKg`x?oO~9;Y_@BoI)jV7t~otM9Mdok2{LiNRQ{J%rcigu)0$oXl_Hh2tsCJ;2dsC6*^wMBCCp zU;8i#VDyJ_Sk-JLPiCy9jGLyArTmlBWYOJ{z;IH94MHm$g;9aDS{GRO;)@tV9be@k z&3Z3Cac@#@ah9!!N{u!A{k;*OCC}a}KiICcy!TbE``pFgIn)a{oZC=bc z%}t47_UxsJ?k=BXDPKq1b~$d^o3Udme26YYwxC-5psfV)c5bq}!wU?anN$lt-kc973%x-OnPB9-Vfe5n?Qh$Y#NT zZ!%1{wH%5m5ATt}!>_a(f_gf|a8B|bM*dxbbkpUW46>h@VfE~c%^je7Kd9v?{$P$V zH(OR=2>fP0f%mR!P+rX9(K!Zv7(gp@(PkLfh0SE$(9O154BsvHeGZ;hYtcT$nTWP< zv~pZb&E?h5Ir|=vC~JPQlZ7%KEXgR(nu@v1&i}^P7+wr>*PJzva~U5@ZyTRNf{`*b zG6}ul^B!6Pu?ZOEbvZ)Ba&ck?AVvgLarO_Zsx6ldp4ql`ivfrhRo&$}6Q=4uJDzbl(nE>+3* z*2HE~ca$W4;va5;&Uc_?T8SkcpMm`Q&5fClLsi!EDF{q^+@(0p0h)dwW z=;!s{!&zSI0RrOfddd2@(>?H@s4xSw-DB&u9A(d3;ppt(tlfVbYvyUbceR}2YZDSB z++LF&cgb*KQXH)P2&&$$a97`iF0!E7)2FV7;pPe8X3z_Aw+9-H{>?R4wbK2tNMa$8 z=~e#d&}GYZJ*ozH|Hw`qWZdW0RaWeTU3~&mij=t=+)unFuBtQ%ph zK2!zTSUG`9ENfvTEskeUYb_nP%b9C@PfC0z@VgUIvuW~a8bGquGo*2=^Mr~knW zvNm?$CMLIHt1=zUSdvy`KRx=H+Q14sucm6rof)3Xkt`Y2-R%;(8U3DUXPW`ZS~O?-Bc4sS8rF8l;nXchFujmGbtf60Z=b7CjC34P0b;JUus~98>m#7b#J8 z*70~)xX=i=;;9}POF^sP!>OG=f0Io?2RGz5A3*#04+ytE_SR#N*eT?{$@8yc!#e+8YS=blsM>u5E!jhl2mvs1MWet!mlG zej23G>NZTJ8?1EOU!f^;Omq{f(Azl0M!;PA0~s9^(X#9|?T;o-z|+Y4%4@CZV=<@f zbJi>WF(AnBQQ+f|lr$%@1kv(w@4pLmJ4|jxn>}u|359(WJ!YKVq ztjizJ+*DOwUX-DK6J2c{hiuhN(JS-T%}hSere1udNGwLbuE~}+Q(dTn?axgo5@flQ z3`i-)n)ct-7<;1+K7NWuQCKC@2hc#Na_vF}sV5KpSBb9G)ke7{w%*15s6NJxPDO7kK!1Iu}bHN^;$LvzO?3 zuDkkJHu-w;dHTgbUX00JeD+Jy_Cwcn zJBgU_#bomxZo+Qb`;5u^oKp9hDe6%w)GUT#mGdx32_vO&yj8?Y>eP>j_VXHL+Cvxd znsjoRHtFmw7p&}YXm%LAjv6uW>}183vwu@?N1<#HQHad>QeFA;8}a62q-M>>(ilzZ zYLhAeHDnd%kTvjoJ7X<@foVlpv;MaJnR1h#&ddYX*G3zBp-S!_7CjyxR!M@f>+|<@ z#KIemyeUhI^s6E!<}uYmb0@~WgXSW@;3f` zduH&*DCL*9?VX?f*76_gV!W)7-gCapu%fVXLOUG40hGWI7!h$I4ZLHvk9*C+amWS{ zk41(v3`U7|UqJ*dPZpOz*VNX_{f`vR;K&%VwFNVa4@m~F!?E# zOsLe>5pw)Ct;Idv6p6IqXVBIE*x7MGSTEmk}JYr`^bZmwvPH zw?-s8-H}F3Z7ESR{Qy8O@*|JD0v?n+Qt-x+$|k79seN^KC(coiljDNVEmNzt;GroZ zR=UNfBJEyRRE;24P_Cxx>7Q`Ev`4Nq^9mqS$xl@6&Gv8B4NguCHjz$s*`QsNc_f_S z*p1ddqQRGe%wL0Zu{Qu15EJME5s-KABF4B>r2@8W*(vss+XOEmyDDF zpWs!mX2-jNgzCf^0n1nx)FC{=PS3%)itGvjoXZjJ2KS_KKKMene9UWm7Ml9IWL(Y% zu>~x2j56BHJ1(s0cEe8h!N07#Ylyna&yUc>y_hH@u}Az`d=w-q#8i+np=fPJXKYIO z&yXVpk_K82#)`4V2^yHb$MjP+%X!tmGSj8WS_df4hRe@wTm-v&R=hZ{ZmZ?7+7!Yi zJpT^JugiR*4GC9k4idT7J}MD}+duTryw=ju?pGoCoRJJN-E*jFRd;Ln;uyhL4ehM2 zRv&gkXescCSg-U_O+sW^QkiSLPSnQg-I8vFjXij;XfqPj!m;myRhy3>j@p5RSh6(^ zyGK~!8Flt9EI7!jYPI}`KIzMO+4{OS_1=E#zB*x~^?auh{PLmocU{{3?#&*#zE*6% ziWj;P_Lg#VoMXCqy6Sj!RDEh-StcE)xDcI`2W(Q?(wK*ZOX0cFP1i^{Xm=leD5uBi z%lAfpamC2+w|4-bCV4Z&x$mkh7Pd!asKd85`&>1pB_des1xSlwygn(Yu@aIJ&6*kK zB}Ob_7f{7B9siovr34lYxBUPk1Mh&HZXZ)Hrf-9R4bw6URX6nc z55XqU3Py_zT#f=(rgF%0a{kJ#c&0ep?_CgkOf_(0`ye`fIp=^xE54t$ct%^zt>yL6 zc7(AX2+xC5JQegWwGE0JE)tog9qfKD`BF=QkF@9=x;n%AIl0K2|A|IZPwQ++a+#h> z;@&q{M}lul0&dt^Z(W>{Y$io6(^ITdu5l(!q+FG2QVrbj8gR(zO1rPSI0CZh_O|N% zjo7_z_;$)cv;#cIx;tJ%I$#^a!|MU*1aT;$V$XV zG7OJfd$fJK6(d6EAu3hhI+z2S9Y!I}sFegm*s7Czm(B@3ws*I=+M4MR5iDoI*-Fpn zD!ZV&{kA09e$yaEd;9LeUX_Y6katM)b7#$mfgo3d#NTY-YRtmVQ4^SOrx%T8FBH{^ zfvR$NZigY@Br!t4umqo{jZfB`*4=a*rl)^j{j2bwGQqAzcm-7mKg%P9gsycSzX%dP z!({6Nid%LZ*W4d&2!hXEte)qzsV_nFjt-ma@5c5Z8|iC%=uPk~z~|zw#jTq9(8nu# z@6{cjJtY0ki=v$K{EwRA?DT*VF0t&s;9Hr7+bSdu@h@_5sgY2nvv_bRpPz(J`)sQmb1fWetZ(7Y5_!zj z5-f>{6Jsos)RTLo>t7;f>!!hOuREViANhBeDb^f6NzNwJT>8ejjI!9-a=e#D;xesy ztjhs3m8ZV0gh%Hqk1fmMCjztfUJ{Py%o8Fi|vl9>f=Z(heI~`!AozD?15a-7HX6A zl5rR0Q4HuyeC+jrH@vNv5Pn33AWgxI8`$;~qP>e>K)wvo{nyf7zBkZ%`g$H+Jrk5@ zANX7iro<$(`TWf^v{O`LpCC1PoR?F#=CNckkPmBE096jBv1fn_9^pvNKa^L#nzko@ z4Eg!UvD4YdOADsXdO7Gnz3>KcYQB-_7TtB=GQLO3ID^GrR%q0{o=<_3M%l1=5E#v0 z&!e%qV5BhXJ`rJMH_A0Nhxf+pUBA5-VLFVBFmzss%>3LYgO1k`<@Uh8OI! zGHW5pC^B^ex2_z>7hP&Q{i3IOrAN>)zu~_XzHPCboo2>^J7Ch*EtqUtBN#}Bh2`Z> zZre2hdi6DQ0r@3a-S40ZxSAA<*d2lr4CSq;{=AlQor?Lm6TJ3Z_Ay)Kf8*_2P&#SH zh;seQxD4FdyOXeIXP^hlPpEiG>2PGHVk#tWJK3xJLWDXKtKY2{W#JbQ`sEmHWN6rR ze3`2zP>p58gYB&TO(TUL*l^jdE#g~?@;$+M>PN}(8iJ`LbBdhDapiXBZ)WfIFBF-{ z^gT;PWTSo5U)sLhcX8j1V>5mG{ zz&Xmk%d)L{sIqNa_Z!3DN=tHp5B;}FNYYSekZ+`0LtWx4i5$-D&p6!=_*=s;aG>}* zD8LBU3e)>wZ3$9Iv7Pv~%s^O>x5e3`H8) zP^p2bluV3~V}c$EHf}k;VD2T0(5$SxT8dvrTQ#(G3UiS0>qld?lG=kezA!So0CYRO z9D5wtwL2vB)VxqKz+UbH5CyVex$q|IDqJv}JUU4NBpU3WLvix6Y|*N~ZxgYR4G4Up6>KBa>z7t% z8%(JJ-NG7kx?Dwb2o6Ky1z4-bX5&THg-&COd;lm58lELBGn#n! z$N-`v6EjYXg%S!vRzomA^e(CVes$HOzV-25A|BEw>}imR#9WI|eRY`+!%oAfhlmV9 zDqY`6%0wC(eB#S)UL&!}Dbj9}U75^xSz6@bfsiOx@I zjyrMp#0b$m1w{Au9f`D&)7%W1RKO}~-z@~$L*C1>c}1N)!~zf*(_ zf7=V)#P~buMCEO6nz@ zB?q{D(Os2DMm3A1MDw5WAA!nUB=&)r7<1P>j361kTu|Wb=Inzx2o7ue>U`)uuVlVG z;`^|=NhPE2ROGdA?ny&{<-|TkK-{cMGrV1=tJb<8-<>0{f9vng;ZpFVz}7s%Wey_~ zzS$FpBey3@@OG4OgZo#R9&Q+O$o#kjtEUL8OR(NBMNWTg;FS8TMtL#nE{PU-aAsL; zdXpyIY$L_Yss!#9AX6?ZwH*8x@9-cQ*EQ0T?ZE*ppvP|s1Fd}5ul_{>n3-&*IZ7>7%YnzVx5 zRBS;>nh1Nsm61+F4m6X}W0ONgF@ZVzqFy}ziz}b;veE*YF)PFu+Bq3JkZS{rJ_}bC z8+*HdDik@r2o~kk&df*qkG91H%4cB}K5dNI4v|?*4Ge!0hUC;+U(!XHE)gCcS|Z;J zwdrsPLZXU3d5y(rw2>J!Bh%iYtIjU&IKcgxBw6n_#R@3R8p!xD02+ad2&9NZV;-9X z-0#iw;U;5DHVTBdvZR03$)aGS&5!!yBc-;Nk-Yhdfn(X&KF0kMZ3@x@@D2gG^>}8B zTwBODm7L~`zoACj{|gD@8CN73#JJY{DoCd?{)ovrW06HhyKtlJwH$Shjxj`58t{9l zB@rSnUMy5)m1+*9+B5gf`ey>T1KEId!C0W#TpANig5&~?DEJ?UVpUt>=L4jar-~~L zUVd!&kR@26Wa3-+3`jFhYFkhNw4|Hgr$+mc$YMQ2@pKe>nBe4pYE9r7fl8`Rb=4Mu zz|<57K5=ZzUeXa5iX=!4%2cBU`9jUG5i=wWy+jOARKrHey(3~5K)f$@GLsE-TrR<1 z7~enXGDSWSBmVUSxeP!X=s;*Jslc5-Q5GA|@+K`l@7BJWXV@TIAX|Zc#z&X)-nxn< z>xJS%G1ACDm}@?Bi%yU}hG%C{25zJS(d?F4Fg+qc)@`t4fG_P_FS(u`E@$|VDTEr| zxnAJG3w%NrHJ8QELgZlR3bcz`_%dB@odS++LfHWi4t-A8Qt;0T3X~1w3f(mXW@0k) zZsi{YyA_Sl68F1PAxzG3#oS!ZKb6oR3Zn-BkxawLB1-s+MjD zNl7L6=bQme0Tl@En+U|eQayc(>%S0&YCMQtPp(jbji|(6kqa8Q957TV^v`uXnnO;a zX1%o_u?-y3nPvrr{6ji%a6*6UFsX8kRF=WE#o^pf+ENt13}AA}bD4y4d35mV`qey= zSC^1^eQTENRH}9wdchl80@TJyC~HXPA;i*+h6LutNs{`>YZW2MXcQ>49}!rWTd_r* zCJIo3jmUtEz6vMs^`Vzj2W-2GX+FwTM79KKkq`;MR(NCk$Durp36SvdsH0$1;J}|V zQBYw-4H>Jn+%Ra8(;$L*4qWwiU(tF8L{K9(>?rzP1C}&{HVuPjnwxFUAR00FdX&tO zov8K>Cd!Hmr>^2cwX|9*R!dpkhbxiH;)Rb*5d0rnJd@QD6V4dQlcmR21w7a8z zPW>xvJ>M^Uegp=UT0lRPm_;&8w$*GF^$|TlrG5qa3z?R@ikA;Ocve3k4nT|4AVTc7 z^H%q7Ec;8W_8%cYkY(GWY|f4*p_-PwOO+hB_G0jIvGY8NLd>~hWOfQVH@Ao4qfGOUjIGvEXPa^5vm+39%1Ui5nDk0kK2DZ$`3@W6PmUBb>g-DzuG}CBqCl*To zJU~yJ+V9d%YmXpt>lZuFUTXj48Pqa`c}4o!@F zy9!V8A&>@t9z%TNd6$9TsM>qI=AH@gNA-6fWBY;g?_cjT=$}cF0RG2>=g&DzYFhP< zQU&V6jpit`lbbW$-Wz{}lKbp@_YJS@pfxgmgY?D>Yw?bMjtd_U%ur6$gXE_NSuFkO zD3h_^h0u@117hp+D|9tjJCPSd-M|K-vmYGfZcQ~^Vo^~P*@qy+S)KVnT5DUepd49! z_B%8MKN0>^*H`9DjdZA7gb0Mk)g^V{MKonF@~Pq$DXH;~bpbK;t=y@{pAq!!UkPRx zQGwx-#9_y7=WGRuv#CKtY1&~yi_HLCL1gMqW?97th0^7i>W%s|Pd%?(->hm_Ur`+% zx>`BC7e81NeAS<$qlM_!B9x0;IVOW)vQRQ|a}6IaQ(5)jDXK&U(mn%(p6hHf?*Y$_ zAl+k1>(RsPO=Ogq(3qhvSA%8-Pt~6UqJ1Yi*(8KA07nd0IZQ6TG!hk%;T#AVh+U0~ zlF)cLE;Dg7Upq(#rG=e12)wGd-=!d&pz0N`tq)po_crkRXvj;U3)D>Qh@&nT)9LI~ z$rgjF?KG_OIKR}CtP4<)q)bXfA6!MQSs@ydUnC9u(1p&M`Yc5Z!r*NcvA7E1x<3Gb z9ESW(2qyQPva>e?&X&b9)HG)%j-iDSa0J$1^T z#E^O1vp-dI9KHaoC~SC)1LC7*Nu8^ja2b#d0|N&o#$DZ*Rv{>+ zT5mRO=Pq?p@%dghZeBio+&)XTULMKR^xduSD6!N@MhfsKiAq&MbHHd5zi;Jls~VXY z?QKgdT<3b=Jk_-_rrz6giSFOWLA0D#C{z1uUag<%svvhPdTj!t+6zp>Bx&jBYIVLF zAPHu5o5zQoq}qYtJF+#xv&JC$wPvHRh`GfIK7x<62O`>@)j&v(k~7;_CQGDxzMj|19YR;W(?3(bW2RuK05 z<^Z|vVXV!|$JdfS4%ofv1OPPtNq`Vo=t7V@CVXCL#HM9K8M}jk{|G@pR_-po7K2cN z*8---(YW0$R>M&C+v&qel#loO*XP_7^)>s2Y%dk|KLERJZ?$X?WutN6MSOCE&~mD) zYpkGC)pei$8l$!QI@tD9=0y{*rRu_Zg%A(O+eIqE!T;CubsbLkGeeZ~x#KK8Cw1Wm zW)h{3fOsw9;1cmwuM6}Nx?Td`2f3Lr0chwF#82d)%=sb=wbWzhe3G)^`N6Km`Zl~W z9me3sRc5dmp&~MGh)ROpOLjGu?OXiPWTwJ&K_*I31rW$z8Bl|MQM_?#gw`3jd0^i3 z%LAD2_cI~j-s7tnHfg#E3_@rfO@e?%jioW??o1-BHkM3}0O4PMJ&L30-x5#`4{-ZD zbNQ9c=N2y3D63AuK${JRm${^R-so-VZz)%=naF%8R=JN#N7_h`BQ}XUL-s|1Ai?nD zZ05D{t`K;8#0A>KM52qP?dRU@6^kze@aIFKoU7kw@W{tfz4P_f2cTu(jzF2B3JD35 zMB6}*(>QLsT0B_Qe;EIriN^0jpwQ07-+d1Bq?_IQK9_vgMN_&gDNB!pNr#In&bl)o zZ5^NU(lI_e5jihIaT`lhQ-`Ulkk*f7F{0f!UXvJ>w>s_ViFkesZ7m}$yNt+NR0UJ=fxIX()J4(FAuV)H>G>HLi zSg^LRs;)Ja7{@lE>g9eR=>S*4&2UuuRzy*aA39awo z{RZy}Z@w!QQ7i6ISvTN)bOB@`LZC$appF{$Bbvc2_7OXY?UcQ2)=DNKkVz0xdbM!* zaTXxdF8~Th2+*?o;gfWkdc<> zr2j^P;mUn}Ue`@|m$+Y_@_)ow`^NGJmD(Vc^7tRQg6M}(r$=9?d04*hgXW$2T^)gV zTA@GZ|K5&3#BPjXSX;~BdpZ)hi-9hvVVs<*g~u$iMIM7?LUdvCL-E7%tD@=m1dNEE z&OsFzn$*+7#bp5pp-1ppq`;o{ku#)@94bI(qV!fLnZ-Ad$TL^r$|Dkb5hVtR4b)JH z>nHCJ#dEVP+YK7DgbW}Y468uG<>Zlvh$n6jhVwuRK|BFkaNeWu!_RClC{359YEUtn zS-NW{R>CpOklwG{AP5`$VNW^TCtLSLUk-EN&)9XW*!eevMK#O>h<437eHsKu6<(9NYr@< zW!=d^gHJr1K{341v8%4!DjvGR z7S^e_i1*vk;vIm8!*}?)yp8(JTdK*Z-Fo0=;&J{erM z1UR8(Snn2QMgvEtI7-J9pQ>_8x>HEm>ryZ>R>-sRS?BC=J(T`t>Q@DITJ{j3vflUr zCXnwK=4#*XzfP1gJb$*o733%sQ?OpJVd@UH4Hslo$*{u)LF72_#S#ABH*Ct+=?uW` zyo5x=kl_#Dia2u$J{qJw=S8|PRm*A-db^_&Yv+a0B-A$Q#l? zr0ZaVswc^~Bb3o=$0b$Zjb#!T#AZ#1{2j+$L=Yp%dHpzK=uR((O9Hpegg@jR;=`qKZ+_R_AE zZ}87SJ0Irv*MU`}T9sXbT%DzKCZlIA zm@$Eb%ah12N_l;Bswlsaq1+iRYnL%0230+$wsbe#rnMAg;2`x|VdGta_HZH3v0ndI z4t6+H`3$oTZ*N(j^e;h5G!)VG#gF!hm|*AGJr>MmFHKVJ{2WBcN6w1vnl4B0V3r9U zG_W9BJ@{!cq(hZ=d>-P`h}oov13)qHDu@{plOZsAR!SZe5>3t0=`2HO&1(d|(i}^? z3ILKnk3E2sO;B^ajJS8YY?vtiX93>X9~UCWTjaXlSc=kF^|w$Ck(OM|a6^N@ja za3(1b@`Y(gwfp%;=gq6-iXl`&&;9cQ|JUNq3lgCK^enTS-TaJXJfWy~S=$^)>7y$o z`22}h4}6b?Ugx;y4iCuC6@-6}qKZ~CRJVAS{T35&L9U%wUN&mftQ=3#S|0T|=)RXB zipzLd8`9DN+JP96*#3ImROekYbV6F)FrvGo4W&x^U!>=EZQA@8xq4Ntk07)@D6{d(vQj-)A z^=vIoEsbe14a$bJ;<10eO|>I=QeCJlKb&KuI{RXMf9;`8ocQc0WRBzb==H#zV+JKdM#br3RENLigrjcVv6m# zk3R6jYXzk~y+k3q_;g%%Iz9YhliI~&=v?rJ*9K6s(SOv=PB0*)i=`D9T8@!rnY%9~ zM15#W)p{(ryRVxJgWPrwF5tR30d0Xl1B6X}bF$lL^@P*%zF{NLU1n$MX;%w_RxbU3 zZ0k#^Sh^myteNTEypLcW6ilzl*t>9(x&reLtcuw-E_ownPv1vHwki_QMrMNnr{4^L z`Be9dbO*c_#Wyx?FUeUy8)=L{F4v8|ij-e9ZDSEQl$^^OAlgCh;4@6+`0S4KbX%62 zcE6?$P_=MrX6` z^(;*wlM_D%qQDnmYIQFfpNy|Q+_Oir2_*}YzYD8vei4m`mS??K;}J5a5isS;Z|KOG z*GMA7gtx?}AOKu!jeAip+hRlz0;_)!p4_KhwMXjD7}9WOZ|a5oCja&>;=bW zopGlLrg7k)iSVmSUp+ERRq)My`#sF9eVr{YJn1V6Qw)!9Dd7y+cQnk}>%c5N_h%VL z-tJ%&<6N#pjqWg&ev;(6)HABQY?=)N5$US$0P?Nl?Yi#Y8j_sCytJ4u$zW*K2mky1 zrnV3l9%92vfcit1wR*1cPzI8fY2aE$h-FS+-&D&`^GWw)-^zpNuKnE0DrjqTKd8?^ z-{ba^_qM8Hd{rTj$Ym-3Z?T_$M=^h{vb+Q zodBj<8Z0jDYPwSqCLWQ!>VJPM z2~xnE(9#zUB>&L&UhIo1Sp|>E&M5V4(Y37qO;%Vl3FFEFH>ht z+ySO?*Wiv-HCZ6?bM6FguwIwW&Ztx54f)WS?S?42u=>()RuDVTK)Xl%*$$k;hfDKW zRne56przSu{@SHP>dkWi=Doe?&*Dj(@~pC=>3r>*ndXh#>g3U^>`1Z6aGlm{Ypgh% zpnz4t9+`FMJxi*zp*SI=FeR)nMHcbR?#9zU0=GG3QJypoO464VypFwZYu&}ach?M` z_m>1r2yv4Aww@0^6P3dX?hNq>`GEm*j+Gw_vEs^h_JDVoY>z`soxhKg_*x$DUr!xd z11}DK9!Hp)h)E+qYYxl01KCWsA4sS;{+=EZc3;0IFufpmRDc?5>j5p%8(OB%`C!B` znIW43%Ma5}7aWcG@rCMUd)B#A?GS|nnLwOBs?>5mTJKzoDI_c%i40j#Wgfbl!Pa$Z zl}ipy6`$&5hU{j`qz5J?GN(C$@Eo8Y5o5O?_Meob7XcIC*B(L*P{V}8hQLTMBiQRe z_zSRu#9_I#I}7>i3fbnQLsOoti(~J2uR>U7X|o?Dy8W{eKROgg9*HC6Wv5g;r8`vaK;g;XEa{{ zckO1L>U8&77D2mBRxx?fQ{Q5e;v?uWJ?~Mu7t%Cq8Qi-6W--`%9Y~ivEMOE$&p)N{ zQde%utB(pgT1?Pk22!E|FBFmrJhfa$tRo$BJG4CvTZRl-sdqf6AKcJt@x@ADNIoX| zI)Kx*AQ~hV0w)^`#;e10KS@>A@pj4M79-8a*D$Q2sI|`c~N2I$0 zoXeafwLv^&^lu|N7v5MChRMt{>#8F>WY-yUgWzr~cMseRgQtxhM&@XX(@zH3NV$)kjsiNy zr}RBMHG!-IBV(ezt~j+L9)RR`8s81dB#==ki3rA*v=m;fJx-XvbAW!r<~2L4G-G=gT5qD<|*3&IomXrWGy63*quoY%8cELV_$a0hiVW zk)eyHzjNJS*B(@>ms2>hBep8Y0z7K4-jSYH81~q{;BYMT)IW$qD&SvYI>8_RVp4a{ z%$~vbL5JCd_LN}Hl|c`u(0iP7}+vrx7lr#wgV8sgbgMy400V$oG8pKG22Bo zd)?r|tH{MDJWvIkm^nSvd@R;n;rM-gTH21rY_*g9Rx9))lB*rtKI5p~-9en#~uyF7pv> zB#@+qR;L)dzivw>Pa&rNrbJTWwC8Jb#DysN=#6b_V1~fe=RQemYT9{_C%lP)Xd(F$ zaZ`aJff>3g7Q#g~Nh2inqYvoC8Y9a%O!WBmUV0Mgc#RbjGdB@mPlwK52MF)+?(CMwrJ4w;J|4)WNguV^Q zB#0GBCeOro(r-;*7RxWo`?khQnf~IR5{z+V9M zAjT6&0a=D0t + + 时间戳 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/memory/debug.svg b/web/src/assets/images/memory/debug.svg new file mode 100644 index 00000000..325a355a --- /dev/null +++ b/web/src/assets/images/memory/debug.svg @@ -0,0 +1,15 @@ + + + 配置管理 + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/userMemory/aboutUs.svg b/web/src/assets/images/userMemory/aboutUs.svg index 1d75eeae..b8fa9e45 100644 --- a/web/src/assets/images/userMemory/aboutUs.svg +++ b/web/src/assets/images/userMemory/aboutUs.svg @@ -1,13 +1,15 @@ - + - - - - - - - + + + + + + + + + diff --git a/web/src/assets/images/userMemory/ai.png b/web/src/assets/images/userMemory/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..3783a5436736da0e92bf5c19a27081878ca1ec33 GIT binary patch literal 6364 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 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/userMemory/memoryInsight.svg b/web/src/assets/images/userMemory/memoryInsight.svg index bee9cafe..7dfa3dcf 100644 --- a/web/src/assets/images/userMemory/memoryInsight.svg +++ b/web/src/assets/images/userMemory/memoryInsight.svg @@ -1,12 +1,29 @@ - - 热点洞察 - - - - - - + + 编组 26 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/assets/images/userMemory/user.png b/web/src/assets/images/userMemory/user.png new file mode 100644 index 0000000000000000000000000000000000000000..671ab044749638e6623b985464c17c7ec5888277 GIT binary patch literal 7990 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 void; + /** Optional extra class name for the container */ + className?: string; +} + +/** Button-style tab switcher — renders tabs as pill-shaped buttons with active highlight */ +const BtnTabs: FC = ({ items, activeKey, onChange, className }) => { + return ( + + {items.map((tab) => ( +
onChange(tab.key)} + className={clsx('rb:px-2 rb:py-1 rb:rounded-[13px] rb:text-[12px] rb:leading-4.5 rb:cursor-pointer', { + 'rb:bg-[#F6F6F6]': activeKey !== tab.key, + 'rb:bg-[#171719] rb:text-white': activeKey === tab.key, + })} + > + {tab.label} +
+ ))} + + ) +} + +export default BtnTabs diff --git a/web/src/components/ModelSelect/index.tsx b/web/src/components/ModelSelect/index.tsx index e5fc280a..a71e9703 100644 --- a/web/src/components/ModelSelect/index.tsx +++ b/web/src/components/ModelSelect/index.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-03-07 16:49:59 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-07 17:14:57 + * @Last Modified time: 2026-03-18 10:12:23 */ import { useEffect, useState, type FC } from 'react'; import { Select, Flex, Space } from 'antd'; @@ -19,11 +19,13 @@ interface ModelSelectProps extends SelectProps { /** Extra query params passed to getModelList */ params?: Query; placeholder?: string; + fontClassName?: string; } const ModelSelect: FC = ({ params, placeholder, + fontClassName, ...props }) => { const { t } = useTranslation(); @@ -48,7 +50,7 @@ const ModelSelect: FC = ({ return ( {logo && } -
{item.name}
+
{item.name}
); }; diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index b4ce3681..f8f9f59c 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -1548,7 +1548,7 @@ export const en = { Meaning: 'Meaning', exampleMemoryExtractionResults: 'Example Memory Extraction Results', - exampleMemoryExtractionResultsSubTitle: '(from a technology conference)', + exampleMemoryExtractionResultsSubTitle: 'from a technology conference', extractTheNumberOfEntities: 'Extract the number of entities', extractTheNumberOfEntitiesDesc: 'Merge after deduplication: {{num}} (exact: {{exact}}, fuzzy: {{fuzzy}}, LLM: {{llm}})', @@ -1670,7 +1670,12 @@ Memory Bear: After the rebellion, regional warlordism intensified for several re disagreementCase: 'Disagreement Case', Pruned: 'Pruned', pruning: 'Pruning', - pruning_desc: 'Text pruning {{count}} fragments' + pruning_desc: 'Text pruning {{count}} fragments', + + processData: 'Process Data', + finalResult: 'Final Result', + chunking: 'Chunking', + dataStatistics: 'Data Statistics', }, memoryConversation: { searchPlaceholder: 'Enter user ID...', diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index 0eda80e4..ab0896cf 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -1546,7 +1546,7 @@ export const zh = { Meaning: '含义', exampleMemoryExtractionResults: '示例记忆提取结果', - exampleMemoryExtractionResultsSubTitle: '(来自技术会议)', + exampleMemoryExtractionResultsSubTitle: '来自技术会议', extractTheNumberOfEntities: '提取实体数量', extractTheNumberOfEntitiesDesc: '去重后合并:{{num}}(精确:{{exact}},模糊:{{fuzzy}},LLM:{{llm}})', @@ -1666,7 +1666,12 @@ export const zh = { disagreementCase: '不一致案例', Pruned: '已剪枝', pruning: '剪枝', - pruning_desc: '文本剪枝{{count}}个片段' + pruning_desc: '文本剪枝{{count}}个片段', + + processData: '处理数据', + finalResult: '最终结果', + chunking: '分块', + dataStatistics: '数据统计', }, memoryConversation: { chatEmpty:'有什么我可以帮您的吗?', diff --git a/web/src/views/ForgettingEngine/components/LineChart.tsx b/web/src/views/ForgettingEngine/components/LineChart.tsx index af36603a..aceb8434 100644 --- a/web/src/views/ForgettingEngine/components/LineChart.tsx +++ b/web/src/views/ForgettingEngine/components/LineChart.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 17:00:20 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-04 10:03:35 + * @Last Modified time: 2026-03-16 15:43:42 */ /** * Line Chart Component @@ -84,7 +84,7 @@ const SeriesConfig = { /** * Chart color palette */ -const Colors = ['#155EEF', '#4DA8FF', '#FFB048'] +const Colors = ['#155EEF', '#4DA8FF', '#369F21'] /** @@ -228,8 +228,8 @@ const LineChart: FC = ({ config }) => { grid: { left: 4, right: '2%', - bottom: 60, - top: 32, + bottom: 48, + top: 8, containLabel: true }, xAxis: { @@ -243,7 +243,7 @@ const LineChart: FC = ({ config }) => { show: true, }, axisTick: { - show: true + show: false }, axisLabel: { color: '#5B6167' @@ -268,7 +268,7 @@ const LineChart: FC = ({ config }) => { ...initialData || [] ] }} - style={{ height: '450px', width: '100%' }} + style={{ height: '400px', width: '100%' }} opts={{ renderer: 'canvas' }} notMerge={true} lazyUpdate={true} diff --git a/web/src/views/ForgettingEngine/index.tsx b/web/src/views/ForgettingEngine/index.tsx index 7a4d94fe..ccfa7769 100644 --- a/web/src/views/ForgettingEngine/index.tsx +++ b/web/src/views/ForgettingEngine/index.tsx @@ -1,8 +1,8 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 17:00:12 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-03 17:00:12 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-16 15:41:54 */ /** * Forgetting Engine Configuration Page @@ -11,16 +11,17 @@ */ import React, { useState, useEffect } from 'react'; -import { Row, Col, Form, Slider, Button, Space, message } from 'antd'; +import { Row, Col, Form, Button, Space, message, Flex, Tooltip } from 'antd'; import { useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import RbCard from '@/components/RbCard/Card'; -import strategyImpactSimulator from '@/assets/images/memory/strategyImpactSimulator.svg' import LineChart from './components/LineChart' import { getMemoryForgetConfig, updateMemoryForgetConfig } from '@/api/memory' import type { ConfigForm } from './types' import SwitchFormItem from '@/components/FormItem/SwitchFormItem' +import RbSlider from '@/components/RbSlider'; +import DescWrapper from '@/components/FormItem/DescWrapper' /** * Configuration field definitions @@ -154,16 +155,18 @@ const ForgettingEngine: React.FC = () => { } return ( - - - - - {t('forgettingEngine.forgettingEngineConfigParams')} - - } - className='rb:h-full!' + + + + + + } + headerType="borderless" + headerClassName="rb:min-h-[54px]! rb:font-[MiSans-Bold] rb:font-bold" + className="rb:h-[calc(100vh-76px)]!" + bodyClassName="rb:h-[calc(100%-54px)] rb:overflow-y-auto! rb:p-3! rb:pt-0!" >
{ lambda_mem: 0.03, }} > - + {configList.map(config => { if (config.type === 'button') { return ( @@ -182,51 +185,53 @@ const ForgettingEngine: React.FC = () => { title={t(`forgettingEngine.${config.key}`)} name={config.name} desc={config.type && {t(`forgettingEngine.type`)}: {config.type}} - className="rb:mb-2" + className="rb:bg-[#F6F6F6] rb:rounded-xl rb:p-3!" /> ) } return ( -
-
+
+ {t(`forgettingEngine.${config.key}`)} -
- {!config.hiddenDesc &&
- {t(`forgettingEngine.${config.key}Desc`)} -
} + {!config.hiddenDesc && +
+
} + + {t(`forgettingEngine.range`)}: {config.range?.join('-')} | {t(`forgettingEngine.type`)}: {config.type} + } + />} + className="rb:mb-0!" > {config.type === 'decimal' - ? + ? {t('emotionEngine.currentValue')}:} + inputClassName="rb:w-[155px]!" + /> : null } -
- - {config.range && {t(`forgettingEngine.range`)}: {config.range?.join('-')}} - {config.type && {t(`forgettingEngine.type`)}: {config.type}} - - <>{t('forgettingEngine.CurrentValue')}: {values?.[config.name] || 0} -
) })} - - - - - - - - - + - + = ({ @@ -41,27 +41,33 @@ const Card: FC = ({ className, headerClassName, bodyClassName, + extra, }) => { - const { t } = useTranslation() return ( handleExpand(type)} - > - {expanded ? t('common.foldUp') : t('common.expanded')} - handleExpand(type) : undefined} + > + + {title} + {subTitle && +
+
} +
+ {handleExpand &&
-
- )} + })} + >
} +
} + headerType="borderless" className={className} - headerClassName={headerClassName} - bodyClassName={bodyClassName} + headerClassName={`rb:h-[50px]! rb:pb-[12px]! rb:pt-[16px]! rb:leading-[22px]! rb:font-[MiSans-Bold] rb:font-bold rb:text-[16px] ${headerClassName}`} + bodyClassName={`rb:px-3! rb:py-0! ${expanded ? 'rb:pb-3!' : 'rb:pb-0!'} ${bodyClassName}`} + extra={extra} > {(expanded || !(type && handleExpand)) && children}
diff --git a/web/src/views/MemoryExtractionEngine/components/Result.tsx b/web/src/views/MemoryExtractionEngine/components/Result.tsx index 6504f571..3c39bcc1 100644 --- a/web/src/views/MemoryExtractionEngine/components/Result.tsx +++ b/web/src/views/MemoryExtractionEngine/components/Result.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 17:30:11 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-02 11:41:12 + * @Last Modified time: 2026-03-19 14:22:20 */ /** * Result Component @@ -13,13 +13,13 @@ import { type FC, useState } from 'react' import { useParams } from 'react-router-dom' import { useTranslation } from 'react-i18next' -import { Space, Button, Progress, Form, Input } from 'antd' -import { ExclamationCircleFilled, CheckCircleFilled, ClockCircleOutlined, LoadingOutlined } from '@ant-design/icons' +import { Space, Button, Progress, Form, Input, Flex } from 'antd' +import { ExclamationCircleFilled, LoadingOutlined } from '@ant-design/icons' import clsx from 'clsx' +import ResultCard from './ResultCard' import type { AnyObject } from 'antd/es/_util/type'; import Card from './Card' -import RbCard from '@/components/RbCard/Card' import RbAlert from '@/components/RbAlert' import type { TestResult, OntologyCoverage } from '../types' import { pilotRunMemoryExtractionConfig } from '@/api/memory' @@ -27,6 +27,8 @@ import { type SSEMessage } from '@/utils/stream' import Tag, { type TagProps } from '@/components/Tag' import Markdown from '@/components/Markdown' import { groupDataByType } from '../constant' +import Empty from '@/components/Empty' +import NoDataIcon from '@/assets/images/empty/noData.png' /** Result metric mapping */ const resultObj = { @@ -56,7 +58,7 @@ interface ModuleItem { const tagColors: { [key: string]: TagProps['color'] } = { - pending: 'default', + pending: 'warning', processing: 'processing', completed: 'success', failed: 'error' @@ -67,29 +69,55 @@ const initObj = { status: 'pending', result: null } +const initialExpanded = { + text_preprocessing: false, + knowledge_extraction: false, + creating_nodes_edges: false, + deduplication: false, + dataStatistics: false, + entityDeduplicationImpact: false, + disambiguation: false, + coreEntities: false, + triplet_samples: false, + ontologyCoverage: false, +} const Result: FC = ({ loading, handleSave }) => { const { t } = useTranslation(); const { id } = useParams() const [runLoading, setRunLoading] = useState(false) + const [activeTab, setActiveTab] = useState('processData') const [testResult, setTestResult] = useState({} as TestResult) - + const [coreEntitiesTab, setCoreEntitiesTab] = useState(null) const [textPreprocessing, setTextPreprocessing] = useState(initObj as ModuleItem) + const [textPreprocessingTab, setTextPreprocessingTab] = useState('chunking') const [knowledgeExtraction, setKnowledgeExtraction] = useState(initObj as ModuleItem) const [creatingNodesEdges, setCreatingNodesEdges] = useState(initObj as ModuleItem) const [deduplication, setDeduplication] = useState(initObj as ModuleItem) const [ontologyCoverage, setOntologyCoverage] = useState({} as OntologyCoverage) + const [expandedCards, setExpandedCards] = useState>(initialExpanded) + const toggleCard = (key: string) => { + console.log('toggleCard', key) + setExpandedCards(prev => ({ ...prev, [key]: !prev[key] })) + } + console.log('expandedCards', expandedCards) + const [runForm] = Form.useForm() + const customText = Form.useWatch(['custom_text'], runForm) /** Run pilot test */ const handleRun = () => { if(!id) return + setActiveTab('processData') + setCoreEntitiesTab(null) setTextPreprocessing({...initObj} as ModuleItem) + setTextPreprocessingTab('chunking') setKnowledgeExtraction({...initObj} as ModuleItem) setCreatingNodesEdges({...initObj} as ModuleItem) setDeduplication({...initObj} as ModuleItem) setTestResult({} as TestResult) + setExpandedCards(initialExpanded) const handleStreamMessage = (list: SSEMessage[]) => { list.forEach((data: AnyObject) => { @@ -100,6 +128,7 @@ const Result: FC = ({ loading, handleSave }) => { status: 'processing', start_at: data.data.time })) + toggleCard('text_preprocessing') break case 'text_preprocessing_result': // Text preprocessing in progress setTextPreprocessing(prev => ({ @@ -121,6 +150,7 @@ const Result: FC = ({ loading, handleSave }) => { status: 'processing', start_at: data.data.time })) + toggleCard('knowledge_extraction') break case 'knowledge_extraction_result': // Knowledge extraction in progress setKnowledgeExtraction(prev => ({ @@ -142,6 +172,7 @@ const Result: FC = ({ loading, handleSave }) => { status: 'processing', start_at: data.data.time })) + toggleCard('creating_nodes_edges') break case 'creating_nodes_edges_result': // Creating nodes and edges in progress setCreatingNodesEdges(prev => ({ @@ -163,6 +194,7 @@ const Result: FC = ({ loading, handleSave }) => { status: 'processing', start_at: data.data.time })) + toggleCard('deduplication') break case 'dedup_disambiguation_result': // Deduplication and disambiguation in progress setDeduplication(prev => ({ @@ -183,6 +215,15 @@ const Result: FC = ({ loading, handleSave }) => { case 'result': // Result setTestResult(data.data?.extracted_result) setOntologyCoverage(data.data?.ontology_coverage) + setExpandedCards(prev => ({ + ...prev, + dataStatistics: true, + entityDeduplicationImpact: true, + disambiguation: true, + coreEntities: true, + triplet_samples: true, + ontologyCoverage: true, + })) break } }) @@ -203,9 +244,10 @@ const Result: FC = ({ loading, handleSave }) => { /** Format status tag */ const formatTag = (status: string) => { return ( - - {status === 'pending' && } + + {status === 'pending' &&
} {status === 'processing' && } + {status === 'completed' &&
} {t(`memoryExtractionEngine.status.${status}`)}
) @@ -213,294 +255,411 @@ const Result: FC = ({ loading, handleSave }) => { /** Format processing time */ const formatTime = (data: ModuleItem, color?: string) => { if (typeof data.end_at === 'number' && typeof data.start_at === 'number') { - return
{t('memoryExtractionEngine.time')}{data.end_at - data.start_at}ms
+ return
{t('memoryExtractionEngine.time')}{data.end_at - data.start_at}ms
} return null } /** Convert first character to lowercase */ const lowercaseFirst = (str: string) => str.charAt(0).toLowerCase() + str.slice(1) + return ( + + + } > -
+ {/* } className="rb:mb-3!"> + {t('memoryExtractionEngine.warning')} + */} + + +
{t('memoryExtractionEngine.custom_text')}
+
{customText?.length || 0}
+
- +
-
- {runLoading - ? <> - } className="rb:mb-3.5"> + + {runLoading + ? <> + +
{t('memoryExtractionEngine.processing')} - - {/* Overall Progress */} -
-
- {t('memoryExtractionEngine.overallProgress')} - {`${completedNum}/4`} -
- + + {/* Overall Progress */} + + +
+ {t('memoryExtractionEngine.overallProgress')}{`${(completedNum*100/4).toFixed(0)}%`} +
+
- - : !testResult || Object.keys(testResult).length === 0 - ? } className="rb:mb-3.5"> - {t('memoryExtractionEngine.warning')} - - : } className="rb:mb-3.5"> - {t('memoryExtractionEngine.success')} - - } - - {/* Text Preprocessing */} - - {textPreprocessing.data.map((vo, index) => { - if (vo.deleted_messages) { - return
-
{t('memoryExtractionEngine.Pruned')}
- {vo.deleted_messages.map((msg: any, idx: number) => ( -
- -
- ))} -
- } - return ( -
- -
- ) + + + : !testResult || Object.keys(testResult).length === 0 + ? }> + {t('memoryExtractionEngine.warning')} + + :
}> + {t('memoryExtractionEngine.success')} +
+ } + + + {['processData', 'finalResult'].map(tab => ( +
} className="rb:mt-3"> + onClick={() => setActiveTab(tab)} + >{t(`memoryExtractionEngine.${tab}`)}
+ ))} +
+ + {activeTab === 'processData' && + {/* Text Preprocessing */} + toggleCard('text_preprocessing')} + > + {expandedCards['text_preprocessing'] && textPreprocessing.data?.length > 0 && + + {(['chunking', ...(textPreprocessing.data.some(vo => vo.deleted_messages) ? ['pruning'] : [])] as string[]).map(type => ( +
setTextPreprocessingTab(type)} + > + {t(`memoryExtractionEngine.${type}`)} +
+ ))} +
+ } + {expandedCards['text_preprocessing'] && textPreprocessing.result && + +
+
{formatTime(textPreprocessing)}
{t('memoryExtractionEngine.pruning_desc', { count: textPreprocessing.result.pruning.deleted_count || 0 })}, {t('memoryExtractionEngine.text_preprocessing_desc', { count: textPreprocessing.result.total_chunks })}, {t('memoryExtractionEngine.chunkerStrategy')}: {t(`memoryExtractionEngine.${lowercaseFirst(textPreprocessing.result.chunker_strategy)}`)} - - } - - {/* Knowledge Extraction */} - - {knowledgeExtraction.data.map((vo, index) => -
{vo.statement}
- )} - {formatTime(knowledgeExtraction)} - {knowledgeExtraction.result && } className="rb:mt-3"> - {t('memoryExtractionEngine.knowledge_extraction_desc', { - entities: knowledgeExtraction.result.entities_count, - statements: knowledgeExtraction.result.statements_count, - temporal_ranges_count: knowledgeExtraction.result.temporal_ranges_count, - triplets: knowledgeExtraction.result.triplets_count - })} - } -
- {/* Creating Entity Relationships */} - - {creatingNodesEdges.data?.map((vo, index) => ( -
- {vo?.result_type === 'entity_nodes_creation' - ? <>{vo.type_display_name}: {vo.entity_names.join(', ')} - : <>{vo?.relationship_text} - }
- ))} - {formatTime(creatingNodesEdges, '#9C6FFF')} - {creatingNodesEdges.result && } className="rb:mt-3"> - {t('memoryExtractionEngine.creating_nodes_edges_desc', {num: creatingNodesEdges.result.entity_entity_edges_count})} - } -
- {/* Deduplication and Disambiguation */} - - {Object.keys(deduplicationData).length > 0 && Object.keys(deduplicationData).map(key => { - return deduplicationData[key].map((vo, index) => ( -
- {vo.message} -
- )) - })} - {formatTime(deduplication, '#9C6FFF')} - {deduplication.result && } className="rb:mt-3"> - {t('memoryExtractionEngine.deduplication_desc', { count: deduplication.result.summary.total_merges })}
-
} -
- - {testResult && Object.keys(testResult).length > 0 && resultObj && Object.keys(resultObj).length > 0 && - -
- {Object.keys(resultObj).map((key, index) => { - const keys = (resultObj as Record)[key].split('.') - return ( -
-
{(testResult?.[keys[0] as keyof TestResult] as any)?.[keys[1]]}
-
{t(`memoryExtractionEngine.${key}`)}
-
- {key === 'extractTheNumberOfEntities' && testResult.dedup - ? t(`memoryExtractionEngine.${key}Desc`, { - num: testResult.dedup.total_merged_count, - exact: testResult.dedup.breakdown.exact, - fuzzy: testResult.dedup.breakdown.fuzzy, - llm: testResult.dedup.breakdown.llm, - }) - : key === 'numberOfEntityDisambiguation' && testResult.disambiguation - ? t(`memoryExtractionEngine.${key}Desc`, { num: testResult.disambiguation.effects?.length, block_count: testResult.disambiguation.block_count }) - : key === 'numberOfRelationalTriples' && testResult.triplets - ? t(`memoryExtractionEngine.${key}Desc`, { num: testResult.triplets.count }) - :t(`memoryExtractionEngine.${key}Desc`) - } -
-
- )})} -
-
+ } - - {testResult?.dedup?.impact && testResult.dedup.impact?.length > 0 && - -
{t('memoryExtractionEngine.identifyDuplicates')}
- {testResult.dedup.impact.map((item, index) => ( -
- -{t('memoryExtractionEngine.identifyDuplicatesDesc', { ...item })} + {expandedCards['text_preprocessing'] && textPreprocessing.data.map((vo, index) => { + if (vo.deleted_messages && textPreprocessingTab === 'pruning') { + return
+
{t('memoryExtractionEngine.Pruned')}
+ {vo.deleted_messages.map((msg: any, idx: number) => ( +
+
-{t('memoryExtractionEngine.pruning')}{idx}:
+ +
+ ))} +
+ } + if (textPreprocessingTab === 'chunking') { + return ( +
+
-{t('memoryExtractionEngine.fragment')}{vo.chunk_index}:
+
- ))} + ) + } + return null + })} + + {/* Knowledge Extraction */} + toggleCard('knowledge_extraction')} + > + {knowledgeExtraction.result && + +
+
{formatTime(knowledgeExtraction)}
+ {t('memoryExtractionEngine.knowledge_extraction_desc', { + entities: knowledgeExtraction.result.entities_count, + statements: knowledgeExtraction.result.statements_count, + temporal_ranges_count: knowledgeExtraction.result.temporal_ranges_count, + triplets: knowledgeExtraction.result.triplets_count + })} +
+
+ } + {knowledgeExtraction.data?.length > 0 && +
    + {knowledgeExtraction.data.map((vo, index) => +
  • {vo.statement}
  • + )} +
+ } +
+ {/* Creating Entity Relationships */} + toggleCard('creating_nodes_edges')} + > + {creatingNodesEdges.result && + +
+
{formatTime(creatingNodesEdges)}
+ {t('memoryExtractionEngine.creating_nodes_edges_desc', { num: creatingNodesEdges.result.entity_entity_edges_count })} +
+
+ } + {creatingNodesEdges.data?.length > 0 && +
    + {creatingNodesEdges.data.map((vo, index) => +
  • + {vo?.result_type === 'entity_nodes_creation' + ? <>{vo.type_display_name}: {vo.entity_names.join(', ')} + : <>{vo?.relationship_text} + } +
  • + )} +
+ } +
+ {/* Deduplication and Disambiguation */} + toggleCard('deduplication')} + > + {deduplication.result && + +
+
{formatTime(deduplication)}
+ {t('memoryExtractionEngine.deduplication_desc', { count: deduplication.result.summary.total_merges })} +
+
+ } + {Object.keys(deduplicationData).length > 0 && +
    + {Object.keys(deduplicationData).map(key => { + return deduplicationData[key].map((vo, index) => ( +
  • + {vo.message} +
  • + )) + })} +
+ } +
+ } - } className="rb:mt-3"> + {activeTab === 'finalResult' && + {!testResult || Object.keys(testResult).length === 0 + ? + : null + } + + {testResult && Object.keys(testResult).length > 0 && resultObj && Object.keys(resultObj).length > 0 && + toggleCard('dataStatistics')} + > +
+ {Object.keys(resultObj).map((key, index) => { + const keys = (resultObj as Record)[key].split('.') + return ( +
+
{(testResult?.[keys[0] as keyof TestResult] as any)?.[keys[1]]}
+
{t(`memoryExtractionEngine.${key}`)}
+
+ {key === 'extractTheNumberOfEntities' && testResult.dedup + ? t(`memoryExtractionEngine.${key}Desc`, { + num: testResult.dedup.total_merged_count, + exact: testResult.dedup.breakdown.exact, + fuzzy: testResult.dedup.breakdown.fuzzy, + llm: testResult.dedup.breakdown.llm, + }) + : key === 'numberOfEntityDisambiguation' && testResult.disambiguation + ? t(`memoryExtractionEngine.${key}Desc`, { num: testResult.disambiguation.effects?.length, block_count: testResult.disambiguation.block_count }) + : key === 'numberOfRelationalTriples' && testResult.triplets + ? t(`memoryExtractionEngine.${key}Desc`, { num: testResult.triplets.count }) + : t(`memoryExtractionEngine.${key}Desc`) + } +
+
+ ) + })} +
+
+ } + + {testResult?.dedup?.impact && testResult.dedup.impact?.length > 0 && + toggleCard('entityDeduplicationImpact')} + > +
+ {t('memoryExtractionEngine.entityDeduplicationImpactDesc', { count: testResult.dedup.impact.length })} - - } +
{t('memoryExtractionEngine.identifyDuplicates')}:
- {testResult?.disambiguation && testResult.disambiguation?.effects?.length > 0 && - +
    + {testResult.dedup.impact.map((item, index) => ( +
  • + {t('memoryExtractionEngine.identifyDuplicatesDesc', { ...item })} +
  • + ))} +
+
+
+ } + + {testResult?.disambiguation && testResult.disambiguation?.effects?.length > 0 && + toggleCard('disambiguation')} + > +
+ + {t('memoryExtractionEngine.entityDeduplicationImpactDesc', { count: testResult.dedup.impact.length })} + {testResult.disambiguation.effects.map((item, index) => (
0, + 'rb:mt-5': index > 0, })}> -
{t('memoryExtractionEngine.disagreementCase')} {index +1}:
- -{item.left.name}({item.left.type}) vs {item.right.name}({item.right.type}) → {item.result} +
{t('memoryExtractionEngine.disagreementCase')} {index + 1}:
+ +
    +
  • + {item.left.name}({item.left.type}) vs {item.right.name}({item.right.type}) → {item.result} +
  • +
))} +
+
+ } - } className="rb:mt-3"> - {t('memoryExtractionEngine.entityDeduplicationImpactDesc', { count: testResult.dedup.impact.length })} - - - } + {testResult?.core_entities && testResult?.core_entities.length > 0 && + toggleCard('coreEntities')} + > + + {testResult.core_entities.map((item, index) => ( +
setCoreEntitiesTab(item.type)} + > + {item.type}({item.count}) +
+ ))} +
+
+ {testResult.core_entities.filter((item, index) => (coreEntitiesTab && item.type === coreEntitiesTab) || (!coreEntitiesTab && index === 0)).map((item, idx) => ( +
+
{item.type}({item.count})
- {testResult?.core_entities && testResult?.core_entities.length > 0 && - -
- {testResult.core_entities.map((item, idx) => ( -
-
{item.type}({item.count})
+
    + {item.entities.map((entity, index) => ( +
  • + {entity} +
  • + ))} +
+
+ ))} +
+ + } -
- {item.entities.map((entity, index) => ( -
- -{entity} -
- ))} -
-
- ))} -
- - } - - {testResult?.triplet_samples && testResult?.triplet_samples.length > 0 && - - - {testResult.triplet_samples.map((item, index) => ( -
- -({item.subject}, {item.predicate}, {item.object}) -
- ))} -
- } className="rb:mt-3"> + {testResult?.triplet_samples && testResult?.triplet_samples.length > 0 && + toggleCard('triplet_samples')} + > +
+ {t('memoryExtractionEngine.extractRelationalTriplesDesc', { count: testResult.triplet_samples.length })} - - } - {ontologyCoverage && Object.keys(ontologyCoverage).length > 0 && - {t('memoryExtractionEngine.ontologyCoverage')}({ontologyCoverage.total_entities})} - headerType="borderL" - headerClassName="rb:before:bg-[#369F21]!" - > -
+
    + {testResult.triplet_samples.map((item, index) => ( +
  • + ({item.subject}, {item.predicate}, {item.object}) +
  • + ))} +
+
+ + } + {ontologyCoverage && Object.keys(ontologyCoverage).length > 0 && + {t('memoryExtractionEngine.ontologyCoverage')}({ontologyCoverage.total_entities})} + expanded={expandedCards['ontologyCoverage']} + handleExpand={() => toggleCard('ontologyCoverage')} + > +
+
{(['scene_type_distribution', 'general_type_distribution', 'unmatched'] as const).map((key, idx) => { if (!ontologyCoverage[key]) return null return ( -
-
{t(`memoryExtractionEngine.${key}`)}({ontologyCoverage[key].type_count})
-
{t('memoryExtractionEngine.entity_total', { num: ontologyCoverage[key].entity_total })}
-
+
+
{t(`memoryExtractionEngine.${key}`)}({ontologyCoverage[key].type_count})
+
{t('memoryExtractionEngine.entity_total', { num: ontologyCoverage[key].entity_total })}
+ +
    {ontologyCoverage[key].types.map((type, index) => { if (!type.type || type.type === '') return null return ( -
    - -{type.type}({type.count}) -
    +
  • + {type.type}({type.count}) +
  • ) })} -
+
) })}
- - } - - -
- -
- - -
+
+
+ } + } ) } diff --git a/web/src/views/MemoryExtractionEngine/components/ResultCard.tsx b/web/src/views/MemoryExtractionEngine/components/ResultCard.tsx new file mode 100644 index 00000000..17e065a2 --- /dev/null +++ b/web/src/views/MemoryExtractionEngine/components/ResultCard.tsx @@ -0,0 +1,78 @@ +/* + * @Author: ZhaoYing + * @Date: 2026-02-03 17:30:51 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-19 14:23:58 + */ +/** + * ResultCard Component + * Collapsible card wrapper for configuration sections + */ + +import { type FC, type ReactNode } from 'react' +import clsx from 'clsx'; +import { Flex, Space, Tooltip } from 'antd'; + +import RbCard from '@/components/RbCard/Card' + +/** + * Component props + */ +interface ResultCardProps { + title: string | ReactNode; + subTitle?: string | ReactNode; + children: ReactNode; + expanded?: boolean; + handleExpand?: () => void; + className?: string; + headerClassName?: string; + bodyClassName?: string; + extra?: ReactNode; +} + +const ResultCard: FC = ({ + title, + subTitle, + children, + expanded, + handleExpand, + extra, + className, + headerClassName, + bodyClassName, +}) => { + return ( + + + {title} + {subTitle && +
+
} +
+ + {extra} + {handleExpand &&
} +
+
} + headerType="borderless" + headerClassName={headerClassName ?? "rb:min-h-[40px]! rb:text-[#212332]! rb:text-[14px]!"} + bodyClassName={bodyClassName ?? "rb:py-0! rb:px-3!"} + className={className ?? "rb:bg-[#F6F6F6]!"} + > + {(expanded && handleExpand) && children} +
+ ) +} + +export default ResultCard \ No newline at end of file diff --git a/web/src/views/MemoryExtractionEngine/index.tsx b/web/src/views/MemoryExtractionEngine/index.tsx index e5c8f477..e5e80577 100644 --- a/web/src/views/MemoryExtractionEngine/index.tsx +++ b/web/src/views/MemoryExtractionEngine/index.tsx @@ -2,7 +2,7 @@ * @Author: ZhaoYing * @Date: 2026-02-03 17:30:02 * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-06 13:50:05 + * @Last Modified time: 2026-03-18 17:55:32 */ /** * Memory Extraction Engine Configuration Page @@ -13,18 +13,19 @@ import { type FC, useState, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' -import { Row, Col, Space, Select, InputNumber, Slider, App, Form, Input } from 'antd' +import { Row, Col, Space, Select, InputNumber, App, Form, Input, Flex, Tooltip } from 'antd' import clsx from 'clsx' import Card from './components/Card' import type { ConfigForm, Variable } from './types' import { getMemoryExtractionConfig, updateMemoryExtractionConfig } from '@/api/memory' import Markdown from '@/components/Markdown' -import { getModelListUrl } from '@/api/models'; import { configList } from './constant' import Result from './components/Result' import SwitchFormItem from '@/components/FormItem/SwitchFormItem' -import CustomSelect from '@/components/CustomSelect' +import ModelSelect from '@/components/ModelSelect' +import RbSlider from '@/components/RbSlider'; +import DescWrapper from '@/components/FormItem/DescWrapper' /** Available configuration section keys */ const keys = [ @@ -35,7 +36,7 @@ const keys = [ /** * Configuration description component */ -const ConfigDesc: FC<{ config: Variable, className?: string; onlyMeaning?: boolean; }> = ({ config, className, onlyMeaning = false}) => { +const Desc: FC<{ config: Variable, className?: string; onlyMeaning?: boolean; }> = ({ config, className, onlyMeaning = false}) => { const { t } = useTranslation(); return (
@@ -44,7 +45,6 @@ const ConfigDesc: FC<{ config: Variable, className?: string; onlyMeaning?: boole {config.control && {t('memoryExtractionEngine.control')}: {t(`memoryExtractionEngine.${config.control}`)}} {config.type && {t('memoryExtractionEngine.type')}: {config.type}} } - {config.meaning &&
{t('memoryExtractionEngine.Meaning')}: {t(`memoryExtractionEngine.${config.meaning}`)}
}
) } @@ -122,163 +122,139 @@ const MemoryExtractionEngine: FC = () => { return ( <> -
{t('memoryExtractionEngine.title')}
-
{t('memoryExtractionEngine.subTitle')}
+ + {t('memoryExtractionEngine.title')} + +
+
+
- + -
- - - -
- -
- - {expandedKeys.includes('example') && -
- -
- } -
- - -
- - {configList.map((item, index) => ( - - - {item.data.map(vo => ( -
-
{t(`memoryExtractionEngine.${vo.title}`)}
-
{t(`memoryExtractionEngine.${vo.title}SubTitle`)}
+ + + + + + - {vo.list.map(config => ( -
- {config.control === 'button' && - -{t(`memoryExtractionEngine.${config.label}`)}} - name={config.variableName} - desc={} - className="rb:mt-6" - /> - } - {config.control === 'select' && - <> -
- -{t(`memoryExtractionEngine.${config.label}`)} -
-
+
+ handleExpand('example')} + > + {t('memoryExtractionEngine.example')} +
+
+ + {expandedKeys.includes('example') && +
+ +
+ } +
+ +
+ + {configList.map((item, index) => ( + + + {item.data.map(vo => ( + + + {t(`memoryExtractionEngine.${vo.title}`)} + +
+
+
+ + {vo.list.map(config => ( +
+ {config.control === 'button' + ? } />} + className="rb:mt-6" + /> + : <> + {config.meaning + ? + {t(`memoryExtractionEngine.${config.label}`)} + {t('memoryExtractionEngine.Meaning')}: {t(`memoryExtractionEngine.${config.meaning}`)}}> +
+
+
+ :
+ {t(`memoryExtractionEngine.${config.label}`)} +
+ } + {config.control !== 'text' && } />} - ({ ...item, label: t(`memoryExtractionEngine.${item.label}`) })) : []} + /> + : config.control === 'slider' + ? {t('emotionEngine.currentValue')}:} + inputClassName="rb:w-[155px]!" + /> + : config.control === 'inputNumber' + ? + : config.control === 'text' + ? + : null + } - -
- - } - {config.control === 'slider' && - <> -
- -{t(`memoryExtractionEngine.${config.label}`)} -
-
- - - - -
- {config.min || 0} - {t('memoryExtractionEngine.CurrentValue')}: {values?.[config.variableName as keyof ConfigForm]} -
-
- - } - {config.control === 'inputNumber' && - <> -
- -{t(`memoryExtractionEngine.${config.label}`)} -
-
- - - - -
- - } - {config.control === 'text' && - <> -
- -{t(`memoryExtractionEngine.${config.label}`)} -
-
- - - - -
- - } -
- ))} -
- ))} - - - ))} - - + + } +
+ ))} + + ))} + +
+ ))} + + + - + { return ( - - - {t('reflectionEngine.reflectionEngineConfig')} -
- } + + + + } + headerType="borderless" + headerClassName="rb:min-h-[54px]! rb:font-[MiSans-Bold] rb:font-bold" + className="rb:h-[calc(100vh-76px)]!" + bodyClassName="rb:h-[calc(100%-54px)] rb:overflow-y-auto! rb:p-4! rb:pt-0!" >
{ lambda_mem: 0.03, }} > - {configList.map(config => { - if (config.type === 'customSelect') { - return ( -
-
- {t(`reflectionEngine.${config.key}`)} + + {configList.map(config => { + if (config.type === 'customSelect') { + return ( +
+ + + + + +
- - - -
- ) - } - if (config.type === 'select') { - return ( -
-
- {t(`reflectionEngine.${config.key}`)} + ) + } + if (config.type === 'select') { + return ( +
+ + + + + ({ - ...vo, - label: t(`reflectionEngine.${vo.label}`), - }))} - placeholder={t('common.pleaseSelect')} - disabled={!values?.reflection_enabled && config.key !== 'reflection_enabled'} - /> - -
- ) - } + ) + } - return ( - - {(config as any).hasSubTitle &&
{t(`reflectionEngine.${config.key}_subTitle`)}
} -
{t(`reflectionEngine.${config.key}_desc`)}
- } - className="rb:mb-6" - disabled={!values?.reflection_enabled && config.key !== 'reflection_enabled'} - /> - ) - })} - - - - - - - - + return ( + + {(config as any).hasSubTitle &&
{t(`reflectionEngine.${config.key}_subTitle`)}
} +
{t(`reflectionEngine.${config.key}_desc`)}
+ } + className="rb:mb-6" + disabled={!values?.reflection_enabled && config.key !== 'reflection_enabled'} + /> + ) + })} + diff --git a/web/src/views/UserMemory/index.tsx b/web/src/views/UserMemory/index.tsx index c8a6b753..765cca05 100644 --- a/web/src/views/UserMemory/index.tsx +++ b/web/src/views/UserMemory/index.tsx @@ -1,8 +1,8 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 17:53:44 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-03-16 15:01:27 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-16 15:23:18 */ /** * User Memory Page @@ -104,7 +104,7 @@ export default function UserMemory() { title={
{name[0]}
-
{name || '-'}
+
{name || '-'}
} headerType="border" headerClassName="rb:h-[48px]! rb:mx-4!" diff --git a/web/src/views/UserMemoryDetail/Rag.tsx b/web/src/views/UserMemoryDetail/Rag.tsx index 2d3443ce..9d714070 100644 --- a/web/src/views/UserMemoryDetail/Rag.tsx +++ b/web/src/views/UserMemoryDetail/Rag.tsx @@ -1,8 +1,8 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 17:57:11 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-03 17:57:11 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-19 11:38:17 */ /** * RAG User Memory Detail View @@ -12,83 +12,55 @@ import { type FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' -import clsx from 'clsx' -import { Row, Col, Skeleton } from 'antd' +import { Row, Col, Skeleton, Flex } from 'antd' import { useParams } from 'react-router-dom' import aboutUs from '@/assets/images/userMemory/aboutUs.svg' -import down from '@/assets/images/userMemory/down.svg' -import interestDistribution from '@/assets/images/userMemory/interestDistribution.svg' +import memoryInsight from '@/assets/images/userMemory/memoryInsight.svg' import RbCard from '@/components/RbCard/Card' import type { Data } from './types' import { getChunkSummaryTag, getUserProfile, - getTotalRagMemoryCountByUser, getChunkInsight, } from '@/api/memory' import Empty from '@/components/Empty' import ConversationMemory from './components/ConversationMemory' -/** Tag color palette */ -const tagColors = ['21, 94, 239', '156, 111, 255', '255, 93, 52', '54, 159, 33'] - /** * Title component props */ interface TitleProps { - type: string; title: string icon: string - t: (key: string) => string; - expanded: boolean; - onClick: (type: string) => void; } /** Collapsible section title */ -const Title: FC = ({ type, title, icon, t, expanded, onClick }) => ( -
- - - {title} - - - onClick(type)}> - {t(`userMemory.${expanded ? 'foldUp' : 'expanded'}`)} - - -
+const Title: FC = ({ title, icon }) => ( + + + {title} + ) const Rag: FC = () => { const { t } = useTranslation() const { id } = useParams() const [data, setData] = useState(null) - const [expanded, setExpanded] = useState(['aboutUs', 'memoryInsight',]) const [summary, setSummary] = useState('') const [loading, setLoading] = useState>({ detail: true, summary: true, insight: true, }) - const [memory, setMemory] = useState(null) const [insight, setInsight] = useState('') - const [tags, setTags] = useState<{ tag: string; frequency: number }[]>([]) - const [personas, setPersonas] = useState([]) useEffect(() => { if (!id) return - getMemory() getSummary() getDetail() getInsightReport() }, [id]) - /** Toggle section expansion */ - const handleTitleClick = (key: string) => { - setExpanded(expanded.includes(key) ? expanded.filter((item) => item !== key) : [...expanded, key]) - } /** Fetch user memory detail */ const getDetail = () => { if (!id) return @@ -100,13 +72,6 @@ const Rag: FC = () => { setLoading(prev => ({ ...prev, detail: false })) }) } - /** Fetch memory count */ - const getMemory = () => { - if (!id) return - getTotalRagMemoryCountByUser(id).then((res) => { - setMemory(res as number || 0) - }) - } /** Fetch user summary */ const getSummary = () => { if (!id) return @@ -114,8 +79,6 @@ const Rag: FC = () => { getChunkSummaryTag(id).then((res) => { const response = res as { summary?: string; tags?: { tag: string; frequency: number }[]; personas?: string[] } setSummary(response.summary || null) - setTags(response.tags || []) - setPersonas(response.personas || []) }) .finally(() => { setLoading(prev => ({ ...prev, summary: false })) @@ -134,82 +97,51 @@ const Rag: FC = () => { } const name = loading.detail ? '' : data?.name && data?.name !== '' ? data.name : id return ( - + - -
-
{name?.[0]}
-
- {name}
-
{personas?.join(' | ')}
+ + +
{name?.[0]}
+
+ {name}
-
- -
- {tags?.map((tag, tagIndex) => ( - - {tag.tag}({tag.frequency}) - - ))} -
- - {/* Total Memory */} -
- {t('userMemory.totalNumOfMemories')} -
{memory || 0}
-
+ {/* About Me */} <> - {expanded.includes('aboutUs') && ( - <> - {loading.summary - ? <Skeleton className="rb:mt-4" /> - : summary - ? <div className="rb:font-regular rb:leading-5.5 rb:pt-4"> - {summary || '-'} - </div> - : <Empty size={88} className="rb:mt-12 rb:mb-20.25" /> - } - </> - )} + <div className="rb:bg-[#F6F6F6] rb:rounded-lg rb:py-2.5 rb:px-3 rb:mb-4"> + {loading.summary + ? <Skeleton /> + : summary + ? <div className="rb:leading-5 rb:text-[#5B6167]"> + {summary || '-'} + </div> + : <Empty size={88} /> + } + </div> </> {/* Memory Insights */} <> <Title - type="memoryInsight" title={t('userMemory.memoryInsight')} - icon={interestDistribution} - t={t} - expanded={expanded.includes('memoryInsight')} - onClick={handleTitleClick} + icon={memoryInsight} /> - {expanded.includes('memoryInsight') && ( - <> - {loading.insight - ? <Skeleton className="rb:mt-4" /> - : insight - ? <div className="rb:font-regular rb:leading-5.5 rb:pt-4"> - {insight || '-'} - </div> - : <Empty size={88} className="rb:mt-12 rb:mb-20.25" /> - } - </> - )} + <div className="rb:bg-[#F6F6F6] rb:rounded-lg rb:py-2.5 rb:px-3"> + {loading.insight + ? <Skeleton /> + : insight + ? <div className="rb:leading-5 rb:text-[#5B6167]"> + {insight || '-'} + </div> + : <Empty size={88} /> + } + </div> </> </RbCard> </Col> diff --git a/web/src/views/UserMemoryDetail/components/EmotionLine.tsx b/web/src/views/UserMemoryDetail/components/EmotionLine.tsx index b5e76097..43f65758 100644 --- a/web/src/views/UserMemoryDetail/components/EmotionLine.tsx +++ b/web/src/views/UserMemoryDetail/components/EmotionLine.tsx @@ -1,12 +1,13 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 18:33:44 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-03 18:33:44 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-19 11:55:42 */ import { type FC, useRef } from 'react' import { useTranslation } from 'react-i18next' import ReactEcharts from 'echarts-for-react'; +import { Flex } from 'antd'; import Empty from '@/components/Empty' import Loading from '@/components/Empty/Loading' @@ -63,12 +64,12 @@ const EmotionLine: FC<EmotionLineProps> = ({ chartData, loading }) => { } return ( - <> - <div>{t('userMemory.emotionLine')}</div> + <Flex vertical gap={16} className="rb-border rb:rounded-xl rb:p-4! rb:h-78"> + <div className="rb:text-[#212332] rb:font-medium rb:leading-5">{t('userMemory.emotionLine')}</div> {loading ? <Loading size={249} /> : !chartData || chartData.length === 0 - ? <Empty size={120} className="rb:mt-12 rb:mb-20.25" /> + ? <Empty size={120} className="rb:flex-1" /> : <ReactEcharts ref={chartRef} option={{ @@ -175,12 +176,12 @@ const EmotionLine: FC<EmotionLineProps> = ({ chartData, loading }) => { }, series: getSeries() }} - style={{ height: '265px', width: '100%', minWidth: '100%' }} + style={{ height: '242px', width: '100%', minWidth: '100%' }} notMerge={true} lazyUpdate={true} /> } - </> + </Flex> ) } diff --git a/web/src/views/UserMemoryDetail/components/Habits.tsx b/web/src/views/UserMemoryDetail/components/Habits.tsx index 9dfad7c7..f5ccab03 100644 --- a/web/src/views/UserMemoryDetail/components/Habits.tsx +++ b/web/src/views/UserMemoryDetail/components/Habits.tsx @@ -77,7 +77,7 @@ const Habits = forwardRef<{ handleRefresh: () => void; }>((_props, ref) => { title={() => (<Space size={4}> {t('implicitDetail.habits')} <Tooltip title={t('implicitDetail.habitsSubTitle')}> - <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/userMemory/question.svg')]"></div> + <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/userMemory/question.svg')]"></div> </Tooltip> </Space>)} headerType="borderless" diff --git a/web/src/views/UserMemoryDetail/components/InteractionBar.tsx b/web/src/views/UserMemoryDetail/components/InteractionBar.tsx index b874caea..314fb024 100644 --- a/web/src/views/UserMemoryDetail/components/InteractionBar.tsx +++ b/web/src/views/UserMemoryDetail/components/InteractionBar.tsx @@ -1,12 +1,13 @@ /* * @Author: ZhaoYing * @Date: 2026-02-03 18:32:57 - * @Last Modified by: ZhaoYing - * @Last Modified time: 2026-02-03 18:32:57 + * @Last Modified by: ZhaoYing + * @Last Modified time: 2026-03-19 11:56:49 */ import { type FC, useMemo } from 'react' import { useTranslation } from 'react-i18next' import ReactEcharts from 'echarts-for-react' +import { Flex } from 'antd' import Empty from '@/components/Empty' import Loading from '@/components/Empty/Loading' @@ -41,12 +42,12 @@ const InteractionBar: FC<InteractionBarProps> = ({ chartData, loading }) => { }, [chartData, t]) return ( - <> - <div>{t('userMemory.interaction')}</div> + <Flex vertical gap={16} className="rb-border rb:rounded-xl rb:p-4! rb:h-78"> + <div className="rb:text-[#212332] rb:font-medium rb:leading-5">{t('userMemory.emotionLine')}</div> {loading ? <Loading size={249} /> : !chartData || chartData.length === 0 - ? <Empty size={120} className="rb:mt-12 rb:mb-20.25" /> + ? <Empty size={120} className="rb:flex-1" /> : <ReactEcharts option={{ color: Colors, @@ -128,10 +129,10 @@ const InteractionBar: FC<InteractionBarProps> = ({ chartData, loading }) => { }, series }} - style={{ height: '265px', width: '100%' }} + style={{ height: '242px', width: '100%', minWidth: '100%' }} /> } - </> + </Flex> ) } diff --git a/web/src/views/UserMemoryDetail/pages/GraphDetail.tsx b/web/src/views/UserMemoryDetail/pages/GraphDetail.tsx index 47efce76..f8282687 100644 --- a/web/src/views/UserMemoryDetail/pages/GraphDetail.tsx +++ b/web/src/views/UserMemoryDetail/pages/GraphDetail.tsx @@ -1,7 +1,7 @@ import { useState, forwardRef, useImperativeHandle, useMemo, useEffect } from 'react' import { useTranslation } from 'react-i18next' -import { useSearchParams } from 'react-router-dom' -import { Row, Col, Tabs, Space, Skeleton } from 'antd' +import { useSearchParams, useNavigate } from 'react-router-dom' +import { Row, Col, Flex, Space, Skeleton, Button } from 'antd' import { getRelationshipEvolution, getTimelineMemories } from '@/api/memory' import type { Node, GraphDetailRef } from '../types' @@ -11,7 +11,8 @@ import { formatDateTime } from '@/utils/format' import Tag from '@/components/Tag' import InteractionBar from '../components/InteractionBar' import Empty from '@/components/Empty' -import PageHeader from '../components/PageHeader' +import PageHeader from '@/components/Layout/PageHeader' +import BtnTabs from '@/components/BtnTabs' export interface Emotion { emotion_intensity: number; @@ -36,6 +37,7 @@ interface Timeline { const GraphDetail = forwardRef<GraphDetailRef>((_props, ref) => { const { t } = useTranslation() + const navigate = useNavigate() const [searchParams] = useSearchParams() const [vo, setVo] = useState<Node | null>(null) const [loading, setLoading] = useState(false) @@ -97,54 +99,75 @@ const GraphDetail = forwardRef<GraphDetailRef>((_props, ref) => { return ( <> <PageHeader - name={vo?.name} - source="node" + title={vo?.name} + extra={ + <Space size={12}> + <Button + className="rb:px-2! rb:gap-0.5!" + icon={<div className="rb:size-4 rb:cursor-pointer rb:bg-cover rb:bg-[url('@/assets/images/common/return.svg')]"></div>} + onClick={() => navigate(-1)} + > + {t('common.return')} + </Button> + </Space> + } /> - <div className="rb:h-full rb:max-w-266 rb:mx-auto"> - <div className="rb:text-[16px] rb:font-medium rb:leading-5.5 rb:mb-3">{t('userMemory.relationshipEvolution')}</div> - <RbCard> - <Row gutter={16}> - <Col span={12}> + <Row gutter={12} className="rb:p-3! rb:pr-0! rb:h-[calc(100vh-64px)] rb:w-full! rb:flex-nowrap! rb:overflow-hidden!"> + <Col flex="480px"> + <RbCard + title={t('userMemory.relationshipEvolution')} + headerType="borderless" + headerClassName="rb:min-h-[56px]! rb:font-[MiSans-Bold] rb:font-bold" + bodyClassName="rb:p-3! rb:pt-0! rb:h-[calc(100%-56px)] rb:overflow-y-auto!" + className="rb:h-[calc(100vh-88px)]!" + > + <Flex vertical gap={16}> <EmotionLine chartData={emotionData} loading={loading} /> - </Col> - <Col span={12}> <InteractionBar chartData={interactionData} loading={loading} /> - </Col> - </Row> - </RbCard> - - <div className="rb:text-[16px] rb:font-medium rb:leading-5.5 rb:mb-3 rb:mt-6">{t('userMemory.timelineMemories')}</div> - <RbCard> - <Tabs - activeKey={activeTab} - items={['timelines_memory', 'Statement', 'MemorySummary'].map(key => ({ - label: t(`userMemory.${key}`), - key - }))} - onChange={(key: string) => setActiveTab(key)} - /> - {timelineLoading - ? <Skeleton active /> - : !activeContent || activeContent.length === 0 - ? <Empty size={120} className="rb:mt-12 rb:mb-20.25" /> - : <Space size={16} direction="vertical" className="rb:w-full"> - {activeContent.map((vo, index) => ( - <RbCard - key={index} - headerType="borderL" - headerClassName="rb:before:bg-[#155EEF]!" - title={vo.text} - > - <div className="rb:text-[#A8A9AA] rb:text-[12px] rb:leading-4">{formatDateTime(vo.created_at)}</div> - <Tag className="rb:mt-2">{vo.type}</Tag> - </RbCard> - ))} - </Space> - } - - - </RbCard> - </div> + </Flex> + </RbCard> + </Col> + <Col className="rb:w-[calc(100%-480px)]!"> + <RbCard + title={t('userMemory.timelineMemories')} + headerType="borderless" + headerClassName="rb:min-h-[53px]! rb:font-[MiSans-Bold] rb:font-bold" + bodyClassName="rb:p-3! rb:pt-0!" + className="rb:w-full!" + > + <BtnTabs + className="rb:mb-4!" + activeKey={activeTab} + items={['timelines_memory', 'Statement', 'MemorySummary'].map(key => ({ + label: t(`userMemory.${key}`), + key + }))} + onChange={(key: string) => setActiveTab(key)} + /> + <div className="rb:h-[calc(100vh-193px)] rb:overflow-y-auto"> + {timelineLoading + ? <Skeleton active /> + : !activeContent || activeContent.length === 0 + ? <Empty size={120} className="rb:mt-12 rb:mb-20.25" /> + : <Flex gap={12} vertical> + {activeContent.map((vo, index) => ( + <div + key={index} + className="rb-border rb:rounded-xl rb:p-3" + > + <Flex align="center" justify="space-between"> + <div className="rb:text-[#5B6167] rb:text-[12px] rb:leading-4.5">{formatDateTime(vo.created_at)}</div> + <Tag>{vo.type}</Tag> + </Flex> + <div className="rb:mt-3 rb:leading-5 rb:break-all">{vo.text}</div> + </div> + ))} + </Flex> + } + </div> + </RbCard> + </Col> + </Row> </> ) }) diff --git a/web/src/views/UserMemoryDetail/pages/ShortTermDetail.tsx b/web/src/views/UserMemoryDetail/pages/ShortTermDetail.tsx index 3fb222d0..8b38aa54 100644 --- a/web/src/views/UserMemoryDetail/pages/ShortTermDetail.tsx +++ b/web/src/views/UserMemoryDetail/pages/ShortTermDetail.tsx @@ -110,7 +110,7 @@ const ShortTermDetail: FC = () => { title={() => (<Space size={4}> {t('shortTermDetail.shortTermTitle')} <Tooltip title={t('shortTermDetail.shortTermSubTitle')}> - <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/userMemory/question.svg')]"></div> + <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/userMemory/question.svg')]"></div> </Tooltip> </Space>)} headerType="borderless" @@ -194,7 +194,7 @@ const ShortTermDetail: FC = () => { title={() => (<Space size={4}> {t('shortTermDetail.longTermTitle')} <Tooltip title={t('shortTermDetail.longTermTitleSubTitle')}> - <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/userMemory/question.svg')]"></div> + <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/userMemory/question.svg')]"></div> </Tooltip> </Space>)} headerType="borderless" diff --git a/web/src/views/Workflow/components/Nodes/AddNode.tsx b/web/src/views/Workflow/components/Nodes/AddNode.tsx index 4f443f07..9b9d2236 100644 --- a/web/src/views/Workflow/components/Nodes/AddNode.tsx +++ b/web/src/views/Workflow/components/Nodes/AddNode.tsx @@ -178,7 +178,7 @@ const AddNode: ReactShapeConfig['component'] = ({ node, graph }) => { 'rb:border-[#d1d5db] rb:bg-[#FCFCFD] rb:text-[#374151]': !data.isSelected })} > - <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/workflow/node_plus.png')]"></div> + <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/workflow/node_plus.png')]"></div> {data.label} </Flex> </Popover> diff --git a/web/src/views/Workflow/components/Nodes/NodeTools.tsx b/web/src/views/Workflow/components/Nodes/NodeTools.tsx index 46aa82e2..4948f35d 100644 --- a/web/src/views/Workflow/components/Nodes/NodeTools.tsx +++ b/web/src/views/Workflow/components/Nodes/NodeTools.tsx @@ -27,7 +27,7 @@ const NodeTools: FC<{ node: Node }> = ({ <Dropdown menu={{ items: [ - { key: 'delete', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/common/delete_dark.svg')]"></div>, label: <Flex>{t('common.delete')}</Flex>}, + { key: 'delete', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/common/delete_dark.svg')]"></div>, label: <Flex>{t('common.delete')}</Flex>}, // { key: 'copy', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/common/copy_dark.svg')]"></div>, label: t('common.copy') } ], onClick: handleClick diff --git a/web/src/views/Workflow/components/Properties/CaseList/index.tsx b/web/src/views/Workflow/components/Properties/CaseList/index.tsx index a72e91bf..0fec5c64 100644 --- a/web/src/views/Workflow/components/Properties/CaseList/index.tsx +++ b/web/src/views/Workflow/components/Properties/CaseList/index.tsx @@ -248,7 +248,7 @@ const CaseList: FC<CaseListProps> = ({ <Form.Item name={[caseField.name, 'logical_operator']} noStyle > <Space size={2} className="rb:cursor-pointer rb:text-[#155EEF] rb:leading-4.5 rb:font-medium rb-border rb:py-px! rb:px-1! rb:rounded-sm" onClick={() => handleChangeLogicalOperator(caseIndex)}> {logicalOperator} - <div className="rb:size-3 rb:bg-cover rb:bg-[url('src/assets/images/workflow/refresh_active.svg')]"></div> + <div className="rb:size-3 rb:bg-cover rb:bg-[url('@/assets/images/workflow/refresh_active.svg')]"></div> </Space> </Form.Item> </div> diff --git a/web/src/views/Workflow/components/Properties/ConditionList/index.tsx b/web/src/views/Workflow/components/Properties/ConditionList/index.tsx index 15daf5e0..9028ed9f 100644 --- a/web/src/views/Workflow/components/Properties/ConditionList/index.tsx +++ b/web/src/views/Workflow/components/Properties/ConditionList/index.tsx @@ -114,7 +114,7 @@ const ConditionList: FC<CaseListProps> = ({ <Form.Item name={[parentName, 'logical_operator']} noStyle > <Space size={2} className="rb:cursor-pointer rb:text-[#155EEF] rb:leading-4.5 rb:font-medium rb-border rb:py-px! rb:px-1! rb:rounded-sm" onClick={handleChangeLogicalOperator}> {logicalOperator} - <div className="rb:size-3 rb:bg-cover rb:bg-[url('src/assets/images/workflow/refresh_active.svg')]"></div> + <div className="rb:size-3 rb:bg-cover rb:bg-[url('@/assets/images/workflow/refresh_active.svg')]"></div> </Space> </Form.Item> </div> diff --git a/web/src/views/Workflow/components/Properties/index.tsx b/web/src/views/Workflow/components/Properties/index.tsx index 283640c7..b74c14e3 100644 --- a/web/src/views/Workflow/components/Properties/index.tsx +++ b/web/src/views/Workflow/components/Properties/index.tsx @@ -434,7 +434,7 @@ const Properties: FC<PropertiesProps> = ({ <Dropdown menu={{ items: [ - { key: 'delete', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('src/assets/images/common/delete_dark.svg')]"></div>, label: <Flex>{t('common.delete')}</Flex> }, + { key: 'delete', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/common/delete_dark.svg')]"></div>, label: <Flex>{t('common.delete')}</Flex> }, // { key: 'copy', icon: <div className="rb:size-4 rb:bg-cover rb:bg-[url('@/assets/images/common/copy_dark.svg')]"></div>, label: t('common.copy') } ], onClick: handleClick @@ -834,7 +834,7 @@ const Properties: FC<PropertiesProps> = ({ <Flex align="center" className="rb:font-medium rb:cursor-pointer" onClick={handleToggle}> {t('workflow.config.output')} <div - className={clsx("rb:size-3 rb:bg-cover rb:bg-[url('src/assets/images/common/caret_right_outlined.svg')]", { + className={clsx("rb:size-3 rb:bg-cover rb:bg-[url('@/assets/images/common/caret_right_outlined.svg')]", { 'rb:rotate-90': !outputCollapsed })} ></div>