From 37fab21dafcb2f2d329b0d3662bef1dc687802e4 Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Thu, 2 Oct 2025 10:35:10 -0700 Subject: [PATCH] Cleanup: YAGNI readonly props, private swap on ComfyApp, Canvas resize events simplification, v-memos on individual instances (#5869) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Assorted cleanup opportunities found while working through the Vue node rendering logic cleanup. ## Review Focus Am I wrong that the readonly logic was never actually executing because it was defined as False in GraphCanvas when making each LGraphNode? Is there an edge case or some other reason that the ResizeObserver wouldn't work as a single signal to resize the canvas? ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5869-Cleanup-YAGNI-readonly-props-private-swap-on-ComfyApp-Canvas-resize-events-simplificat-27e6d73d3650811ba1dcf29e8d43091e) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions --- browser_tests/tests/domWidget.spec.ts | 4 + .../focus-mode-on-chromium-linux.png | Bin 90433 -> 90480 bytes .../widget/WorkflowTemplateSelectorDialog.vue | 1 - src/components/graph/GraphCanvas.vue | 3 +- .../vueNodes/components/InputSlot.vue | 8 +- .../vueNodes/components/LGraphNode.vue | 39 +------ .../vueNodes/components/NodeContent.vue | 1 - .../vueNodes/components/NodeHeader.test.ts | 25 ---- .../vueNodes/components/NodeHeader.vue | 12 +- .../vueNodes/components/NodeSlots.vue | 5 +- .../vueNodes/components/NodeWidgets.vue | 5 +- .../vueNodes/components/OutputSlot.vue | 8 +- .../composables/useSlotLinkInteraction.ts | 10 +- .../widgets/components/WidgetButton.vue | 10 +- .../widgets/components/WidgetChart.vue | 1 - .../widgets/components/WidgetColorPicker.vue | 2 - .../widgets/components/WidgetFileUpload.vue | 16 +-- .../widgets/components/WidgetGalleria.test.ts | 28 +---- .../widgets/components/WidgetGalleria.vue | 1 - .../widgets/components/WidgetImageCompare.vue | 1 - .../widgets/components/WidgetInputNumber.vue | 2 - .../components/WidgetInputNumberInput.vue | 3 - .../components/WidgetInputNumberSlider.vue | 5 +- .../widgets/components/WidgetInputText.vue | 2 - .../widgets/components/WidgetMarkdown.vue | 4 +- .../widgets/components/WidgetMultiSelect.vue | 2 - .../widgets/components/WidgetSelect.vue | 1 - .../widgets/components/WidgetSelectButton.vue | 2 - .../components/WidgetSelectDefault.vue | 2 - .../components/WidgetSelectDropdown.vue | 2 - .../widgets/components/WidgetTextarea.vue | 2 - .../widgets/components/WidgetToggleSwitch.vue | 2 - .../widgets/components/WidgetTreeSelect.vue | 2 - src/scripts/app.ts | 110 +++++++++--------- .../components/NodeHeader.subgraph.test.ts | 14 --- 35 files changed, 88 insertions(+), 247 deletions(-) diff --git a/browser_tests/tests/domWidget.spec.ts b/browser_tests/tests/domWidget.spec.ts index 6517b9170..02392f51d 100644 --- a/browser_tests/tests/domWidget.spec.ts +++ b/browser_tests/tests/domWidget.spec.ts @@ -53,6 +53,10 @@ test.describe('DOM Widget', () => { }) test('should reposition when layout changes', async ({ comfyPage }) => { + test.skip( + true, + 'Only recalculates when the Canvas size changes, need to recheck the logic' + ) // --- setup --- const textareaWidget = comfyPage.page diff --git a/browser_tests/tests/domWidget.spec.ts-snapshots/focus-mode-on-chromium-linux.png b/browser_tests/tests/domWidget.spec.ts-snapshots/focus-mode-on-chromium-linux.png index 2b89be5c537fcdf56f26bef5997524fd2d7cb43b..1fa6c6d67eaa02c15fd53ebb67e448254d6ca035 100644 GIT binary patch delta 31046 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

0(}B1hm;Qz! z>V{gzlC+vJcS5e~H+mZeb!uWupx})G>t)j!e5L!F;;nIH9W;#oIk6%He%AU^S&IkXwg*c7abyD*A624$7?4xfOPUN z5cuk4DxMD+>VcEkt8)YDtZv>+K|a2t6HF_cnVMjaB~T)TCPVVdf|gBRv$M0Ss>F6& z=!Gr1e*Jp*@Zsv_CRP`{=gLGg5YFOuL~!0mf9Eg&+65;;aeBRYc-6lV;&1S#)#*6qENC1Y-!Q1Kfdq9Na;pWeqDHix-JKjA0THJFO5eyg%bAcOmR_9c zb=^$Z>5o@5H`Mq=M4*e~Wk8iyIrakl-}&xGAQsCEJ6QpeU?KC`M}o;SXMd!W&R6ty zcXkNZRFjvs!VVk#8_%7TPRH(3DbSkPfqfL_&P<0=kP%W~A5Z`7aWXMq{K6mRW6QVaXHQpYiP zt({1H)NY1Cw^TCs=|wDAI8OnxyM`&Bsd2^lpcI_yCh&4`f_FARLJeBR9Hny0<`dx7 z;0{1;|6S|1qgd}pusa*PnNPjJek=1jBa`31-)|$Ln)K>q1z`qIv{$D%etFb+j#qat zdB3nU#Owp?DD?DT3furl?hpR-LaAh&xNUaaTcBsn#2sfU9etznXx<+I;qZ&#Dd<8J zac8@SlRkP{TCr$niUwW4A+&=4lL|IFUTzaFYy`%pm9V_H_;f2|Cgf-?x*SOSPfkw2 z-^IDPi$D{~6*(EW@Y=EJ7>NIa!5cj5my&<~)>i2PmI5sR&J>6L2Jn>D^9@fx5GuNn z6#{iAB6uZ_rSqDKaj6;H%#7(nM)S#PF<`5LKX5EKw-1nTblJ&fB)45f;mR|^JRBvb8nEP=hi?nf>MAu#V_ z4WHEHx=Dn@Cqj*%>Tq|Gge&^Y+|ybH-rhZb&RI98*qbDw(TixK7p&^FOqF+H{rL53 zuVh|EuZN@_R+oP-K9%crCT3!|>qm#jeIRq%F1!3P;p;vuRXe}G0*R&y%m8vwfMf$1 zE*WR_j5iF>>wbt#K<)u223phlki$(yDegT#05njfR2f0;5wCX;~ z_+tCt@f%{l;g$F*myl`!*(l{vW{SpjEfK`_UP* z20qWDaijKAte|;qNmJ9=-pXLLu4UM{a9zV$Fj zQvH^I6a=#=(;-_5vbnV&xPAHZrKLr&I&ugsI$d`;=7xYGIA1U%aS{?0QvA0cNtT$H z2qgZ00Y<8Hg3V!;@^}hP8T6&cJ~IgwxY#DUZnq5FbB({d#3jc41N%IwmG& zWW-qIfuG+#1RfDT@p$o**>e)WyTF-LNV|J`ubOKK_FQauLTjaI71y(*M(3V<(9Z9Q zz~h#%`5tR(37uWuw%`G21=ohY*eoY+L6I23_Ak0>#y8+nuCknjs9kx~c2m)3O1Qp@ z$rp)nhiYFmHi_wmDNh>zNGoF;3~1~k=SZNp8a%}6B%-82ZGv=K+LBkN!ES;l1ze!x z?+@EanP=SVG9Yf{^N*~Rw_c39mQR7Ow0E=x;Z6^yLqxc^777b8t`jRKJB&+=510H* zAp>RezgmJ}HN7YG7NAGkTkaa9IBSh9TdS6m0Nlcp%{3DCr`B~7=d4{2&^Weme{p-x z@jFvV>B*e%c#hU#NguX9({ZQL#Wo;6 z^>lR)TAzR-Mz9CMGo1k-V4ZHY;=t1Z7CIH^IAa9Ly1KiwJedM(@LF@f>oQD7Jv;I< zU<_s^^w53s>vjjdm7uV2*xU>H;Nn|AAD5NZeAbzecQGB|YhC*v(NT}6wzc?42qcXs zp4-Q$31HlmNL|pQ@LlPt+(QLpUAU^D|AF6gGB`+)KnmGGW=nCOv`5qm`_WEDSNtVK zdskvE-*vQK^1{{UZM#j`g)!Wx_T^=0r4tGp2He@S;+^N8G~>7h7zh;3{s$RQbb8LQ zckpXkB?}#<5CEu}_4V~n5uh9ab>HiJ_EBJ(k7eCw5CG9qtV&@`U>rdKwO1aS?}87*v&R=fALwFl`8MR|yX;XVa*$>-{D~C? zj_wMQ1i;EJxRQ8ub`m@!m|pvm`dW_(H?CKLiI4NY(MoX_7(Cq!9IP3i8YAC;WC`g- zzNxLPZM#zq7?b8^g&j3;mir*OJ1+ft4=Rfdu&CA5hJ|=J=Q{uXk8fS09=o~aj!EaO z1^1u51{eTPh+{nJaErW3XuoDK6*bl1H*+#lXCaIk24g$JaFa_JlK?W!(!Hrc1UEJY zoqH=S@f-;F;{Z;e(SzjCPC}R7@4le7#O@-pX>E9(7#J9|(p_Hu|FHhpv-l{6l(Q_+RE;(8DL3OK|l5;4FY|)gSHFR#tkS z9c}wJrrUe~Gc5R_)G84h36eiElzp~RKg4-L^3keaa zo0tN0;=sVXeopj@j^n7 z(1nM2YnR0RbQvG@!D=8K8sz^4NKMLUu3NWWP#$04Ywcdou%xgD;D;wY4nYV9`UIe$ z=O9f%_%ohQY|+>10>-*P&D0LeE#x$BR|=*iCpS!OD!TGlr-feBy;RSvQ_qa8#y1l` zQus*mvRM_JCGDCp+y?$5bvaYSXDPXWIGQ#}QS z3WdOD(3E=R7;^)I>;9e-z#uN>>02LYY8HO}Oqymr z_ylAh`JFBesPR~F4DK2I)NYn#>~WbwKX;Whd*uw^&YU0-2$a^7ogA+?9o%$Hv(kQ z$^Keq@G8V#j%ft%z=vNe+`iShxq5VIl3{`FROsOpATIFQyzIgXu$>@3;6VKL0?nbf z_g&Um*7{^n6E8!tUD;!o0pbGMH|3UV;EdbeTvyXKlu$DcjMviC@oJcikC(jbk%qRt z8R=Z~>uw3!ddOEN*#YzEG$i5)#8Tk=IK-Spi!|rq51BW2a^D8B#<7L%yF8$#V0{2a zxW7l8$`Q*dC@7p9>gwu(xh`JaH0-W6^73gFQuUyVD`9=2&NFxY4zmD$N^o_!xb?7k zOHJCzZRGbX7{~dF8cIPbL189feDQ#wtf**ST9>xttpu^GcgV2Q{UHb->zr3$Z@vI$ zy{QViBE97%#@9dJN)yZSpt8Bdk)Xmb#|%vzZ+kZ^1_lR@_ts604-K(Q2o&V!e=b_x z4^B!-ni5Vaa+$BbVX$iSVo4@Br)tc>G~RuBjh9I^O0)%uI`WB*o>*e{QR%NoD?{fW}HQ@tB9)ssftI6`OekgG@nSqCuv3d zvSinOKL2|4S^i^J*X7<+%=q}K)n!)oWH3c}Ffnrh9RPD(&V*64>(O?6|E|)|gRgMz zm3*d2;g_kH6nJUU`~#8H5p-3Zs9jVyx~itM^uFf4i~o13PNWe_`$Ht%QZQQdc83f> zK8;{(ObqZrFiT6lRr#asuoZV6NN@9KW3+W{$qbev zP=H0Bn<295z}HU)c!nH;;(>(DOAnG625ScOL0|4RJJT~7Yn2CpSq=*eGd3OpbD-yP zg@pI)d6HZ}*F(_`AR9nwTzj@~^z$eA^23L6auIdpjF$yF3mYDOv6~-FrX~|*B~MRF zlXvQ40X;W<3YY|OjR5u>bf&3LF97wxxRfz=V*B#dCYbOen?Kf!7(M$r9mv?|1O^L2f8T=lID~XYh~4y}Y5Ouc{vxzz>5(C1mp<^SxL!LPFaq!!9#?7>zHn{cfp?Aw&CyIy)`z zuoM?wK}#So?es)HqZoMGii*5h=qFqW+y42K>Y4B>np?Jx5oWzkY9Z@uB)Lv4(y(r~ z_#rIYo(lbLHX=hfKj+!s`*L?J#2HLQP+!wjdE*Koy9YDm*G<8UgPJ~ok>f~n0<-)w zQBIPnXgY#6hOD(AFClvsDR@FCmb|$HuxXBeyQBjjYK~Yj-w2+X1jo z%~airmEs$VwY)DOcS~)pq?$glGU?PsfUh;fPcVF!uG=^juhT(bZ3Kqh3JWz8xyKK+ zT#%Bt&HWe*#j6lK8Om`743*#4wv|}4|AvpvF(2jnH0y(xp*1PQk;;$V-&hvvJ)mK_Ry)rKP5tm(-oq+#Rw=!uc z6NtI#{rwj|&`=lUZxkNA+r%=DD+1VnFNRw)Ci}?HYW&x6NVtY!F(qV2-G1fAJN1&4 zJ54;E;)#7pcbYijEEEzVDg_Vy)q%;stF3P+lai1abF0nG<*sgpk-gxF1b8<^`xBM| zfcCrWUAw*ajQ`&{8(nR3u@&HlIK;)DsJ#_Ye5@LF6m<{$=8CMcY)pAWHrYnWwwTE> z-8GflX17yQQyHV6|EIAp52tE>`(7j@Q$-|1MWRd%RE7)@g-GT(l@LObX-PsV5<-Q8 zgph=G$Pjf@$dn|ZQkfEkM27dXcF*|@&-2f_FV{Ke>g@Jj*7^?j{h7WOjuJ~xlpVL! zu9}ZMvZH3vn`bAw>hyWSLPXe@&&34o6CS;P>G;3&Ywki1;9MQ3=eXP&9e4Y<8?EcJ zr+K~!JqyG$k2rbj&K=6D)->on6QHv5hk3^-Klj%DqUNtO%*HXz!5V8^;@KUtff8}+ zFKpMeUm$;Mj9i{Z`mWbHUfyeIEp{}?(DcF@DqLa2)OxV&<@oHon>%9V#h0t=r^p}} zhnor6D_t&gwpPp>{V}*;t$}qFC)O-AHj{cJ;v~{K|y=m{J`nxG6arX6q0g6ppnH0a) zFY4!FdC-$_Uo8A#mj}u!=_%Q&9BB)0e`&eI!~W(zGe=Q9R2-$bnTPo z246m6c};?y48tBWqa?M3p|yg;;=*htQTSs5(|UW|L$2+*WuiI;sd=ko9sJGj`q^6f z1#e97f4HkPO#ul!EF~}P7nn7LqY@Jh7k0l0l|1C2MWr0|9WwO|WrXPx*V=h&-+(ID zYr$_`-{h)gf6a}iUg)rNdA?()xW4#S-WwZ}cXL}ae96Q9di)o{9-Pr@aCiLPI5kF3 zOX@Q+1(3)(U=*=$gU$Zn+!&%Zaf5$ilvf^Y*WU^4as0O2TH;#^2x3W{s@M7&pYwrQ z{+6SD2wtJ*t{{8GwaV<4%XtCc+OJ>DCsJANaIIwslZ!e| zG?Vs!kqX{$A*%Ve$p?p-rm~{n)*(w*fH@3dGcY59xe@%6b|AEjmk_yNl3QVuTwP4q zZ2kR~>3#QR|3#OWn2F$F#>KM4?tznnd_&^UVy+jgYpJ*>-nnFduG2O9s_7}=_sW|~ zB&bj1puf@nr_AnKcIK~534_YtQ$NjVPdAo?Ub#5O*X7sbz=)5!_d%4RphS3UWn(u5 zZnPkJt$(Nvs4n<9NR7-t?XV{Zwe!Muct`NbG2ZGG(&u1I_Ep+cD=k%NLXhq*znJ<` z8Hn42AHH*~MnFKo(WBzsrvYXmKLNQ<8)d8t9nR}#t@asv7PAi4{G0pz0cL^b8=3U0 zQ}TM9XC5CPPtK30irJijg$}U0)7B`Oj#5*9e?Qi6j$J88xfrdOs)Q`^+_`go72>;P zo4@r&uA+(GSwRl|>YsVZT=v2{`vxfH4C{Je+YX&60d#l?F! z2G>F1W4@_g|1aY8@MOlyYN7*8skC0>e3>ubfUFf?*6?g zxbNe~3BS2}=dgKB`rV*vyhT+vxg844cJA7xEnEdWALPLndHLnb0iC_6@CQ}1cR#p5 zMYrC{Kr|b=nLlE*g*(en7d*C$h>ji|83B}70KGm`E3Bf?s`I~EGPF@n(_A{FZ7a%L zJLO}adm}wW&hqJa0LVx*T3Q*9GAa6wy~hjQ1hh>~t7gC4aKF<&1h{o#!ds0S`gmxK zWmwhq^t`Trv&_XPC4@n3fy1ah?F`#7DL})qiZ^LMWcF3%^R#STn*c7d(MtOJ8RQG9s%#^|n#7S;;_L$zun@Eef zYh6ygA*&7UU@_Jj$f{XIkq5BzbcR#sd$%Gtk<+z09<)^nJ$m1VTd){(Py zb!*7H7AIsTEfEdp6e{!hPy>ZhPr$gI`ZK^Li1Wc`0kDcsO!NgI)@pKm>vd?yM!INK z3-iArIr93_ASZAc{OI)BeZMlj`EJ9PI4PmcND! zQt=Q%Lqp+EW(%<^v4|E{p2>F)%)NUz%I7iSgf4M^ob>xWGqZffip+O00^_DVB`yiz zY)h?RYSqdxETAG`Bo!1o9OaXtE8{k@wIywhjWrFV0hk;=Uh46Iv9XCm;oSk?>p=2! z+_|3cKr|`MC+c`)`rO2`R8H5LnI?ib$V{z_6RUTyyisVsaxJ9zs^H8Pp$|GOLkKRo z*lw?U6W^zwwM9mzptN)v7H58+45HX#1UDw``t>`;l7Y1%;gQkN$IP#hoHSv-D-Tjl zmQD1hb3ih@(sFj3)wj zDa#GNUPWtG=&{u95et>zi9DddL5PU|MKBYrr$PAjzS(O#w=%J6NA>c;ul(ajkah(! zNvHpHtFXn!Ytq(l+sL-@!K_r9Qcp1j1sd{K-Yj9SRZM=_cte3}SIU(uvMFDp4ICUk zCZFz^#vK{yEUI%Zk+yo+Y&yo3oImnA$v&|*oD0StmI57aJ&5VZI{{bc$BS;u%&`1k z6_(cf0FCuMdrsW0hvfm&KeFqv`16%j1}x4p$rTHI<4QiT-++gDD=UkShX)CF8!vjc zxH*zBk{k5ZL9}9h9Pe*RcsR=|#3~u- zpsUL!x*j$nIXOe|*p|+x$oI=Pk&1s&pMb~)&m&N16yM3q&X$mo;qqvF{8%m1==u1p zT**5ht&FB=84%y{G{R_WBwEN;L)FZy@*4^FWFFTLcQ_}ts2eF&!q3`$f=Z?C1dYMmo zH!BXB>2B1L4mpKI6_!rpkM#g@u>$a}S>rCB^mC+3yIjN4!lH7VOdb_f_KS;}htmIR zKCQubAvSmWr?0jJPg0nk^zxs?RQBc-x7LC5$`Ry1aqGBJ5^4Ssuezit%ucq7}Prm^f&cV|5qP`x|j5n`ezwYeRnc6)M5@nkJMT46iI@I3PRZcDh z^~N0!P8;}PDp;?4Xj*kJ=2SVUolsSi%|HZitaUtkl=;_?oYLvNOGi{rJ&TX~kL^;^ zP;h71_B;t5G7?v{wfaGs3W^BN(g0xl2iuFe{eeMZw=8_?<+_ucSE@V7UMms*qWU+% z6==i3$+V zbV`2<2P+{vd4MhsWJ0n;W>@@)*>7u%<#|Ov86WG@-auQf{>u4Owj~R}eGzY?#K~4< zy2M-8?ds1CFBLYw;=e`o$vWSZ`S;qP+@)43L)Q(EGUgh@hcr->&`Xf{70MkLF!R=3 z)gXG-ZB$CnI&0C_GpN8HhyAIthZ_dH{gi}LKKBNA$C{*xh8A17&C!ypGF@z2_S|A1 z?1s`<_z95-Cxc~#Cdq;g(t9Ta5k8{@ZVf5g8x|G#^`|mn33z0b<6YjJ=C+R5eaS(7 z%a*|?pENferZK;YXYrcP;=S?Ha$U-hXVNb)8(|1WNPB}BXB?Ad-4p{vh>I32N|#VE zuKYMTI)7F;z^6;brh5ufc#Hh)Gr|tBJo!yNgGQVO4_+2Z(CB6h{;NJE<#obpRR(2l zr`IE-*>`#6U$mKM+pemZ1SeI7&5Wkg2??qU8-c*m1hIjFE|{H|$&^@B;f4^l+%y%752vwP<>I84>x zNy$5hqk9AM6^kOm1a=w(9_u^TeXU+T2|R1m-9(_Q9|-LAz(^GzcDrS@ZH!#obbH3q z1OtH1H;;ST%*XCZo$lYG8uz`!L~zb>u5Mv?ZVjg*Gsz#OHo27GcKb6JW)+}85Dndr z8t@fT#g3YrJeI0FJ+843P{-vJ>os`NkcXU}zPQbwG@$7k(Np2Sdi82NIjF4UU4Q01cbuuWoxkrlIb<(0J4KQUQ{cVu z_sS|OgOJBJVFxhz03o{*t1x3gqj5$&6H|T76tSfMQ6fQpHvJ)m>@*;Z&_M55T&gYty)MBH7zAs7>z$qYXu)**NTxE z{MQtHVRa#$pM1|0oM>chTx3<EtUs?|@7-Wn-+p=cX(SMw8XNB9qan(ntI4-RE{=y}5G}!C? zLeS6Qj-lZ4dtF$?G^z1pW4Q@Y?)dMLb)Jzw*hn%SLPZiDAYu>1(HGb6qcce{%iY!j4kzjLzrkW4KtuD5~b%@0D6962T}6O-|XHcq{3wMMVtwyfjpd z02=mzZqn1UE^&?@jj$;g9UA&^dOq95$q>8#*TF%^(W?9=?@TaLgLt^*#JXsA<;wg= zvsD~teU`diJ8~wa!)YtqdB#i`lp|^+10}*vGqth`z|Dl8@9MnQqLGrs?e%@>Q6p%hR6f&me3Htf+gHU>js^ zWu??(BIdY0?pU0H)$#SAmuNx2PsYOOE6D9QiAWiQ+}=C4E?f#?vkUVcP!FWtn2MV5 zjQlpW?+mGw0(S0{llPlbjEM+>i)+K8@zD-3O7zzgCh;v>V!z$s8@i@R6m(p)(h0TF z3AfVW%P$3$SkMtpVK}f;tgbuh&9xqFYjQSyXzjjh^xsQnTic2uli5Jl;;JL;-GB#p zIS+3J;S)njUHI38e2ob?Fv>)*Y6!yDroBdcp6$I;pv~fSkyZ>(qSD;wvHdwr)o=fE zX%QPK_=kFlh}-cx5y4K?vX^u-u_*DIv&c%)x=zr#fcT3Gf!mhnsV0b+&7z{B8#n6Y zwqqN+_|$>crO~}MA$kwP8WP=%lCXh>#<|)LtfwrAwdag-8k(9Q$wWNrs}rcxa>8~{ zpYXy?77-)qGmH88kegy_3)RaZu+T&3AF7QtxX?dn%JZ}1A$c$CC-@6sPmXSdI097i=N=zGnm6loOLWi#1gVo#Q~TUypD1EKo(MdJ3 z^n1@eu$}$LhiVAeh$2U3R@TCM7FAh(cC8Fb588*mdP6`PT3v-6-wfm`Hf(|J`zi1k za#O2J&+FHKB$~zr>k2p3%QigoN}oK#%l_;TK$OBhPwc1M-koi2Fn+3cM^qQRjV1lyuz=2>VRQsEQ8UB`1 zQRzX?28Zi_+GVZr)_pSMNN*Koe4Y{tfV%WFv@g&D2(X9sr}%$M3l~PayrTR#Bx-tk zdWR49B_8nrM1hUtA)6hQOqmhAj$G_ftb!_c&t1Zyu33T1RymTmh@Ifp;SXzZE@3dK zV6&Q;$GxCP{h8mt`x}xFKHQ4LRW)v?L5`9z6cm~{ae08+L?a={scmY?H&-77X@O+C zGiDLg1#+T}5OF};BcJpY4l%^*?3N|1BbY7neLOroK7Buy8n|6bs@|0F5~Lx%7B*dA zXjo^^upD!Ayb1POo_5WM8RInHWLHu->N=(i-7Vr6X?rtCBk($g8WZkwcsPVm)gJ-) z+R*(Fk0bqSq8}Jk+L6D3OMpLy+VsT5r#0hBqK@bdLPQ?HRc(?R&wVvHc@7AP8+4NB z_9mEuiC4}g>S<;)H%eUS?Cktwe0+&0YM@%?nk6CkpnOo{W)&?hEk*tml7MUym@iGY zK$h!VGE?>r)mx1q1@-PtH_Fk9YL7FTG1AJ2k)ET3-UzOS7;uHUyu3U*@7)G~28<+l zpi>eH6;utn88t5W1?mp(m$&Lat9Purq{H(R>R>=5cP&bgFEc`EAl{F|1)d5mF~rMH zM@S#rx}!|L63y~W;&o36jiSo2UrHew?8vkX(9#Ms%Hd%;yRvr4k|irIo`3l`Bl%S2 z_x2ExOBQE;g%yELG(4ut$lm_$-7NGOUwf;nuyI2Z;#Z-9w!HT_(l;RKT^Ot7!nn!G zJKvWa&V~EFRHK6+)?Vm#TSJyQdPCWN>QqVG`GSU{Mf=5X$Q{;##iY|!fA8Kzl|Vmj z?eNi1w9V($)yOYrgr!QVKOtZg_y#2hq_q}Q2|a>hD(GiXDh!GMsV2)5)>ZF+|LfN; zmr{_4@9~N($;H3 zCw~4!2f>+41blwMtNx6h^$gpdxBBh6K6`%V`Z_$k zda{Af#@8N-g^r3Dq4A6l?n%Wr|+618}Nqu?Ij{jau1O? z#xs_zehoc#87*d5i(uwjrY>z=W{gnKtpedT3-vNpkAUR?$$}F7Fs*A<*hxBs1tnoL zw6}A1^Pb$voNH7bL5hZr3MoEYw{5HV_3>ip6}Sir%!|TO?qO2kg=yl0jvhJFlNDnM zRnv`tOgE5TE*rZw}JBSVG z!vEmlPQ_m!`2O_Ck?g;8t8MV($B(zZzSvj)9--ZXd@K>1$a6V-t6JtuCC|dtj}p zQTjg!e}3upYPMpnj21gtz);b3TY5Se39*EFgxv}V2>kt9J*sbj6Pc}>Jh(h2lZ306X)*(i1Tdk=rA=gxt*02UM5N`(<$hH zSz`ZReR{maBDdXHKI!k0A>L|Z zwlV&?5PLfJ;gs#kD@hdtYj1SAZoknO%3WfSk2*l|P_`u#cND%DEB8-`Q6f%K?@E92 z{=LZjLzKG&E73OmPYv-G)ou#NvTM|-hJSEe9W3PW-lu#7@T6O6_1}k4k!_<|B+Umv zHo&$gjOj55FG9PSuuPvpNHjLK@4GK>OW@vKlp@%$iNT`*SD`2R0uw?L}N}fQ$X{q20Y_XUA0fDGdU3g6jxpYLt zUYrpCd18>uQlhWDyZeNE643VzCW{skyF(-6Q`}Gi!SK-r&(08^ojmFpFE1~w;n}MJ z7#w7wR!%asWzZXN%!_CJuoYojNz+D|1~Jg+zS8heG9ud^KccQmz^$ z|DT&iUTx!NPnYoV_Wt^=H1;R4Fla#DH`@d#wQBmy4Hjl*(0JB1Hk8J@W%wPIHf$ci z2dS+JxFXJN=Ctybp}FnH^tReygig2=m)F|qF#fepP^>$Z9 zzli~WpSr9`U~=F_qSU2uYE4W`q-hweSg`^X!Y`D86DCLZPooy@lg(!f=53hyGAOb8d=BW3N7*_P9_TnboFqT6pE2m~Vbq zTCkW~nw#qw42+IWCFhys4*m=-PG~s&PJ!8yXHS`^BpIyQ*x1;lG|oPE2Bm;4Vjn>M zxx0^MZ-7f?7J^zo@MM4LffYR$SL1oSEMZivPRKi3MP4rX&q-;RlzVdSJ6eoMip)eF z3t|da*!*%v*#}n;Wh0#QL76{stRXh^!t-a(4oL9WlH}Yr(a@m&kM1l5&;zH=eLaRP z4}zVFZ;h<7D-=~!Dgp4%WDY2vNa=@Hul_!Q>UV9KNikK6{7;(qU}@QZAO;d6%xZUU zp_iv48$b-U^)SA%72Wwk{vl|c2VHJ1PEH;>lM&;9NQr(}KDMHrMY4CANv^VR^kX|# zk7dzy=kD6^x8whH62|kDz!UQDKkz zfCl@Y4eg%|imLbjwzwz8eJ!kmfEgJ#6e%*g7F8qG$!V~cQScn4^|GhG{!kl^_=h>@xOWLg!GXeO z8xX?{D()jJ4b3YMW{%M`4Fl0jnCNi)M@;}3r_sNhVne=vCE>Xs>>w-gq<=k6_SJe?M^dXm?K zTF7OO79}0&#I%)bx>fNwwlu*aA7;5MWSS4W)&?gRTPjc;hbZ=IMsuyJCj0IHV-rcI zCmVkPWy*Z+v7`JMq)hcVd3cP0xd6`oSrL{GN_?zVAyjRAwf-|aX4sF@+*k=>zYx{@ zF3YK`tR%rrqqZ+E-<7REspZl8o%357oRiftYzT?v6A^lwjKE(}^rM?M=a-bUyV1hS zb`UY3hCcWAZ(%<-1YC!i!eRbvul}=D8?7W{FR7j4zG6)Ko(bZU@Y97 zD51$t*V{`?urbH$@}d9;T?Z9kd;7M#bJTA*W7Wlc;Ygw2#G6MpGM-|~JjH}O#jL4v zZciD{WS_K6M^!!&V{=iimypY9aZl~dklHlza*=?t~9-m_l88&r00@+$A9 zwtrfm)CMBhEDV5($bGT(>(`5kwIpbpFsxlk-}O;S%Lw{t{dxYrk zNkIbi?c3tURYdHE@4nY>+`vww(ajC0btir8y`-Nt?yCeYPk6imRS6z$nl^|?Xva5h zBu^uIR4X80HaiV}?*FY++tYtxAG)R|{&xp6)8z zPJ+-}LmxBZ^s}n}~IWOr@|23-ZXu8yhe+CQ_<`-x zVBQGZKZ*b&^2K{lVp!##_dg&Mg|9nk}Fb!_(|Vpnl1sQ_Js{w z*fIR?mD}U~>NTh?db{%??x>)sy<;a48$I?nq zuaWBVpHEdcCn#*+PNnK%H<%~&E8)x;8XnHHeT4F_Pcfx`M-+}svrmla*Bl;~So^Wbj=9Ux>lJ1GZHXu$R+?GP+^)j z)agDG-sc|QJKiP^_t;o1$;G#FrSLAFJQ#lfs{l%viF z!XgW$23U6Z$I7t8#wfrscuhYG;`1q1Q4C5{Fd-t%%{Yt+=4Q3Ja*#G^+(+rrr21WB z@MSyf)aFPd@yIi-ISSTwhN_-FbKX~4M&O1pHwm{@z{$-Sd zBJke1K7p}KtTkBgSy*r+fKqmg6PT#er>DX=R)2+n*Fx#*TC8qBeZ*sPXtXJ4*#l3X zRuH{~$&s14hv#WZiZBpza_BNnHo@+$riK}ft_6p&WX9j?8ZnWK$GJdovqDNGzWE4s z>QY)igzGWC*?&hxr0*@S(Q%B}rephL#1-FY%_itO&6^sAbmaj|uR;U3$0v1(G! zkw2wLe9+0@lS^cocG3$DDW1!W6u^nFb|MB}k5bf7qnKRc zp3~~scwm3Rlc-#W%YlS}?R*F~@DX{4|DSJU;MbsoE%^T>Rj2M1TjWnH!M4TS(oBc! zG!5}5x|yDz?m0R)^t_*+pT}W7xE%;u=ZjE5T?`nEZRyexpWk5UDgQJHbgAfA69p(j zHwKTDfsW1@Y_hmHIDARQ=22owigacU)@I7$2uBScA78&uIUY>XwQE`$kQlh=>b}5K z7*Op6`hs}GCr_TlOPO+Va^hK@8h)*_e#zQ)lq*+jYlI`^jt@g9OlHm-vs(UDQqZ??oI&{yn6P5#0k`@yc*vE0+~`Ae zw%5QT+hC7%|DX%%f3}_us_@>O4gR@M`=pM}^XBt$47+z$*ruWKuwWQDO>EHvYg|h zja2ZNpozj}NY8C0NY|`wEHb*ig8!|k7+A0t|J!NnkayX~j}G}JE=8SrCQ{Zf7>O`L z2_6h-$TFQvuJ6D7yy17|Vp&m5@z`lgCMgR_Zug%RxJzk`AaKxUM}amR-6E=qCF6e; zHRO4!sBxgfr4n+AiV>>cD4>DSPNN(DqF%u{!E}lS|LMR;7tm%58xXsHW!!K-JiHE} zbzuI$e-EU-BDm)RmgZ+Lqv+D4Hhy)k#j?9^RqF$kSa$h&L&L3IZ_k&BEvp`$Tx+^q z)U*{pdq|hNnud<%+qZ4w71AZ_Uk*>&JoJE?klKbQz$?*Ewe|L?q5am6m?ln?!JPVrfI6)-*m5D;4{EmbaSvw13yTB)#B0l*cmz za{7`zKmANUs(2ZzAM}P^_SzAg=Q1z-iduWVf1uwKkz(d=!@~!2+wmNJ|^1;aj%YQR6XgyUW*lX;hr!*KUQW`ln594>>1Uk-n}#UjTkE#0!7_U zoZZ?u=-parYcY3!6Ra1nLvRljse4$nxK>uMZb=A^hQ(Z@at)c{1 z`e*@*;uu?aoRxHHwaeknx}pI7jB&1|>9^LQ1TCsU*IY|&5+6cdS8LR%bB!Agt{|B280%=`ZH-5F;X49UIcoW1wjYptEFj*IOb7e5s*Km$zY^}Y=vD=7w3 zwq_fQ;`6HFSILNx*==D;DQkL!8iX9KN$f1WQPh(h`KQcpBL>BYG%FcN={%9vX0^Pi z62rK zAphoSSZ&6B^ybnsE_BaCDY$6BOPMl4VT@+_B^}JVY)C{)mm0B1qw-cGZ)rx$lCc~7c?rwMgPSxB_Epjpo0iPlb& z$1vE^8}y=ZWWD~m=P#y>XTf3*m7sU9)dqJ#I^G)^9xps$*5iYk#v>v~ z%{j-twkqDja1{@=>(*K$Nl8gd)_Whm$ien5pIwi!GkM+hM37EOTKa6l-qq*l zdv@ski=c2(t-K4qw_9uWhgKn4l(Xvm*aH|WkFHbjc6_&^h-#WL32b{|_o$(<(IjOb zeWLP*reNH^eoH1NBjYY9A?_B8jXuhTNI^|UXED%nq^2hidGgv%h)S_gXH7j^qx4JL zZR_}MCDNnsQh^&H?<%gHjW}qs!dF>g;X}|Ho3z^6+Kml&I1d3Ey#)q~#jdWdIvo

{N7P+dVGAV3j}5^V+J)PzyT&G91b3ltjAJl_Dbd8K9vD z+&Sn)xYTmYUECT*o`~MWSma3->=rq3+1#aszskDQD!L;zbaCk)sKSfp57rLNbWy}{ zkYD3;L;_a)c&FM|QO$*9cV0tPk#x+20H&r%-s#CuRO0OKUsvc<#rq)5fi7_MXOC{f z65N9#;YIz<((Bxc-1xZP4Y`Mf@({rviL3E?XV+1-@AyM#IxiEp4XSHvySup+xH)Qa zTo}3i^Ja4J^`C8IU|V@&o`|i?o~h~_ZlZI<14GEsyJ^MB_R^{b_J6VE1dE#5RR_-1zeJtb2K%Zdzwsm0N7=DH=tB2c}Y(VR=q#xdY ztXQSHbwNi+Pgn(sYlZwbwF3o zRf;A558-ZynD)ryGfYqnqz|r3=-rsy2)EJVFj>qIH0YbX7zi0M z9A`Vt6NC>b2M7BxoxXbjS^bOpx1$C>kxCfL?b#yo&b`B4zGEt4p9P}WgCE`=*@9pd zmvYErzJ+Me!04oK0$0yoI1p~mhE1P@F?9E5&Quc`su#3*O{KULbZ=}@w+3v)pIh70 z&DdU7qJ`p4Tj1B0d)EJ(DhhPaGU&rvGCK%+&~^hdNXjR5TWiBP|3zvp{`q?PJx?H} zAx2IrX7z4OYpQ+gg%)oSw9yM*A4QdWR_A}-Js=yRN|0}iaq_}v*w0|ek(tU+s%o- zNyxS_-+I(QI9A48(nh7&6KStHvbUew_~uv2#lOpSQ;l)P42W@$PLR#+EpEEUY^6R) z7$QY)D;>A6-uw52g)5hGX`yH$32ts~PR{77Y6)z`A3l6&Y?RKRb)RXfFDr8uOn2B@ z^E=sDKFH^8b@gOU z9fXL}u=HkAvc$;c%*;&I96{fe$0>G+u+FXbWLr~CvSgmylKj&ZwhntiVG4-nM07A1 za{@DIZ*MPSwsxvn62!*-p}`V%9BF5wJ1-fhRf)CWcTg;7@63QSj`85Rii!#&Bcn&_S#9eyHy@uxqo13zv$L5QbjuAfhP29g_in*c;_7Xg z@xj6SNb|>!Mck((3=CFRRu0y&5A>f;O--Tr8+j!q>+9=}ezw0@UtfQ=DH?YA*QKJ~ zzB`UlEYodyxS*@6%V%+bMy0Z$VG@dz^!d}5A&PPp^Y`^-lnr|Orv@BZRH}eD{TsO) z0d{tFZtmqiC|wvVqIs?B#8kbH6TM7N<(ObY*NQabWW^EHPyGdRjc7UkX3XwtX7}Fd zWf&}+Sq5FrYc)G~ee*f&Yj~lPB~qExtG;P@xmSwCxnsVqQ;I}@hlgj)E6OJ5@_z4= zN^}2d-_g-gWYf;~XBSBR3}j0`{YI{+78ZuEcZ?K;iFPA$Zz+yXD<3vM4gKRl=wy>C<{Oq#a zzQ2kIZl0-|30eiOd8n>#Qu*W}-^^$5z8h2Z7%QkbFK_O66-i+pJK+4;GH~Ht@WC47 zm;h%Vn#_ zUtdw(qNn#;8?SuY9f#i;QPF+y!bNnByzdHil@;CXJyga~q^uUU*n8vjVv_3>s0!1~ zAj#N-6NbUs(%4A}yDyi!S!_f6r1#f8*ZPq)QQDaNu@NgH^NdijB5At4wzoV2PES0O z{KoE)vx^JQ-MfW4IohO7j*bDF&4;F@rc>^R;L{yVQB|&BF+s{;xcWdtL&M9pB$|FNHEYs0+upCdrLox^_@zl zCME)p_nhLpeYSqKQ*mk!W|J))hOA`9=DcBQ*h2@P6IS40n);_nLUr=zROo)Iu%D$DVyOiSsOGH3OehFgP z+fk>P0oQ{2#RLs!Vuvn}!(jIv9ik>&-Q83UF6S9)xTJPHdF9U?6#LiVQD*rInQx!r4jt>WlBX z&+kfI7tOFDV2*mu0b>$aur;wa5rYT#`beK7JLuzDS)f2(U@s@VJ2 zT3}tM$e>i`{xIcj{G75-e0P^UW4j#bEQr?@UWyPwNmR6z__EvP~ zH3>+9kMGUFm%^f=94X%ze*WytOpQGEIx~!K>FC2oPklYT4$DvF@#V(zN_JGv#nR56OpFdR2F10_;ND_}41l zGY$YC+lNl8Y(z19dgcsB$r zU8^UAgoG|#zT9cK+xF}ND9o8+ZW+@4?jXR+OsXpyH>3d4V$tvbwZp@s^>hcdY`pZ2 z$B5sgDuU7*WV!kIc>pKUH49Z<-{{X2N3ZT52Y&#mBO@~tQ*QP^AlGRU6!UV!)h}Li z_I+sz`mzh4VrZoc*>yya5x=m(ogVo$X5*fR?i_`{!*<&4-e7*1QRtMBVmoS2^D%(bu(d!Odd*B-;=n~xK;%+VBa}9ULN-)Ic|@e&BAvSr1`^jY@OfwB)E-} zke1Ms13L$Y=rH-o@$tVi!JB-^*gXd5i&tLvTs_E8pfZrM@Tabx9nM-cz?VBBFJmVs z{Whj%~EmM1i)+nQ}-ke`W7j9AH z^6BtfYtBtrThH~t)M$VK1|>aI^Ss!uK8x$EULt){n4kY+?24xla~o+=PU`5;(64ic zrj7P%t(Qb#Uui>U8bTD%4=*&vR~qp_MjQ*2iakTu-A~-T1W&S5lne}z7#{Vck`jh) zt?ztn%8U(l7htfLc|U&qcq2X|;>&EEMUZ+E0u53E zX|3x~#)NC&{-}}j0Ok}c?oQFz!h4^b&-jyL*Uq~S-A24t_15hj0dE~Y4PMCNDk&{J zJ7FP+rG^u3t!Pk%$0O`xZg9^Dzv4=8YmCrekm(e>XY~s7B$Q1LL`Q%_mL*{&M@_^~rpO zJ3RBz$%%(lP|3T@3iEpI-eWXhzxfOSKQ{$<+`kQs)5#p#a$di`);NujvUoJ_k97&S z>kkhP)3*+{bHTTMDkKlpgq;y9lJ-AyI%xD+JWz_h`mGUu;Tb@Y#Bm2OWRnPiaf+y7 z&sT<>Mhy9teo!Bq`J9IZKu!*k%RxWbbweyV+< z&3Ub!o2QwCFc{nW(BQ)gE9fj&;cx4 zHu#RV<7(S0T)n$QUS-e?M#iBYIh?K0@`Nx)awKJQNr`tGhF~eRjUhmA!ecO6p5Na@ zhj0ojHFP#j%&o`*V;=H^7`nZ(m`N{SiF@a^JsIk3K1bhnb-Yue>RsI5%R%g6h0?axh(ar?3|Hf!f^Si7+f>JS7^^eXbDZ_&f`_{ze27dLV?zs;ZBM}K+ zH>t*W&vw46tR}lzjX!PrJomfhsk9$cSW)@z9a%u9NW=-#k^kkm3WI&i5ODiqv%ex5 zL0O00-$4oF@Cdv%09#qJjXq(Ikim^7=h={o!0xw#Edl%*S9!B$-h&tvDa(ApVPAw` zE|)h0rkkDrgHkbfLn@MsE|u>~&}fo?R;Gx+mZnKcTs96qTe)6@y1JSSKW2tft&UIt z)_F_@jDWQ87iD#Jr{ZG7(6^kky4T>n zu;B|%VY%&VJq5ypyOQ?KInXee|j+bQxr@_?ro6@TgIrj_3tctcAO5q!4rs*mGZJ~+{8JSJQG?f3^~6_| z-V?l^eQfZKja%Bn;+_>}gd;t-+=Ht*zoi>4#ywThB|o`7Im@GdosqF$a4nYmH3;KI z&x4X5^L=f}zL13gw|v#&QgC;SyzURgv;JJJW6tBN7=cS5!7NEhNm-tbTsE@u-8X9S zerl)Eh23<04GzO&$)G*8@i_(VZBl$gdi>^K*1bWsATPdjRo#U|GUVZW0Ego`kBaVT za`5ss1l1q3dA;L6Mx?Nj316>*k-Jmlr_E}{#`q=(J2UaaM-Kfumn-H@ry#uG5m*h< z$9mok`Sb854FW+SX25xd`7};9RLpvx$#=^`0cwL}oTSg0NiC771DgiaU9B9|x+3VD zz@v_d(nXpI(u`RR()w||!--`bIqBxcvX!p|IGbYBbq7{6$+1zBc8!cmAYN+t{^Sc}K8*R#0n6FZ8B!Fo2GiCtH&gQLU#YVqCw- zgEvR0Qz>`07>6V6^+xU=FmWPX7onvC75K}l(JXTbJDXo`BO{Y(HG9%;*OedeRuK7Eca&UQ%xl>REy(_b6H7e=(s*E`i%kzKJ9K8AdWK9&}#+lEwr|Q#vUMZuQGW~y&aMot$uUA*ZNLBVYZK_y6i~grT3R#4Ts)F zzV?$I@hvA(Xp?ZjZzi2Ko-MCFIPg!f$CsKZ$K2F0%=a%PkeK z%F3!yrtZF`Sa^fTYH-2tZH|DPkuUVyyubJRRFFUZ z+kz;(l8{XBKKWG8YPneEItBFi#d*)#L^ZN;qd|N&q`IUehB7H9r!{DQ<;Rc5IcUs} zAE55Gzor$quE?Q-2pQ25AF4OI8l6{Ldw}ozN38H=8n7~L{*v&eL1?Bq82^jk|E?Yt zXJ^;aa-?a?)?LM(_B^IPi`oOWkOrOmjg&!E&6)Rh$;f7v@N+mos8r9ZN0 zXmF92J~J`de^t^jqE+sD-o!g388;_DW=aG|9PkI0;P$_&YH9Vy-V}BuImQeqY5On570w6O+L8&zP{kzoHu|&}sMbnwmmR z|8B!!o_>A@W**Hn0l0KX*r8>wKp?XDv76g^zIrloGOVtyPQWU_cWHa!GSb~0NuEXF zDrTZ`?-XvXH8LrknPIxhUpr>uTHHAJ*r&2yil^Cm*%jHP3@{7XV&>mAc15K>YHGdJV|mfGqNPBfke&h7pzWCmIIt{?tbCKQJ>}>?#~<06!Pj9)By`jTmy` zSlc}k(aOvah}RhHE=WFg6_QJq*^ROmBz1Cf`ru-RzX=!{2U{ELo<7(lV`F10E05|4 za68M8Lc`$OURxk(;Dp`8GEobcg0Gd1uIvXbqc3D$$jZnF+FFuVjAuGMWztCDC6n3t zHhcblHKVZf!)xo}jE6;=cVjxdrt%r=I-NsT#npl?u|%9g=iPpd0i~nQ*J$w{teSuz zlITe2>dCu#A+MpLyT%p9O5A@Ng+gH}EFft>G4AYmLp=-LzW)B`bm7IGL{{7jVf(%< zhaQDLed#{Od&>$bobvwPeUS3U{d}{BOo1Ew4|aWuh_e42NSLJ9nWW4~oS&cEBUh5H z;Nv(#xx9nwYdKHWy%Ta|Q6qL0K`uU)m0^o z9EB71cB)=ir5H@L^gRV+zEOoBGN$Yh2xCQgdwdw=LP*=h>Qfg~RJivhv3s-}+5g-I zv|YJLwdzPsQqpx@YFb`nL6@;IJOjDK5M{HoyPL{u(y@EGJ=aZQl2o?#W3HgF6@Kzs z7RwxZJM0#lRHzZPO2#onEO)oJO4Fa%-XwI6W~YYCwmlXxIMy9`HQHM2Rxoy;&T3t? zHCHYNi9Wb=;IiO<#@o7vqbFG-qwMF!$(F&q6@QNl)-@bW9W`NfR&a^LK73cf_+Kp6*RjG zJgLbj+UtrhyEW`*9bGrYVsafnA2eueJvzLu?2bHkeK|Qfc}JN5cHPj_bn8CiKFA~Q zm2k1Db82e@|EFOV-S?Ag`;LvNPy# zB*ZNBSzJb(5BI-YKBfST;3-vq7?7%%I4!C>97L0m7COc$l!|c(dqgnmYgHK_76tw2 z@n@Ua284F_?TkXnY;CO(A^nhBh9_klJNw9lx3-F;iMBiaOz9GF;^~^>$E5#afs6O~ zMHrjliIx!RmSMe{J+y-qPw0EBNIK-}jivZH`8t<*tGWCX(1Q2|6J%J}kVyZ6w^N3F zU9XkpoOW%JnOH(r8Dc54l@ix73y4c_Gd>FcZk?EbOt8)PfxpbKudHZq-S#D9zoMAc z1CBp?%Fv!PP5{eC-Z}0nmeQ3E$}6bc?VuZk8epNu*Ax|WEig|_#b9)%F}Z3<%5{v0 zwDm@t>a`O3~@Qf5a6UFA9+-5T(D=7k5As=QB$_9ERhp~oV?RB0E;1v5U^)ln(x z>Fal@R*$@^AE`n8Njg7dPs$$h8C+$R4>tVUUrHP|$9v;4P7UxDu(prSh#)#xK9`j_?8niUcdMz-m?9bN@tKu_M?-jzWxaA z?4-1`w9~S+`g2XwWZ)bPIg2f};(Kv&*}>jTg++6te7-D&lz!GRjZ$gIFX{-I6*hMi zt>UemaJ|+7C;4{Wl9ntLbWazW&)+iNKX&6KvlNANm`j=vgfC}No@N^rWv<0 zH48!Ip7HFwf|ffe>z*T%Dk?39D<$ssu16#ww%ZQRhwGnOIeAagdIPyx-Ps$B=BGGX zKHov(`rCG&4>`^U-kuP^e`c)E_zxoHtAKgE$|MJctc~9Ta>1{TNdK9@MW9QaJ(Q5W zjRwzVV9*aL+NjKa`==&jzdXtR+~G)eYJYz5IrERv(JO!N2sEQA zd0hnQG&!gk4`kBr{HMZ7$ZQgliz6`_q<{yuu&}rgaKz|8^~;KAb=rUSN;V9X(}wlD z?}N1NCu&wz^OsQyuc2H=5qd2Ss%hb;u*iS!LZ<-2(j+BVnpKgDD`s7sAeTj5&&6dG zVBW*c*-iN`?$ZrGwH&s1edn?%t5lg&a{1x;&gGHt&2#p2u?c#323HJuCs$1Fs?@ZI zkRbh8vwYT&-2cB@iOC(@6zSAWe3pRg9(>)2JEB{B&qk^vgoT)ut!~6@Bm&1!W zP}ssdqq{NQKr{x_aMx?v#f1e%2~TE2jE;6@WvIupzQ9qP!f>bii?9EuujzJi+3C>* za2&|_QKYbM94U6onm43AM%$zf5(UiH{6rq$2{HH6Dw@#cS45z`u!&e;oGO6C zf`L{?Mc(lHJX|p4-PO~l%`fQJ(8|t9NwF9CUed7BllbKZxOeNf0WMf+fV9CU_xJ&J zm6<>rZ&G4@HV7Ag^oYqLZlZ}x*eA?%^0cPrsJM8UL*E?r52Uk_0e90&POTBb5exMs ziMY!$HcbBaB;SWT!M3iA6tVS{n0NlEr1ssVXHMZ3yo*zMX{ zDmS+rpi2G?X{eyRaYOaA88B@u4diloOUEZ(4N@}a(c`M*hdc zS|C;FQsNW2{ONWBN|1;iM$FHJDv;-jxh@i$PT3*c_clMjR}5=g`k7g>o|)UJsz1f8 za_{KI8-C2Ig9GrKoLDS{Rnz#N-HZIsRdSBN{RUcMe4l>Zc!FP3x;aqBW9@<79+3dZ z_ps&|`)Z&EG-yZjuM$9xFYP8~h(lw=Gk4u;8D6t@yCSTswJIkH+1M8z)ZuIzF~PN^ ztMCU80*x>e0|Q9|0|Vi5fH)x(wmd$^@n1DbsiY9Ze~fZC5gjwa9rUt5xVSCt*9X~x zq$=z%5OTDT>hzd0g4QY|F^Vo~qQTc?kY*-e?hO#W1|c5*v9T0!(P;_0OQ3oT<>^;f ztsNaHEcO6UO1I-sEz)&`{v*S~ks6uT>?qd(v2@2==^5AC9%758y!B@$ORZ)}+Wzpj zzJ7@HmAmU}ysIk>OWu(!Ncp*f0!8tExs;szx^;NKU2g7l*4faF`9J+Q*2B$->bzR9qt}u^4;87i1$xA| z%Fy>+jub61dOn#PH!+8F&2-hLg}rZ`gzRpR9b84FmV;0Y_BMVLXY>FgAbiEYW>zt8$No!#khKS6tU*Kn3Ax2=oK9N zGvp_?m|5JYlq9!P(}e5lV$54DcmHY(Hh_D`&9iaUqC&NSNIU!Z=L?EqpIFsAd4dg} ztDerzE46tKl;S-~%gn26)qf^}#%4h>&c;LqBU`d!Xn-skel)N0>D0viQH2I~%ya60 zE$8(|I)n^1<2LixUOm%YlOq%q1VlTB0(AQ#-Jc3dbdgZ*nvb(@Ar0l`tB#&GwbM5`Xw|vGQK5yN?UzOzZ zzO{Yu((zXJ0{<$ozOGihk}V@0*jP7pzM4V|yrkbe&FA_zm?LFCa#iUr> z1h7$m)cmBfBWOukoM%Erd#4vKY7+Asxm{m1naNmTls|W^qdU6`3CgN0Isar6SN}mI zvDL|hY$OMK`fp@jUgs~*L8c{bHDKnVkog6yMW__MJTlLp4Ay{|dqD!EVcHFIAg`8e3)AfK@ZY$Euu?u?>RwxEQ&|GiFCJ#pt+ZZ-L$3bR+Mx^kll_Jwabn1*P5M z0|g5Dr^Zop0f7sMc)Waspu*~=v{EAWPZA`N|sa+E?8Qa^-T z0U!(fwapTfJF>iY?>fuxPtD6m8K%$djF3$stx9i0^jfXZfRqN0gAVr9!oamKuS}@* z^wzE{mip>CnBE1?WkAZZ)}>cFGPD@!Yw(0Y>%vI^^FxsF@bAnlM@|e4t!{r;O(*S4 zg=xejA+kigp5V4G4aXCu*(`N%19N!HT~thkOGY8p`7tYbXH`~-a}2NWLus?%x0D@R z=c=SOr3Y2zZlSG_6~ZN&j+1N7tm~p@xM_y|*tPY;(r?!R>4d*1nR2;+4WO9*W=cVO zfC8n;v&|=fN-Kd%oEsROhMHrFP^jV0I1drd$FM&c)l6%}F z*SjtzoZpE3P<)`)MHPUUGl?60tfgz9l?1oIe1_D3j+3pn^D~vk?xi+0MP2}LC_8Bs z-sA_a-)+{EqFVYizG}0Pg)K3;f1BhCMqXA3X8@}}lN{5pjx6+cQya;Av-fPEKrAy^ zDomLCsZcuT3jEYAkZPpZ#RK9v;L|U>>=Emj%jKL=_)+N{EV{4-m(cZOJD}++bc{|m zi37K_7-*nxV36!MQ%d!mvtp=#lOV;ezE1c~#Pi%2Aq;icbwK4AmX0pN{rvrdWtO%{ zNC904T!m)khS8lvfYlit75%AET=H=9321c=3F2@wOaqQN>ohI2u<%Ot5fK&L0E7`W zFey$JQwB|v{!fa6zKyexKJT6z{gKdH^Wv-E^R`_=RE@BL8@_IAxC_)F&WBB z22Ivdca36-lAY##1 z@v+KwfQ&_cV`;Sp3R1o*^yjN20YcD5QC*!3+;jUQ>VldY5qWv2?db=6oJQd_9Wx89 z5z?Vo6{}~nWUp+Db>~gu^lepk)EaJtT*DjZe_ljT=JtU59TLf2`r1bcXi@gUJfuy; zO9#TNtgJGwhg8#drS3FNTRwW^2|R~3+_d#8C8aoMSN?ogy!EI*nkkHq`nrl2aDw8X z+pC$s0ct+#i3upX_U7z=+-(6*8W%>E}00#cLi>KJyU>7US`)Un@v#&&~cTZ{RQYIxQ z6Ipr!#j5W0M|usoV$h%FT^WyinSA!bomK82Qv62jgiLaUBLGmW7M6XYsChB+7cH7d zLRPjJt&l0Q{~62brpst%R_mHB0|j~m+u67yU_Cm2jRQ;5r*{tdW=#Rx8UoEVZrIvS zL!UmMHE)J)f}<>dJQVNVa`XoowqFX2N&(O;99W)~mzRyKLVd>_ZESvJh`OjgBy_FA z(h67tE98U&eF$(=0q_V!RL~B7<&1$}O9oCA@#co zsF$+Ct8BuxGEGYc4UDK8W7;`7!yE^aoB>;59w~mhmP#R7xvo#p|a1%1uf;pII%y)PRBo&hPC2d_e3%i)fFD zDmx%5L?oo7q%0zWD?Wb~tw{j}zRlKi99Xu+`S~g6{OrTR+G6+a@iRDlHM!^rlNrLaX}{($ljTnH%d(?iIA8@PbsC{nfo$mswlN8 zO;XxMD^k_iFTQ7h(wl)={6C!}ug6R_`}0OAG* zU?|53X&JimgF6)kkUPyUcKhn|KYg1`y94?CHTt6a_ttT6e8V?_exsKl_tq0U*pZzW%;m$yA!Yj$ZpdFFGbhh*WVhY)6$NvW) zRzps(v$y5LLdLJ_HTtbL0BfXV9BV|G>E{xVj|F9efkZNZkUarHX4BrVhK&nHO>L28 z`taD;L8;Z*3jR&jJs@cy0<}2;gRZ^(AODu!Y!arBM+T$d(1WVt5xQyy*wZz9z6F~N zj)Mfm5LbiRDRiwmK=I%kP0002K%DQ`27Ej38G5GqsL} z1{OHZz){_6yFkGp1$P9}j*W}@NKIc~9~dbJ-l*rS$+{;0YG`G5%u_1czFLxF6BzVh zg3191jITw#$VDTK?}pWjT=mf9pc5wHWueuw(QnHP_eHzc0-wKK0sOVl2IR z7QV=>UufPG0EP%MC>2lmNZx<>VvN~O7j^(aY`^gRU8Dcz#x8q91!fc)1xdCX%!z<} zalUVLzW>G}gmte9{yL*GnnEXCDDw8{QeONWIHN`q-cF~e2BsjKo$s>Pf_G^>9z`xq z4V;}EB2B98L9fn{{K~J{9b3D8fc2ng=&7rntmeUHug^ zY4labI}sq+L9{e97Y!`{Tv#8aR=LN+gZGaXDLK11JA)7eV`NGiY9Lp9TZUH{S3UuX zyhbYj{vr9H;ja&(RBY_*1@GVgJOYUU5RPJQlY5|fo$loO37{|IhV%=$Vt`DjB|cpP46dMHzNJjc%)C{bVw`dY zTDdVZ$*1g!9-lgY38rf%l5m4fgndnIXLio`qZ7WL?-eu#&!$yE&l_7(UyQQJjw!oa z;ywmfBm#I6F&Ai{%UF^-Tw(1}gK}KX9pV(dTcs(XUj_-&5dfZ-w3Ffv6t77dd)1n9 zC)|WLCC!z-2|CBo@EC%Dntnh7bj#zs#(ltKhoXKNPz~qyF;*Zcoh)zTs|?6bVXCU% zMs(!)NT2hfYFuhcOTPrq`GCgapO@e@;-_~#IE_o_#G;#jAzDCrdN}Lp>HVC-P{^MS zy4RgZCxk+BOrh%56GRGW@=(~%4vU%xsT%@1B+mwasEvpm^Mm<-zhiYR2FAvYLg`Ci z_G)Ts+T5LsM$)sg%&n}LOch)45Cfcku%7_-&48jH2?7wGg(E1X;>EZ6K8aF&o!bVi z{gB8Ga81lz5uZxP%36bd0l%86UN_~9GBC1umz=CLE3)Mb zC?T6wHgA!w)P=wnFgb)f*_;Kj_gbLE*xdZIp$4$WDM|((#WQJ~HIpp2x&Fs< zlwy_LM6!PdTIx~*A~I)xa75J+3;joRR+Uwt6frP(r$P0V zE{Zb6re#pL+dIpV@@7;bySgr0?kaEhEuv?@WUo)7e$Z=akq7PF>=48qHHSVSQb?v# zHxwic`ujgJTgU*B!qWP?=19f7v!IQ=02u&86iB3{rQ;c;Z)nMX0!NdKg5|4y_02b` zQc!7atKa5K=;5?KW^|N>mi90uw+W<9kN|T%q{2=EUbNp2Ml4&=YK?4wq}{fAwkybY zLt_c9r8Tm|#HK*0e6Nqz;<1qt2Gl^1{!brpXl2YZO*@OwFH}xAv3m<{OGl8(}%L3IdXFTn0)9ox&9XndW>3h;&c5$r zBFPIS{v?YOoc|B^{9BAfqT{)&$Q3!i zHRA|T55O+~_QRtNdo#+UHS7#b*j&g1($7Fo4|7CcmSi%=-PbqxE}h6Ofyo^pgH?d} zC_oh+99V+cGC+8NlDX~&)EZf!;R8Pfa|Afqe4jsmc5`#%OC8)bDl=A~f_@Zeqz?c3 z{0#U)3bis-N$Ww`W95ylfzHFuO-Bx=e9+)ymv10>49l1!LXJ>Yg~%(sSP(q;QKHf( zz?=bwvy41w4^h3nAXYxGR)7H%W!*9)(!<3i&uJcX0lPapU~b{s(H#Iy05EPkJHXs#bGZ6bSXh0i#zQ1i`NhYcs`+GzlxkDnT!qJ?{R@79 z=I$m*#OY_lEx$7+8`93?1c$%6UHw$C3cNawA_rnglHMMlu_^L=+JuIl0jrym6&Ao1P*H)1IJ)3{ zlN^e2EJT2wCNo~{m@8ZBZ0G^gH0aFUy?ZBr`ilY&j^5l7|MTaM+-{#RP&Avb7#(0i z)L~iO+u^t?%);ANN)edKxanhDML1^^PtzlA3T&mYshMOovQv*(8Ff| zq!%BymxrIjnzxl|llJC|OsPhn-$+!czLL~y>n*|XB7_y}aX1TmOm3lbOxYGgYEs5; zcs(Pdo9&cD9&l(4J$`3roY($wIfEBfp>TLe{7VAT9{O=mdo_hp_1#M!=BH|`+fsD0 zrz;}~%yd!-_jF+XigErDDr&vG~!kvOF7PfxD+`ypAD~l_J)rAy3e^7#s`dAK? z^C?mT8wm(jm6w))Z662}rhmigMGDtMs622K0SKeEqPT8%Zb7s6)!tr>nR|12aj|5r zk+v4#utrz+IXF2RE%*&azB=*b|0uqM^5K2pPz|Q5uuT{pk(cB)A)-0ki}B=L`%2BH zskGp{h`WqEPZ=Bg71$l|E+-ZGH&wEjc8gG}sJ@C<+I{Ma96Gm%Ik9 zU25|x8Czvjrn~%Gj3}d|ygVE5GA=Hq&`mgS5-Pc zQZEvvX@BAcqt1MM%>mm_no!p-;33MKMTE^~;M3xIAR7NUggs$^Q?XXtBJMDL z63{#ac}Z4lISot-kBWl4xDLO^JSxJ{z!>s0+=fnTBoP*Gx2+RS#sYNZqoX6>w*s@U1lnCbU@V?8Nos##*1V(-G*NL4Tc3;%;Y9-;rCkK3sb-t%Vt5`5hNmoWhk;(t8=W3M(g z#ni4{x+YtPWlW9^hP{jh1l}Bx0-Xt#S;ZasWR#KssKanC3q?}&F00qA{4|-@anHHP zx#Jetv|{|Zztyx+oEuLOlfkUH)UM-d3EI+L6jHp`AxAkX)wW-crG6zuLI;DG4XIVG zsoa|>079u8aC~Ka^I}-vzastjrnU7G>8cpAU`Y#3<&pgl+1V(cvckK{7`O$66*=84 z@C^&4CEvZwU6EukrDyIfvUi!1mZt0h*~#j;Jg7VINvUb6Dn9Y)@v9_RW&P(AK@Dkf z#2pmtJ)T3>w#_ng-q*7Q5pfVpsDPU7J?(HB6+pNP-iiGkITk9HGvTUg2HeyU6{`R| z^nv-PtFd=akCa06cOSK0#u%zhmP8#}tleBrVhe2i6#C7Wc22UbMu!Y`eU?i*e7Tz0 zu#+(SUT$;q^yj>1jp@V|Ni*zI)_(t5Rp{a0?F) z4~%d2Mu4V&4>=gHNLk;{{Bw=I;N&@nY4LSo{MP~C|Ivq9EH_ke#q^Nz6am2SF{8HV ziNN%bcugqyZVg>(^(5dMENZEFw|fYSFEnKQ1~Es`yySjkJOb`##*r<%=t+PAU477P z67a*J*h`u}ito)hwP zc5|g+WAH! zgpbt5g`IJtydy|HC1Pviv$@DGDo~RXv!12M%-G!=`QNCJa{d1*`|@b2+WzlzOi|Lg zOC=dgC?%AVlA#PqrVJ%>DM?6@c`MQ&Q!Y8nG%DXa2%jb=_8(qh!-&J&V zNvm26_!^iWJD;WXjkYFKor!I*E&4V0?Pl$@{J68}bQevhHH8nYJb$BPzKb}@zDZ%> zx618W$D*7()e4FDw3V{tKsKi5)n1C~o&tI(XrU(H9hs+DGV+p-naL|Q=gV}_3s%lb zNK?K2s+C=u_OFQ(JIK}I|KWpb-0}gv((0t*6~xP5nH(#wJhbdy$$dKcET{W4t4q)A zmnZGam3le96wGBGUi>aXRyy*M;^2`5h0R=LexJ=a=hK~f2myLPuYoP6m^JFug}h@!%Lpy{RHkKLJ*KL}T+xJM~H@fVUs00lBQ zY<``%YWt?*dKFK8{(a+m}(v}ciHEYT1t7!CQ+*dJA@6nar6_wG73(gtSw3VhR4BHDQwGn9~ zCQ$v7jv_$I3#%2Q3M^4S^CU9Qt}$#*jH*dZ4pSGWnp11^{I!{?2U%Z zo8zzY(V08Y8kjDu2_GXWoaZMSat%#==%p&gofockyZ(seZL5g<9o5D}k-tXALE#%^ zU&=V&$;eFD=NbwIPc3af6t{7-P&dPS{@HjlHLSga!Ia|ppk&n=3g7F4S~|k)u{Mkp zmAHDVbbTSQZJukZa(7XkG)4+38?R6)?Rj!kRtn7p;^sUS3Ln8zcEMpV?vNv0-In_n zUv1|LmN?m7T)q^aXnJ7rjp1|4Xq%6Pj;$^Z9-J?5A3uLVbsK-D_Cn(4){Eg3e3Z4* zyG5M$jaY@iVUt^HiZ8ESSTS8y6y2LUi(Q6iMR`WK zZ`$f&qNz{z)#Mq9=VnhHeCInFFK`P4UGWpWVg;BWyovKh;e-H=x}v)g?`~oPE(B2cNT?r9Rac) z;N+%8x&bgY>8FdD6gHod;0CT+p*OV8#Ml^pUtEnP%;_t*rFTk6y@1{Q`*(8#rXng7-TFy&Mul#<&!6wwxbY++Uc3Vl z95D z>nF>dU;;o8_5e9}JKMq^cY#Y;-v)T2MT6F|c1o3qJdHtK^S$l_vHh5QfLm>bSBF%H zs$$iO?rvSNxSDC}m}BgGdCT2LuKzshv!|Fs`6enUdFfLJlGc_T3WJr4SeX9<5Vir9 z!u4-Kql>YDVZ{9?7r^iw*NI=`8+sk|^z@cq&A8O3r|=HVKj7W7J2~+ON75haY&m+A zI11fTV)HZrdmQw_5bwg!P#N#Jo%e6uTB`8wTj_OR5l#RwU?U5rWm-2#TrYiksqb@3 z{$(LSK}5i$X6bVJoyHsXI`%s)%uOJ`2<88|otyz&d(0*7p~3A;pAH!oS*5T=LN15HVLu-D2!2_L$Xr* zy-tGth7H?wFPi_FsHhE`zf)I#M zS0k?!Utbtt;*I0h)8%xrNseJ!l{GQsG%1C~1z%|6`HEU{v z;dnxH1cq8= zs%>KLV)2L_4^1RWQ?K(R3?%6?%sE@0E8F=aJ@W3|Q(_z>a&`Gs;+yk^hRxNwWf;HS z6^Oh6Cxk?!LfXfb#gBSs9F@#}r0%edwSAf6UwD{Vi=6p6DROFyGyJc9$NZwFL50)X z#E6TYo6H-;f0P57MplwY&z~d_N!D9bV^y`5M3MAO8MQZW#=$tfwzjDz{^R}WP! z=nM(Wb)WGw8C@~HgY`hsc`6o?QZ7vGcBt27eqPXGpSzZ}-Q-nry%h`pt_b4%R~F2a z5RRaCMPl8DIK!;<$5Zuq@$h~K5%CVhAqRDbe>{Cn;jgu8l^5QR%(APcA5m9#l;Xm@ zkx--p3{GahnAiio6!)YlCZiKuL(kSdobsHGSTU-hZuKlRFwxVvMEsuMI zf8<$l_X9E%|*%c^He@v*^y0FyN| zsu0Q|AWA4Mxq2%uJTg*^`8`TmH8tFw4vtUjdUX)`l9-vFKZBzN;u)uFf#nCyxaT=G zHnuGxs?ps-&%y&sziDm>85$a5Exj8W3VFaZu@{1W#Fxy@x`kT!`ug@}oL5l6L#(b| zi6oR`p-3E>#)Eid$yxf_2g{~p3xC&0C5F<>U)C1R^c&wMm?+_@9Jcfn8dcON54|?H z3(E_N%haVqwQmLanqpF&!u1WA9ENXGUr+CCSs55ruu*lts)3jdx)I%bf!oE$6ID@r zF9XPmh6d%6$nSj%oxvK@^Uh;G>oJS{Mid$7SIk61m`{;clIzf03%!9WZj(Jomx4M1 zYxLCT6Skz03%DGBSYVD}+fDX6{WkS<#3|zACrBjf=}BdM{jk?$yie#^_# zFv+jrlFGn`l5k55qEMh#(ACp>Zdnrt)sVkGTi%jkBwMA{SlYZCdi&wSht}3stRj;S z)#zCj!-~Ei`;~la;ZVSnwvoMgv#XVsQz&Zd1UGKnSgarLE%$(dsIyg$C z{7-TyCF?M?E^+D^v9hzntiC^^eec3xEU10Kh_kKRyYm?@ySdF~=r)&3Ij_ELnYF(u zQF+y>Rel3U#bX%xvNBI6j89C=%&&V~)t=4M9(2xjnt}O^DSIw)het6jK^ccu^QfY} zIx%E}4(MmVFr<^DrdeY2wV)8ooUdPe#aa=M%0Rh88w>_Wyu2%nc+7~B0yl>Dx zm&1oe%>B#6(1c3?rpm3QX;W`y>oyiO&D?4^+wI)iF*K=X!8=t_9Oif5QfGgY5EtVO z^U~H?{;9i!k%*^qi`>=uBR>Y8ir#|5em;68h$C@ZWPv@~&RaPJ&8}!?H#rZT!T*P27PYFf`bKUcp4JLpt<{8$)WGnR>lDo;*^}N+Imn_Qo zk+$WUl)CFHjfRh;RL{<)EgXqoKR#l^NNeI+^dT0 zZ(hBUS9rI=cEKZa*G*cjMXyKp4@m`PBU3I4<>5+{#uUtH7o@o2gii~enztO9=nd-L z@BC`h3#Vx1-F%o@$if+NLUx1?*yum+%_lV9>v#v&aWChMYE)v@N~w>v;ikxKRlwVz zZMK`c8E5&dftf#Go7*X~%8%Z(fOh9;FW$ctI_;+(o!d{P$Yo3!Azl?P!3uIU9UVH` zS2(v%W;owHeWznIOGY=udkpJc7A2EuJCf>phn$>3iIJL*2G@LOwaqQVw)q~1zZAy# z!qbJrgBV|~rzUy>NdI)Lt$mIRH46)PqxYyZtCvx4t(A^A~OG? zHf%wb%Cl_$)D`WA0^Wu_`IBM7a?}k(y6a+!#Qe#n2F;>PGjVy$h8!Izy{G)ufwgl zcOx$&!xlO#&&)dyt+1HQUah>KH!-x}vT&W=pXy_#3EbIxJ$vz@Xno-$GOL*Ry}I4P z{^6TZrLLC*({emi_xG*Amf33AwxQC<1TGgt_BSRT^X6lPZFQ-4bhfO1Y=RZj3*8@X zIrdW0wM(j^AmGW+w6XbRbh#xPq=kmQ$^Sh3_Ivqd%)ahf z$I_eAxz+9QFtMg*@5P&0Z>J$=1P;|kju4<&P#m%|3Vd)v7t zixB^k-FRd)Mm14eGz?0#M{dT9n{OFXU*9mZohJg_KA^vpxL468GIz~f445VE+kcMJ z@3Ubnh3UavRSRwH+P3-e9Oz}V;%iu0S#M7)-CEAG&*}I2w#m0MgGI7en6eD5&U$!YcF*Sni=o3#JdJ_267L<&)2MQ*e4_W{>tyjQzZGIB#Oj#nDafR%9Xdx|8$ejZe_colpW=<+ z;g?`8Q9mA-5S57dh;f3q2js@d!bqBZPc^^Ep!ir969xu?_kw`Sok@qj)aupcWdHMF^+9vGKzN zt`_>6=vsxgEZ$myDR=L(pLD(a=meGKaD0chtBZ?5%dMgnSH^R0$2JYHWt5oxK?jKc zga<@Wbw}Zbxk1t+Jss~%s9dR4DW<51Jim&Me&l_ualGH7VbN@a99>4nKU#IlYlbH{ zUfOaFAFX7aEg?%c_ED6&9PP) z9BZ$aYC);d&~O}L<)6s#u^IA&Ps_>gDa8^-3$s?DZX%8yn}m`M9Q&c%enjx0CoDuK z8M_3^8(!Pimks7mAr#HalU8^~lDP<4O(`leaq;4R`@U;9b}$9+okNsK5}wQNYl~0~ zxy=rhofY1;ZD5J)}qrRY`U^^i-$<9Byj zA92qT4lr*+G2L?cH&kJ5P-8$SWC`&zBzf0)To7_`r2ip|NKitMhaLKA+qP{`v~_Ip zM6`;O|9=13)x|Z_FPAE@=hEHaKF~HBJAK!T4Z|;B#-Wr_&va~Ti(T)G7gUlE0Q3$H z#=tNJnHz%i80B983?gs_Z_Hz5iqXtMsRm{d{MG3883bvi=sea<(R0UmdIw@5gAwY( zsZ3~gj#W-86la^ZQDedOW?Tq0*`uhvPGX2*#=xBAPjidiv! zUtfvX73HWoW-%R@`*&3ByNG)U%@`Fk|nE`GS1!W zc7F1SE;uYYI!#l!aDMt+n`+U#<8Qzf^9@xVh#$y3 z#gYvbiGVj$9MvrMcml4QaX5^Zysm)Okd#u(%TxJJ)j!r%ihm0I(5D@wEDH(*!-=1l zD*}9qEb=H1eaZ%c%4;?=YN?BM%S89>d1_Je+l)N>IAMcSJpzTbEq{-=tCyeBNeJ?l zdEE~(=ekYVJ3HsrSaP|{A%}Sw628H{zP(T!wb-2Dc-v)<+y+uL?g5O?YpPt{LE66a z9l}D5J*F(+twGx8cVDDQg>F5b2@j@A2_6arvymbjDEptB$f=wtX`B7A8&Azy>re$%FZgUnb(g74g! zjoNWXJqa~TaHh!iZC)vlA19b_@kv8o7jS%98|c*OXU>K*lo(kex*uNexAu_J@D1LsS2tlC^OL>AFW8N}$n@-!s7rd-1` zu`$06Uk*>^J3D1syX^A}(=>N`&wim<5}WLaWA3}x3=7ZstjxW$@}K70@?$-N-UAdc z5Xha9aNZX^RJevBoNE{z6JugxBHOwaAz7E1gWsRJ;`** zBTj~K!fdYH*MIKds55yEHX$u9FAotCfUq=oGw^Nb9h-(ipM}sVqR4-TXUEt~>GUnV zcuL{eZFz*3` z$NhKiS;G@O5pFeRN~tjWEzkz3dQdhV5v+TmS3no8O6BP|CZ@Jn&M((ZQy{AWxl=n3 zGx6*mElw{*7hqQ6(o4RSk|2C>fB$O_xEaM4r?0ylTwJetC&&VaYU(0G{)Q5mVHBm{ zL3$svp2=>pNNai?8XHLI7SaW?>Z=nfyErD2Zh99Q7$}AW?l4|;Di6JcL{FHUI+dG0 zDr#WJ3Bo@vwz4sswQ>&HTS73kZY}5ZdwbI;Haj~c%tM{JpV+kvo->X9F3QvQ-|T?v zLaPL!sD`zODY<6F2W%u5?Xvc#U;XRv3%&>heYU^GUyZ?eZz=}Ud$sL(s_9EyGBv@Y zV3b~4nWAFTd|F$F66gpD83goe&C#j(ly#g%1^VH`(n|-xY5jbFdhiAzCLLATF{H9? z$`Hv_Mn*EDz$HIS6fL-Kz6`_o8GyaY%dwobUaXQSWvh(bQ`a^{>p*{>#_s{wM_mUC z3ky5}Utc;u8?3>g;_YdP27eQys7+?H`haNIIrH6#ZSy;K?gZpU7BJLG>$7J!Z`o3E zVl9PFY4NlL(3WI3QqJus@a!+Ws(Ji4qI2nd-wekrOvQkQh>yyH`GfrpNFQtkP{Y$M zJJ+kR#@7NVB_K3Lii?W@^vLby2AYVRWmoMGsR!drLQ;|m8V!k@P;DmotWx#% z-pfZP!tjb_N%2&P(@wVD)%1veI%ht7qpT$7a{f~tZ~Xv)=8t_o!NULS^hfX{u5fKY zP<|&gbeBWVS#$I6NUSBfmWei^2>IN*`<#%4gAu_pfBIQ&LPF;xG1P(6!WlpEFcZi& zNYxa^ZU;r^a-g3_h`YkO;$k^K$klcKRSW#TOM$KKo3+?+{zjtu8X7CM`GBgxXL7M! z=VJ!rku=5v5qMoI(P{%MPV@_On{H+JP;{A!TBAk`#k|s)rl3o}wqUOn3_ig*Ig5o2 zZh(2%4KC!je0jQ#x?d2Fb)vRWnJW;FuO;L_ef^HTVk%4Hglmlk>#fERH45Qc56j%# zTw!p%m1GM~;P{;>|CzU@zHutM4>A(JQEm6$I};r%Yuo%{2nD6epN@X46ETKxp6EmJ zX@hi-yV-Unt{3Pja<6msC`%^qNdBHkf4b&BAIdEkCDUXJ(PJ2=^Ezf=r;f*utxA@e zEN5fGJvxD%2;y5sH*dZ7X2?vP4B7w7z~+L z5a&p2;d>Wy_dhG`6O+_>*E81AQ(VQ#bq7h z9IRB)??X=2t6Agki=TXpts6-1NOp4a+5b!Nko{n8TV27(N+a-twNA{TLxc);w9(wJyEc#2Mj z7V5zA(qPT=Wq&btmq1%&#*s*9uY0jXYC2l~)s4T=U-DXTp35!SLeAQ6t#>`!8i8l@ z$GxoGP7)K^DfOh$!roq@W%^M;fxCo0eYgZ!Wj;2Mj`uLEN6yE=ovc?dTSG)v15d4* zU_jZbPwO#`zs=8a9bS>Euy(Qn zR(rcn$9&YiW!Y`y8OEGz;(NL^)QczLOP^wzfI?aVs1INAf~bVWF?!ypUc?ltM!3qR znwS8>k~Pzz>x(~Y&*kQQrti0nPx#%Ozd6g*>=eJgcHG}G2+q{pm5McOEEJj#33j0k zq#LB?a{q%OEb=NO{^yr%xETDr)0D%_&W4zHPLgX52gBwsy za?} zchD5uCNT4F^;LDUcF5wl-^6IY2_?Ew)(=&7#RB8)L#KSqZu$BG@ar4I2zw)7EcVhM zrcHNQ2v=I5RKS#o3Vl~Z>cfXWFg!@?NQ0Br11l$kmFvpxmT9I9&q zPNTzT&q98)4}EA&Jh}4s3K-O=3v@fb`@i5CB|`33+XUz+2_7EX)|k?qxHiB4@74kNsfY3JRH-*K0ZEV z{9|nFt2W~O<>m{@Mn+MizB$jI+jEtT>?^ylwOoRA$8e;jyD=mE;sB6i@TBW!BiJ)$eLA>wr*4KMFV#rP49%#{h== zK4PuJICjAd>X^^#F-d%bM-;(xVR!HLH|LJjCLRV>i2W>J4&^BogSU~^vgb640jMv~ zru_eM2#1%<{9 zobHYJI!8N0`e;UZDKv?YJjEWkj+}Ud)L%b;HexS|7MrA_zSoTeFu6T_T7z8l@$vcj ziK4-uKR0*-h1}U1As-WfrYJ_nh<^dud*Vn%c|9-5Ne+Owu zb)Ru;q^9YmKxU(_r6nI9@1M-XeCL8+32@mPi-_bMOt?X-eA1EfJ3D#d=79%Y_Iu{8 zbV%J(+a)HZX>44X*^g_j%6uG)P{s%b7vhvTc(faAat_;`2T~4+j6rJQU?DN{(s&S0 z=)kgV$1@X>lW&d-)#dm9sY7bFvx$jPedPXB7d~-Xpo!|qXf8f{Jy~~J-3Wb!8V#|} zR-T~LO*A#-nD61V05L?WpV8J{IoBsEDoSqi@jxaIIKzB3p7od*bh8Gj#<}*1qZWyT zE%Y?d85lH=kBvddVj?Ug1bcD8^XH#0<8VM)tHf&36!6gFwi4O1iE3Up(r{Ru8Z@XdC+5iWZQAjI2~FvRMYHji2& zL{wwLCZG?9m^|A9MF6B4#`%uh=DNYKAOa*bJp6@K{bMk!{vDvWcij|_PiTDUeDU;Y z!Kieg6OEWCh@m%YgLB)%`(*0~=P|vMOA?oX;4<5vUoSA7IHU3{*IwUJU**3UeRISk z6kSxR?RCIot?hU|*5WsE6%+p#HqqH=PsNS(FK|Nl!QbG-AE_T%X*>-TSzI|do)HaC z>UwdGZmTTkVhdg!trztaLyqXCuATobDad6!2pdRpvN8p~$2Lm}Eo&5*oe}7)>~V4S zM}#d~)WkBHO{cxHhlhu|yZa;36@Rq55mh#Yd9@b1(73Rus3=cfpaexF=}VuG;T#GE zJ94JuW|kp-F1}6Uiwju#H$gVO-T%qbZzA1vqNjBIQ^`_TG0DZz14pgHN;aC zHFCEXm8hG52o9BzsDd2D`q6s)CSPK!$%=w}{jGa)ahPMFFcS_V=dIl_>%@}(?aeb6 z%tIRYN^rey1qvYU#z1@0yCeVTJ#*hah*_ ztieX6Fzf7HMJbUtF^T!ohhP~Gdkcwsf1_CcE_cHMjH!&otq=uX3SXo+EB0kW4mWuR zc_7T!_f1JA($Xs0uH}()&wjVXLGk`vjJwP#TUu0{c ztI^j6Wcj^>9K#o=^T^;s@ETwGU}!9q%~W2=z%S>l78dejs)l#?iplzOi|a3fKV%~c z>B7^HqOJ>ZMCIajiB4Y?PE%NTKJHQgu|$WI33XrQO19tE_sZ-kX1OvGdU6ZkM@ zX_{rWM$$|s(H$}8D}nO*JBdFqFDvBydYufcnH!@lG5&V9KZm6FE|V$ofp^NgRym!2 zqPV$JRrT(zSB6s`j11;#g~3-RNn#0&pl;;i$ybp`wR>fb@&LZ!| NLyGDL(-cgv{vTU}3bg @@ -43,7 +43,6 @@ v-for="nodeData in allNodes" :key="nodeData.id" :node-data="nodeData" - :readonly="false" :error=" executionStore.lastExecutionError?.node_id === nodeData.id ? 'Execution error' diff --git a/src/renderer/extensions/vueNodes/components/InputSlot.vue b/src/renderer/extensions/vueNodes/components/InputSlot.vue index 10de3a402..e74688181 100644 --- a/src/renderer/extensions/vueNodes/components/InputSlot.vue +++ b/src/renderer/extensions/vueNodes/components/InputSlot.vue @@ -6,7 +6,7 @@ ref="connectionDotRef" :color="slotColor" :class="cn('-translate-x-1/2', errorClassesDot)" - v-on="readonly ? {} : { pointerdown: onPointerDown }" + @pointerdown="onPointerDown" /> @@ -54,7 +54,6 @@ interface InputSlotProps { index: number connected?: boolean compatible?: boolean - readonly?: boolean dotOnly?: boolean } @@ -117,7 +116,7 @@ const slotColor = computed(() => { const slotWrapperClass = computed(() => cn( 'lg-slot lg-slot--input flex items-center group rounded-r-lg h-6', - props.readonly ? 'cursor-default opacity-70' : 'cursor-crosshair', + 'cursor-crosshair', props.dotOnly ? 'lg-slot--dot-only' : 'pr-6 hover:bg-black/5 hover:dark:bg-white/5', @@ -148,7 +147,6 @@ useSlotElementTracking({ const { onPointerDown } = useSlotLinkInteraction({ nodeId: props.nodeId ?? '', index: props.index, - type: 'input', - readonly: props.readonly + type: 'input' }) diff --git a/src/renderer/extensions/vueNodes/components/LGraphNode.vue b/src/renderer/extensions/vueNodes/components/LGraphNode.vue index bced99338..2911abbc0 100644 --- a/src/renderer/extensions/vueNodes/components/LGraphNode.vue +++ b/src/renderer/extensions/vueNodes/components/LGraphNode.vue @@ -50,15 +50,7 @@ - + - + -

+
preview() +const { nodeData, error = null } = defineProps() const { handleNodeCollapse, diff --git a/src/renderer/extensions/vueNodes/components/NodeContent.vue b/src/renderer/extensions/vueNodes/components/NodeContent.vue index 9137df463..0874c4013 100644 --- a/src/renderer/extensions/vueNodes/components/NodeContent.vue +++ b/src/renderer/extensions/vueNodes/components/NodeContent.vue @@ -27,7 +27,6 @@ import ImagePreview from './ImagePreview.vue' interface NodeContentProps { node?: LGraphNode // For backwards compatibility nodeData?: VueNodeData // New clean data structure - readonly?: boolean imageUrls?: string[] } diff --git a/src/renderer/extensions/vueNodes/components/NodeHeader.test.ts b/src/renderer/extensions/vueNodes/components/NodeHeader.test.ts index 775dd6ba6..472427e8f 100644 --- a/src/renderer/extensions/vueNodes/components/NodeHeader.test.ts +++ b/src/renderer/extensions/vueNodes/components/NodeHeader.test.ts @@ -118,7 +118,6 @@ const mountHeader = ( ...config, props: { nodeData: makeNodeData(), - readonly: false, collapsed: false, ...props } @@ -182,20 +181,6 @@ describe('NodeHeader.vue', () => { expect(wrapper.get('[data-testid="node-title"]').text()).toContain('KeepMe') }) - it('honors readonly: hides collapse button and prevents editing', async () => { - const wrapper = mountHeader({ readonly: true }) - - // Collapse button should be hidden - const btn = wrapper.find('[data-testid="node-collapse-button"]') - expect(btn.exists()).toBe(true) - // v-show hides via display:none - expect((btn.element as HTMLButtonElement).style.display).toBe('none') - // In unit test, presence is fine; simulate double click should not create input - await wrapper.get('[data-testid="node-header-1"]').trigger('dblclick') - const input = wrapper.find('[data-testid="node-title-input"]') - expect(input.exists()).toBe(false) - }) - it('renders correct chevron icon based on collapsed prop', async () => { const wrapper = mountHeader({ collapsed: false }) const expandedIcon = wrapper.get('i') @@ -222,16 +207,6 @@ describe('NodeHeader.vue', () => { expect(directive).toBeTruthy() }) - it('disables tooltip when in readonly mode', () => { - const wrapper = mountHeader({ - readonly: true, - nodeData: makeNodeData({ type: 'KSampler' }) - }) - - const titleElement = wrapper.find('[data-testid="node-title"]') - expect(titleElement.exists()).toBe(true) - }) - it('disables tooltip when editing is active', async () => { const wrapper = mountHeader({ nodeData: makeNodeData({ type: 'KSampler' }) diff --git a/src/renderer/extensions/vueNodes/components/NodeHeader.vue b/src/renderer/extensions/vueNodes/components/NodeHeader.vue index 252736a26..ac6878e6b 100644 --- a/src/renderer/extensions/vueNodes/components/NodeHeader.vue +++ b/src/renderer/extensions/vueNodes/components/NodeHeader.vue @@ -12,7 +12,6 @@
-
+
() +const { nodeData, collapsed } = defineProps() const emit = defineEmits<{ collapse: [] @@ -118,7 +116,7 @@ const { getNodeDescription, createTooltipConfig } = useNodeTooltips( ) const tooltipConfig = computed(() => { - if (readonly || isEditing.value) { + if (isEditing.value) { return { value: '', disabled: true } } const description = getNodeDescription.value @@ -189,9 +187,7 @@ const handleCollapse = () => { } const handleDoubleClick = () => { - if (!readonly) { - isEditing.value = true - } + isEditing.value = true } const handleTitleEdit = (newTitle: string) => { diff --git a/src/renderer/extensions/vueNodes/components/NodeSlots.vue b/src/renderer/extensions/vueNodes/components/NodeSlots.vue index 26187899d..e4617a4c9 100644 --- a/src/renderer/extensions/vueNodes/components/NodeSlots.vue +++ b/src/renderer/extensions/vueNodes/components/NodeSlots.vue @@ -11,7 +11,6 @@ :node-type="nodeData?.type || ''" :node-id="nodeData?.id != null ? String(nodeData.id) : ''" :index="getActualInputIndex(input, index)" - :readonly="readonly" />
@@ -23,7 +22,6 @@ :node-type="nodeData?.type || ''" :node-id="nodeData?.id != null ? String(nodeData.id) : ''" :index="index" - :readonly="readonly" />
@@ -42,10 +40,9 @@ import OutputSlot from './OutputSlot.vue' interface NodeSlotsProps { nodeData?: VueNodeData - readonly?: boolean } -const { nodeData = null, readonly } = defineProps() +const { nodeData = null } = defineProps() // Filter out input slots that have corresponding widgets const filteredInputs = computed(() => { diff --git a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue index a1a8bf3fa..51aa132b3 100644 --- a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue +++ b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue @@ -34,7 +34,6 @@ }" :node-id="nodeData?.id != null ? String(nodeData.id) : ''" :index="getWidgetInputIndex(widget)" - :readonly="readonly" :dot-only="true" />
@@ -44,7 +43,6 @@ v-tooltip.left="widget.tooltipConfig" :widget="widget.simplified" :model-value="widget.value" - :readonly="readonly" :node-id="nodeData?.id != null ? String(nodeData.id) : ''" class="flex-1" @update:model-value="widget.updateHandler" @@ -76,10 +74,9 @@ import InputSlot from './InputSlot.vue' interface NodeWidgetsProps { nodeData?: VueNodeData - readonly?: boolean } -const { nodeData, readonly } = defineProps() +const { nodeData } = defineProps() const { shouldHandleNodePointerEvents, forwardEventToCanvas } = useCanvasInteractions() diff --git a/src/renderer/extensions/vueNodes/components/OutputSlot.vue b/src/renderer/extensions/vueNodes/components/OutputSlot.vue index dceab8111..12db0a6a4 100644 --- a/src/renderer/extensions/vueNodes/components/OutputSlot.vue +++ b/src/renderer/extensions/vueNodes/components/OutputSlot.vue @@ -16,7 +16,7 @@ ref="connectionDotRef" :color="slotColor" class="translate-x-1/2" - v-on="readonly ? {} : { pointerdown: onPointerDown }" + @pointerdown="onPointerDown" /> @@ -50,7 +50,6 @@ interface OutputSlotProps { index: number connected?: boolean compatible?: boolean - readonly?: boolean dotOnly?: boolean } @@ -87,7 +86,7 @@ const slotColor = computed(() => getSlotColor(props.slotData.type)) const slotWrapperClass = computed(() => cn( 'lg-slot lg-slot--output flex items-center justify-end group rounded-l-lg h-6', - props.readonly ? 'cursor-default opacity-70' : 'cursor-crosshair', + 'cursor-crosshair', props.dotOnly ? 'lg-slot--dot-only justify-center' : 'pl-6 hover:bg-black/5 hover:dark:bg-white/5', @@ -120,7 +119,6 @@ useSlotElementTracking({ const { onPointerDown } = useSlotLinkInteraction({ nodeId: props.nodeId ?? '', index: props.index, - type: 'output', - readonly: props.readonly + type: 'output' }) diff --git a/src/renderer/extensions/vueNodes/composables/useSlotLinkInteraction.ts b/src/renderer/extensions/vueNodes/composables/useSlotLinkInteraction.ts index 57f6fa21f..71b3e985f 100644 --- a/src/renderer/extensions/vueNodes/composables/useSlotLinkInteraction.ts +++ b/src/renderer/extensions/vueNodes/composables/useSlotLinkInteraction.ts @@ -28,7 +28,6 @@ interface SlotInteractionOptions { nodeId: string index: number type: 'input' | 'output' - readonly?: boolean } interface SlotInteractionHandlers { @@ -78,15 +77,8 @@ function createPointerSession(): PointerSession { export function useSlotLinkInteraction({ nodeId, index, - type, - readonly + type }: SlotInteractionOptions): SlotInteractionHandlers { - if (readonly) { - return { - onPointerDown: () => {} - } - } - const { state, beginDrag, endDrag, updatePointerPosition } = useSlotLinkDragState() diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue index ae8fb7567..7a0ce4ff5 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetButton.vue @@ -3,12 +3,7 @@ -