From 25b1b906873cd49a31beb85223c37e5093c00458 Mon Sep 17 00:00:00 2001 From: Liam Horne Date: Wed, 30 Sep 2026 12:58:35 -0400 Subject: [PATCH] feat(explorer): stream address transfers and transactions live --- .../explorer-live-feed/before-highlight.jpg | Bin 0 -> 105085 bytes .../explorer-live-feed/live-reference.png | Bin 0 -> 7043 bytes .../explorer-live-feed/new-rows.jpg | Bin 0 -> 97965 bytes .../explorer-live-feed/paused-reference.png | Bin 0 -> 7567 bytes apps/explorer/src/comps/DataGrid.tsx | 10 + apps/explorer/src/lib/live-feed.ts | 9 + apps/explorer/src/lib/live-query.ts | 48 +++ .../src/lib/server/address-history.ts | 6 +- apps/explorer/src/lib/server/address-live.ts | 296 ++++++++++++++++++ apps/explorer/src/lib/server/token.ts | 4 + apps/explorer/src/lib/sse.ts | 54 ++++ apps/explorer/src/lib/use-address-live.ts | 74 +++++ apps/explorer/src/lib/use-live-feed.ts | 54 ++++ apps/explorer/src/lib/use-new-live-rows.ts | 31 ++ apps/explorer/src/routeTree.gen.ts | 21 ++ .../src/routes/_layout/address/$address.tsx | 242 ++++++++++++-- .../src/routes/api/address/live.$address.ts | 17 + .../test/address-history.node.test.ts | 1 + apps/explorer/test/address-live.node.test.ts | 93 ++++++ apps/explorer/test/live-feed.node.test.ts | 21 ++ 20 files changed, 960 insertions(+), 21 deletions(-) create mode 100644 .github/screenshots/explorer-live-feed/before-highlight.jpg create mode 100644 .github/screenshots/explorer-live-feed/live-reference.png create mode 100644 .github/screenshots/explorer-live-feed/new-rows.jpg create mode 100644 .github/screenshots/explorer-live-feed/paused-reference.png create mode 100644 apps/explorer/src/lib/live-feed.ts create mode 100644 apps/explorer/src/lib/live-query.ts create mode 100644 apps/explorer/src/lib/server/address-live.ts create mode 100644 apps/explorer/src/lib/sse.ts create mode 100644 apps/explorer/src/lib/use-address-live.ts create mode 100644 apps/explorer/src/lib/use-live-feed.ts create mode 100644 apps/explorer/src/lib/use-new-live-rows.ts create mode 100644 apps/explorer/src/routes/api/address/live.$address.ts create mode 100644 apps/explorer/test/address-live.node.test.ts create mode 100644 apps/explorer/test/live-feed.node.test.ts diff --git a/.github/screenshots/explorer-live-feed/before-highlight.jpg b/.github/screenshots/explorer-live-feed/before-highlight.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0047382136ae392a60257e21797d5b1e4f5ddb51 GIT binary patch literal 105085 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 z%0A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 B0H6Q> literal 0 HcmV?d00001 diff --git a/.github/screenshots/explorer-live-feed/live-reference.png b/.github/screenshots/explorer-live-feed/live-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8f5f2003d89b866ed2c46bb917b638d533e4b4 GIT binary patch literal 7043 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 Z8HBB<1$Rf0bf*UZ)RZ(8ixkX){})r2Q3?P6 literal 0 HcmV?d00001 diff --git a/.github/screenshots/explorer-live-feed/new-rows.jpg b/.github/screenshots/explorer-live-feed/new-rows.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e9d83be5116c80c4888f2552bf99d0120d3775b GIT binary patch literal 97965 zcmeFZcT|(hw=f*#C@P8-5TzVNKw2V5ua*NGYNSgEQE7)75_(CnAxaejgdU~WAT`vW z(z_5aQX_;GdI>Eg@aFu^{r%Q`*Sg=j_j|wl$G6^lCTnHpd7hb_J^R_SXU{G<`f>CV za6wl~M+0UiQQ{&M2viC<2hJaLkp{p6`L7tWkHefrE5&huw4@Laii zmFEgK_ceZD!E4ur__(=$mHbsmL{v;%j8{L-H}4xgjg>Kme;i=vy8G-!oX`UkMAx3*ZUXBbkdVOpgD;#{LT% zfQ{9Q)#cdni)@!}NE+aDg;4IrQ)>POo0yF^h z$bSd(@8N!-Ve0A~bynLU4x`@fzpAuo1GyGMYXn01XIDESC53OH40zs;L_ zcm}rp7l(ZQ#FeJ(O=%3;>H06QqPhvKVuwtfQ_$!-q<+EiX)654Pp`QI`x@b_Yrrrb zQ!iF6Is&{4`8@=V>h^NR>DVKDwa;)M=?=99OH)MdCi;7U>k$Vb%#RK~mRjDN+tMp& zD;5>OwCgbXFt3^AbRSNRK>>^OylW|U%CgS>(S7dwJlcNf>D)nf{0s|yf=Krf;1yXr z{!T#C?<=nst6fjNgE5Lsu&`9mHAeBfBS4#I_VxOgG+#W(QKr8(C}a1`5unsnJ^vgy z>j+TQKT68>w)Q*GI*c_lew4QG8DW%&&)uE#Q6yK!jDk)tV6%fsxoPf?^#sDHpK;@` z6JxRVG_2ps?N(g_0j~pTCT=t11sxBBXIIT+Hhru)0!#}M zfe!~k+RSqlnT@A0sh9_|pw>)7B(S$Fi4j<5lM3ZMhW#cumX{m6mOIYFm8`BbJ?A)V z(5N_yyc7opBQvT4n^v}VK7#HkrrFqveyPalMVhtsJDV6I=WieEFyrfk$ot-hPFaGN zcR~*AT1w@;{Kw@XCUr(TX=y^ddeDf;ri)Y&L%-Z%x(=1Bp}~pezM7OEJMQ2{=)L0# zDJsx)XPEk8P1uMUj)K)tLp4d-eE2l1BKmQnB?&DYoki5Y96z}`HUeI}SGqG#JpyP@ zdE6DL?;^J3E2dWnL+Rj>a;gbLwsM-^5#TNK_q~|k z$%0fek8Y;CcUaH}m_OXMM;v#3aQ{|Jl*XQWbCbeOd-K=>qi9(V!h|n1EbR6XpeOF|1G2&V zqOm)H8Whemymp)kdU*}{i>F3qh(QJNYF~5PmzLaqZoGYQqfYBCN#C1WbEHG@41>WmSop%FOwwO-oyS@Psktf4}3S1T>#4UYGM??~iwT5;xby+dx?&W#mU zipZgW;{-ne^W_}qrD6?T5A7z=)!JSHjg4xr;&4(=s>hX|bDby&Sb~uoZ)H1pHRQ_s ztx_MJ8E;1$=nnI0@pC_D!y1l_`Vhue2>_oI=r6K_Q#0jAp`O;X_0p*G@=8TKZMalX zP7FALG}T%Qv+cvrlLLjE5W&?R8iL|ZXPukT(JE;hD=!IZDv|LvXromkILNjC6MywT zkP_pk;d0Ze$XajKeowa~QZi1g#d{6Qh9r(20ftS!$6wmo%^NeQSyt#1E0ImPv#+c7 zvuBQ-p{F6p_*EQmoZgTe;9#rY08r}JE87G$MPZ6&XW>qy!tME$4A6GV-AoTX$#aezHM z?bRE;&5w@!jTa5iiJo3HHX<7j;Wt)(w1-iF+PL8uUv1uG3dP#n;q{nV*J<^{ogp;1 z*R{KYvxYBGL8-^O6|T@1d1_{J5U03d=piR+T8zfFR|W~=*7_%{d+oQ(a56j=F?^+y za9r)M!ZqBhT$qQ7`z;0qPso^j;`5W}+3?1pAv#2`Q=5P0SzA3 zX#x}C2hP0fEW6EBkW-CC?#K}$H*In)xSFTnYl5v|JTd6l*!Uc^+T6@I12w|C>ao3J zqikW*N*-2<4Zc7%e`0q}cfU!(7CH*T(_ijduh$8jToV%U%kd+^Zhgcw4@}Z=wyxTFow;<`V8kM|-R4_EOetj#=qGGW6fSL1yGyke5E>Vl0$MUL{uLW<-S0vn^ zWCzn2%$&a-){PhsVMlj#DSn6V?bnKT^mbVo3RK9B+tMoQZ&x1nr?Azq3-{A?(CwC; zmK=Neq*nq>X61cFtGeRg@xorri77i4DUcRX%weYr2tiQ_txSQ)L0_PM4$Ry{OT0HAzYVCO+dc%hh+%vWM(5vT{azkpn4xF3TQv z3H}8T4}%(Sy9b@>Z@W4a@asAvlMOU>M@|ccLB7=+^8=kGF(`w_>rMQW?FaI;{mqY@ z@p(fOGOS|%D)UxTN;}OfdHV=pw(!`bydhHiwxU5uLhjh^icYY=_7BdQYpCl<%q>i; zBU^4CFmchMzH@^r<<85+2=tBvz6r51 zo-3Gb6DA6j$xttr^Dqklb~}g}*3`MZR?f;z%L3+-Fe&>lzP~bCSQA1ac|Ch@H4e}0 z^{$am6W+64AJMQ=X3wqMOb-9W|4cV;*Iht^hTf=@H0oG3(i#|}jCRvf` z>#fq@yHPX!yGsQ#GmxJnv)$10lj2T z_eyI!XPZnPo0SMvw7j~vYqXROG-w-^FIwD*^Cc3<2Z+5pYCL*B-(bG5CAT+e2ukp8 zCe95g&2&}MB{J0Bb>?e&9~eO>xwPGpwI|-Ae+g@8HQ|1IWT{A+cnOZ{Srm^(ov+@Wuh`nG*_-}aI9=fs6?Z~9C`FnpGhHgCJkdLQ&Q+d>Rlwd?lO`|%-ngF;wZLm`VS zCvwrEgBd)6H@l?z!pmzFb+j%erfga3X)XWs?@1euYI*W=wgGJ2+iOxT*9J3+pNTUz z2*|+ozcRd~KRh)%b@!{kC!z)CT&Zo1tf>=M6Q6<+>RkI`-r2`L%Q>wn&qy2{Xi(is z>+IV;|GPh98IR%9^UQ(7;qGAY_SWDW;Z>FKo|I4PYn>hFC|Qz($lzpVA{q9DbKsRB z-)}@p-{D17p%^yK+CoRs5(@U@li-z*Tv$8}KLFLat0vms+}b^3<~i*$^Wc zjz|Ywt(wB{PLOubl2V$0_B&=3{kl)Xt}q4)3i)+DO2S5Zsql(|8N9@IC$PSA1wX!7 z*XS*vLmkQijY<~LutxwRkQPah{nbH^{T}Q_@Ah7d;ONp|G=$UoOWBumXiTAcZ zqaglaJ`X3Ldi<7Y*V_Se_7mQVk-~YRL66d`$qs8Ik2dlS2pijZ*rRy1xKD34L%#rC zA-wG)pC?Qdy_Fj8ojJAzhY@zz-To;Jg3(8S*7j^@gPIIwPu$_OS)0-H>iC-WUT|7xl^E2Q%d6bL*Pyc<)`4wGOWfax7_-Y)sO0H>Fr*t9M?!c7xrb(yCnb9s9D!nXhHOWGjiDpJ-iH8KCX{jisTbo2!1HC}Fmg_-r~YHi z$?}^+mje;s8{)=7Zh5MQgN^`7P=*1tvkMrE;{L51je|5O%bm$MVx`S+SXFh@`U1-CA($HJgyUSX7 z6Su#}?a2n=m+?Ca3t6R@!;6xu2#`a%6Ev*7TDjE1u!7hPgO`(lT3g@d4AYl%t;(cppft2m=k zgT{l#?x5|EA3V#g^b=plFkOYS{Z7IZ?_E=ixkB*d?nKo{Bam)D7v=cu$>4Ld0dc)( zFOnlI)~pwm+FDcf9D9x-Z8twxXAp_U$9wqnXHTR?Xgzqf7+zhaj@hu@l)%2T^*yP@ zKcSntm|#o|M9NqN(lOiJvowChKJu9Ti7!(?muQn*6y8vysC7FCs6Iz(_0S7BEu&@| zZ8yMY_AVhga-rz+Vj+Cu{UqI?lDV>Lg(Q2yNFdBN9~KxkBXE}D6_Wn1tJK1)>(O%! z`DuCQ{o25eL3{ev`72E}gy&E$ z;+0gGo;Av?vi$eZ>?v6qXO5rU zpPDhA#0y?3$SWymc11xlh)`2k;f0>fDXf!3##(O|u5h?=s4z;mR;f8xs=E&DzS6j} zseJF`o5{-x8s}96lV*n3J2M|ID$@M#yhI_0@p#ZuX>80cC(6)69xU8B?7dL9m~{;v ztXO4lJT^WyN}Af#{tYlN_PKL?+)#?wqZlV`zRB<~K#Wp7q+?RzMkgb$W<<@xhkmMq;zBJI_so8dslXY(Lrx(vgV`z0 zwL#=jCw;*DUX!-Kxis(DREeB-j%HC^mFdycT0i1S$q@h=YrUuc!@*H6a+X^_-XTNk zoByI$WSyxs4x*P+#Wj~hZt5UEmu<-7>98MhgDWX7w$`2DHi?a*c<&HBk$MKDF~%bf zY4Yw@2DC4CK1j3Ln2M%$wr_mTtjw;uy=V}y=1ldqWiGI3x4@Hw9ew42>iV-^DNh~> za9Lj6R6yhIw;}9is{o0OrwneZXV(SSE3R2vLsHOPo+JD3n*?x%7ru0qeyvW0 zCqzr+qqHQafhGqi#H$3H24WLmIuN zR|)i6!;w3kN~p-M2V1~5dWGFinw7eD$S;%=Ga1ZmM#{=aQ_I3VzS)c@ure=k&I@TL zDw0Ggx?S`o$|y1|b2=4MHB5GI68_=fsTy{peV&3ytE>MGpN%xvCQ@nt=Tn7IwO8gwTwQ)swP5D=LIg6~3ALv4cfTd*J;c+em>(o>*?i4%U=q_Qf^S z^N_wiA?>)9>3vsoEp5YEydw?_4>vM1MmI(Nx#a+&-nBk^W>b>Mt=V3n1sth)Sg=BC zZ3Hd6Q#b;gr*ZR+P`6l2&$-%|GZ0ym}ViX^)dU}I@Hv)^dU zl7RFim8W)Qq4@a?M~O`FiB|B7o{AVOe^d*6+*fU9Sf!*?++6Qb3I_9ljA@_r^@?;l z{QzzpnV910ocU84Uf4?B+HX1@eltA{e|JIfSl1lfQvN4VzlITG`TCFCnl{oPg(x?; zD{w&apv$F^m!}EPK|T-1BY+N5s0eha+v#mVbtoU~qKnZ>Z+waGD%q}qoqIe?VnM$G zQHI!Pyfy#nZb56bForT=yZLJdJ&*T(dujh@xNQjM*ZzC{?F$?bheQx8X5Uxp7EN34uovub4jSwsty zz(jNDj;G1JQs(kB^AAG1Yic76403lTe3hTDpJ+YoS^rcr{WL_b*9qQW@U4lRO=NUJ zw(oSlhT|DyD!HQ8m(+k)*|7^v;C#rS&)_oEXW?`qwuP&hy{^j z$2Y+>xBTN7e>H+a7WEdI9(*|S zSL6Q55ugB+$vpF1?B81K_`_^M1Wg=}_gCX@01>pmY4G1kgLKB2JHztPe~pX(?)5hX z{@Wk--sq}x!C9(?GV@zY4opJ0S?)BhHS{t8rZY_mh!9RaXi983+&8cqOaF&}d@nb_Ai{QDLR(Jy?_o+I$q|Gx(|Lljb9>n7`4W5LKO$+fm8?Fh} zKZri(o;kt5Mxo3jAVrQF9n~p3o0z#@emn8RtuU{~& zLO@<$m`{aiMOACn>PzajMj`VAmhkZAEk(YzD~L}rLJpkW;s$v!t>t*df%>5jkuj+e=%}-i!QsW3o>8&o zcMX9u*2d&7xSzkXgOaJ_V_`ku=qB+a0C)XVg!@2CwW*mmJ7U?f@ltNY8o`Zu>Q`L-tMMSF3nj>bK&p9QA22!N%1D-TrSpc zjjiy+<W#hbI0C&qgCCt2)sgY?e(uKg=0B58C1=ig3zN>Q~*RpyqqsU~!$JsSRsk_g>8Aiv~0pKB( zhk_VdL^Q=8b;H6|UCUmwud_}%-G>O>3zrGAaR3&yaTuYj$FwgdEI4KFRc&5X@;CJg z)~{_qx%k*A63^y$7qx#hbBM7@2~C&5=-2PsYF9m1)n@;;`cP1vHvko;vZvWKXAivG z+J@10&wXp=^bq@+ZX;>6$gera7H zKaA`{y@Wf?VxW&o=!xIwI|Q>Snn!(aypqhC2NaYwG66%JcK$-Ct;E3@uf} z7VSB{3gyxkntn1pHT#tGb`fXfWBJTi!f{ss&odUd6ZA&}`g5Q*Nc%4GLd*%*JfWmS z{Q%hGyf3DD()KbzL@7s#B>NvIhW79VM9~)X3m~1PWhXO)r-{1G= z)`jY~?U$Qzp-LtFEhVC-kx6(d=bi8KmJ6j~+SyU-3=rrA8t6)L>IAx$Uh>vmt@i_4 z1;qzqw8KW4DoI|X&jJsjC#XD!87(wj8?M5XfTUS*yH9xv28iRl4dYy9y?1v_6KmiDI)~4p!z@T()!jk?Ff(s07M3ktz|zy zzQ(aXzmIzL^)TQN`hol9-!z zI(HhcwbC4(Zt$XthOsIXd-8)s=4(>ZjK4rwK3fm-IZnx2mBS0mm_}Kn<4-R~ia5<)>rN>-(CG=D1H-uqdem1?b&W^u( z{QKxVme@xr?Bun1sVBo5oX-20P)b@lI=kv`7Tqq#p1a?==%U_i3@fr)KG<<=f6FYO z3wF;&*$x_UU!$b*p+0IH$`E_H6- z9$DPk<2(Y;5+>9Iq4f}3WJ51BPp}HA-N>Jp(vqjlZCzc$hPtOm}GM)>s6iN&f!+wu=|c2 ze(*!p)g5Pr`O=*6`CQvXE%L)pimN;^EIrffd%}Y!M(_#h=)Na$f zo=-V^!P{?q+63ZB2#MDz?%ucr(Lq|%e04MFe$EkK=n8QmxbfE+>2lBf(sOgr7^H{% zP`q*uI}f?QIV+kLK@9o5=Ae;liaNd5rFM(<(n9w_7Xc>7&DCC%iwGaj%f)z1SnvLE zUXMKmA&?RXUg*z4#m>^9%}<9z1fy4)yFbUTwsoaOP+!H2y~)WQ8~i>wXzf*VeiU{t zVL{Ln#E4kSh5S`%Vv@*;|5|xcZwE#)fM=WX_Yww4+@~axwh7M`Dhse5ieiG+f^QP zN>P_OUyQwq!K?@kz{Y>5rrSiWwe{C|KhuhIb*tY0QYCkW!XuK{uw4pd4rI}qcJR#` zgeW+plq0Y=+T0s%Que?G=d9$n$ zafKA>lh_tT9Z}Tcd=%5C6LfgeCPsJ3Vx6}Jb{#Y@X$#NfO?XT%s&=m1smkM(8(4KQ zfRR5e-uuVuKkK{SPEY>F_X}qq!2>MoWcO7H$cnJ_Vv_gn*#knmyJMrpgVp>K?R}(* zi-b>kQ`Z_yf;M-L$?}0YsJ`}lT>%~_K9BQU-n05nkZMDhR)rH)#B4mTANlhblp1#K zw;N&;@23|ny7Rb4{LQKdOS01gv?91h(i7+6{P7&wjm~ z?s|4SxV8|&nQ{M_CfVRqmCmls|7hRq-ud-BRQ+9?D=dF?aVy7XhK^9!&Yl-gHA2vY|zV*aH~={ zvlJdZui>yNJrKcvLc-jg)e7Xo3`MvHzQX)H5jUQAl zAT$o)YS)7ux!o-Tc(i4fq!%*NRPtgaB*^asPiU7YQrDba@vYZDx<>$)q$K}w(ZkfX zdUO*eE#Yn=P&@2Ydub_>tIH7X>HHmIycG!fO#6iRM%x{j?|m2%kXW2--@s+pTJ>o2 zQc#W!Wq>q-%P3jHW1p#pINOHzHH?s0uA?vz=W3*@Jw=1(t67P5!+2GGNp(sfQJ=Hr zT8I|&7Desm8xx9D)mX%{qMH#5>D)vSwCXoE8yAagFk|NWVU-qFmqH9BD;gj)LZ@8tQvQpW7^-HNYF^ znND#G@t{~CVpW@NoRNGLG~)3L(53NY9Y=EL*-jHPlQQ!h{#8V{i!|B2k>?rRp}qYr zWwZ9QVg07`jbsN?6Nkww*Ve?m^N9Rw^&~V~-pM#r{Q5xu8$n!~<>e@^@YfEvrew#R zDyxV&leT)*i~(DTK@=#Vt5opPQn22W<)W5MpSFb(_b;8o!V>|<>HvU~e5Chf?*2xF zmTI78^Uk(&j8TIeCg;N#8agF0L|DKuTIf1QM4DYPqN8jPC~o~`id?a~RKuUIq;5iV z6WJ^2Ei_G4>>JHot zI*@?PoczhhBqVuOPOC<2x))v~C=P}u?Pzt32-oDX3*=Oh0|!1$)kXpxQ;R>BBi7w~ zEIA|+yk1vkq}ih(DQr&wfO85tHpHnrV&!RmXbd`78ctoLnv}z;$+f;Pdk>ZPxj$wE zG_v_na~XLe$d<{j5k?K;z+BHUHwc#-kW3%Zd~Z^y?iFTg zVGNZ@G@@e9B|u^>Ev=;evHe!_*=YLvQR|n~o%$+POlu@x3=fsW3p>&7gg|8Q*S^dD zzED=6qbZ-Ye4tlHw1t(+g9iIiOg=%_BgO zB5V@z+0uY~Jwqj~(4&d9?&;gaVMhJrK|o@lFqIGat4(x%H6{YBYymNO8E-NOD*(At z1m)J)KCoU|(ICn=Sb=NFXZX4U#l%8CBQekZ37NJya!EaDJ+7bSk!<%y*xtgvaQe-C zkxE5SsRm6z=I4cDT^p0h&!FkOBn$@}zDE_MSZc-^s!78NYIcHQln znj_o;XKiDyDGWGxy-cgK114*#$uqV;DEyo+p|ywN3X3gyeiY*@Zj++iW{M(+X_;9y z?WmnN6h-s~6~^&OJYggnB`hJV?2=w6ry+4`Iwcb2c5XpwSwp9wi&i*!vk>PQb)lL^ z+=(bMzPsX@muF;^NE;g*`Su*}pOiZeGwlLmm9wHVk#qQ@ts?pn;3r!Cb)h@^8u&ot zkmm^SgvrW8aAIvVM}TEn)jS~!etjpG__U0ytNUeb2rk5x+96iHL=JC2RtD0IGU@7y zCpT&=v%;RB%vZa4Ojf8H#}VMu05SP`fMl`U$(-LLQWFo<38gIm{g(99rm6kRSj_O% ziPL@J{MHB~XN7%Sv+{1*#J_(3skf41t+4Va^vaHxYceIR(6-imMW?+fgVA*E06*vU ziv>c0Fi2$?>rPZ10XQ{Y0+s9UgsfWb9Ra4e#Et;9PLw0SYtz5za5nzWB&-$9*2=%? z&;AN|{yd&Gb8h8D@X+MAnLCI&hXFCYhDCJ5C^9i+HO(S%=L0<6nriM|vnQRNoEE0( z*Pl}}J#bpIwwGB;NUA=xvJHejARAa-=_(GNayPb$7v;L$)GE`Xs_!NqEU6j@Uj!q$ z?my7@4JjTnBc)l+1WWF?4ih3jg-4oN#966wfCd_LnewzI(Ls%o-MjsgJ!?FdMX%K; z`lI;FtCwRMHQ;NX_e)K_ATQH2233PYMrca5@(TkmdK~PF1AdhFD-OO||ELs<#bi`B zG$ghYVVX*P50jXg&{u8UHynUBmwz|ZmG0gSP#Up<%~X*m2UdPPf1Xx!KAuJz^hYW*qSf5u6=+6Z|vR>XLk1kh{P1-lpaxIPkDFi`hQQ_E-!0TM27VBy=$7cPL_~vu5m8!Nd^b|tT@N(4W zj<&XF`>7=!7O%&r-4My*;#xz6@b3)K`Mc=Q1&a^EbV=sfnTq}56Ao7cOqD0OIy-9& zO}q>xjIFK6FyG0>{9|2#I&GVb_T~0CN(HxUZ4XYSEAN`Zwe-!B1L-kXUQzW(FWoso zJI6-!bV?&9DsJ5?Z4z=xm$$}C&$brY8PJ-CO_uPqw~t=4m5X|aMz}>^lWx`m_QT_{X{BX8ATTeq`{9`@4U_ps zr%1}yFouHEN{Jfi^X{+geQ=t>AO~V&9w-{0E<@{QkA=y@t4UGUsw5;`@i39bemv4` zg(=!I(B58aV>d?n3K2}0sXzJ=4<9E*+o>Z)glyW zI}W`PH8X>YRe}?y%hbi%EzfI|plal%{mL@mM0=CMAL#BD-BdmWD4hw-sH# zl(NuXD9$x(V`_IQCp!)jr#J4v*1{B_)cR3-4`bUSY1LQxu-Em4I7LQ3#%g{-u%yX? z{DGX*iaeT(t+#7i?~kEbd@KD8zV6Z7XSt0qpYB_G>|aR=A{hGSYpIPsf)Iu(s}uXJ z|4lsqr<(n-)@Olt)1jFRkf77c)s~qo46Le#CNZl%QQs(QM=N?US1WmFWSp><{J5*w zduusURxhVO=>dnid*d#HbLQCBsXz%V_#zc3%Q(;TzBxDC3geMaDV#j;g;)!15+b)i z;v*Y!4|#4b3}v{hh9*e0NgIrqr#a1#dIeqswxV4JqC?)}-{VMpZ^u&k!a<41_n|&w zZMp)-AyU~5WJ(3R72YtMkQaS9De5 zn}r0wx%oz-9ghhUh7^+Ug4{CkHi1F1=-pj0C|hq^p(4gmaCI?2IHiJX(_GQNZ!#kq zTZJ!K)Aj~TTV(N)Yw}xI%-R-qcWGtYcb(y?m2|GLl1uyfIDTX$3CGSTkyNwuGrNlbswQvGqTkjaN6S5 z5bWim?U*sjdhfm3WoE`!a7Z>oK{(Y`%G=J1ml2v!+$|$~X0s^PVO^o}Cn2_COi31l_xG-QdvXqrg05b0Bu<-!;{#LuZsx4rK@STDhSlrI9 zu|6@NT`ywpl{xT~AMwh`GIr)3s$>2Z^&9U6yk@chpv&CTLoJ z1R(H2$54ZG(Q~*^8M{z9JUixo z*T3;xU)b{KB=&00VM(aYlV;_0Qqd`3M&n@ zMWDd%2oNmORL$DsFL3JZIDMtxZ|TNVU_0xF5pKB0{(kfQ%Kn|&CKH3s@ujr2HI~$(xEG+{inOwC?s9RT_4cZ3oyp;`9>YJJN+*7Lj$qF}&ad=c+pEesS zs#mC1XQ8`>p9?(2*1yi=pI1y-d&70rQcoqiy`^@h4 zy*kd-bY#xlnA~B+x@wbP_p}aaQPrKxklU_3wnC)-x?W!9W!tY{SpSS4O9UKi-L#Ex zbh4vc8keV#McvIQI@RB&uKLF9icm^J9DSdkSDkOzv;pLnNRMNPbE=5WarE}rt4wxl3rkj?!4me+C%}4n(-E}wZ;_1 z25*!j!GhegUDLDHypCgNB{Sm?7q3ZjB`prpIIr_{!}6+aEd60RO#4N;gG^D*%7I*d zW2v7v>>dDc?Yw?XB+i=cl8sNoLj?|CLzh`ezTqP>Yfjljd%ZH`jk%@XwwaG%Z9gIJ z+y(f}{kPKQQjB4_$~r+9U!QyDHJS!i{o?bu8yLZo&_|SVX$c>DrM(?X3S97e{Q$2b!X^>{6G(6p=su5)~3&BC) z2}tQULkV!uvgR!F+Pv51-H*?r$|{tVu8@HbhEEL@N5*rBd2iopATt(dci4qnHW+KX zv69#RpcGSbQXRo1mP$T*Ua6@uVWs%$!Nl#^AL$EC{HbmBTU;|=F)^{Jju82;Z8JlY z;|~13r0E^lXBHt~dNpJF9@mHAfvQk}2sM08zBR8#=iLl!=E&N>p%bV2@g`7mz%~Il zDHwHnH*jmnasr^};WQ8pmPer}W{Z<0UCO1oB)6>FBUWK$w=n311D&0{i+7Qi`)B+Q z?}JZ9x#J#3xv=#Kx$5kFfCE|138V^W)$psoZt(GFe74|er~GsniEXD)tV(OYm^c{0$$t>?38lcEwdZ_H)sP$7 zIk9~UZ57*P8HZ`B|PncmMWMrj*!@p0z7@ z+UJ)ez&{2#JZ;k}@EH-nq9U$XJLGWyzl~Th6c10;2xrG_-dm>qKOQAG7UR}`HZpJ5 zyUx?3^7bAvF8W^?-DjR8^)HwnGbqJ=a}PcYz4!l{TO5+kHI+N{EbAdN`$Ud&pl<-P zG_3Q=zl?{_sxA6C7S{R4Q=u9kSQBBz;r)H<|1L_fu^-N2V-7DGV-FHhtYnINf35FM z@cPHYAsg$zDga+hE+a15T=Y6r%7VwOs6xcTaMqmujB;v);dE>h;Pa%7p~R1m9?lF^c|cqg%^J~j5H)2Y-UO!a}^_qcuB zPw&t3to_}gbK=Z$hTuE#U`yiZF8RTOAXeB>;MjP*->%=SK!{I#phm2+Te>jlPutYcjfrPTA?j8XG zHm)Y)nog6gQo}4P^iZzI>R-P7hjNpRp8!A1efa112P=s7;rv0+Btw&DGY{-nM#?^t}WNHwQ&$>WXL;x$MqV;{}?vO2mw`K;Tm8 zN%_K3OG5|}##9d_R!yveYsa7eMH!_Yvd(hrETtVqnUx~AAPT+^iS|zh5!PkCJD3b? zh)|a7ewxn?-K=f%!oqfNuxzk5Ul5xg3mocxi0GV9W*>ne$7%dN$UbFAd2z>pTZvX$|!m zTFqR3*L}nA^1^F7g{iLUp>2MV?8g4G;v>L7!=#ybaq@s^qJWlaF3#{$db*VN*E`{n zw)OjjBLHxUG*5?oeL7{4aL~@ZC>ktHFQ~huYwXN2l-$}m=O<=9FT&>b3b{NE_0Cj1i~KMjY+;;8 zw_2M}Qw#R)eeoGic;i6Xu!-Wm*jm1{hczk5tK#6pp~FX4xTf!mGVbE|MlCI`2<$-&H?~M%fP`n5Db_F!V=kr+ydaJTkh(tLW4C^+)nDxQU z>FuGNQ{dt6t5gE0*_u>E#)rHs$Qno~Yy7oHNT8;fvzV9ieO5u~E25&vxf@1bo|mL) zCv{HW{(`^GCOEXWbmyakpHg5?_R>xY6(aEi*1P+}_Zuzj4OUxQs=XW6f96`pt3@o# zft8VhBg?w=-A$vJFZVNl-zaR2tf02PQ9)MSh6SyRP0&>C{BN`V*M+QVf40f=RzVx) zV#kdCj(9;e#=-y%M+`2epo~z?0hh~^BKgvirX>q+UbV=!3238Wn94}}&UKzwtqj&T-f;(XiQhCa2!zZ#@JdP!v9=&}n@Yjw zHG!EpWqD%wtTu-vhaB0L5Pb+CIs5IWQ0YS5Ko!yGC`I#!%4v@+F%ni8cMEGCK%}WV zRo`X>mg?CWw;6_SyT9jC6Qbi8nt5`K?HdpfzB7fP?R-?S9?@E^a^+Gjc3MeZ65DWScCf@S#BEAlc7EOW`ERvpz1O ze!>*Nn;aWI>#O?`V=@}~B*iG^i+ksxjAJ8RMIYq%%+X zUEpW1hV1>p_7I#UYgd>Pk(z2~fT+{Ep?fJUp~55$YHDMJ(Ajr)?eB?g^;8^pk2fqr zNTy5N5Vc1yZWKqMVLCz6Rh#7GYJdye|MzJ!yP=0Y{HcA(8}WEE7uG-LEUFoJ7|?3v zHkYg1gU@nna@#vO&NTCP4nQhm_S{?Bk-FmUw9b+)a6by!`g6E993Kv(tPZh2th^GG^aQL6M{$rb)Q2$Lc zOT|{rlC`FvFYem^yth53zO4R=&G<+PnZd`3LxyznXuIYvBDGMDxPmwD=#*7nd}4B^e>>;Ys6Mh@QTr-E?t7=79p)EJC?ejk=MjehuQK)kgDQWgcfP-|fRX70@ zGSy{W4%F+^>^}m)Y697B^lhm6LKGXqL_;Icz75Ja!kzePT4gHPZ){`PLL+UuhS4Q` zcVAM~t!R6S=rizo9-osvc|ho%KH!7q)i%g(R;ck839(;~os-Tw%P5Y>;?fcy4@^a` z$*0BNY+UKw0SCqymYYd4KT!H5IE(Jyxm1{1KZZX2tcyz=nS-ae16e*b;M$Ww^AM$$ zjgk0ir_INYM=V^MbC)Qm`(b)Ijl0MufmW{of&{yAn&hP3c|n;KfA2AGJ0*9jvjSnQ ze6J$Bw|~kLd6QO-)mdqeviLc*ZQ?q$*U+8bNEOgINGXZiBs^ zv_HXZRen84Yh;}+hIR`C0kpn`*tx27I3TZob>6h{bD6<&#{uJAHJbrC&3kSbwxev$ z{3lM_QT{+i-Pen%!w2IZgofC}g{~dR#xQ5Iq0WA%!@r!kUTezfyZhDAhP))NUMUeJ ze5HoGSNI&3$H=SMb=htcQ6hubqG?gEgPZ2tj!+?n9WyE6mXO`Z>U`%IW0x{s^Le`o z=NsG3aOV_paGI*1>T05Ol?~yBCh+jdko|AP#%djoNPonHV7id??sB1UppG@*z#Xto z$|I?}W*+LiFYn!6YUy3|=4ndFB_iu=0_jtll?eEXfv^x?X}$%v>O$oLZamjo6~-C>V7!2**E; zXRo2k+7h_QZUM^)d5bdvPgnrvVB5_NID0Kc1xYwDMs%<8s_!ypEHTFpb$A+Qx&vmlp-Xx{<(DiON9aFtJ<>uE{+;#*EJAB4JmDw4fR z8p67rOFTRl(j zaUkgj&tnVc5B$UbZec(0V$OWN^id_!3ZA^V1HYvuw$tpl9!d=l)5x=b?RR{uZr!?l zXN(0Q$Y@56NroJ+qE4w_b^^zCBl>2y`)4a}Jn%e|_GZ(vXe+hNgu~}#wlgK;3&*Y; zHpU%kyOMUkTro&e>o80Ua|)JG>BbH5!fx|~%yKS2$Miz&YJ*aP7Pd}mGHOV?f zZqBg)TR{lUC@oY%Cp#_5daN`!-}w6+CsTf)NH3~lgRK#1n^tBF#~OBF7%T=u;G6=6 zw!!P01DP(`pRAXW+`KxOt_Y8-R3vaNe@!F#_k}N+PxIhEM+ttEw7;#t$*8Ly0vTRx^S|6g;v6;Y*ibK}{uAFR_<8UjmMqk1Uv8D<{O3%#(MUk|pEVa%Rj&Q8K$ZMCi2NpA*+f>dqEx0ADS3cg`Q zu4N%;rYz&|n!Sx-BV+xb2ZK7#p8E>=9}M)!glsxU3nWeMn$f%hRo8V6)K%B)pMtw}6-=SX+;FPFLx28=v_sA8Y&)^rYMoBb*5dqT7UrUAirH@WcV|-% z75orig6aB*gB{MszTq0+FAmxBMrwO&}sXB8%{xt7_RnM}fd9wfw2xz%)c3xLOVLXsP(TP^o~tr{f{gD1Od~ zcN>hWtMKY7103MXs{Vc5;4Hr@?O%Z1U_Q#Z^fBZ4a#t1UO~IjgO==1<9H7Oa%KO3l zCl0rgDc@OkTCA3*LgMBZgs^+$68{>Cpuk*aXtNo zB8{_3+(&M>?%wYE#A4#a5&5ch-H#9KjDG;$FutL3>zmmu6;_!NeN=N4to`BDApHEi z?y-PFKGnVW=gu4#rV0%@i}qfJ_k34`#2+g56N!W6Wl`>u+!GZPC2s zGmZzio620fMnz-iE3A29<3rF@hpFRvr+;|1#Qi<=??wP>XN-x z;zi{@#^*Luh{~#&R+e)#b*7hl*LlefMNSRo5w3JMQg~|3^A*?6)z#8%2`~4_Vl z^zQtk^eFQ|SbWeUO|Yeoj>nQ&JcE58dy^iNRc-(nE5R^kOw%ONSr_)9;7mR#sR8fWsh`*Rg$g#3ith`TCELYlA;+ z^_8pD&IhJZURUeGi=_#)Hh9(k-u|^q{YKtIE~SH}T7I;(IhNFA&P!hurc`6ib()*4tPqA-)CaA_!f8tu=S6wHjq zl%q1=jmcbPF%WA(d4fgbM$S?+Fli`nk8%2>1)>1nc+$SY^(5U-1%<^;xhAQ$`n(C4 zLYS`7=I)DRVxPP8JR2YGceIX9OI4i#S&bknC%BI|H44qg8lguwH>#I=36o74Wev4A z4H_LwM)pcJsIJ>es*sKaN2k~V)0WpfQcZOeQXx5a)htJ;Zb}o&^TgVdn>qdM?UNQ_ zU+=Jwi&gIWkJ0_f=XGJ;09{1-2m(G3DoajQg%}Mhmjfhucs_D{FY%LgQ$i3?s!4i{ z_~8rPNIl1q9a)l185S2_+LT)&W%@&$%;#idJ>0Ugq}~n471+tTJbX6Ti@(ShI5RdZ z1kmv!%%&L5PyN<-YcX7^3z7yuCIA$Tsy$~fhI{sM-T8sfLMNzh+&+whK?j<;!8iAk z-I*^?NZ2q@h(2CXrJ@J=b=`EehFW#{wvfBLfc^J)k^K5Pu7?tyg7cqAQl-vs(}Z)| z)+4YS7A~K9cX=GH7Ph1DY^7|9JI%?0KphJR3Gd@rX8X&)<(Eoda!6W`n$D{YzmUDN z#V_m51n%0;5ou7v7iN9*spMPqi)p@9kVlJ`ADJcYrk*B|Q>o7fFC&`7g66-xh8@vv zk3Z0gYtp{)ncbk7#1q1z(WgSjkKiut1LhF$Mx~qv7u5y1zfYLC*~)s9pz-mI$}J+T z@mTQ)u3y|&9c+LA=n?u++MkCBWsu?4|GX zkDCd22McU0tZv#Dqri9?QEDHGC=_L$1ark>_xyu=Zfjz_@UVMa!@fB+Wp0GJCurWeZ-e zKE78uWBGYN5X$92?{h3ier!DL&YDnHdU?o^iFl{Pz(!-z>IWaH=uFKQA*Vn}mDU+QF^+7uUJH*C?k3 z=~SB}LyDKzx_(j9Iy3wpqjF`jT5c{{SoU@0W3fgDNhlKXXrlL;seyVz%zes~aRcr7 z#KaGehmh8_o5z7X9U-;B!TzxKYdvp1zL73#QKH<`APyB3CJFQ^*Xvc}7+x@(fRu~K$-ysHZ}QcGw})^%O9Em zN*O0gQ9^*#!r3yo05jV~`yc}oP}fET{nvp*z0}S_4$s-}{Ksk@jk}J9%7GHPJpL1k zg+eO8vF3FQph9^Ug>xNAy#00nemsgPI8 z@vFTzw*Bf;ehpK4p2?K}rkwQJLR7)Yq7u)cR9j3KRUR-uP<~BD8{Wl~96~M9f z57^x6gWq84*tAbJ@zZ9g$a8Dgx{3o^S!1@iSEHP!3P?r^*llWJbdfFk=X_ZRQ9%Bq z!NO>XfT%NM5D3yMZf;b+VYZvKO8bN#kvYyc@U8p!z)o^3I{AXjI>Q;Z2`*nj(M`)% zMP1M}gn15)gR_o8!woP;UVyJqvA~~LY%v6edS~AY7m6TpoDDZ5Sk-d(YBHNx-bEHUf{#!A_Tl!_bA!T1oR7akq zVo*LaY?F{ET_*d=<>9~kg#En_#xZuuaE|;7n-z$ifi$MDEc|dqB!Mk?F1ZHD|GMdl zFgm1p%svrqP>u2Tm?JCP`QbK}Lf=2-jZkg~1E-DQ-yV1UZk$BlhwM+X*y@%R{~qVC zS!yq&oO~09b~RX{wnaFOvDn9v7svuIE%ARga85``=fCdb;5dR0EXP_ZjjXU>pfHsM zCoV^GQ+(P|`Pc{y*ugu>IgW#g5j>4uUh9{h8!KIgf7}1^($lVDzWqFIzQuB9#HygUt5K@*~q5h>;&qjFY?0VR{guF z=v;K>6^mxjzS{$EQ7whSTc+t@I<>mbLDA`0DA~rlwZ0Xt+;Lgy?!fsKjTV+poSj65 z!r=|0iJ#6izFNp}?RAEoNwDw_Ms2s65B5j%N`#u^o0`0auB6(9u1!SV)8W-UaGIMr z8s7A;V+6^sL%Wl}AIBR)6l=-a0fXPh``)yq!z(pZA2!&>edXX6Zr5|jt3d%<8h>y&v^YqWw>$YU$-S-d=NVn{cB0CU zx+OaHP2QG_Qebn8C1LuCV#y#sG_yKJE5+mh1w=m-Mc-QuwY7*bl=QKmHooua0k=6<>XWU7HR zR8WKf%V-&A3zb(`g3n)EH}}(q3^8Qarye8{6`h%%+TNIgyD=1#8^QfVCQZKTLjSwc zUVx@nt~*@6kLz=yyA5!H!uB2o*q;i1s0G%0;fhX*NkfjsT#c5H1Bhe&Si6CI7J+K(S)ql& zr2!8)#kyi6)PUzhSZUc*dQqkGg-Yb%^fZ0-*I}j6^u0+_6KX!Wd-|o?Z_ivhKR!_T zT{1}Ubx*pnt-7F4RXQ~SSE28v*!&k4U?w3ZUs(EFbl#=;%2h00a^lM6*2e3E^h3g^ z>3Dkf)+()xt1+{)P-?nM3!2D~cd2rgV$vaBA4$R6Qlj4xOShZrh}FWn!eMpsv$s^u z+>g9WdMzHeK_(p2CutTVsW#MrrlZ}Zmq4cX=Yia?x3@m0>~Kn8FD2IbNtFG%V@S3* zK^LX&h3(wSrpqI@s+lkY^O-1^wi~e7T3j_OJ8t}BO8w5o`int^NW=keOjN*iV0mfz zdaZ#4m}kkx-IQgsy12e+v+h?H>YZr*Np-IaGWTnjaL*&DDTn7-UcdIpR^#wme{tQb z;A%8{f~>CZ_vAzq+DmR_-#u0Q%2Wfj_2?Q`Jq@4Q!*zb+`n_a3s(i6)Ms2X%!4I|e zYO2hjti!MeGlN?v`gwoXq`nF9E0^U%j*ABJWUJ~&sVANWg{d9L;CgeYr!R^Yb!N4}6cKMZPn7NSq`l4$|JWZi)fN4; zUhprjpOc{s8LMCw2BJ@>w+AMvZ>d>vpGoV(ddy%Ls#=fvPCe2REG0E6-e6ZwippcX zBFzV1-pX-zRnG1pZc#zM6+EA;?-z`PFS?VHcHT|AFWPdi)ZW+;(!)l&=(F6kjv^vl zWJG(PBl(~96_+-B%>m)5ItADu_WsY8dyj{?J{o8wa3 z1``NoHoC*(W_8hBA5*_Dn2{s^+A~EK!XdOK^i&QA%Q} zF#%m$U46D})t4vKgDOxoXW!B3>(@JInVhIIO3_f~lPQUl_AGxp1wT}DCAU-Xg1euHy#M7-tHR_ar`YV(zf1Lqk>u5If(y0-d1|K zu@l!IjW$vyYIX!3s5U1b2+Y*^ZBB<(;Kh74JaA9#=XVTiY$9MMr%bX!1UDki2$D6q z6HuI)Q9Dg?5!Sl2@9w)3&fB@@pZbW$L7gw6{yZrTamU>AbF4t>=x#{qB-`x(NtQTh;YtiZx&fUD{uI-C8 z?z4k;_jKCFMGHS)lB{%S%J67;Z4-y9VW8p8Ud?!0 zZLN;Iw(q5Z{^EijiU$r1Ae0~9LSkd8@5yq1v{pI4UK$>;S1)KUeL8T`+3irctHJZ1$<}FXMKL* zz{t}Uugeyefk*w4D|Iy?^|fKgD|dY*LgT@K7IQY49>hN#c31n*%E=!lgL&{ybQqvk z0;nCss}ybfJv5tiFP;{037iKD8oqCc!Ry_dgTgX~-ObwTb=+1DKj(>A8FjarK~mm`5eLA16xjZ$Ae%P3dgZqluo zauhZv4YI_8a3j4tnni~L*X_3WjO_2)%gP7<`r=wP=#EK~*(m0pjrX^+?8k(j-4DQe z30Lp#Temf4cpRyc7lY~> z0&he#0 zSM@HQ2UF85>{hxEt3P%2^bGaQX011CO{#CW?u5gW@p z-ubR2<4yKFeIeiW*6r36;Bd7B)B4_z=s9WITC>oNNmD9)w3e;>$D)N2$HQF8kI(|? z@CX>DEZ9E@?sv2HlkG+NnengMk3G55Jj>EKP{Kz(*OPQY1Op#gPI(#peMcuAyZn1c z_h5nKb~leek{+r=H~sQyvqakM!=jVTs>v?)%~-htg@c+3qc(dkJU;u6amJ)-c+ZB@|AIyP_ujT3d z-1U@QMDAad^uzV_C>?mtzE%pz868kw{%x)=rBkSQkLz6Kzonnw4IS#VZ3?1hRHvh( zyO1EC%5JBmXcuz`O&XYqJjbmN`xauQ z#>=#Jsw%Xbc2KRmPu&u)uH-`GWl#neHf=BG1YWtg^tnILD<$35VeItsCm(&h;tK3k zN6m;kAkjXZ98dT0z1!z#X13ET zB6ZZbALlTTQgk*_zRI&W=s_)dd#Y1c?iK1;ZEcyZ@2*|Z!e~wMw?D2tV5)K>*NjKh zC0aZ4uE=#ipRLN%Gb+P1u;QoQ5@`Fz81co$0!z#Taq-?was+H&+GI7fH*j$Nt6`QM zVZ*BbX}GgQg{=1WhNT63{>#(`2t~3JQ*i{6jSdf9t`oQey?9rBbWXMRvX{Qra64|EGyCod zMZY*JVq1ryz}~oL){SbY$k*|Sx5cQrHFMNE$lrdJ;g?6UI=@*AfqfI)fa}PRCsGH~ z(!e***EUwFTcZXur4}`p4Q!}cd6(AA`oD%3pe;LuIuf!}M+UJ7eKiaNRHF>Pm%#zg;xUv2;5 z5?twxZ2&nw#`OdtDNw|&T{Dh_n_B;Jxm4-X0^-4gm>Ig`VH0nP}~lVDS*P14pL(Y zBqid)^!#!P%7Tz@2wh)Woo=29VO6;#O1_MW>2+XEIr~9@4f7>R>decsNj2z}v^K`Z zmgl$5MjTAjO|^FHb`zlypS5D$ijxh>y)>*P`SSOqJ_m-go-kINuCJymUyhixi*O4w zdGL1#K27IcM()c?oVwP*4)f7mU!VM5SRPr?(BPj`>-RwK2(25@%L*u1LTPEMDcmkR z#krbM>Cy4_$qLH7a=Xn3ZJytv2ZdMf-HKN)7J05>G~DsaKgPg7lb+`Ycz8@xvpl9x zb;j&r1Q-kn_Se_-SR-)sf8NF@_S=amL)-40A%K-y&8iH3iS;&x>&wQR`5Y6~J-^Uv z(n%~gF#rRBvX}$KEU3Mkbv@`W+q2nNjQnWgv$B zeeQ4&Fc%(9tsAnxo8SV-)DqXZN;6-Hds}u8YtIbzMz&XdmMZ2ouQe~sd5o$gX(oCT zb81<%v;E?+2v#0Yz+*}%%9$tkkpU;?(}MtWD6WS;%Fbp)5SM1<*&)Z;Rfi$9q`V4` zNWe;#O<8&Fe7h0&^IfOS3@d5_y!nv_7?%B%hBg~7B5di5iNeOD(?LtLtOGX8@thLD$^auL-Qq_iMSOmbwsLD@0(Dnu)Y z6T8EtCDOIb!q^wTI64ofCeclvr|H+wIBH?W5umU>_8ML!cC8o&vF4TNvzd%A>Ziyx z0p{NGO{h}OgL`zZ#!jK~Qgj6c`@>fJBSd2-v)%N?7xFUtl$&d0zrN?X^Y2XjLnc%6 zPCq_3{oKu{OKCCuQ<*nm{MM>q1y+JwI0k?riu10`9#OrP1WE!+sGR+V0%%t0N{;mGsV^ej{$?- zAj1=k))N41kKlC|4x!L_$=nYRFDYCg? z$-V`G0fdQ*A&#nby%+-V)UKqaX>ZCYPdv9!qzH$aqr_It5HP$F-uk4O^oGz=iOXNq zCPIwQBsjA__on%o32bV#sG|z0l;T}RVe!a5UggU-M^T9~o#L!XkJ&R1|26*qx>V9i z0a{o|`b_YDsh$e7_xJ93bYA)J-h`S;g<61J2>QLiGo;llYKZ60d_6UzmC!9Dr(#0d zr_01Nm(UXIRg_Naxc`husW;&^uok>>&t|@a~ zHz%PfK-09Vg{-{n3F+jm>(HwXH$!Ea#2OCGkLVL#RGuhf<>>UUhCUq?ucX`NRw9V41%*{H9BjI*6>P9wv9S<140tP)+PtTs_MG0k=vi7eIo>dR!-9P6 z^0A_9AKR<1KTYet_l_G#{jh*y=YiEP+G!5hJTtx2o&TtRha)x}8nLw#`9l}lIGVog zw-04eqgLV2zqpi77Cjv|B-zJsPU6Dm@8kxV=MEPaXJ{?T_T-&4mNVbjTurw z9&hac(u`~wrul#+uxMfQ?W?F%iL?XX>T=ww_!D&P#@fy_?Io=BnS)I!y{s6g8~B_) zVW$(UG+=4wuXHNl0orkw#*m%Kh}+^nw11rmbG@0Y`$V-5+iO=L#dMl+lUO%wM_bH} zpK$Uhe}1kHE#t_L-W-Fi;324aJ;51 zIXU;<1hmwPG=-cH@$;&d7yu4KNP)u$BkCI$>v>Z%qoSNXq3Bl(Vn@3oTNyRT96VnI9pi`Coc7H9auoNv06u_Y zFCpx?F?fX{F2vQgc<+uk`^(JU$H{E(9;?lDC;_D6T`NkVOu=D|z`PN;2k`0XzzZ9j z^h})^>HDk{oE+{;&rmzn5Tr-QJHpL|EPnQhy6l1ViiN1-2ksl5=0|*y(UMjl zXe*u2CDy@4bu0sZPfc*MT|_H0iXXPZ`dzp`UhdP&0#xXmALK_00O}%iRQP2 zM`x@q<$kI(E*6%pot5)gTg7KiaKSzl?DZV}8k4H41@Ut<@pRSrmIg&lD_t*2jdWhc z&B6vYxGrmJYhSq+mmhZ_vMUFY3XOMSRqBwIIVv~;ucq!^yff$IsH&~n!=dr;XOwRa zm;_a4l1A zT1Sd$N_qKL%p&DF!J-^ntf@%7KyO}>)91qt8+Dj?Ex3-;el$^cU;KnEUpdv|&LKm) z1_~@D{A_Kp$Z#o5!nM+0)6M?g|0wudrv{w$xT)3I8oPM%cuY~GyX0Q zyZwq?w2+}_1Z(rCblb`#*E<1)iktVnjw{ev@) z0<0Lu`6()81R3ikVm4V;?3UB0*VWZ9C^)e5I7vFrrno7NF2KA+6w=lZFgdIlFa~5_ z>c?sM!E8UR7EhEsD5L9wRAm(jlc3#W`?_y45F+s>;uMJ_Z2xG2PEjB8Ew8uW$hl|P z|G5|)6Rl%iAWlt%m?`iz{>pp)na^e~QxyE@^~UD2(L&eibrijLa(xZn2*mXv>vFuo z{aKI<-v&FG`D2YcIUhzxHm6NPbx(V-1R*}^`L?wlF;W!F$A4Q@r_F}tK_GuW^deFC z0b!g?RP1I>BcwlzI$KR^%N}8sm%~)W_B@Nry#iU;Q=97*&A}|swsVx%{kU>`*A94p$Hn-bvFX&3 zn^G;VZ?3wuynHEI2hw`=sM6+9xkoXOb8F1c?(i4I2o;Nn0qAV@TJv=Mta1R*)R-#C z@ZJ%lJL`*HRw^0^+0CAe?CmP7ZbN>~wT;?yo{FP-fe&mjyMdBolX0NsnFVUyxANkK zREXtIV!MaW(>wgeY)hn;-#Dw(t9FR}#dQrbDN>q2IPnpQvmRvM{JD!9-_gpj^A=63 z3*scs%Htg;jwF?eQ8wu2V=$`gf;$eGBmKrzwpR3d_OVg4jOTCd2g@hj>qWhMvWz{-C0S@c4vi_N00K%47cLKdV&)}#7^gPCqXi6<@-raaDnY~7 zrX0nkb4OlR8EC|!D8}TP9kSA<*z=hvJ?_o1k-n~u0C1z{Zcz=R_NLZ4?fS{`>_ARw zxqlF{{2G3(u9y@xSf@TJc<;}qLLBX}lH-$h-DZ0lRK`S3#doV6mv}{BFVTn%uNG06 z@H5@@MiDu((c-0h`y$3S(*#Nf5(9M9RQLBvyF}cjpmzGrj!uMW z+zJJ1RQ(y-ve6`UEL%U)5b+8zUz$;_L@xQ#Ful4@865XXJv zj1%l^2K8v!^p{mH+oZyD1}sp(b5qjN`lg}C6<`23qHof_Zs{^d$d8C_LRiqe{rL<< zN@q7$+V}@OZX*GaQc{>MJDGGHEVrgYd)(o5eKV zxuD$eeE4OIc3^!E&+)A$`x|Z1aTWgC70YZ1R@u6L%X;XpW%$7f*nfW5{(b0A3v$Ag$opaBS2RFl_O&?i~m)hP8Q-?d&xTlSt`z(+z%V$JcBUsVHri4y`_ zh!1^?Az{2p0`@rgX>P(1hu6ENc50?-B~FSc{SGg#yl$2UNS7A%EDHbyg#$ru>tJJh z>a-sp1=1spjf&C4NR$*?^kQp8J?|;zjik(G-mB5g^6%!TVkD(2<;6QXIJrzDEZfOA zy1N6GylM$G+4cv+o|~e9Keub&%ChNA^Jhw6Y|S71)(O+H8?{K;+-(d^%<_Y%AFGX> zw_F^V&pPBy^T~}6{BYB(z6Y#HrMC-AWjR08oE|%e(3yu{S9>X zq-^gmE~(Wuu@Jdrof_v(EH%F#%(zD>9)bs~5or9ZQnRNE1+{gKYOdZBVC_2ez!@+3O)Fu^Cp*UsZwd?Bg{mcN; z)>Re`i0gAS{N6e!Pm>p-2L2^alO(WPlp^3EcK#e~xesXw#j)M*+{L(`u-g098cnT`wR9C3}-v}367PBu5 z5{#Bi&h9fw%BB8f2?{hVDvJ-SA(B=JQ>$xs^IGDCXvDY~P!^c=AxWAJvT)pa#0!-e zXsbb^3TsY!mhH9*x!h>HsI8#>9#`F9)mm#%Rjv>&ep;{wg*M#fYdQ_R!#w0XlBNS> zd_y#CuCK_vunFzexk6SB|yx+A9PWar=F5yFVg0sE%Ohj_mGCV|7%xNlaYU&ZB)b z=0Y4t7KBBG$zJT-6vT<{Ae83^V}_%oFcKrRW!@8Bq?z$rS~blrEV^Kp7{l@st{*-+ zC3530Mx15S!N(`~>an#gYCr3t;2wsQND3GPei`Czx;V2G-ybQQE$})iXf@O@)O0U! zb$S7?4OJLs(OsXx{F`3)_T=E(THchGHy(;g%>dh{L(1RgKs^k@vo-I0w-^z9DBJId z_#*haJMo6>#rktj3KAArsqWqYTwSZ1ZbbiWH$|c-KHBjc?fSmAm}+YGPBzA?{swIL z&k|>XK~JqvGq9`~&Ctkplh4Q6K$>os-M7j&ch53a7|{%<0R2NZypxF#xF6)=*P* z38%hivNHG4W(h;M$fCD#a8=O$~4Sz3NBLk1L+~ zrHq*i#Pinm&7%CvUS!c-^k{5-|Bc`6oLv3Ns=Catzo;BE1+7Ymj**>@no=F0zqsQT z_YaXJI_Z-+V%Xf+n1&DHxRFXA>WC8xtX3G25md9Sx|_>CI+=5#yLbj4Y5F$nVEtjW z&-bDF#~^QQrI_Rlc3Glraf#I7i3RNn!b=-oQZk@*^wY!-)=7iUXlTKZ#X$4o<#?t} zG7bryjGtt|t2ZO)*EL02(sdN;7N{D<*w@4h-*kEo0KJlDs(pT{3*J9SXILgl4h#ch z`r1;GEGFIbD-1!3+q3zZX*8Rjw;JgE>NmxOc-7+6$kS^-^K=r9I~#G9QRUbhp(>bdm+I*-UHz?YFBd`5iIDIUF1gJ_5S6nM(tuh2(IC7 zSeh575ya+hhZ+u@T8`TL`&q0sxL*YU$Z;X|*^fqG?|(+BU3w5o2OTI`dQht+J)kSZ zjVTW8hY?Bd%C#@l)MS{i2i7#gun+!~j=8NyY#W!u`9zVeRmd9+3OsJp()_;y;K=^mr-mX30?GZe;w~yq3~{90yx76sJEadxU2lL!3BAO2IzJayEQt zgd`hbxL{T6B74`V9!0{(eK@eR~^g z2fK_fQzo4B4V+%2Gc3imZ}9OB9?kJj>}srIX%n(?*CEO^-gei1y|r>|gII3pTZUNU zx%Joa9v&rj;f=dIL+x+xBkgn|e%vlp0+eaL+9$v7vHX4`<)>M4+)|SCxb%+y#1OVB zbet@-OU*mFj@Q1{Z_Vfu!GAAcmYt5e#mNO3vu{d$wY&EFt@vYTY1Ptt1=W&$f3`sb zK1oA+pY+Zx&|M^(poOlw4JljD&B=q90**DGZ@lM{|Bo40ZP0k+Qh9LpFLkrP<8Sl2 zd@jB9zp8d3&<3xNVADzCxr$|YrFSGot0K9lm!A*%d&k7BEo9hlU2Wb!SApfi8HMLN zjeCw#;GdxCPu+tP?X0Z7Sn+2JNoxa@tuIWEAs}rfIAp4EmG7$&5a%rzRN<|HNzxv3 zqpKdt4iHp&CuImq864 zbDX-vB&}$*p|X0lVAlN9SB z+AQC=;}6X{!f@7_F8s1g{1;!rE`0AKGZx#K($a-9HDNWtfI`xyNL0S5F`@CMrtEe} zR@m*L`Uk+v(mx~x%pcM!R2f0Z`UXDu!jfY7kkG7%{wzEF=z<^gS#Sl8$b(Le-Z|WI znwD6AEusvMNS!XCz*krj#Zw+VUbw)-?L`Ijj*-^wq!w}-p}%xuEbGMPmx8D9B?69T znMAJ;nDoH9&6?0RRc~#Iuo()^Bak#NryUA)aVKE6L~psjRXV+tZ&OjPrr%|V2|e0f zA30R&CAq$P3(GjI2&tL`mf$NMO@2)CHL!ugo`!@#Z9?oGdi@uUr2oKMga5M>Mnl1( z|A`%VIyUHNrM0lDC*D5VZe$7FIP~NX=Ye+iEKpo2nKvmlDfz*9@bt$tyC!h)vHp@V z(W!P#U-rJ2sz3!^>!W8$D&0DM720Dt=4u#=G=>^aassx-eU;=5EW62`TUgdu&kk*A zoJZXF#R2ifio5G|bW;3EXm)XFTiNk;V^m`Xv%2a-T3T9yGfC)Xn%S6(@e{|@Ukxr4 zWu=6MGihY+9zGXWRcd%OV-^42Hs^)8wEyYt1pd;!#>nC7AY7le|el`MMFERolKtf7W{8+f7t&ecVq?p?Y1 zp7qY2N;_VT%;r)~>odY&e+0%=3Y-fhkCtA#44>A34>hTD4a;1#gQx`|M((1{^e@IR%Oh?NuQ!rET%?rc!SY} zThDM~P@9_0P13sEO?`U8Y8*IO2-s>Z6Y!i4{7t~m&JP=+=n%W>SmNRA^T^90AI!^n zE@K1@V-H(7!1sn~=bw2zzm=3ATed5Et)~HcsZ>H>^?ro2<#O0jh4X^?SAhpf;*Je! zM)oU^nx@e5zykyc9)7w(HcGlcK67mPDKd=0Wf|Pmx|;X)pHo=UWIMf;+8DNel=I8C z@l1|SLQ_O=jvTDVKUX5P#!#jn4pc}$r~wvjU+L}Ey+Ivp^9(XV!1FsJU>`AkJbC*_ns8#^scy+^nysbA2G4guGh{JtZ`Au<_TlNbiI!@I2Ta|I@ zxBNGj@Adc8O9Qqk$e6&;T6*JGTLWH#s@)CS$)3|)LZ@H8B`_~?Go(&}pt8+D43EZr zotGDXLeqMx$!o3e})_@eAuYZ=# z2MIOJ-&~mY#xu1*>}JZBg+R+?hFPt|*`e}%%iKA7|It{_ppq0Iahgn?8>Gv3y-|v* z!hQDXqC7Dtn}TXjkxttm5*2=mx*K)fh;JV+dtN$-UbVS8vBr_*uud6EtQg1IUkgM}k;#sZjuECg zA*m2U_(oBkbop_>o4r`I!w8hV)Cf@f%4@AsiBl1NemTi14NuD0y0ds{S5D~OKM1`n zd)E4*Rl_m*CMW^+MgoR^XC((tBbLYi;Ajh}#SQ%3i=b(vp6l38`Z zyeMYFB-HaDUT#K$d$+wW(MZz9>{H-Cv*{J9Y})FPiDyys!g86sy`Ov+?q=3T)!O(C z2|#PtpGLgG-&De)Cp=b>x6i3~WtDP3RyVC+XXa=e`JWPTHWiOLv2z1m1!=+4aRG>~ zoH(->E#JoN&_5I>GwP^kU;nh+!KWooNAaZbRDU}% zNK}DNM}8R@4~%r_Zq+j0M9n5g$D!SA+?X`)<#2+{eUsK>E0og%9W(WJ8Jk@0GBsFd zm$?=Fd$y52zlfl1TT>K7IaTt6P@-UnQYd;SOt9YCzAGMOAaHX6UJ>AK8l{fChO_`o zgx3I^b)0G84qO-LGDrF&`Pq98z8hQcn$7XVb%V>tFI=Z%lH7j^Pw*?(#BDhlYb#3^ zmF+F}o2e>$#P)8GfIIYRtu1T%{L^_Gt0I2s!s+qrq`mxI5yYmElbj6esEC@tLC!|?>byJI$=VuG7Zkfl7r_bhukG0<#Ou+^lzB-nRy z7{RP^Zy%L=(Tg)^t<7+1kV~5}h%OW;F)1gtte_l>Xrslu&NiE}yQtixiys04j@9N1 z#MX}utai<K;Fd%AwoApcm`QB5r- z!R!J8@5IL!me;w`=Q_)D1$Q%DY1V7u*wR;V+1%#PlyE}>2rwE0sV;XHjnJ{pbGm#-}I=IEI}GZP$bA+rs) zT@-%iVbMSlSiM`#+-iE0eRfd!`h}pt!fDum9uQ|msbIOy9_qD@zm}88;D}#OM5kaQ z?o9e}sV2v#g9nM(N>_xG@4GW;VXv2CYcD{R=4##kmwA((^MVq9Yhe0z_*fNf+0;IF-WkscY6fuzX94)8I?IFJM$y0HF`rd3rQ+aq+4{-DBlOsP~>cGo924>;LivqXgpzP@bAZrBTa6H;x~=)AFcKdg(sCH*JQ zB85FY$RC{&b&rG1fw+$&Aq|D@L1yE#iXZ3e)hEpq*e#6Lcl}Q9(A5jI*D8ElXn1Y= z<%&)if^2>Y#t89>@#p=(A6tSWS2*&y?iea7D}P!EoO7ia!gn=C&+;*-zgSJUl5y=fFC|BM68(l8jWu3V?t_8xRcP-tkyT06Xg=0==EdQz z@MGhY{<^x8*2d3C$eb$mzk4>NvpY;Xq zas3@IC3W1?ozoq9H0@N%xqKH9zO}Ru>tz%~>f4?n^AZ))W_NdeoS>Ivkm@Z(2&>Lr zvi)ut5(d@Rc(6imFYWvIslt79G~wa0rR6k?Y|}vEvJuRJw2*2bd!{&7zuZt&NQ>ZP z`LqR1?EqrVwH|={QbIPLu*28Zq}IdNP5VsRlo+3u=bcTMG2A|DzxRh)g)`3$-2D>Mimel8lTq9)#Swoc7jrRHWwx8BuA%}9M(zO+K=NMBe0R* z-i|HDk+}Y^Qo}=oT>2cteVgrjWOMaXBV_JtvO^U@&#zhN3nMqSN4wfHR@OEb98gLz zbms^2>5D|y(pL5iX?`wfds_zPrJK5zGeXEa+kZzS`AC!k)nYU^t_ja6KUUwu(jWPRma8PuDW{Z4j zV!?zTqIRY^2SHA*X$t}kgN{LRl^}jSaLq?_rH{-$a`#Ujv}Zz0Qk?PY1Vd{Y;|t+} z^2XvgUq=U}t(+d6WOki2!nEeIiWIqRJ0Szq;KWNGp|mSId3l3ge#83Da1lSzj7{6E z@ykCkHT#HmVko#XeOR^R1SoG8R@|Mxfnk;RcFH3M zRGURZ_D6~=ZOFATlJb5RmT&4VBiaGp>{j1xba75%@T`eAAH6w%PX;ruIi*JZGS3!m7WF+@gF36r1q;t~`;I8`(+nWTbf4*cWe2=qrXNjc( z>&$&r>Hf$%U|wp3Ia@;ORwSc1|DPoZF$yTF!pJK z>Yw8^G4JdsRwGglkLde++5h*QV4ZhwuV3AHt#T~<)Tr3iT=ZRMoAR(jJn!0M_t87X zp|({3leLXaH@^;c^uHAy9IfP~9`gQm6|THZ)xr~j>M^VNvce;blURDQJr<VkZ=Itq7=Kcg#U;lUshNoV63x>~izWLl+q+_kTmiMZY4!U9*rC>ocg-b{Y0x6PG zd=rzCj1;&?$hQ^)o8+dgx~T@gvd%u{8ju=&gW`*P@-o$3U?B^&W{{VA;AB4ZBS9Un zq8S(Zm|#3cZ0VZ{=PY-{)*BOK)oqqjh2E&=X0gpeMPKoJJrUT^P`wh%TyNA~6?Mt> z_x3MuTce}HYv}sL%Vy!1YKUG+&}@d?XJ5$6CTIvSx1Y#KA6T(psqG#Bj22QHfWna* z2G#Y2=X;$9=E>u?f35#f{ThAj8EMXy`pGXcK?!*B|1KR69r3vL{ad^L-+A%Pe|YQo z>5FaV9mRbAU*0;`zvv5>$7R?N)^86 z_Lfx^aGN|d8f4*|_}iB=F-2%|&x3pS8`E2H5<~8XSoa$yJKYqOun~6!PmP*!a@d)W zpQn4DS*0vhp4b5(AX3FQzL1d718^;2CgdJnPW;vD zu<814ulC)&tqcrHTQ(;p3;Utw@nJAO4GM_6P@6HIe>Ycp9rWl0;bg!v_4eVN0xgAg z<@D+a+G<{XIyI{`i0)ANrKh|2AtCNIHZNr|@m1~5tqB;T$7>0^E1Mr@)zQN#VK9_g zQR7PQjMI9#^G!!goOFHhu_cf%ODs0}$HP8W#mn_5+X1if&Vjp8e%ZsG8mlc5u-Cd>pHSXI_USogFJ{nGmx7~&R ztn%Ampk8;uHH;6WhGw}suXX2NfS%}o0D2E53TISbPehJ%Nh*B&?QEI@bjT0yi?zl& z#4!SP=sU=$sIUAww}f1+u#gn6MdDF)4GH+E0>3@LrG0Lc8^!lgbB(4VG{0bLo5sim z@>UT04qj!UqF3G1jtYbluxzi!5dTrHQ<#7Q^zKTn?;CZDb#D6P@bS2U1pSrT0XO8} z`Vb1D#_(v6!w&!DXHCAA>G)PuB8{GwW~N%TO7XWqEPF}g;V-6@&i~_ESsvrQeo7lb zwXX$#OKP~#E!8UW^8CB3B0!?{GoZ>U?kj}G1qNGBn!Zed!4}-H1?TF`iaQkm)44|( z8QCU*_v3CJ`V}X98EXToLeGBy0(ZZ6EPGuGk)d|PTVsQ#rTzx=TwEWld=__EoO2&{ z52?R5t$jKL%K~&i`JI2kdF-E~;(&maVA%?P-}RdE;L&L7fMd>c|i5>iXQOUSB^TJnbp^V-gOt!nbCWWMB zA}uk(nn`iKW^eepmj6MZQJ0A}t05J=O7Cco%8APn1YNmZ$`mNkUigUlquzt2{-x;- zj~%pTVihu=64;w>AI=V&$s25ti2B;;VW`$m>3t?Bt#cD$W*AEToDkRNJ8o-)^{kz!KhIsD88@rmc> zGkKtLqdPxl^x`_9eo`@uDRYN)dT|aW;dpJc@7#DjH$zsm z9&IKP`Me`5@wCuy+xO*iLT2c7E63adIm!I&gLC-+fakaQ{#?CoBEN##WOAAz#9>cL z=40U`GOr2rzCH0~Z#qQo`hopIgEKPpRJ^e?T=0YR4Gs|}nK7N@t$=s3dQ+RXt0D+= ztm$tb=Wjf)#HPAlubmwJr8PP`F6X@Y-|bbjl9isfqiC1$?_#U_-C+-PQI;VYjy_I) zoff%nOBN_T2|>-B&Tdn`321&EA{SkyGo0n?7kaKtzSLKfO=+4c4v>B_C9W~vZBk6} zMSJQ=O(I^%<$q7aEQtS(iHQcQjc1OV`V(TYE{C@WB_zodlO8!{z2Z#RD1)6V5%M(D zqLn32I8KXuZst3tmbm-S#-tbLMJ+e%-h;z~zb)qZ-$>mXN3XOB@Y9Z^BWnbBzDNHs zOc2uH&FrT1S>mD_rXtwd^J3ozD)a*cJxnv)AgF6J%y((GC5jBX)g|>=x?UG&O?TIi zUR^0gg6#hg`B{PB)x*@>C^Av2Dah^Hq5sz2pDStP|MpSng%Fb1_Xs<6D&ePz#71h% zF{b(Vq2FM>S_1}3IfJuHJ zhExs;)SxS#=G}%TzCn0Ui$9K3Ed)8bduV zQ3Q>xa>OK-bBV=Vq-fP_z={LIyry|0QjuzJcrqQel1p07IIU^s&fHv?scAmgfX4iT z=NkZ+&FbpMojDCE!>_M&<;7ULJ}zV$(#|bwLucm35>wCmrj*KwK838@dPXz+iIwVn zkYW!6F`w=(id@q=0_sZ%54-U50UA+X6|tC+JX=c#8W%SSJy}}*tT3De8;$ zNvN2SDqYtyFVWkTXu*uD=fQ)wUL*ykgVLjFOd%}7eOuW>@3dS2TksUA@cYKX@?hv* z(9Z(CP2c%RcwFpiuHJ@@s& zaiSI@ah_nVRO-1GXA9f~E-kJ6Ly=jf^hQ(BIW`b_)VAU$4)rS0C%Lg^@9dU)SxoN3 z$jSBdw7x-Vd#d|#YGE2$F@2=Lx#G$?)O=nfy#MprKMHzWdJ8P8CLuMaKmN(HuRqvG z!bC=sjSZ;gtz8|si&F2?&C5)jlaOKYzXFI(VIjxTypbMURnFt<7$9%sTg}}ccMtW$ zZc5mEFr8}L4cM@lp}}#JPHPB=A1kzb;7hm5uY_0{w5%31f%%i?v9oDpztZn@JdN)t zRH8s)QN3jeVcl55PKU2a?Yeujh_C$wvZfY;<_bIuaZ(b|x22@(KFd5S^T5l1n)CqH z=+v`k#Z^Kjj+|N7PIGj99V~_JX7IbWMkL)Tu(oFimjyAiuy-jcW3(cvEf`xK-A!>t5J=bgkplpLnkXnUa!Nd zZL;Z0tV%&dz4=T{bxQW%Ku&uv$v7If$;k7suEtkLe*^H;f%*~A4w->v!nk3;Vinlak%R?hw#nSQsse~D^+fXu5~cRsFVbk z91~1nk&U0H%?*wbyWYsZ^3>KYix=iUlElEtk^aaZAHT4LyrdSXjVj{j{+aTcTeyxK z52z?kRfsPsp)5A?z8X1#k*SrS`lVAtQDx>@>);)ZKdrm3m07O<1{KmTM1(`oCH=)D z$?VnILdJpwI=RF5IPtnq=HSJPRD9Qc!Ul0oa%P6vywTFX3shPyv|mt)8lJZl8=aRy z48mq?1+EBPyY^O5?_Qg^U&2cZbIu>9hBs&O#F7{#DIwJ%=^ieFw@U1ncTF5<$r0Y! zSzEp)8|E!1)9G;`b!t7n{N}Qgi$Rxadpj_;LCbLBtH>*g(+TU6mnFrV@vc_J&J&wo z3&>PMWISSbsawE;HSF*|eR2AzQe_#NE62J|}`$1~u%J zTuqB{^v>_R$zC2CsiD=YjV^9FF$Lu4$w^%dAF~o#Hbl7u^u)r7=rq{55x#vI4f$X2 znzKzP5mMt?2Q_EVX{ryycW~BAj;)<+o1BVwp|kAFdtE26C(I0@P?)W7zaY z0#oV-UfC`?bethA`bAIANY-KcUoZ_Rno70Nsc$~y9Q?}MVwZkh!v)1$H={ zRoxijU>5n{iVRw}Y)aPmd0@sE&ApM*aM$1WC1`??vW&z~Sw8X|)LO>19@(7ixaCw{ zRIiWTsab7{kn$w;nS)_~Lrju3?C7U7Pl~~-ec|Gc{H&_+k|GaznjOlJ>*%CLg6cNT z%JefGZpiUjPWn56CgS!YnI2B6vVFOi8+`f#J)Cul@oO@AZI&j-LKaE8L$$!s9hTyc zz2pha0S_Pm!SK~SU+(w9ob-DYFGAS6vd3z}06Z2EG^wUJVx~??0N|N1Ec(vOzJIUm za)`Ze1(Qb0UiQnmf-8~Szr#9GKT@9zN3`@O2`0&7BbuBZh^p%t8ZH1_82X)tDZ+VjrLWRS+AW4rqCKNOP8$z9R zL*7dgTKsc|g2)k2ewR*zdpTgPA16UxatL-7O6xZlJ%U#zs`KBURIHbgf`Jf&4UEW` zW-9ZO?*}&^G6o+NXB96SZ%uDy2XDK7`SP@`2PAYe7NCMJy-K9Fu5co)tR|!nt7i}! zyxjfA=mN87cP_0v7$h0edwo*cF2cK_X5(!x;Ha-qn6Gh3XlYNt3j36 zvle3WxN*ZUqp^W*81p*j?E*)+q=2{<^3sCA%+L68Bcs+dF4(`oykpwu+MM!-G_VK1A@aJZTAitKyn0^t#4v5Ou{z+6*Ii}hjhrvsYKZs# zsHP1Xh^$EgYmRmXI%)6tyvvCD1<)(eprb(bn#kS^UamoO{>fub7-){<8Yn4bkub@> zFD;%&31hcJ?>t-HfIn@zH&xvNlz1JS;3A4n{EE-b%b8Y@=Hr~73yCGkR+g3OvR}*M z!}uC(Mo{OEbrh+1Y}mhGnOueMBc7ved4c>pA-NVsHp6Shrr2}Eq)BrEk(l)TNtAnvgBC*ZiZ&MD^;}5UgD7x)1f>7#{nHyR<(6j z-PEK}ik@=D@GqfqPWDcQi9?Sa%y5g&D`1m*pocwfZVO?meXWyF8<$c%cKI#S8xlSY zAoQ$qq0^BSnpSzV3NRXFr&}a)21c}^#AoO&O*)GU5icQyviz~Sw@K-VU zMZ=+NONfXEzhfqwsk z+)C`g9%}{;$f{sWr&4CnsNLxkyOK3Nv(sGBv6I6hles@!XX#gd;n%HH=qB`?4-BbV zhHI7Ya}ECFxi59Ije^E&QWaiORB3` zyXE90xA?oC+uu6$yj8f`9X^e({IT8j!a9h%k0WndS_Xx{ zN@}L{j>8rI_i^q(Fr( z_YK{R5XUB7=Ubvro!vi@$S{=AWDd2^E+(ZkDM>!-=T&+Qjoys;e&wgv&A&v5N{!3YJ8>OYAW)yCL2HqvItai8#bK;wsQr14;iKQ;{n;8z>EZbRI z!O#F)bMGwQ41?O+ICN3!T7;rHKU4+3^s5U<)S?!w2pXrwne0zljy0}MOm}kjcS5+D zwIRMwqM^!2WhWDOkh8c7<%87)$n_9N_3Y&+8h>NCQcyfC!A$uoS#0IdF5hGAvXU5F z^B7{;Lln@{fhYL1)UAi7{<9H~eGmsD=J^7{o%pLKLO)+OqRZjh=Q?WvAfc*{`Oyc2M&Jh7!yI&5=*uT(e|!hWE@pV?Lu;008E@ z?ln9x=lLKdnwjs(JmhXa%|~1t;L#-jMKEBwtTB8lq@?ja^;2EbMa3T6XekRqD-ge0 z+`nsT5$6{Rcp4!s>1ep?zz!m~f8@Alj(gp+=vQ;R>@j z@w+W~7Dgffm#j&-wmX_KD`GR1PP#5dOvEHl{RT}EnU?)^>lrjyZOy2@z7ut+kesi= z^MB|if6%)Zou+?Ntv$#hnT`G&0=@_f>TT;nu!eKHv@)I^JF9k~dSFG1uk+ZV zqEI!`-Y1+G|ESpf>r&^DLk+2DCJ>f}GL}nhYkW_!FOcmKm-B)i8Nq$@5#2|fO~yjO z3g&VMk!XEzhW2t_+SOoN(bK-?gpbW7LFO~3KSyk^7ZvjKHHOKibtYSCr|T>z-y&QOD}yrC5ra;$;ne;3TpWMT$f}mv|H=+naMW*rstW9>@=4p!YxN()Z9hT9M{2x$>s|+knYUXf3nF z!_i0HW!2Y4%T~Z`v95*Tu6VllvL$+3YX;3BSDi`?oByK9W>(Vg5Nn&dA-dgGdba1M zY9vz~P_QtE^>Dh{67|~wmQ|!$yYE!gNV%;C_?~>KZ7v$ti|FktvdwQvn)mf(`f2Jb z4(O`}8Q*;RDUgB)Pf4u)xOYT2`68;!reEn`EG-uJ0=*|Z8{bG9S~amjl8>%#%IHWJis~vO25q; zcx8ym+p0*ljtUP2V*LEHVDR#{BzAd2&%~+3oN3*^mEe&!_pH(Ak|To4$X1EC26b_`mb&zxesa z?Weqei{{T$+D8A*&rke#EFEsXntx)@^e4~HvKKs077s4{e|P)uKrXWRhCvtAgXR#v zedf*o-1w{g4$3?~*8leZH2Bp@)lCi|%1$d}XVReRqP#^a`8&qTJHNTsF5_R?jGxny z7&F{<>6`$^@DL{sirEm5M6kG#@^lW=)#IwNIl59)yu3AN~~k`onFIZ`w2C<1C6 z&A;E_Z+n@0C?Oa?62LVZ{GMnR!l~_XK__)x)&Q8}9x|61jhWA&rorLR_QSKOWAcY^R~o#gR%iV}g) z1SJFBD+P3w;sW9-w^n)=C4~H(azQf7>>h3FMLQ-lA<912!%%Y*VQSNVUt@FfTTOAd z=Ps@m7b{hY@tG?{z48|Eq)kNMpd-^wTzg)y4dk2ZM04gl`?)*AW--9{EZO6KNa`~qjP9md9v zcPzk)J{L^7gJA$%b|&HDFdTls=O3H(I@Nk&BJt>xBGC1UcRebxscu;30NU!=`@i(4#-`e*I-||q`Q})2AF-G$^9JDG zC8q$f^I>5?4cy2A4XC?uI2`M5Q?YNn7jH<=B}4#mEF8o0%^tMJ$Rca%&c_y+)eFFx z=Ww0^dzq55H31w7upPdXlAfEJyVLPpP)oW;p_BdbI4bIM4Ok_$Ku}8h;N#Ihfx|s3 zT~AooSqI)A5%iEEAff}CffV35OYn^^5Hyhib!#k0Xm)l2^BMH;pb$53fm+HqA5& zr{w(33FpZrQ0fKcvCgZI30@}fxb%fhO4*h)F<3BQa ze*9Y@+}~d2&2t9m3?3D$zj2j+!7D!q^!p35PHy$L&3QF`?u-gg(;S_emytZ$oxBuL zo!8X(Wwg-x>UwE_UJBnViYqURaTKj=wON073df71E+veFO3O225yKkxCy zg87Yk=LUW%aWionztP{??V~5x-K=r)kF{^|dv{9XI|g$VhMPnD6Ktl6v+*UpP-UQD zko4J>`A<8f*t}amf}5hW+(1{KE@crZW`x9M7{VO%E24FfbBgiRI=E-`cuSnQi!ZAZ zeM#^U@{7&3hu>jjqLd1;;7895ZccbvgCy0Vk5{77j2*B-PQwn)`b(FVG}rxUW!~T) zR5dONDTeX|s6n`6wsrk`d4YRQd69{jrWrrGh&SAUYsf7oq- zyV+f1kB-kafqUYb4_;h;FTCcIvAIV%piGWJm>>l^`A~}bs924(I>x59sYT+;DTc$} zemlq^=-!KhF^8`Fz}?Y#x(Gm2FPxlf`8j}RbaQG!O2K{9LO7OKXk>+xjDe^LB8u!& z9L&whT?<-DW?Ra7A|%-|*)6S`RmApm-8&<;QKK>-RHTc}Y4PP%;nCdGQD-H0s7T09 z?M1uV1#D|TmjdW&4f=_;#N-Bc1&K*W6`uKO@mz)J{wQ&%YszMxR_%!}=ZlAr#g6p&P$iQ>Tqd3Rq*m-i}>Hn6N`5uA&64$3+Lnnbz7!hxn$E zz|nP7 z(x~3ZPIx)^6pwK_NfNP{*>Ay3AL~19Kac$3cjTBIJV?!Lw6Ywk_QO3IkPPZD;k4oV zgX$2&ejph96o2Km;3dji+-mhO!-g~oOvf7|S_`htZzC=I6azy<$p8*EbZRcvy1YDd zNLq`~o7m4$CY$GH!dmMHPpv*7f8o0Tz6V)X{9LK8{Sx) z>?<`n_$Rb`-i>-uE~OhWC9rH+E&~SNjeX6isZC+SKn=()jN=k9izDBj)2jo! z*5wnlf%||6pR{Lt1|8&-5-xlBT=j>h)=X)CT_~CrP#Xt9|4?Kiy);*nE92S5>bm)F zq^-6sE6-C47}fKP{$QHD;8Qi!%1)AB^M+F4I(r{_op5q=kb{Z7T%-SPS4oO6A7+#1 z&ggS&#ISUK)VEcSY{qv~YSyShIhH=kL7w&IYsP-z^vEpb@$6ZKd_0Z{@i7;(CgN0l zNRN@_?0}ZKwPq^Je*LJRH0Nb@99CRPlwH%zm-Dg$r)dP%8ynlXSm&cKX_#zx5b~w! zWH62dXc@DtR<=`Cv!S4cMqbsm)TVO+kRZ7V3_RoC8M$UxGwwzbFU z7uD$JdZECsEFrcU^=&GV{IwTrjsw5wMvBF}sq)0UHiJ;WFhBG0*FeSq478;dk!~0i zW*)7*t&A@nC6+trnFN-!n#wgmp^eAr(;THo`m4y9jp$^PQAZ|C)5v0GXKd{A+@_*` z@7!uyMu>Hx^b|F$XMJB+twS)k0e8ur@FcRyH^{N}au;TQkUD3i2%Q8uoSlkN#dGI|Y-}#|OkH%r#o3aQ zL^JjivynQ(^xPd|l7XauD=FcG;a9rT@|Ku_DQ)*N>&!WLqC^lf_-r(-;8k#|6gB29Oa1doX1fcu_bfVKDdTko-b+3|(;TzHQ?o$Rzu2|Exj)ii*{ zGlf)$Z)D>VkIxNswMubPCK0GpN{_I|ofr5tn-#*Kpp@jk-Ui+QMPs0jHm1tzR!tyi z>k@ENOyIakvsTc0%auxG4TGFHjcFMa9Y^*vajZ`95%d@w= z!c06@peYmM0x^XHt5XAtc;AZhH@6{T2az@$(QkW6KUL2-;`0aTI=ebU!+Cqi!Jx1lPg^S6ai zyllTJ6V=o-e0R+Q{o8y+<$?559JD@kC^ajd7P3oSy-!REV)T=fvzp{Xwl!;hwP||n zAQ5B(Ix@$r>1@(M(Ebdm^3cCS~00uDzB zie_sh0R=tM<{joxXcj^s&H<&|`(h>T&YFTk1Vs%?PjF8g4^CQs%02Nkt=q7wAjZL# zFr68yw?>n?-E~7umpp>H;eo9bAfqgN7mywusFrq7N+oQW4@=v#D)lBtFlh1d&S&GP z8##XdepacFlqad_HBurwwbhL^>(1X=2Vu26ByYR!vQIfC?f3|LR5-eanj82f*g<;s zzA5CvyM}$*$jH3nsr`}m*vSIe)D8KtY*dWM6ZKSbfaPIUD zPU!pF*))>${0eiq$}nshV?DL}1}7TRBU4A3)>v1=o(hKwKTopkNVg%02}((Pe^j>@ z#z^1k*5HH$v*gwaO-EM3mtnvt031U7y(wI8r8BV~plOtMbz>{FFH_>Sp(Z$7;TL8! zgb#B4QU58U79W#Q<(z<)+vGZ;w3==rN_xjleXhQ8YMX%d6Arf?IeM4H`$+M};#{i4 zH6(c}vqnCqRE}%hXfEH|->B_BY4VUrb*0T}J`{5jh|;>>UfZZyecZ@@y4=32>1tGB zRBSeWIr~nbp!%ej!vu=9f3y>{u~`laVI1ww=m~b)I{gA6I?NR+!cF;@6ARNN_wCN@ zgMGJ-ZPV#Hw~dn;*5wq2;_*et8O}dy6#Ep{?HUsAEacDR&CvFYYZKrZEH56X9&wq2Q_Ey-qfh6usw`IbAqg5SZ>4 z%&E4GevG?-$9Lf_*Qw+5?yt0rgd1qyXui@`>!_eUQ;}ckJGNGISwKTcLuRA#;20by zAPNW@mZ-0yAcTz0@MQNJsY9=YOUHntAL`=5Kn$kvc0ofzsJ?TIJqDM=l(h zld0j+9dpkn;i+vm1~{aK(S50F>Ez;Xwp%}t?x06>}Wk8e6_<1|DCBX&Ol zzqt6J=*I$>{VVLMRSJV_k@QE*(V%$3j(>FjGUtQ*Q=@?HeQXZW)Z}1~#^^;%Ayh+F zy}K#F6r^ulG$hFMQs+TuT}{oF(o@Z$%1nHIj#@*h(~{vzrIQmY397kcf4i8hq%>&j zmnFIFff<(F&MVkyr&8;CAVvpZQmJ-X>?#_BBV(Ec7RJ$(xnJk#H}O@s*$>PwylJp~ zT)5h~h8TAW-_LfZGUab>jv_|C&M`0JCJRdxj~E`9V*!tUzrn^|llR*!5{)&q@3Xv_u%p40~hB9Ksrsc9zZGN;AKjV+6MEjtlHGH&qWXH8BAd zN^oc+QUHRM zAN=4tm8tw9Y6#MUx)&xNG%hDxz!>*2YYs-Xc#rDk$GS{$9im$`{S`z;4--)jIw`~} zPX%gj+K)6yh{otC>2EAsB^GIpPl0eZn@~;Rys0;*hn8M1V+KpeddJ9x{VNHb9jS%Z zlJn9#fp%_XUIu|$8iiXj(VcV8CdvTs|M;+5qi#hX#NJrJ4TGSV)`;)+vf#>unFe!% zEBDqH))CRfcH&SkGwDKEVO8XHQdFx1QmqMglMDInz~kHI4> zF7Dfim4{KI6W=a*~%F!wdSBX5n!?p^wQjh?x) zH{IZgPmjwiv9tYX+bhaH4oZpIg5lF{-qPGTIvvSgBdnskt%P&U(YCI(?>{6tT9?te z7QPkr#;B9R`7N$cJVEM;?14j|rC*Avr=2vVqp2Z3xA4SDE}P=AU^nOdpZAZ41cM-Z zSV=H4uk#q3JmLB79sL*XVlP@XT6?#%ptJnBhf7&m*tWq@UgDIGXYp=*U~kLOo^xXS z4Ou(b?+H6p)jxUahx4NS&9nlo8*=xj0Si`xn4x)2M!h8vqRf=0wu4J09N0(1!g6A= zW1=eml7)a{>83c%0q}}J z51yk-t zm3-}VZLu(9ZhWD?o&&VPbjDYUR%5aE)Bs8ruFIt@z;IpJ%6gYdf~(J*>O}H>IHAWZ zBLvz|yqI_YZG@7;ug-DAV|+B;%tMIyf%+cH)W%>xMEELDg#vwbp0^k*iD^07^>4&z zWeS+-cKYUPCg(gI2pCmz*8*E$(wpYe`|||tsf!zgCNIu2`4`=zP7Mw=W->u0@bXA% z-4_VO#nx~)#HVYf23G5bEvg}`o00z@Upy191-32~UM!RucPm4Kx`END(85r?z84Fm zha`!;TkOrE2zPYs&ZY9``uy|nD#K;f;Ur$xhxnO-;x1$N!6S;1%q|=S4y4# znELJi5CvTr@vj^F<-ifoZ7Q2k6$icHESj=k#+jLbeIu_ZWX0zSh^Ou}ew&OD?3y#u zy4rBS(zTN=zQ0p!s+ty~B`tM*vMDcH=MxX}B~omW+hp6xiOA(Q;3uT6G=BE$!e7hI zj-7moXmo%bioE|ek=1;IeP}<+1X_B@fCOA&xvX_>B6OPhZlFmnWd@jUaunh!wA}^t? z{L{)Yuud!GGelm?#TLoeOGzJw`oY;j(BW-v4)NIdDP`sSg+=!(kQqGj`fQm3{3p`X9$a0?TPsLM0PM`d8#eed;P zgqTYIgSzu zYd3sr)Uz@d{`0w0-_dC<#Xt~LwS}T{M$f+p?ensG zyqxWJmppYHldvlRQ{RFi;{x&aRbLmO%~k#PZilMp552n`ecU$u3vEMEfX9Z@x67jZ zmRvWKAip=EC=LcGdix}`_IH(+tdr^`-&(srS!<6n6#C2j+I!HH=lXmX^vvg?s!4mB z+$Th`Ymj-#kTtY)O%G=Ly!-7|ZpJ`-1M`BONSMPkkb7lT>bK`tjQ;yo^dCR|E6$|> zkXZKrJm<1|H|}lR>P^XiaV{P1ppu{}OQiSw_LYH+BMTv=nK(`%Z$C})cpPZ%9RB^Q zHtnOPWB2m^pKZrsgQMd<04}rtY+uaJ{?BaEuch$zZc}Gep2};NciNaU*LQ#U?a!*o z!V=DNc#E=4UH|ISqXGv5<@I@tbv?7RPku`^bE|WAND1y}9(X$#h$a8+%3pqBfG{cm z8qYWq+!)pvW>%xJwbs`5gWFl*-p&LF%tU?B)fI?+y0kEB>z=?up!m|Snq-HM-M`m( zBE=dqgQOzDwp-1J=7_`ZoA)0t@N0-|gz{~MO8c)LuL!AgF;44CZ6EE=Ema0vyB`1U zbyB~!GU*UhLu@|Yn$6g+zu{Ly{4AtG>UO}AP)SHo#Zo{eP)Zw%wff6L&&vH8+>AZB z|6x>43KkW2YF)(Lij?P1Y3jLPYn>6O_UTy2>!e<7B^#{i>c(>&9`?#j-ZlQ)KVJ4a z@AqxlD{|Av7e1Z*>wjDo|GnRSkw|l$V>J!&y*qW}6?ZQs+^gjC*_!%ZS+B%~YA9_+ z=A@>A41Pq+)7Pt%HPK5cDtYS5`F1@n3l7fWjc*#Jx8-Pe4|7hBKXGSnisxDSZxceR zo5)b7E%1_jDP{PF+(ALBAFw<-{Y3~AVWIej)C`423-D{!K|L)-aWr>~sC;t{(4+IzfIDb8?MgBTWBXDnq zEdkK)^I(A8ADa?+nT1V5h`j+DX zp{3w5Hco^TeuClc<)e5Y{h2@-uf_Pft9|WLX5>MgU*#?WN(HD{~^{v$}cBcaWJ5 zLk3YAN~I%L;j(0T5f#puI?$<1+f&)waqkKC&#m{b7xBEW=~3xz8@#~J1Vf>)SftCY zq<*8Nel^9`G1S$gIZVmx_qm4Q=5W6Gp*FX7)Mww&$5CztE`6DKL#*i@T5jL_O56pE z6odedjf(y2`y+ngC!$%zaVbD0TRfIrVx@iB4%>!D?~sRhoVn0Wa?neV4E=LGfzCfv z6NOz%Y~2n;x^m;X+6zOxgoM5q64H%%&L5->A}5ukm=y{U&0|%6JR`TG_uGm6zo*5D zs+x>&(o;<+tQ~p1;Zh)f>Ib4bYqPviGF3Uda;+%Mm0~?!cXJTbe$=%rI8bYEq4#lc zdx{$&I^&Gy5T#nl;#Y5ev_jM{j4Bo)iA>N;+gqnC3$0GO(V1|*aMC}`0_}ga1w9?K zP4U9oxVjF(EX9Je1D&!B3J}f)m<(t2;Ldz~5~S?n!$pLqTm}n)s5Sg;jjxn;2aBw5 zsp=1O+HshmXbyd-*jB|83kn7{^%bV32NZShbe1`*yQC7o>r=ySDi|ocY7}D){AIBs zYL{iuy41zh~Qahvc6%7EN>tRAec%T`IDhx+QnHNOTH zXk5RY@F|r2FCvECdZ zmfcL{-D_=@7sm=+4nWYs#Z7@Qp9E)Co%7&-1l@4DOq2GmEvuX>_&qBZkL6|^AP)5c zs+HZSr!rGbR;i8pN;V6?X+*tIFR!3?vz?r%?3yrVJFo3^&R=QQq!tf>GC_iJ<-DRI zv8}>fUUfn}irY%;EW|JNY~`M_PEQo?65S$TVwLT1pGq%EV)CwX#!rY3e;| zYmhy$M-2s9$FTk={U{zjGUX2Nl%RqAiK97-nDGWyVK{g0)b*#;491L%#TzcqIgp4%zoD%Lj1S=&@}HlF|ktqJeZt;2-BgQB{Hq{loo#cJI(x;RIwNhWbvsp*RDzTOqr?xF^U+K zZJpAZTYD-3!OmLsY_TFij2>0*P78Jrt5~s$R!4CQSl+eSqn@aj;#s?mjXDj$hrqJ) z*xoJi?s`Y>BmwLqTOd3w4``5Q0HD|t<3NU66gi0cV&tP}XBEmHRbZg!$;Cj3Mlc@N zUHAk$QfKH*`x(ivE)l-kqkD`k+or&+R6=WgEAG1|vOOP7Pxt>{4!J#ND|tpt6b%uR zNb>a@=Ry5d-Cwl4L03JcUZ1;nhZ#QNW1J}K{Tr^CLcUdATHeZxUSY#0k(S~gBR&$5 zV$wNolk-z=fSwmvOYf(1+9eMi2GYtx_vsqIs(CNma>One?aAa;WiW+y9HL(BIK0af%vM{5zOamt@F!py5 zAVJ;f=OJ?a7k%%)OW6o~dMhPs1eG^)VuVX`<+w{vu3%r$JPPrRjLfOE_mUr4N_!&(e&qvbVX18=wcaBy&U0(gF)1*D) zHNByGo74n%uxZiNIT*%cBH{2pW7LIbrKZcvFK#4NzRi1d`udI%2^GAUV~&RSA)))R z5?GJBbpC{sd8Kdq%|RE^g4NBo@2Ev!6?H3X z;r93%>8tyjgS_01rpX)CNsW_cMiC!>YweQVrw0eJWOdQeNy}tTdlUK&Kh!aSfjT~^ z(Usa@<$RO1yI@Kw+n(E*r5x-XS{;cud`MGN`gOg8CojguSW)LU1Ja(*Js&wsD)7B; z-G7&m7(nW$ep@p>zEE;v|n-Vy>j)Cn3m^tO!KTKNP$!yBLu%gqWF?{oAg^~l~T?_Y&^wD(i8j6{r`Pn>- z-dG&{BJ?RC@tw!C+j3E)bzorEHK*K^k^{=<7DHzXt{&0iGFb-{B2pQ856HK9e8gPl zDAaB_^|&&*X(E7X3A{cX8gYz~r1EjaA2 zmzSu{bWD}5Jx}+FUb2B%CL=E<23ivH0(JrGj9A|heR;35C-Y^Dk+Dd%OKk-sB7G_7>7|{R!yQ%}_Qup4 zH<|8Xe`S%g8GK#ok!AI0HOZ=6^=P{`>)3QP#zDD`@0a3hryg1n#=g~a#$|Mfo9;iY zE-DrAKJ~YF2mMF4*s?kd3dd&hi%{<|A@JbzC^c<>xZZEkykP=F+fNe?xRsZO;32_J zDz)Ak4&l6K+mv|gKd|Bvc}BMHx^U{MjCisKeM{S7VbR=BcBI0nfD3P<^tHAa$u^!j zPY)r~cErs zMwOeHU)#j=CkRVa8~F42Geh=pYgg|4TAapsj2>$Jdcr;2tv_oJjIt~;dv9${X+>S# z?g3JLLE7ulSfBBCr-PK{J+J6JCde`vRMpH+qvHjK+}t1b4ejb8&x)btDTK}4%SuxqUYM{#uPV@YJT9JK6P3tFmFa{(AAHUI|%X=e%?W+XgSp2UY&9i zq4fA)j2bhi*4_+^Ho4}o8JCRO+rTmOg5f&Hj*9)D(|5?wG(4-Uj_2lC-Xwp;xS;{a z%IW>w7pQh7Avw@s$x%CvY>_{dQFC`R1L-oPWmYI%tyh`&E>&-e(R`yktz77;>*L6? z{`HYe#U8qI7|R5D8|zX_46!MUi!HteI844WUW4zhnd#&$X<|Y;edp%#TFzGu{zwQ)6` z-Qw-k7`hwjtPK%Gg$yQ`?r+~LM3|IpuR&llzD7!-PP<#B0iwqKgfre(-bBJH43~I3 zcFZ@8d1lED29I<)D`?ks*s_}Pt<0)u#L617ZITJry8OVefqO8&Gn9VUzRI!N*UQ*6 z@|tZ~OZ55@sp|T)q2mxta1tNeuM!z|?=WhjY~gL;T8UWjXQ~vty6D zt@E719k2XD7YkilUC^HSeB5*XRlTcK>u&oQgBh_f7Ge+H_M$tb^9sp&?MGxM{iYr?2BZQj)&)uZlg|VpB;|D1L{&f@m>pluNYjK{YO&?}GjQ0%O%PF{N&M{gqNYPT-JT*#x{NjV}bb*4OG@U!jW;-d9r%fV5sEM?tE zvuB!{YL{eZ>gn(15DJeL724wG zwhG+==%Lp5u}X0Fn;slNNd{~Ab6)Gq1L&B$7+=mCC7$iT*7rp2HuE1zdW*A(lf$+{ zE2Wztm`TWPby)k z>*bwUIk-tKsdX@RFFHf;eF#6Gt8-?aX{&l)Oj6Xk6=AM)DQ!2^yyQSZWv}M2j{>=v znjWUbR?b9d?gr%r%ZuXMn=u?gyVg(C)46prsloX;g6QxZCo2bz>=VGg2;I5tNxx_b z^G#cVmHH&+Hg)rxbYt9wr#)w2OK7J$(lXqhiMbfdToZ4sRYScdUX67;Wk>q_OjY{s z{PfI9g#W|fWC)ckT|?&k#hzs9pUmsBtKrM&QfWX_h?fPzt^8_rDTA4$b z?kZy|gdtj+kcbs3fMBd2Qy|{hRIk|r4DTAZ=d}FGn^(0Ho>W$NR#&%LyH$mRI;t*x zgbGTykS6BrPiZo_=k?`mU#vKb%zQxLddQmE-&W`t9p#M)kc5f)pLcsBJq)5{F~5a4 zD1i5RP#L2+*k~ARPKG{RtzTDCO`?^KXnSYi@@V0UKxmf=oC$q8^9WooG0w0HU~R-U zK`wN^yQ3()bE&fD_Zcl7r?lo^G9y}W(BS-e%g`OiEOQE)8LuG1C7Kj|6hs%W5Nm8q zD?=a%fKRJmH#M2GX2y4YNc38+;pqF|+*U{qAP@sVEgi?E znuP;3?w)bojorG8kO!rIyC75kcRA(j_^mdeYrumO(HjdZFw-j^NsE=rw8&ja@tKjl z?)!MFgcCIcrMBMCmi>jXUsyVBx2{$%lUt{!;g_`T2-CFdu|cdFYCO$_w2^Dtx?cT_ z8XQwiax67Ksx~gOXCATePrN)&D70T3y2TMEOkSJP z@NQUQxq@D0%&*-G*hw7Dkcru$6=eJceHC=%DJ{C|FfvU25D?|ne%VLpziJ=;chsS8 z{<90={|gq7f9H)0{g>%M|JJMj+dG{@%JidJ(1CJtfr!hqJWyHXyoc2eGD@J@hny*$ zW0E3?YGS|Do{~@RsM6@qJS`t;$F&`fMq;@5j&pyz5ge0sLF_@`Ea@}7(&lptF((Pv zvPA{H(~#*;)C#6i>gpS$CIiJflIQ}((ZrNqv#N#}rR{v}bw+_gtBh~x*Rt2CxEB-+ z5E1uMi8W#Ka5S56pck4 zTK$rsEz#1e&qrDfg#{D+3)4LBC>GLQ&^kF|=w`ONPLqS=3n`-pw!>gaYC-AXWBO{7GFF$liMj@B!2g&hYgPr3v z*KLQ3kBeW0wlA&`|~-yPkxJ^w^P#Ww$og;5naU{OG}$9hvuUi z5;|QUq^N?@yW6TV!A?Wn zq>6X1WWP1(lPh!>r;3nkqgOtTJ9kZUBu8-fERG9>V~-2f-np#Qs%iA>wkU2I`it`& z!*mJMQu+CtE!gPjSj@+(M0xoo=?oy>T}h8ti~iAC*|k{WRjrR2%Dh#8Yr%J!t9K~9 zI!IFtEjK-wE$|@If`wDYV}4pr>)s)G3ZfRLqh{ThqUjR z+RbOpysJ#spv{{e(^M91c5ad<4IwauiYjxWm5}%cL2VS?`83cb1kzS4-`eo!AmGzI z_8mXl;+Hgmb5`hflQ%SH8FfUA^%(c!12RUi?i zR4RacKHRcBllbN>wS(T38e)w~L+^VWeSj?2X1rG&>=MnpHZC@$yG!LrEZ27ghj-e8 z0YEW%wt$;OyQo0Cy%qAD=P}o$R720t+HR|$DJSK*$EjF=2#jcQaq+vU#$|)&6RF8i zw27uDwOoF#sHOPmgqyaMgA1cpv~j#_8PbL;5d8T8Vz$>#jIU&xeGvkCZ_ob=%GKgmVEIc2_3OwqPjACN>ywA5pokt34j;yW-T&MfF$T z(Wz3}<K0}PU7z6iNnEHww$wSMqKtN=EV)X&*IR_vBiH=oc$ z3;+Hw@WXKf@5N(fyNtLi;V=k+IgZ?DtiD=d;Vk~1WRsJN9H@}P9@+$u*LN?Rn`TO! z#{*Y3W&Bv+Sa2NuQT4+_jQOH}`q7aMA5r4pzbjBi{a&8eJWE?)QX9Ah2S7WR2Rmpy zrf%ugj4U)b_(jPuHWpc7C=du%zo|BN1`-MeE76U_3i};b0eRz&sI`5l?dgiA@XCwU zDIN_)_zaV&udNr(a*sq*xKqvnEkAvbBj|KCF-tYMw4{y0b4_B#=e#T3lfAWUjW5xZ zMu&!ATSG2bGfTyyoHgYUu~dn?0Oo68UDHL}589B(pjh?U4gnFtG?YzjtRK9W2*xzE z7^ptUyvy@qL2aJ+2UdWUs$%Cxw}}gyYjVe*OQ%|*Rhql|xe_cnYRKfaiVB?M;z1q4l!*^|uHtHP;;svBuQ+n`Vi_Lynv+{e6~M zjdr$j!nKQB@rL1;tPBunpu0=@!dGXsG_6lpGAnEmVJ7$VpwLl#A?4ukw<_V&6}cOm z9D(3{l7H%Nukg7LO|inMa5uu&F*hm*be78;Xhd{+O$wWfUbF+Jt$9l}88%2ccYtVj-khm?hbBKr-ho zF|Rs#V_t!sIpUQkVg-VA?t89;mJ*K&3xi?T&cN=z2HXdvfM*i^FRi+)p{jaONyvJ^ zp|R9Nd`F9AvdXhqw?kK{EK`5#=<&HNB#05doNAw#Agn7l7PYo3*uIfNK)0VU)_6Ma z1+N!%-tkfRYiRcystJk zF@37iL4N7V`O@Du@~yf``xwlrR=Gp!s=Fae0CJ0G|2Dvk&sw;fiMUmJtL9BZd-+<> zrcW7Sk7rz>>0wgsOLfB3eNcGb?iHpX^1YloA8Y5R$mGtkSDO-qo- z=%n+N^Gb$uGqRe)c*Oj*V*^GwAKY&m`MSTSlKtb4w<^b;#$H@}GRh6-@1LE#am9ga z?A%>7s$e%Eu^*;Wv(&FbSTR<)lxJa-HxwP)E)9r^dTj0QnjXEMSlHJeB?P=H8`hx>uhG^ zm5O~^PLR@Sr5wPcOkMoj<$obv(AZT(w4JxcQ+4izq}bwfmb19ItnAm+RNH52VDJOA zF0eYy-!=no1p=IH^1Qk9pZG~vqdEv`a*a(Ewj{&zw!sKybTX8KB$+wWi#( z_jP>)xCkG1+UGfuqp%24WhpD&*AhLr%FT^a)AH!zZ3ND2`T{Ve^i*xvFi@Gs&Sf0l zafY{X^LRe3+;hgDC5unEG6es;m|!vJ?rQ~DmL`4ZGp`wn8shwdGT2=uP*pOfOtFkiMfN zh!5Wfp00W*T6gzZ=zR%9=*nGu(_=Oytt`eZ=;r*CY2#=~K}mBMp*?BPN4A5diCuDp zW-2GOd}q<0Ssp$HRgj%?roSU@I;L!L-fb?YTUoE&xMBR!qXFsQ{OoL96}pL% zTWH3f2_WZbxdSSy-z@kNj(~Z=?tvhq%+=o9%($cT0sOew??r1X>t-ME!!(~Mne#_i zmAnSy1BfPv_Hvf>8G34)j0GVp-H+sdGVAIfrsP#k^OQ7hmdeZX%1bi#(A;VE54_Yw z9jx#jj6_l1??57k3FAlakV{?7kp<^Mhi8Bi`8kV_oJBkciodtHOkrN{`m#7P98r}kT^V@nXV>mOgSnSri|J+!MJ_X^Nc@S^rSGcfOmPs6iA zxeFN?92P^&cgpO}8+@X-!_ePvIn!H1n}7@YF>ZQl?AFV{%`S#dcIy_qv~5FF;%6U*=#O?>+BnYCqqlEh1Xj6o@%I%+~7H(wcgk92_j~ zrR>nT!*a=p24>hE+~s|tM9mxOH5sKFEU%FQ2zUcPR04S7?yxO>O zHPsF5!AK2r$-9209Pd+lGuK>Tg*^UNl`QHB7hlxNL~y*&_+r)7~w~!BGLhdHF!oZJwQ7_+XAT3>51w9Fp+PKGgupUn5mR z_gigI3$;KTht+~s7H64mpc&@sx}D53ap?JMty=J$K{=N6(;Bk^N?IdMyCHW1sY8>x zQTI$l!e)mfuzbUij^6D;*t&qFcIw@B;i+N*Mt@?U#d4|jJ9)Yw$0A;M^a7P>@z7ci4-FP_CZoSL0bzq@;PystiZ zE;z=Lj+V*j3Ikg-?<=Gh3_>7*kUqn`D|-$by2{w!Y} z*v4+Ia=&y-_AHS1=;i1DZi)JRX2>T4wly|pZm7u?^Wmcy&7AAlSp8ClP$_B? z0->$88UHe>{`on<{eo4Sd_|T|B8#YEL2-KlR@Ru$`m_%8lt=_WBY0*6V^q*kr2*2a zN3CM-e&gdgh++`+JFXXscgrGVk*IK>VyH^l=51-C`47?edR^B#^8D=riTFk}*%f&n z7cyt#W@7DBP!;xZkX|w5R<(e9wdA)gSICC!f7|tLkUNLn`{Y$o`phI-=jGj5Hs0Gh z66&95?u?B0eGuIRbk|31`k1?Vy;et6Q{}>R>dJvSEIMj07datv zFVAUaB23G3TZbc>S30uOOv#DHaFOZUeu+%IiS5tZ#{=nIPnu3V(y(xi{xtn%lkM79wwHS67GdGc)hSFY1|!^Gk<;k>z1kY?*b`0w?)ljxDVJ0Ev)*n2NNRDI|AqIPHZ!n!TSM z%9vrxyHM}Yf5q7Zo_~n)yIY8e+%dfM)yjq6UkW_-<-6?D?G_3jlvL&nzq(@HqYfV* zb^(-E)7}5crZpZA+Wz;ZH6e|;e@of=zqwO(!lCx@jP8>QyU3%?kf0?=A)(*@%|rg> z|Cs&x*RNH7{x=Ws-`wrG&qkvTfYi#4w717*YePkPT+o_g@};}-dumY%*k07jmUx{j z1}~&^StW~Iq}@)YHanEw+Acr)&8G*md&<&ElB2qo;{gV-rPsu6d}K+r%TfkEQn7zj zU6VKnK|M0HEIzHAS!YeLIZ#xK!p5#d{-P}OU!~grJ7f4iXFdE7vKR8lr@gby7vp99_ZCjH)(7p;dRu{ed22gw0j^0=;h=NBbnC<{opE%Ns zt|dU#_S_3tfgQ)E@KkJcrc;6BuQ>%;E=^{8US!e2EqMKEt6->Oa^pHW5R)xj+2m-O zimD}4+??H>S5bR6P=~%IhKNbI6QVI`wLPTx!-#bPY1|bFL!#VI%ySy;R6&FCPZ)a2 zwHNIr;Z+=_#X^`4v7AL{Xl`9G8lYw^h3jWt5Zzx_Dmbf=rS^Pnc)Z2L6>kP^DBDb98>=pq<6)y(EHts-NAy zqq_??jyFmj$E{}^siX{XDUtZv* zeHh)(ffJUuT37WjqhtbgZpYRAVmu64W7@Qv1g47xLe8eKdim1@_;FJl!v;*v%D5kHKy5(iN1SH}-Xf zt PZL1mjlBi1RjokTj9Ejrs$^pVJU41v;YRt9wKUH1E13dS1+hM?ESZCkZ?v1JQ7pB98Y$ zH4e}ACqF`b%mPWB;AJuA0-8w8+t zHWUo5)c$hmd5?4&%HVCgj39o;6U^2x8E$dCQF=aqiD2uef*#zJI(hB8UlP*Kl$ZJ2 zmsQ$OLQ>6ZqAw!KcUIV{6G`@O_}kv5ySA$3eVjiBoH8kpJ-KhYdQb{Tz>=P7N5+}G z5$tO%O3my}*xiO^grDP3Yv_V(P55DSeqs&&R2NfaR?l~MneQf2zdjBSI$-yAyAH3#k9w@L))ZR{!-O9!=LY)n(@$|3h*MW<+LHoE@HBBS!CJT zH$SDNI+#jZYHXq|SJi7-J9Oy&5hJp;#}i6mW8YfvL#_pe8%mux{4rb?(IlSH+3d8(G@O4+ zQ$uUpRps}nfvUiU8p~udXR6-#yWDQu_%7FUjMj|TEJ*79yV#pr^A%xDcMrOlrRX@- zgPz6!iF#2>#hjenIx~7M@lNzOPJ1wyvx;v$wD1UeDUQF_qgbcM!O18QZry`KXCx!! zb`AguboxwFRdHrwuR(w%vs63Z(r&|7Nq9n3Yiw+c8=G0mjue*1V{;23V)?%7n^0}% z7d)G$2x(b4SG^Qoct>dyiq$7dA30RWOOQi2&&O$L%G}Z)&`%;ad|e# z&1?IHqsGfJ)%vRaw61L`g(>p}S2T6%8@!p#Q0xt$4!*IslPxWIQYWO--u!Kdg9VsP zyE;l%ZQTx2`G?3EaY4Enr;?VSV4-#IK*oo+L-oMhauF*B_&0yizc``nUtm$=KG=My zH6Fe;demtvZKye84ZV9$bHvTgQ+)4c$}eBr54hfHQN*prqg~a6-*DZECFWH#iAUp( z_z?dGvq6(CMfMYlfkgwCno3FugVRHhK7Y%Fcy+7rEdRupA8I-WXu@A>1Uq=K64Qs| zwO1<1SF{eoQ8t*CG51SNZmCT%ma4^-NgEnUl~p&6DjXF`M``G>$u<|Sw26yZm+Mx# zN&cJ|w?ser@J_WUX$JgLgQMVqs7NE3qhmi^Rj~j%6wS#1@rJ3jPgv=n2cAUlayhj= zD)!a!@!e(@1W&6AEcyP#DtP=NxMQCDVI`d7=Vu&!$2wp6>{<4FKic~Pq=tKfcLJbr z7$@9!ABx>DxoRJ%Yt(*g4kSb9;Q!Fe3AmVTt>qTe$B zjk9&FcHE4kUY zg#uHlFzYawvOIJGW8{*8O&S^!AQ@R7I+&v|F}+Q*%s;a9!Kal<8;&NA>4)Kxfj6rh ze4!Y7$0>VP3kB5)UTwox26x(G@oi2h`EYOLKp}~k_+&tT&!SHGnId|-d{YLp&+aE4Apg`SHFdZ<(S_iq2WC4x%Hs zgOYZl+@i^ITZcWLP|o7n=!vC``p$YHU9q?+M$EAw15h>{&RWjqs|+}^@E79jo>zvO zyqn!vw8wD%M?MIU<) z#OL0%G$XdOf$ZU+Q^sdL6Az#JOp?lG&MLw&O0`fd%!b23?5RDYKzlcwAEwEeO5H|E ziqZ35umE_1N@$HCd60{4?F=9)-I%m-Ci?<0)uE23EWN5=N66_z?$o+cVFyTVIgy3; zR+7s!VVD?|G&hVM7B(=fBI3Y)iBvAYc3V<+pg`VX3uG^01Hl)890HG1>ddY*Mptn} zUHC6ve>@6*>00~)FZ&UpIPSoCaj8smv zrx8T7br@wkh3zO8U2AdYTDwVu-59cN&EtEt^rIPV%n{V8gL- zF1{c=BQq2G=3^`RqeT_+X|;I-Hbq{CjvPNwX+;h&dvoKYbb(WNbFNlLG**@1@`gYa z=8=XAMq{h#$W;}=LDsDF%DCr^1}vj&;EWyQ;!hnj`RaXq4f(L_;KjT=8`kS$wpzx`{<9DI zH)CUBFVxgb-;qsx12WcV**W~yX=2ng_GS(M9=3_%#Ja#9GrKl|JEu2%yOpwh3~d zS?HzcA7-xSvnT!12b;SRDdr$Re!>ou1$7nmA;Cq zX4Kd8_a;L#u7W2@h*`bSm><`K#Bdbn({Ji*xazixm@C1&;ic8X%Ls zRfUQCB2@DEr^b({Vl_3Hik{v?6TlUprJiJ=#GCsfB+4*T4zS$3=2Kqw$Di50-MU`E zn_cty_uZ$O0eHd>^k=T$&8-_fw zU0ABLeiB`1>nbqfOdbT#M3;ghs%kTx6;al4+w9vzd)o?{B431fMfavXc6*ndCv@2_ z3De_)oZvL@_H09j%ifiyvm)6~%lWcy#kau1=7ts;R)$6c&36hfd=XM7Z*vjGaDOU% zJ#zogd)sxJEE(5`o!z<|IJ|Tr97zF4ckGR~Z~E$uYzv^8Q4=Gzw@kMEFUHB9Y?nUX zG`wmR&5RrZs;wWUO?z07dfrD;+t;US-BUI1<%B5M^*0w4{o|%mwV|o`GyEcx9~%P* zsl}bE_l`ZB*iz!e2wPl?5;PH1A*;F&?y5rXq7($@C^CDfBm6_lv`eg8{WdEn%8qU0 zJ_x_wUGndDj?~3=lkFBa?D@yUB>i(@W_k==REJ!MGeqCW&IgR8 zBG~{gYbo-IgRe`;=3}zaOIgv`LAdqsz73F`2P{1N;u+rF&S#X~J$aj1U)ABT3NLL0 z;5JKu0n%FsRckDxY7;^k5m%|LJ8^7(gywz`dL%5CRA9(o-wbq0r#N&z%~+G;fI+ku zoTx8C8LY&3=-e2m&`8=^?30P+J;TGzV%!VmspJnzGp5BE`BfNP-lYxB?i#djfpElB zZOhE|tx_&@NrhfKfMO83k>pl9hwkn{b1QH&F!6VRe_ZmbiKAMn(O(j8`%|2$l^r8u zG~0e3sDn?O$(}W-^ukGd<8}Wr4j(g#nfxNetdTTAcsXJdVl=AbVRiPgmql?@6?4X3 z+vHl;zy#X&{DwSU+?(xSYPB3C`1w)v{#TrZf7Ocuh(V;V; zv4)T<)x}(N6Qjx{%_b-qGdZR4w_w4%>s+WGgt> z2*O*xKD$nwloP+rBq`C+9BmObktSVp^GH7`@5mq-$d9>LL*C++YxIUZ=;Fb|&TlB! z(<^)NFy#&9&o)mmr3z%;n3Zu9t0Ub^ujY@QHjxnoj(attGH{8=0F|2Ava;r|D;!8K z)>kU*V|uNOhHaaul7F*ir|P*#^ae2RKKC$R$Lbd%dyl-w3}KgVAu!2SS57sjjRr zNl(?Kw*HEkdWbZG5(|eP)C)+_01@{$q&5}E6 z?_4^lwsLd;g*Fn}7+Y1BVxeQ)5bSLA^!m~F9W>)V2wMG*ydKdUs-4ns4us1G<-1Y% zPxwD}gwDMFnKv^(4O{}Ds$F$~qCc*f$7JXIPm7Tm{~N9O-;uojTl@TrmHqR(V@ZIO zoj0!6`43k1zje6(ml`F%-MjK~mo;OHc^}_&C#X_IkcV^2aUTRA`}dYK_>0}~qV9HT z^({)cL0tQZxj%Z(I_qBc7+zsCH^U)Nw7Ch!8L{{B<5nkUL!q)_!89Z%1$Nl*@yeSA zL*|5rBi>*C#}!)BtMqhbKY$o=W)kP^5vaa4u@Je#^}MYyH^&bgs81wMbUTZsWd^8p z$6w6MAgYuUi-=NNqYDu)UpMX9CMvkXds4I8s?rcgcMT)_-KTe;dj6p0vZI2DodCRW zx|K~tWPjC>NAFXfyPZTXqSJb8%yn}t+WmbU>Iz6&utWxF9Au96I4z7AnwXdsM=uOQ zR*>*$*3UIr(ht@;`2iK9J4czacLxP!Ekm2IFGA@hX{C1e9LyBU-&%LpD-~502Nb=k z>GZ>7M}t7kn`<9)1j^>(UUqE$`a^ul6 zFxijqi>1@PuCcn`549QEG1y+)`}zT`i9N;f(mks%IFqWJ`N5;m#wO{rAlfx!FNS?b z*oZy1Uj|d^YPOGfKRi5hs|@S9G7+fnu36S6>*nAtn;+10D)%((a^3#gI&L_xXejB~ zC=0xEpj{(_dh!eQ?0j~&H!D399y(e{c$;!#EI29{i&!-JA{4xQviI-y>6R47!t_4Z zKp$^gdQN59sT=m4t+wB-mEJ88XdTt;4C>v7;@?hrbHcJZXV)yWD%bL4JV3C)Wb>Vs zUG&E35mrA>ZK46(TpD-X3T>;kg&jnPsT|_5*A}FU!ud1mtmy30s#c5ts zS3npW>q%^M>{|5h>$_?F^@x5lE&-7#JPP*sO^is#Rdap_Vg)h;BY>Xo{w;N!(k z&v*~z!L8sVtRMQ%|D!_UyGPTm_L=ua7n4)1^MP%UdTXl&8v0N_@~c(PXWczzZdNRIT~ zT!FKbqoBF&H@9dfXnCJVDwQu}e(T-dRvz0g)%DiD?v)=H6$Z3Oma!mN8Bv@EiNVs=NmA4a6EZ;GPk#1poF^MoohRd3H|snySUQ{~ zXg5AQbk5{A5(8~gGq{P3J?zG|_J%yyAt+5Poc7npyFIHNeMRL=ja<@W?314EEK4~S z2;d9vcu(vkv%=RO1Zo@KIh8PD%W$0a_S_%lDI&WI#yv}iME4yyYYlA|H}wpR)Wj}* zWZO_|0h^tEV1E9^6*fTWl-*K^F}-G@{#2QGcep$)Azm8M2+ zGBG+}(O^gMZlWikM&AT0S`$TN9jspO{7e=ZgKo9XvOR3o9F|f__@yjc9LH}90Q3r0 zd6a)DSy)C_rIWLg3qk_A<+o7|mM%sOhf+}S+V>Depe)dk)yP4&le1{L| zF`orAnaL<@*4FVrRu<4oAMp9p`YlQ}3z}#vuU8dr#d4zw08t-?gwmoLpvmuko^iHY zAkwESY>DR=dT!&Wl%h%MigDHMudBZCH2G1TykzN6jL&Fw5A}L~9&Snwr?iNX9E77@ zWU$)7$D-p2c)FMK)!pi3SypDCZN9F;+dxCjZKKpy^FZ}M7jDy5#G#g`A+D#K<2W|l7MiqCqzeonP1+0!3`9V>5RxcWh#`dD z84JVEg#ZxqVF_u03cbM|S^eeQGpCuNoI zTkE&h`pR$p-uF!hsZXxqt4@HXKmYV`u3A;;)nanm#vH>1RFm0v`VkaA%TuTJj?uxOL7xwp+&3bMw%=!DywJU){#@$H7X@$vEE z;}u$9+nWTOtpM1~ge00q5Iv(n4(C8Sx)(FkcRjI7NliJF5CP>AE5MwiY&tBl12bRxiTer8y$frCbi$VKtygs^R%3cAd8(6c39q z-}afW`;`Ml5iQC47d50M4VKKpf>*c0)gMovXmJSOKIfLS_dGFLWg|yOP(ua~)b+-lbrBlk&CjMFWf4-3#$MCCEl&bFO%i;G+kLS%B-cT=KdIoeH z+#7Ga9@coDp>Z8m5y;xzd}BTpgQ|sn}WDD6mqn$v}(pRB2rk zxPZvpOLWB~v^qr_M7zMFD{p%V+s~F3kI-}1sekZ&a%cFdReQL=`!~x|tLhAjB5_wH7hhGbSU>DeMkc04S;|M~6POcj zVWG6r)Bb%mE9*7>O~t7DKD@|5C7AcN(&4US>a0>n?Wqcds}<+V9fe1Rd7UG{0L-l^ORG%re7o2Hx2-Pt|Y zQA#d*n)nCbeV5PH4o}}~=Y_#my73Nm)d8)9R0op>>R#tVgr5w3gV(`Ns#!z;BaVdH zEl>es`NoJr41cCP!!5M_(drTc1^_8q!6)EE@Z3?A*4+VTr@95V;-V4z5I3ED0C+qn zhkbIFv+DSI&bNoC5a`jFnQ2tWTwV@0cSf-5jxh_QkTm&<^Gp4z2DW6221viB!gzny zE%c^*Mm|fMjGHLW zseJk>GR4}H(ltPYcXhPps@)DU#r7M22&|M{FCfl9?6&;1&9+$$PWA*|EWE6a$yKyN zOHXSi0T-{pzRONBW3c2r7{(uf9zNDN;mbA&(Ej2>jj3zLQ%FaV<%Y(fPM&mlJ=r^8 zIl$Lu*v5HXwrX{$;L>elP5J_gI-6@BWnTNN;+Kxz^yGT;99mwM0;4{QC2uHApZSCD z)I~8Gj=^DLBs+-`zKy2WKTilA*kxqori|xsxx12$9O({M1`ze2ssk-+pOAcSA|*Y; zCI9$jhrNI0hlYtEp5n0Jjys1nN`o$0?_P^g;s*c0$JvrSR=uj*&)wWNsNU6Uf% zcVeV7RTf)GTk(Na9-g~YPj6i57ui3tu+bK}y4(q8WiA;|V?K@EawY+@kM#23Q z(B0u->(p()38cCIQHE`f+~gD-x8|Ci3&M6{6jB^hJF}vVcTF(Cj3S~M=Z!{0Xm|pEuYyemnl7%72fX-&qQD@e!c%=LncHk2^DM5er9`ZO_YZ%>LM z@VH-9AbOWVM>jsO534<+)jdDdMuCN*C}{yNP_c4=56ftW0$b4bHc^9w@?X)B?RxAM z`l((E0BFyIqSZX zqsib|IeFQ-CLV49INfr>!6nvAYtkY(uI#)tyc5X$@~gtpqO!eJv|}!8Z+#<%d(2&< z?^C)LF5r!L=!pu1ghp!S1a3Q`^ z35Z6=ds^SBC>$Pzm$DtY%q&dQEcH=vD2NziXH}F`A7VLeDx;$w*c|xQ@z*9%i*+J3 z9CWBWZQP&-8iS=(WYFuC6J9o zLTfmnle-mHzx9M2M{QHrwhE0kc9<_$DEs-Y0`B@#B+-leh;y zhJipvVEE*YbEUlw()X6#X8(@w%vludMRA|mTJuS0suP)a65 zB&bmc7@v7v(AcLU1G_Q_97&uU87;`CpxlaGpEzq$q(c*FJU6gstyw( z=v~!rSI<~h7IPTBGR~9x{#x|pSh1wUC*sV|aodXnKIPj=xAJ*U+@zaa&*=?B1wm%4 znOI)GXspvKP$B7#%3TBl7==D_(#FF17~~K#W&Q}DxMCX+QDA2ahLb$&K!>G%?On+_ zcY8~h+!af}qZs9?$}VW_3JSKnMt_ffAjz*jyGMwlGK}PLIGL6OcLjZrI}nq*yv$DB z6o?i|Wa02QFLKOiv3iYEe73!lX3y;=IV|;N^UrM^zzB=5Dncdh*Zw$me6v?`!2w-z zygBC5gaZ`f72}1O7~jK1A7;4dVG@y|H6f^|Pu(F#*OR>X^Ye@e6M?3+@Tjh^m!kp6 z!ISjatkTxV(1`_Zlflz2kUW!OFZ?d)#2%;;Cj-{5P`^|-l;^<_14tWPD0_M zMbbJZVCMGDL9lY99uA{L@s9*>ioRMRZ_|(k zMT@yzqjF#^Yuxo2&*lg6rLJ1Xrpj8g>}m_gl!kh~Qy-WA=JMOZSyaFGW;H$_SI({X z)?PWM?UHhiPf6W&{fnuNfFqQs3ZUT` zdbJrc_2_+H;fgZa-rj>Zw}wQtCaj7&0CbG>`W=ZB;PaPx&(j8+;#1q3xY92@c`+7t z(%B7iI>BaRBf}`PkZ<>n3DOz*^iB>Nd3y5Fk2gG`<2KW3)Lz(=_|=>dxbl4{c-;+C z{pp|882v|lo?riWnnUz|_kCUo_N;vK%eOAS|09+EgJu3RAlVX-k(0Ck6C|6@qwhc1 zu79QaX=HuVf{T|nPh|Ox%r z)F65fGZDrWdCtR=o8IW2_&DJ~n6ZZGXxc|xy!I(Gx>!|(QZeX>Dp?@CW;8C`Hq~Wa zn6To#1vtfBG?o3lObe08!r!4gw8YVAUbr)99}BzUe06J_9B9k6QG!OWIyAlkU$=|g zzl>>jpGZv8U1U^slce3PBtA|79zHZz8y_Xgj*W0A&5B`(>A0@o-U{y#pNIAOYCN!a z<`&STG5n`w0ohDT%Uh9WnH^K#G_9mG<(SpyEQ9h3Vs19ai1O&}QOSC77L=W)DcgWY z)Rgp>Sv-u$UP#O-V-=ocExD?_{cU*W{%&{%daaRMWJ61*?m|3|=mmaS1*FZDyfkuG z@5cBoG6^~=kRW6%E4L1GhJ|r)8hDa=-p;eu z0E2bG9)OAgJta!JnuUKOqOvmtIU<>|HDJ~5XS9qHVj@H%ObT4~c_22UE-xYwet zbu|!AwIY5NeaQDCAKwDUA==YQ@ve?ywOgDth^J(v-Lr3;UX*WlhMu?5;p7(4H zmyH^8!7d@av9k>y?ochbT+{g{46aj`?iB(5taCYJrEa^ zx%gELFMHN^ zc*7;%B8^e2uC|q-uDIe?|3={!O{@v(EiZ$gAot5I)b#*z`s>-sdkN+3J+Iga$ygh- zy{{R-TaF|^$POPqud2XDiuW_iX*pvXbhA9yiHrbC+McP}1Smj=F ztwfHOvAvG5oYBKYXkGAOm?m{?e>F#Crg4#z?Z8+OtrF-QyZtOPFp%mD2UtMoiCiQ% zsr>P#$V5>d6DsMXhcRA3wQvn1@Pa$#*c$??#PL&M% zDFjJTX411VX$hJ7pvaKZqO_!DkTbZ;c&6C}if{ z$14?`i@R6HPx>6_9#iXEo^pPfV`5Jk9`3d?Ze2o%MPENKkOnU3hYoIh`mvAsB-=sR z*d^anfplGHEHUxHvnCKQ$_Ats&H>dC^$F}2YOf=*jhdY%tXNz@xZX4j0)MlhT&_>T z3sgc0`8~qT-}sF>2ubA{C2I_oVM`h);-*m#qxxeTtQ%*|S8k&>z2;1;%mzSLUM>$) zGN@}jU&W6)s~1v!+H`@a!=+&P1O@Sis)kT=&0f{fAc>OU`Ftu*bxqCcB6;3Q@|@GC z@krXUrR3#7c)1SLZ^=w{q_XsQs`W~B!}aQM4S})$FmbG~HYcuyO^a53XDCrWullStc9yg5r-Zi_7k@=2a1vm*4q@+a z_)TZHal+ngk8kF5Ct;i`q@CPtfMc&IHIv*HgRc9~2Dbd;rXn!-!RFG-DlAU{>bu?H zRb)5-0L%T$&(N@UMAfX@icQx{sMl+jDzUS|=CHjrk{A8+#9wq=fVfbKYtvC=gm_wV zu5}I~!x;t#m9#8z#eb;GU3RUY-hT$RAB&61PW_lHw6E4wcBro;Q#yXAWCp|Ka+Jv| zu?=b8OJ28sV;E7T8tUf@nZ!K+e73&zTdhtHr!Km2)|kk=%K}mkZvE0syM3X!h=9{P z`3d3Jo)j810kPD7UwfGhw@&0ih4#I>pi{W8#rliuj2Ok3*69mT5sFQ%i4PXN*{ zsU}imC{?RWPQS~>TXT=zBTWB>zV1A2QB$FH{f_*EmQDxmDx5^5Lf+)h!^7(7iB$TC zk$R0S*~v@k9ITM$qi++^<5JW*oM453g=tay(w_Hrsr53JC+>7k9yw#4xm8F}$rda9 z!Qt-C`$x1Sy5#H7jl_@n>dDGhYuc@qb*+~O#Cfl|YVLIbdk?3S>cxuo)L4Sz^tpNlag3)Bb@aqs6Oj{4@-h7=N} zwo~DCCRI4kc^>No;%efIa!3D%rrwPrJuhjGozgWD0*bZ3>9^ns`{{nF zI_8Z$0OoA0TaBf`&3e#7TvUr6**LRd+{0e9sj5_HXyjt@;EmR#819vZ2j6))CRH4M;o~kla^)G%*K| z#Au1zdi^#TR98}3M_jL9RYvqYcyg>$IaXJoI5_2{Sr4oBTx1mw$k?`ov0%lJb6n9IoQ3yL+^ z-}`z?8!7I}iT16f1vcT~P|Pg-8Ouam1ZUSl0z;^_cGRCe$t?T#ZCM8QRjb#rAp?i5 zgzrpCpjI^zIa~Xx7pjcd5)SqXg73lbal65l| z&R95DUOjfqEw;`zr0qA_V#$>?P0ZN`!L(x3Hh`4tEhV|0&|)RCWSw?il{xESNzgF? zDF9Z3g1s>$Wv0$%Hf7_{XVg1WPrbKI2h5eG%PDx-VoLOhRgXwRzD($&qolj4*mhWu69mJBq)1gufOe1=hBXAZ&`aSyrd@r zumRsvM?~U75Wy@DkaHd)1n3gczrkVjyk3W zYeHVEVztVa!OY{V&g8pkqaPzHFG*eKIMS3ILD^F(0#^$KU0N;;CeK_!{Se3|Uo*)~QFNj#>@-xcg(*CIk2O z4%eGL+G`R)sa~>!f9`DHX}H(~pjpzwl_ZrX zyIT>?LoU&tC0(0bk%|vakCqp_xHk{(qC?ng^`vhhxyjjLdzoF$VdlL>c8maTiOgnK%c1JE|sF}GSNbEuu2t{~OR4m?^SHcJPm$s@c! zIU{6@$5?PJjNVL1Y{FZas1LA}10fE&MZ5XFe>J;m!ez`35Mi6U+T21WhVRJ$eI+9E z`5hhZY*o+RT@cZH>zY+RGCs0v%ZY|X_F2#QdtbR93?YKdpWGg+Z~}T?Bprkgz>$G`W(s! zUg(YBdw;b6)^+qvj=1wKw!#Wi9vQ?7BoN0TE}b9RSEya?sgOue%k$r;7EO4W8l$fg z4(7odXjYN$q>;~-`+3xo4i*ClD2{h0nuKI~qQ7f~#QlkXxF3&uvB+@>6HBVbcGX_D z;&*7%DqF{u%eD6JuCwNCC8mv9fuh$}%jj6?;QRJwfro`iE-$tjs{X`vft;D*8B$@2 z5g!?OP<*%}+qx8~M`EV^Iah1_;eXE6Jai1%#i2-&84PV6qQQUwt@RlB-3WS^C%n3^vJSd=y&paRDy zhg`s#8e1YxyGA8C9gYyA5$jbZYZDohVI6ns{Ok4_?G1wXOAmfU)U16wutf z$L0W)0%GmwwIdHZ)B2Kzi2BX%e0q}|TvvtX0X$;Mx+Hfj)8edw3`qUtGeqz^&x17X}Hepq_h z3I%sM0Xx3&vd@1)yD?j!ZMmZUoIz!(9E^7p#*k8dr=6**JNsA9}P;rro?;Xu2g)sj#BIeWl@4kCkk@9nEqb({bqk# zuIdI7VHxf;@J@*kbv`JC?SCIwP#paSU+aZq=URU&CG!BB0{VeDHXyS$)e%o0g!#zx zp6*E+g;$vV9IsBh1@JWv!XwQMtvQM^eUFUkqtc^PmLX(Uf2S2EL^Ep=SR@$G52XEleb z^>}knQQ(LA;5KSS$%J6xqz#}o1CQV5=4ubh%AOLKVU79JfTyj@qr0Lv!N6%0WkaQ> zNFkxRsN=5NIY-myo}(V(-VtV+_(B0%$PLJOF&Eu(Cqa;+3NqubO zYJIa~m$Qa&0|%kr47cUvi66LTrspP@Z0vh>sFENoG z<9QKy4|fDw|3FFLZ(+rQSlGHXE~Ew(U89oo<`kF z7DJWLBqg(lVnh|xR%=T4&O*+Zzd&`A4Rj6jE@8pWEY8#51JO8?ucd94kgnJ>yY=*h za(|zOT{`|mq7Y4>ZbocB7&sr_-$@WvPy9fVphiY05G1Z7tsbsvU{ngS;|z!L&!qjT zr^A0WsrOf&Hltg#bb!4ny9-*gO8g!~u+XU6eg5*yCDBt?nq9=g5!DsWv3EWgU51<% zm=J0Ee>3v*pGNs>Pst7XVbc5s!&%avNPqjgXMA7(^0)E-S3kclGqLowPK*NYaDHq` zJs#YPnf)px7D7w?6l#CmeSH39_}BDvq(;fVZd4qm9SFghy>RC5n7=E4LbRR$|F<%8 zIbY`s#P}QjH0!u0wXMtt{HJe;Ka-4RPPhI$vgWtzj}n3moBsaf=hluX+|x=ecSg9+ zt^Tf+d`kb++Dm^Xz4iN_8uumZ?}zjM6KmWxSFgU6PES9&jIcT;8%iGC{OiBEF#bn@ z^JTn8C>{su$z|^#$-@HnAAD`6Zdh#@{?1ERKjMprOQl-6Z&nrDe{1#5+-6PS;tCA4 z$wl;cq!R143@(BKi`m_UqT{-<_OMSt6C% z9mtA>F%jq#4+nDvGGbPeKUVREiwjEz6=rdZ$Er4-HhOQ>bVHjoS#W;v!1VW4*%uWF z8FFG~pYsamd6gY3Nxg;m0*&p@&>O$0TvMM4}c1S$u}w~B;uxp!P}rI7|_ z1i(RIKkz8-u+Z46DJ=bBN^tu4NCd@|4LFs_I=+s5H@Sh}J_Ui;*s8oYYZM=}D|1%l z&Zxt2e*fVP9pqJn&T?7p?FkKJPW8HZSz=c+-kw{2=xl?q=qWq8atgY1sW@n(;Tp^8 zjEW5L#+=!wLWWCJJ_qR?lkKfUpo2}wSxmXPhQ4=4JXF&TQFgd~63p6)HmMl#HAJ!+ zprI$q!Z3H^&K@RJF3`KQu1EylbMzgpQ&y>ehW^oOBrz52AYSEYtut|b%{J9&8Idw# z(E^QnBY-N^aHZt%Ktx(!ulh)(mshv>*Iz-IFD)T~%flm-9OdY&wuAsuD5CLA_M>Vn zxKh?-!H36-u!KNb`8#hpYc!*Z^a$EpH9BT93=gX-%|248I!^p$&XvnZgq5Xr!Z00% znm^Db`_~Tk4}=OIy_!wF@YLRY!6i}@)H;H&nuPPD-#1T1eb|CDuai4T=cUeQ3B9En z52!_{TXdRr)QyZBsC&exIe?XPw6|7D7freW&NS!As1sAeF267xr{*lU;dLob=hB9e z#K4{JC}TLD8=9cS-WN4A4b5q=l#)D`Z4MT@iP4fbD3>dqv}lpVNl$!Lojy(26g2B> zG*=Dq)-1#mIBfgF#AgBa{i8*ScMk0Gc~mJa`cZu2;TnTa4(@fn>r=VHuNE|w8W^tB zg^$9nrgGg$hYlkTCIJJ6@q^*gi^t9O=s2k!<~_w+=7OlYa;5folkLN*hQp$3lNN_o z{iHafBg)+AAOFX4{P+F%Za?gEc5hc4(&9v{Np`j$PzX7LljXR-1SBu+>gkk_SyRCf zDT%T%cl>EPY3f@!=`qPTh%LSO9DM*Ab)##J^*nnd5G|F(5FTBa?H$M@jH!6)PdZZp z5tG(Bm&_d`OrjfBbN${c^Jwhe^qw`ceTei?TI*EkZZzyNTO<^8EcolRYDuNGF>ZH$ zsCU3b2W1WnU`xJjvR4CG#t5<4H#p5gs)3E~#2(GG>SlE(*S3<2-<9$Uv~`!sX~>M; z8d-)wNhrT*|D%uZYd7AjzF#Hx^VU||<%}o7ZLRs`=2laUAA+eg6cGk3->w~J#aoGY zu$UfG_Tv)|FfMwR&JFVWp_}kyl!i)}0cuKlUUzXpE$kT>B6;b2=f|)&014`XbA9{- zFgXt_>I0eSB3R;OOAob#QfC@lC1pjm&WS}k7-upMrUZFh((+TU*DbF;L?RN=jA?m1 zhV%6^edQhOtg>Q4e}8llK|^US zuqudf56rMghu`qULWA_#O=t?aY2Ypz2sR$UYD~FQ=Avz0H5E<`POMVQ*Xab?w#TLk zvwqt976aOEc0Ls!F?mjnlOLbd=C)O&_qH{Sf!=I)a(h9Ag$KFooQKpS0IMHS9VDA; zy3bRy0$T7C>l$GiB$<2j+Rg8XjT+`%feVkrD}pUBXH~9RnX7p3=N(o;r|)f7yc}e; zgg1vd&e9XGmCd>Gi#f~GjK?kbH5J2`YxD-+3fBIiT8pzt2JxVTKc(u}dYZ9cX)qo2 zTVr%OA`mg*l-3iw(S`enC}-O^hf_Lu0+h0wQp)^)@O}G6>z*Iew=aTfd3EznbMuY{ zX@!>Rc&6ZxpmOo9cWEeGqN&9*#MlZPfetUaMufsSY|(@;w5arb*)&jyGt#~>1jw

?M0&P~tjk`cNC_@U0R8o2yi$uo_#jT2j^cXiuaA9-f~AwR(1utv}{&d%k)#7H{FJ z{&Et^BzH#|iwM(#>^&z$;VB0tlFDm!gpw8|r6o8}=Bt-H9Lpe&-}Srl|Jcn{A5Cd# zIr;g*^Qyxizp^0Dv=&Y7tCTV2=WCrhbHXY}J-KXCu#mf_#oJ-~>px%if6Y1fwCw8~ zF8S~cWdK6!{Y4&!CN(BUvX1+{B!98VzimQ{)%+Xg-Tyidzx@AVfiD*LVu3Ff_+o)C z7WiU;FBbS>fiD*LVu3Ff_+o)C7WiU;{|gp4EtbCJ9ew-Ui|K~r#bZ;K=kse}{QDE!ymlr6W zpm78|e2vMcE0kC=WH?vy#`rD)>eSL{_Y)Dxpr@wwj_}7HG&AnAH)snkw@$>>#t-#_pH0k$J9T=xyHNn$ z_8yk@40p?TlXvmPX85xj8%a6S8R@j(Z;!7391iHBc5ZM-iIo*usSaXKfc~{dA}(1i zgN0YN_I6dnFAV~hguZf!+OKzWlDAY=dzlc9H0y$`lULr~<#pz%z5+8~qjDC}(CFHB zVyZDmR8z=Idu1<3ZGF?LMA}H-+IzjUov4^N@87U)RuXr8dHyb`$Npz{mB!tp3#DegL(Pe&HIR0eWs=w5<9r^hCkiyzBI>tUYS^ z@kLgCI$~^dLZ_xC8kdS%)-;I2!+F7Ht>QL-$G$&x`<>*vxjVvfV^Ls9*|bjLY^v4+ zFR^S}JC{~9bMcd2{}E{S%I|!9r(Vq+-(ZF5hMiT0{PN*fgJ_dmPf6DUYD+6TzM*aw zO_h+OqP$AQ2q z2Nk@7ryH`x+XidWPmFDefnk6yuNNbW@sAlngMO?v45VH9qX~b zm8_$TrL|-SuTklhRhyISz)*CRrlVB!#VeWF!W&6AM513MxhWBavIQMP4v&OSet!0U zTz~&?;&+KXSGsd3Uh}^U`D;&nc4=p6_XVLuvB^5xQ$ANv0AKaQsQRWHZ#*9N9C!SQ z8|@{eCH1N(`B(jln-2Ysw-e`Edudu_n5jMLu=Cd4Pke)>8-G$)Gk^cNTzee3_4UR- z+?2l+ybcHKueL&lXwzC>PcGG}DN2xKCKs_5ieiBUgiovy_VW1Q^`{3{twhKh&2guE zAHdpjOFw)1iwJ#~nsiy3)8d;(S`~Q_{6p*jHijl zNCrEIBG;+<^2HK+oHaJ3B0W}8khtyj26uIcEvq#uB-%z5X_u*RUu*s0)vR++gY=nl zS=lia8B~Gq;#a@>fs?lO)3yySDQ%|xz8!9<+`EQ;*OSm$^9E4zLCz4SB~I?&TU!e> z_!ZGeGrV+2(s$Dyg5_V#n2^_1%wXMOq8%ULmF}QXa6?2Zuh#)5S%{+)k7gOGtGqS2 z$sJU%cc&}3X*VfXm|MS^jKCYJ1l*w&6w(Tc9sIM!#@>WFLOOw+u49SrxMZKs5?xt& z6MiedUklTRt%!7A=2vY2(aBrU>0L6B820LUw@!L&N;NxgGc&8VTxSsbmr>hNiQehm z-J|5JU|D_gW>~`!MzT#C@F9?)m-sA+<~63Jc=zVaq3PQ)f*^t36ZAd5*QY8`-QQAg ztRVdg58dvnMg`OGMi0%F$yZRp1e`Q`%j*H(DdVM(tH|D2SF4nI?AC_=N?%du#*hW0F#SOu~kW(Z6F`tQ@nopV{W}8)juH^=oNRSxNz7R zPK8G^+!7c6;FFH;mLK0(?IOitQd)W^Oza160_DbmcsYV^KFxXjkSiW~>UsBZ!JOew ze*4YQhVeL5Y0^`Gv`zX-<%eE#AAQgPBnsXLmtG|4=z&d>+FhUwPNOqdjtPupxVteZ zfwQw^ccvM)3LKH3)F1i$RJY*;k)Bo;{TY(tX}wc99Jj!+_oZR!-HVHhBe_-}keL$K zAdmd#!0`iy*6;bL-srZ&A+vCw(*n zm$_{4wYj)8(hN`m%E*CNL$@IXE)endpAgY+V|&MPYDyxH01CfaB@fN+hbQe&qbxLA zsB4RlFB#6Yh%7A6g;t4bAP{ZsgDLJDY^#3_B6eW$gTsoM{x(J##}nEe?&>^{B0KhO z?9F%alYan(YMS|3!F|np*AcoP&*HjK8}fmd z($Hv+b2CI^vpug|?q_S_yz4GH9J82cBw<(@gSXU-B}R$OJF|~`yev|gXcxDgy9FjB zSTl$g8|hUV8FiA#(bRX;D=(j;;tX1uS0+#3_R&`jN+P;)OaGY~s`f_nlC)3xl&?V_eLS1cP z?6zV-=G7PkS0!$?C1Q3mr?9NqAWy^CI+X9*oIlNeP8&0iJhFaxy5;g=^#T8H$DfbS z{~}n{p*T@uYIKi zB{;uIN2K#K6Rl?d;JZN1J-qs{m%N>dK`rz)N6|tB0|1}ES>pl=7G4b^1KfG0XOp5iKkfbX>GAr448&x6<)LMU_PHw)wB39 zrqlJlvqCU?ab_E0aeSp{7-!tbFL}enpc-iZXzxTkv00irvx8p;g0~QdSGReuN9KlJ zF20W6&vW&B-`yU-mxtn8v*`Ui&?q`pXnXJzAWC9eN^4jwI%2q)U@CsL>zvCghJR~t zuQK&<7Q@8`m=FOk_mzJ(6|?cA$KB&Vc1c|1YF>(1LU*u5JxlTXjCy+RuF&Z2uH_*3 z^c)s<{@TZ92eUR`=OK)CEIHaW5C{2Umup(?Rr**O48p3Y2C3TxuRd<44xQYKW4@)t=RPRU zp#`2Y(TRqzTj_s+eQHCFZyvGyu2mE&7Acx0@7a$BoS z^H^Wi*mVwwk$pP8h^7~Xp}pQ_@wA;C`&(torEpul`WS2eMB7|Qwe$YoJWBYTd+kJx$01tOO`sJo9hyx{1~Yu3 zK>OKvn?in!(SsVmN*YK=;MQtuFH1lN&q_EkX9-^Q+b|oh1Ery#HLG7qWY!=RYkx;tbpMPHR!9H3}9^`Qi z_liSdW>HUm%WU5QXNAL{9oy%Bd)XC{#Eopq3muD`V@<=EStAtBRK#42r^L(6ht}=e zz~5-#(W&|lmAtQ|BoK`kBR>V}9+ud7Bu#z+PL04Oxnl??#^pd{XY z0Vc*@O@T#D003E&vyzg&hLRFg{|Uyy8D$Rus7Jm|A<;Klr~laIJH{jg1oGuQE2M#I zt^t#*RJb^S1nk|k>A1KaIs`dC3}ND7tlXhmYuC}4k9#NbDL=O&nuv*ihd>E8duOM` z+i_*!bg1w2a=yWF`;NOXfR?FFoipe);1jK84;66kp#B6Tz0Cy$2<3vbgTyj8sKmND z6#>Yx%blYI)*$ZRF6E?^fmc^;>9)iG#o^*-_9XMJU4Z+zc29>>8&WMoIp1Lfb2nsXd@uhm)*@rl85dKI}baGV`(o8 zjDh1g#KohdcXdK_;+d&BY0hGn+SUp$b;KW3^*I#xdv848rq~%si2!XjUsbbQP2VDV zzb>vFucAvsq6)PlU!PW2HF=jA*0--zoHm>_n6o7Dz~(^0ol}lPQy!}IA8W=lcsgKGo5R;PbKf}=$HU1U29cjY z$wz`kesIA-pdgC9!e)#0Zo<=tk$c_0ze@0BMb5xkv$&QJ=A&Dv%}hXQ{jky7fu`L) zU$Roq&)p_h#6jnizkdBn6vyUP1DHLDgK*L`;`UI}*P!;-CNH%!W$Bdke%k=3cnKIs z0MhLMZ;r|!7FPmvJNZd46hf8{mqCE;LMa{+hxPOpPZi9B`e$TH#H+|1 zb1+OHGDnswc-!#2+UP$Fs%F8}QQFMKN#%!`@UB zd^Hr-&o-3f)2FMTLy%d7(UFal>5zS(wGyDFjipVCil*JC6QF%1FsILK0^_|YaLS8) zoh)E1P|JVF8_RF>+U2#3qx@eyHe7x-^y8xnu?F? zlaB;f1m`Mht2Z2H(+>^&>l#y}^;(o$6fUaH7$_QFY{I31o=iNN2jtJW%hnn${uC)Seq+7)=#zluk1sYG9WQ|shtUf!V zsM6wf>M_Q#dkzTk7Y|-cQdVcIylW`%PWP@or69+3_Jv@uUHQ}0cI!yKnhNYD7G^G1 z`Mz?a;;dr4LaBnhGNaOZSS&M9)NwKMrPRC&vkOSl*M)Vm3`aakKUFu`S}Xox5obI- zi!H{TPrrSK!3HkcEVR4h)?Mf0H|`F*#o9G3-r;fN!5X!U#Z~9IC+t66WhIWK>gBbw zaOM;t!R)3NnlI3LHBPe;{6o6sL#L3Wiav5MIGddJx5bW8dCz@;l( z?YDrfy4rcIdaemg7fk`pwq&>ds*8u`M$3AOKMlWmRz5Rpb0>WI+_kGEHk;{sl0eF8 z$}uMWL#ea4zkA=xu{k}a!E8Yv`&huO9Q7DuuWmme+2z7i=U=H=-e|sMIs4A?@%hvi z+cVc^GgIre)d49-Ril>H0V`L2fzR5vix?NvqhxWilfKzIv6Iuk$QM(l{L{}hkNu}b zX6AjNKiYfDR;Q+(n~_XRba=jR%u|XCN3$Nu&KP2h+nN+A^A5mwVfXg-oJPO+ehhh4 z%jU@ZR^HYF>B~`zEhK%^|CrHP_wlw%BxW5=@yG?^{`j$sv;UJTz80hLVq?9x@=7vB z9uB`zmy=)I^WD2vjfRguh@b;K*ta{gq8AvNgo&&hpG;oug;6?uoD|qL)wT3&nevHs zt2}KSJ1o-u__^1bCD3K_$;P9`1;2vjqJg2h?S@%LwD+8J;Pmm)^1X_C6FZ;Vru{|E z<}R|kv**rd&YxcgU7wQ~47hvbv}`xHn82f{$DjR3w(@jn^TP|P;<+*ZR{yMFSdQ$* z>OtF?<=**3aQC8kw#$kS{ zl_W4wCR<8Q7#Tg8SO6e<;HpUmz#J38BT0gy21mPzjP{QT6^!P=iJ(gwy`iPV7uv#y z5`fO|`1K-^AP!%ksOkY74G>%afGiW(`1+ovXUFoao{)CItR)VsDg+uG^n@OF$h$o1 zz0#V!I)GQ5-MJDuHm9SGOGEJBf6apIG?etOQ2>Bw!o?l@eUv>y!$C&}z>l}V01%K7 zK!mq|c##7#{o7Ur@&X9|@)H06;m!ciKQX#^{b$7CO_=ZkK!U%c#*0@j!M~z` zlDUNcvH>sfa{vV+B@GR{HnMwSZ;y6&!g#z-J4?hnNL|$*xB~$6Tz>?pVaU0Q&;QN& zKEeZ`qb+TRaS^tCh(X#5d%3v&$pet_lE#}Z_8zuSFBcTrUD`_)_E&^7-u~kjfkFQY z@pvo?L+I#3l`v22p_0O)!lE!aGAI-(^W>p}w4t)Kn!&O>D$LZB{!b;e`#;;lZ&2jVjEI=9sK~!_~8-=3FCq<=^^)@cKrkX@5z6FG9rI= z{$EV|P4iz~JkN4uG9v%(nH-s`A+0dJjm*x==k-aQs0cr!bq^({3z@`!6z zW?0LO3JQnD!;5j$Z=7ifKqkN*2P!Z`ohKJJs`3a*0HV!c!3SgoA+;DvgTWAe)YBk9 zum?eukYyn;3=YRm0trB)q`Y+=@r)4wJecJF0JyPh;hhZ>9t5WiuKKAte{5ep*(^8Z zYl^Cj5C;;NPCXtNRbOk9`|v(e~*@hQo)9AKirN z&uWq7WWofXPBM$P6Hgi}zMa3t=pCQ8Ajva|n0Vmdx%90&vW8dpykx$8D73=1IQc0A z!5;>nB_DW5S1uRfU_9${q>vMszI6l3D>aNtTghDr6k?ToIXom#w=2eoZ-xmRTMPRP z0*5l_qZT+M06>DuAmn3}Oi~C~Bp27I<^&)BnE`vgMct*rBjMPvS0exrxP~CAlFp4A z4s8xXlC$Lj!4M}RT62LP+CgwHU=O{VA|V7iLdIKX(wznf-o^LZFO(Px&!yATq*pNak(`!`bTPbWq8$M}dEs|314D~5m0 zpg*uX+()q^&n_}5>?L)KN{5jiR3}w%d>fcQ)-JW4i|?Gs^&C+i-nkm`&Ym#z-FG?J z4<>rl;P2=6dy@1L|Hi$#3RU3C1^}*o`143?WjRLN*MNNVr6|sp%93(y(aXNslS$Vj z$eSOqyQC~dr*bW##0DT{16NVL$S(nhNacZ7GWEr>ork36Paju(%*IYoh*#f}H6ptA z*19cVcKmAY)M(szM`yHcUOAHU8bOYHpvlf$i&pAszj8r1JX^;5{!3=5{5$X)vOJ{N zu;A?Q53Sz&s{R*e<4Qv+%LpZ?c^!%$GuMnQO8%x6A;g`+C9UaycA(J`cqJ#DrS+CH z623jtVEj2#$_~A)h!Xq2`Nas#Kx=wm84^KDP@i94h~-v9Ve4Q9Usn%*PH5KMF95p| zJk3fOnnn0o5$#f+HsX!1+1r;}iuS9rZ7=*j^ zd?s7gx2VY)0nnW#@mldBweO>B^y*is1P+y z@r~a5MOB%iwjumxHBPS2C9+AeZ>V^k=~+N94U}Z?&G*%{b#JE+7m~*`QAc+@e||H* zI6E}rOp5YTgGX%Lqc_~U5v&f$a8t7Erqgt-l3eI?q%q%`s;worKh}^Q7)TKruQdOV zBs*Va*;KYNlrgPC(<<1Vyn99P3m9~vGQ1WOpo%IQcB0PIK`Dh(8rMD=ztu&|A|LR( zBw5J3i1a1-Ykp(HKkL`eP?o1cY8_k!-AxO0pki{RviL4CdX91ClJvOixshb{0nMUf zT%yl@+j*4Ja%J&!e|4ihn9xkEAHwdd-4jJ;M8|($U&yQm{KQhky0v23U8KqdzZpK_ zK0KXY^OV9pSSFkuLwV#zR=Xo+1WuE5HbdLE1L4 zH*1#Ggb30!P{f7$KZigpu14apb#}?t8U&Yml|{qXn497rr$<}UWCLT$AW!>GYD4L_ z$MJhO^tX`qIVdq}3ur;Bi00#YVt>Z#d9rI;>paG7IqW&b9@FI&laTnm zKFU@5bj$2;p({KIJ$`(!HGOAIdW%8Cs^ao=H7D1{onT!tRS`u@CFK(hH-TgT1(Lqs zYP?EjMdD9px>=(~sYx*JdX4j#N7<)?^)bS84C0<~xrs3mIsI4b1OM|QzPX?f374t+ zo;!1vDP8P!F4J|Tvc5-a0XIktJAV8K18owq$_H3jbJUA@?>%(sG3c;bm}zhypZ=WGofIr+=-60WmRebPjV zdrgAw_?_&+`y(2%r^IBtpYDEFsI?!UpS5pzvi!Bgpn!J!N11WC2Mebd3imFT{d9CV z~J9uJZ8ruYPu+*rS*vf09-1IFx$0GcOX$2w=8o+^Pk5tMh94-i9 z%1slIM)NHtvuX%nXY1XRDj!sfi1rI>z-9w{y?OwYHE?aTO1rjV=; zB%I1ffq}7MFwWIEs7>q00xwFPub_(4j;UOT!ynh(+k1~`w=UJ=`uU+YHa@OPd@)WpSZ5@_Fb8K)pqA7jBJ z;S^UrG}q!w$N4gb<(|o~*qau)*-vMwQtm}h+e)dC)j{$3*5HS?v1z=e-pm3PNG)4*ssNp zBuDK8ujTn}Oax3+Sw8yslBLo96|3z1L~fnTXG1yi)@lzLc)M3Z)%pG5P=UxHgb#6X zOdR9!6g?9kbDVC8P0xZuLSsh&-Bt_^&FBeXD-1adweMw9ei*<2qwem#i_d5Tp^X2O z6q+LW=irwid!o`^KgKc@ze4S$2$@U1nI<@#ZS)+YXD{qUs1Ik$8ZY+761r@LZ1s|1 zCqJoA3V_~+;9{nogOJt~hT_9%>1Q>pF39r-A!yBuNfR=r!%DN-vxV_*N7<D=?)EA;t&f<=FOXR9>c^bBK}eak)yO=z$v zS!BGKOZtsJm?Qi@%aA_SNYD^gH{yGj=QM?v3n|a8Q1tdHYs@LvLoDsHY`Oyzm_KQ8{~&_1K;mr8?_%1Z&6?k zdOH`NaX?txU|*7Ra=Lyr`W%+&l8b#oD4}XBTm2ezi{AV`-)Vb15ogNJu9q!iz$A$R z%dn5M`um1O$HW!C_=yS-#y+Takgf+r&b9?w(Ng>XTSIu<^C;+i^-3!kz07Gq!lJ!>hJZeJ}^*^jP*5?z1A?< z?XY7xDQ&^k_T4qlpQZ`h{4uOb2h=n&I~@?j2vt5?_FTu zr<{z7Pn$x6NN>zEJ=3$MN4n?zISdd|WVOaMhD7(vnA9Xfch+^g`tBEU2mwUObvC(c zCE<_zwfIP`-NmVG9TjMrRn~?>5NSKjeFS(n@%`}GQQU;( z5NyIm+TCo@SNp1$a93tf_exR<*%05a;M#sj ze+9-}%`B{8nxu+y)VB-L0ev&$9D1ua z3}HkgDA?Q0qH4YE$#v9tW~)78(hH;DPC)M5R((J3dX`{aN=70(yd6u66>||}6}&y8 zyT5vqIUgMgfgqzHaicoDkO)q!y*6Qk04o*V_0jmyNmmiYDwM2NMuzpSLHsHygP6-y zJ^D7R5h3(*0-AT*W^7W|UEN9a;U1MjP_CL!h%nVn35qQBT_^>#M~lXgNYRMmhduh% zs|tl6wK0oQ?gs@!#|B}zRy(R=E<=h>G7MB8SQwzeV_oA}%TJK4+YFKBnbNbHi06_N+gF@1Pmq+28H4* zO4PHUP_S2Q5F}$_fTy3FAS8$!$S%piZ^(lWvEqPsuN>}0?)||k!Xt*lqP~*iLngpr ztapoFels3hk7xb=V)}%H#KbF4%Q$HTI0ORnQ~53*m=G4L67GKf=l{Njimq~%qD{#E E0~bAW^8f$< literal 0 HcmV?d00001 diff --git a/apps/explorer/src/comps/DataGrid.tsx b/apps/explorer/src/comps/DataGrid.tsx index bb7fe5ef9..61f4dea51 100644 --- a/apps/explorer/src/comps/DataGrid.tsx +++ b/apps/explorer/src/comps/DataGrid.tsx @@ -4,6 +4,7 @@ import * as React from 'react' import { Pagination } from '#comps/Pagination' import { Sections } from '#comps/Sections' import { cx } from '#lib/css' +import { useNewLiveRows } from '#lib/use-new-live-rows' import ChevronDownIcon from '~icons/lucide/chevron-down' export function DataGrid(props: DataGrid.Props) { @@ -56,6 +57,10 @@ export function DataGrid(props: DataGrid.Props) { }), })) : items(mode) + const newLiveRows = useNewLiveRows( + activeItems.map((item) => item.key), + effectiveLoading ? undefined : props.liveScope, + ) const pages = pagesProp ?? Math.ceil(totalItems / itemsPerPage) const isSimpleSinglePage = pagination === 'simple' && @@ -145,6 +150,9 @@ export function DataGrid(props: DataGrid.Props) { 'hover:bg-surface-hover transition-colors duration-100', item.expanded && 'border-l-distinct', item.className, + item.key !== undefined && + newLiveRows.has(item.key) && + 'block-row-shimmer', )} > {item.link && ( @@ -278,6 +286,8 @@ export namespace DataGrid { } export interface Props { + /** Enables new-row highlights, resetting when the feed scope changes. */ + liveScope?: string | undefined columns: { stacked: Column[] tabs: Column[] diff --git a/apps/explorer/src/lib/live-feed.ts b/apps/explorer/src/lib/live-feed.ts new file mode 100644 index 000000000..c85fe0d60 --- /dev/null +++ b/apps/explorer/src/lib/live-feed.ts @@ -0,0 +1,9 @@ +export function liveFeedSecondsLeft( + session: { scope: string; deadline: number } | null, + scope: string, + eligible: boolean, + now: number, +): number { + if (!eligible || !session || session.scope !== scope) return 0 + return Math.max(0, Math.ceil((session.deadline - now) / 1_000)) +} diff --git a/apps/explorer/src/lib/live-query.ts b/apps/explorer/src/lib/live-query.ts new file mode 100644 index 000000000..6ee0490eb --- /dev/null +++ b/apps/explorer/src/lib/live-query.ts @@ -0,0 +1,48 @@ +import * as z from 'zod/mini' +import { zAddress } from './zod' + +export const liveQuerySchema = z.object({ + address: zAddress({ lowercase: true }), + kind: z.enum(['token-transfers', 'account-transfers', 'transactions']), + limit: z.prefault(z.coerce.number().check(z.int(), z.gte(1), z.lte(200)), 10), + account: z.optional(zAddress({ lowercase: true })), + direction: z.optional(z.enum(['in', 'out'])), + include: z.prefault(z.enum(['all', 'sent', 'received']), 'all'), + status: z.optional(z.enum(['success', 'reverted'])), + after: z.optional( + z.coerce.number().check(z.int(), z.gte(0), z.lte(253402300799)), + ), + hideSubmitBatches: z.optional(z.enum(['true', 'false'])), +}) +export type LiveQuery = z.infer +export function buildLiveQueries(options: LiveQuery): string[] { + const { address, kind, limit } = options + if (kind === 'transactions') { + const sides = + options.include === 'sent' + ? ['from'] + : options.include === 'received' + ? ['to'] + : ['from', 'to'] + return sides.map( + (side) => + `SELECT hash, block_num, idx FROM txs WHERE "${side}" = '${address}'${options.after ? ` AND block_timestamp >= '${new Date(options.after * 1000).toISOString()}'` : ''} ORDER BY block_num DESC, idx DESC LIMIT ${Math.min(limit, 10)}`, + ) + } + const account = kind === 'account-transfers' ? address : options.account + const filters = [ + "topic0 = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'", + ] + if (kind === 'token-transfers') filters.push(`address = '${address}'`) + const sides = !account + ? [undefined] + : options.direction === 'in' + ? ['topic2'] + : options.direction === 'out' + ? ['topic1'] + : ['topic1', 'topic2'] + return sides.map( + (side) => + `SELECT address, block_num, tx_hash, log_idx, block_timestamp, topic0, topic1, topic2, data FROM logs WHERE ${[...filters, ...(side && account ? [`${side} = '0x${account.slice(2).padStart(64, '0')}'`] : [])].join(' AND ')} ORDER BY block_num DESC, log_idx DESC LIMIT ${limit}`, + ) +} diff --git a/apps/explorer/src/lib/server/address-history.ts b/apps/explorer/src/lib/server/address-history.ts index bbd4ab692..1cc69d78f 100644 --- a/apps/explorer/src/lib/server/address-history.ts +++ b/apps/explorer/src/lib/server/address-history.ts @@ -32,13 +32,14 @@ import { isZonePortalAddress } from '#lib/domain/zones' export const [MAX_LIMIT, DEFAULT_LIMIT] = [10, 10] const HISTORY_TOTAL_CACHE_TTL = 60_000 const HISTORY_TOTAL_CACHE_MAX_ENTRIES = 50 -const SUBMIT_BATCH_SELECTOR = toFunctionSelector( +export const SUBMIT_BATCH_SELECTOR = toFunctionSelector( getAbiItem({ abi: zonePortalAbi, name: 'submitBatch' }), ) export type EnrichedTransaction = { hash: `0x${string}` blockNumber: string + transactionIndex?: number | undefined timestamp: number from: `0x${string}` to: `0x${string}` | null @@ -312,7 +313,7 @@ async function fetchFilteredHistoryPage( * Resolves TIP-20 metadata for every token referenced by the page's event * logs (symbol/decimals for the known-event summaries). */ -async function buildTokenMetadataLookup( +export async function buildTokenMetadataLookup( rows: readonly TransactionRow[], ): Promise<(address: Address.Address) => Metadata | undefined> { const config = getWagmiConfig() @@ -394,6 +395,7 @@ export function toEnrichedTransaction( return { hash: row.hash, blockNumber: toHexQuantity(row.blockNumber), + transactionIndex: row.transactionIndex ?? undefined, timestamp: parseTimestamp(row.timestamp) ?? 0, from: Address.checksum(row.sender), to, diff --git a/apps/explorer/src/lib/server/address-live.ts b/apps/explorer/src/lib/server/address-live.ts new file mode 100644 index 000000000..21f56d4da --- /dev/null +++ b/apps/explorer/src/lib/server/address-live.ts @@ -0,0 +1,296 @@ +import { parseResponse } from 'hono/client' +import * as Address from 'ox/Address' +import * as Hex from 'ox/Hex' +import { decodeEventLog, parseAbiItem } from 'viem' +import { + liveQuerySchema, + buildLiveQueries, + type LiveQuery, +} from '#lib/live-query' +import { readSse } from '#lib/sse' +import { parseTimestamp } from '#lib/timestamp' +import { api } from './tempo-api' +import { serverEnv, tempoApiUrl } from './env' +import { getChainBackend } from './network' +import { + buildTokenMetadataLookup, + toEnrichedTransaction, + SUBMIT_BATCH_SELECTOR, +} from './address-history' +import { getTransactionActivities } from './transaction-activities' +import { isZonePortalAddress } from '#lib/domain/zones' + +const transferAbi = [ + parseAbiItem( + 'event Transfer(address indexed from, address indexed to, uint256 value)', + ), +] + +export async function addressLiveResponse( + request: Request, + address: string, + chainId: number, +): Promise { + const parsed = liveQuerySchema.safeParse({ + ...Object.fromEntries(new URL(request.url).searchParams), + address, + }) + if (!parsed.success) + return Response.json( + { error: 'Invalid live feed parameters' }, + { status: 400 }, + ) + const options = parsed.data + const abort = new AbortController() + const stop = () => abort.abort() + request.signal.addEventListener('abort', stop, { once: true }) + if (request.signal.aborted) stop() + const deadline = setTimeout(stop, 120_000) + const backend = getChainBackend(chainId, 'tidx') + const encoder = new TextEncoder() + const seen = new Set() + const metadata = new Map< + string, + Promise<{ + address: Address.Address + symbol: string + decimals: number + currency: string + }> + >() + const stream = new ReadableStream({ + start(controller) { + const emit = (event: string, data: unknown) => { + if (!abort.signal.aborted) + controller.enqueue( + encoder.encode( + `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`, + ), + ) + } + const heartbeat = setInterval(() => { + if (!abort.signal.aborted) + controller.enqueue(encoder.encode(': heartbeat\n\n')) + }, 15_000) + const run = async (sql: string) => { + const url = new URL( + `${backend?.url ?? `${tempoApiUrl}/v1/indexer`}/query`, + ) + url.search = new URLSearchParams({ + sql, + chainId: String(chainId), + live: 'true', + }).toString() + const response = await fetch(url, { + signal: abort.signal, + headers: { + Accept: 'text/event-stream', + ...(backend?.headers ?? + (serverEnv.TEMPO_API_KEY + ? { 'tempo-api-key': serverEnv.TEMPO_API_KEY } + : {})), + }, + }) + if (!response.ok || !response.body) + throw new Error(`Live indexer returned ${response.status}`) + for await (const event of readSse(response.body)) { + let result: { ok: boolean; columns: string[]; rows: unknown[][] } + if (event.event === 'lagged') { + // Keep the stream open: reconnecting can repeat the same catch-up notice. + // A fresh PostgreSQL head snapshot repairs the visible window, then + // subsequent block deltas continue over the existing connection. + const snapshotUrl = new URL(url) + snapshotUrl.searchParams.delete('live') + snapshotUrl.searchParams.set('engine', 'postgres') + const snapshot = await fetch(snapshotUrl, { + signal: abort.signal, + headers: { + Accept: 'application/json', + 'Cache-Control': 'no-cache', + ...(backend?.headers ?? + (serverEnv.TEMPO_API_KEY + ? { 'tempo-api-key': serverEnv.TEMPO_API_KEY } + : {})), + }, + }) + if (!snapshot.ok) throw new Error('Live resynchronization failed') + result = (await snapshot.json()) as typeof result + } else { + if (event.event === 'error') + throw new Error(`Live indexer error: ${event.data}`) + if (event.event !== 'result') continue + result = JSON.parse(event.data) as typeof result + } + if (!result.ok) + throw new Error(`Live query failed: ${JSON.stringify(result)}`) + const rows = result.rows.map((values) => + Object.fromEntries( + result.columns.map((column, index) => [column, values[index]]), + ), + ) + const fresh = rows.filter((row) => { + const id = + options.kind === 'transactions' + ? String(row.hash) + : `${row.tx_hash}-${row.log_idx}` + if (seen.has(id)) return false + seen.add(id) + return true + }) + if (!fresh.length) continue + const data = await normalizeRows(fresh, options, chainId, metadata) + if (data.length) emit('rows', { kind: options.kind, rows: data }) + // Bound memory even for a busy account; only the latest visible window matters. + while (seen.size > 5_000) { + const first = seen.values().next().value + if (first) seen.delete(first) + } + } + } + void Promise.all(buildLiveQueries(options).map(run)) + .then(() => { + emit('end', {}) + }) + .catch((error) => { + if (!abort.signal.aborted) + console.error( + 'Address live stream failed:', + error instanceof Error + ? `${error.message} ${'detail' in error ? JSON.stringify(error.detail) : ''}` + : 'Unknown error', + ) + emit('feed-error', { message: 'Live connection interrupted' }) + }) + .finally(() => { + stop() + clearTimeout(deadline) + clearInterval(heartbeat) + request.signal.removeEventListener('abort', stop) + try { + controller.close() + } catch { + /* The client may already have cancelled. */ + } + }) + }, + cancel: stop, + }) + return new Response(stream, { + headers: { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-store', + 'X-Accel-Buffering': 'no', + }, + }) +} + +async function normalizeRows( + rows: Record[], + options: LiveQuery, + chainId: number, + metadata: Map< + string, + Promise<{ + address: Address.Address + symbol: string + decimals: number + currency: string + }> + >, +) { + if (options.kind === 'transactions') { + const fetched = await Promise.all( + rows.map(async (row) => { + const hash = String(row.hash) + Hex.assert(hash) + return parseResponse( + api.v1.transactions[':transactionHash'].$get({ + param: { transactionHash: hash }, + query: { chainId: String(chainId), include: 'receipt' }, + }), + ) + }), + ) + const filtered = fetched.filter((row) => { + if (options.status && row.meta?.receipt?.status !== options.status) + return false + if ( + options.hideSubmitBatches === 'true' && + isZonePortalAddress(options.address) + ) { + const calls = [ + { to: row.recipient, input: row.input, data: undefined }, + ...((row.meta?.rpc?.calls ?? []) as { + to?: string + input?: string + data?: string + }[]), + ] + if ( + calls.some( + (call) => + call.to?.toLowerCase() === options.address && + (call.input ?? call.data ?? '') + .toLowerCase() + .startsWith(SUBMIT_BATCH_SELECTOR), + ) + ) + return false + } + return true + }) + const lookup = await buildTokenMetadataLookup(filtered) + return Promise.all( + filtered.map(async (row) => + toEnrichedTransaction(row, { + includeKnownEvents: true, + getTokenMetadata: lookup, + activities: await getTransactionActivities(row.hash, chainId), + }), + ), + ) + } + return Promise.all( + rows.map(async (row) => { + const tokenAddress = String(row.address) + Address.assert(tokenAddress) + const hash = String(row.tx_hash) + Hex.assert(hash) + const decoded = decodeEventLog({ + abi: transferAbi, + data: String(row.data) as Hex.Hex, + topics: [ + String(row.topic0), + String(row.topic1), + String(row.topic2), + ] as [Hex.Hex, Hex.Hex, Hex.Hex], + }) + const transfer = { + id: `${hash}-${row.log_idx}`, + from: decoded.args.from, + to: decoded.args.to, + value: decoded.args.value.toString(), + transactionHash: hash, + blockNumber: String(row.block_num), + timestamp: String(parseTimestamp(row.block_timestamp) ?? ''), + } + if (options.kind === 'token-transfers') return transfer + if (!metadata.has(tokenAddress)) + metadata.set( + tokenAddress, + parseResponse( + api.v1.tokens[':token'].$get({ + param: { token: tokenAddress }, + query: { chainId: String(chainId) }, + }), + ).then((token) => ({ + address: tokenAddress, + symbol: token.symbol, + decimals: token.decimals, + currency: token.currency, + })), + ) + return { ...transfer, token: await metadata.get(tokenAddress) } + }), + ) +} diff --git a/apps/explorer/src/lib/server/token.ts b/apps/explorer/src/lib/server/token.ts index 7d25a95c7..22fec88a9 100644 --- a/apps/explorer/src/lib/server/token.ts +++ b/apps/explorer/src/lib/server/token.ts @@ -182,6 +182,7 @@ export type FetchTokenTransfersInput = z.infer< export type TokenTransfersApiResponse = { transfers: Array<{ + id: string from: Address.Address to: Address.Address value: string @@ -208,6 +209,7 @@ const FetchAccountTransfersInputSchema = z.object({ export type AccountTransfersApiResponse = { transfers: Array<{ + id: string from: Address.Address to: Address.Address value: string @@ -262,6 +264,7 @@ export const fetchAccountTransfers = createServerFn({ method: 'POST' }) return { transfers: page.data.map((transfer) => ({ + id: transfer.id, from: transfer.sender as Address.Address, to: transfer.recipient as Address.Address, value: transfer.sourceAmount.baseUnits, @@ -316,6 +319,7 @@ export const fetchTransfers = createServerFn({ method: 'POST' }) return { transfers: page.data.map((transfer) => ({ + id: transfer.id, from: transfer.sender as Address.Address, to: transfer.recipient as Address.Address, value: transfer.sourceAmount.baseUnits, diff --git a/apps/explorer/src/lib/sse.ts b/apps/explorer/src/lib/sse.ts new file mode 100644 index 000000000..48123abfb --- /dev/null +++ b/apps/explorer/src/lib/sse.ts @@ -0,0 +1,54 @@ +/** Read SSE frames without assuming network chunks align with events. */ +export async function* readSse(body: ReadableStream) { + const reader = body.getReader() + const decoder = new TextDecoder() + let buffer = '' + try { + while (true) { + const { value, done } = await reader.read() + buffer += done + ? decoder.decode() + : decoder.decode(value, { stream: true }) + while (true) { + const match = /\r?\n\r?\n/.exec(buffer) + if (!match) break + const frame = buffer.slice(0, match.index) + buffer = buffer.slice(match.index + match[0].length) + let event = 'message' + const data: string[] = [] + for (const line of frame.split(/\r?\n/)) { + if (line.startsWith('event:')) event = line.slice(6).trim() + if (line.startsWith('data:')) + data.push(line.slice(5).replace(/^ /, '')) + } + if (data.length) yield { event, data: data.join('\n') } + } + if (done) break + } + } finally { + await reader.cancel().catch(() => {}) + reader.releaseLock() + } +} + +export function mergeLiveRows< + T extends { + blockNumber: string + transactionIndex?: number | undefined + id?: string | undefined + }, +>(previous: T[], incoming: T[], key: (row: T) => string, limit: number): T[] { + const rows = new Map() + for (const row of [...incoming, ...previous]) + if (!rows.has(key(row))) rows.set(key(row), row) + return [...rows.values()] + .sort((a, b) => { + const blockA = BigInt(a.blockNumber), + blockB = BigInt(b.blockNumber) + if (blockA !== blockB) return blockA > blockB ? -1 : 1 + const position = (row: T) => + row.transactionIndex ?? Number(row.id?.split('-').at(-1) ?? 0) + return position(b) - position(a) + }) + .slice(0, limit) +} diff --git a/apps/explorer/src/lib/use-address-live.ts b/apps/explorer/src/lib/use-address-live.ts new file mode 100644 index 000000000..726aa2d10 --- /dev/null +++ b/apps/explorer/src/lib/use-address-live.ts @@ -0,0 +1,74 @@ +import * as React from 'react' +import type { EnrichedTransaction } from './server/address-history' +import type { + AccountTransfersApiResponse, + TokenTransfersApiResponse, +} from './server/token' + +export type LiveRows = + | { kind: 'transactions'; rows: EnrichedTransaction[] } + | { kind: 'token-transfers'; rows: TokenTransfersApiResponse['transfers'] } + | { + kind: 'account-transfers' + rows: AccountTransfersApiResponse['transfers'] + } + +export function useAddressLive( + url: string, + enabled: boolean, + onRows: (data: LiveRows) => void, + stop: () => void, +) { + const callbacks = React.useRef({ onRows, stop }) + React.useEffect(() => { + callbacks.current = { onRows, stop } + }, [onRows, stop]) + const [error, setError] = React.useState(null) + React.useEffect(() => { + if (!enabled) return + setError(null) + let source: EventSource | undefined + let retry: ReturnType | undefined + let retries = 0 + let disposed = false + const reconnect = () => { + source?.close() + if (disposed || retry) return + if (++retries > 3) { + setError('Live updates paused. Try again.') + callbacks.current.stop() + return + } + retry = setTimeout( + () => { + retry = undefined + connect() + }, + 1_000 * 2 ** (retries - 1), + ) + } + const connect = () => { + if (disposed) return + source = new EventSource(url) + source.addEventListener('rows', (event) => { + try { + callbacks.current.onRows( + JSON.parse((event as MessageEvent).data) as LiveRows, + ) + } catch { + reconnect() + } + }) + source.addEventListener('feed-error', reconnect) + source.addEventListener('end', reconnect) + source.onerror = reconnect + } + connect() + return () => { + disposed = true + source?.close() + clearTimeout(retry) + } + }, [url, enabled]) + return error +} diff --git a/apps/explorer/src/lib/use-live-feed.ts b/apps/explorer/src/lib/use-live-feed.ts new file mode 100644 index 000000000..a7b67bfad --- /dev/null +++ b/apps/explorer/src/lib/use-live-feed.ts @@ -0,0 +1,54 @@ +import * as React from 'react' +import { liveFeedSecondsLeft } from './live-feed' + +/** A live session belongs to one address, tab, page, and set of filters. */ +export function useLiveFeed( + scope: string, + eligible: boolean, + initialLive = false, +) { + const [session, setSession] = React.useState<{ + scope: string + deadline: number + } | null>(null) + const [now, setNow] = React.useState(0) + const initialized = React.useRef(false) + const stop = React.useCallback(() => setSession(null), []) + const start = React.useCallback(() => { + if (!eligible || document.visibilityState !== 'visible') return + const now = Date.now() + setNow(now) + setSession({ scope, deadline: now + 120_000 }) + }, [scope, eligible]) + React.useEffect(() => { + if (initialized.current) return + initialized.current = true + if (initialLive) start() + }, [initialLive, start]) + const secondsLeft = liveFeedSecondsLeft(session, scope, eligible, now) + const live = secondsLeft > 0 + React.useEffect(() => { + if (!session) return + if (!live) { + stop() + return + } + const tick = () => { + const now = Date.now() + setNow(now) + if (now >= session.deadline) stop() + } + const hide = () => { + if (document.visibilityState !== 'visible') stop() + } + const timer = window.setInterval(tick, 1_000) + document.addEventListener('visibilitychange', hide) + window.addEventListener('pagehide', stop) + return () => { + window.clearInterval(timer) + document.removeEventListener('visibilitychange', hide) + window.removeEventListener('pagehide', stop) + } + }, [session, live, stop]) + return { live, start, stop } +} diff --git a/apps/explorer/src/lib/use-new-live-rows.ts b/apps/explorer/src/lib/use-new-live-rows.ts new file mode 100644 index 000000000..872cd69f4 --- /dev/null +++ b/apps/explorer/src/lib/use-new-live-rows.ts @@ -0,0 +1,31 @@ +import * as React from 'react' + +type Key = string | number + +/** Track row identity across refreshes, without flashing the initial page or resumed feed. */ +export function useNewLiveRows( + keys: (Key | undefined)[], + scope: string | undefined, +) { + const signature = JSON.stringify(keys) + const [previous, setPrevious] = React.useState(() => ({ + signature, + scope, + keys: new Set(keys), + added: new Set(), + })) + if (previous.signature !== signature || previous.scope !== scope) { + const added = new Set() + if ( + scope !== undefined && + previous.scope === scope && + previous.keys.size > 0 + ) { + for (const key of keys) + if (key !== undefined && !previous.keys.has(key)) added.add(key) + } + setPrevious({ signature, scope, keys: new Set(keys), added }) + return added + } + return previous.added +} diff --git a/apps/explorer/src/routeTree.gen.ts b/apps/explorer/src/routeTree.gen.ts index df613e962..5fc9c1574 100644 --- a/apps/explorer/src/routeTree.gen.ts +++ b/apps/explorer/src/routeTree.gen.ts @@ -41,6 +41,7 @@ import { Route as ApiTokenLogoAddressRouteImport } from './routes/api/token/logo import { Route as ApiContractCreationAddressRouteImport } from './routes/api/contract/creation/$address' import { Route as ApiAddressZonePortalAddressRouteImport } from './routes/api/address/zone-portal/$address' import { Route as ApiAddressMetadataAddressRouteImport } from './routes/api/address/metadata/$address' +import { Route as ApiAddressLiveAddressRouteImport } from './routes/api/address/live.$address' import { Route as ApiAddressHistoryAddressRouteImport } from './routes/api/address/history/$address' import { Route as ApiAddressBalancesAddressRouteImport } from './routes/api/address/balances/$address' import { Route as LayoutBlockCountdownTargetBlockRouteImport } from './routes/_layout/block/countdown.$targetBlock' @@ -208,6 +209,11 @@ const ApiAddressMetadataAddressRoute = path: '/api/address/metadata/$address', getParentRoute: () => rootRouteImport, } as any) +const ApiAddressLiveAddressRoute = ApiAddressLiveAddressRouteImport.update({ + id: '/api/address/live/$address', + path: '/api/address/live/$address', + getParentRoute: () => rootRouteImport, +} as any) const ApiAddressHistoryAddressRoute = ApiAddressHistoryAddressRouteImport.update({ id: '/api/address/history/$address', @@ -262,6 +268,7 @@ export interface FileRoutesByFullPath { '/block/countdown/$targetBlock': typeof LayoutBlockCountdownTargetBlockRoute '/api/address/balances/$address': typeof ApiAddressBalancesAddressRoute '/api/address/history/$address': typeof ApiAddressHistoryAddressRoute + '/api/address/live/$address': typeof ApiAddressLiveAddressRoute '/api/address/metadata/$address': typeof ApiAddressMetadataAddressRoute '/api/address/zone-portal/$address': typeof ApiAddressZonePortalAddressRouteWithChildren '/api/contract/creation/$address': typeof ApiContractCreationAddressRoute @@ -299,6 +306,7 @@ export interface FileRoutesByTo { '/block/countdown/$targetBlock': typeof LayoutBlockCountdownTargetBlockRoute '/api/address/balances/$address': typeof ApiAddressBalancesAddressRoute '/api/address/history/$address': typeof ApiAddressHistoryAddressRoute + '/api/address/live/$address': typeof ApiAddressLiveAddressRoute '/api/address/metadata/$address': typeof ApiAddressMetadataAddressRoute '/api/address/zone-portal/$address': typeof ApiAddressZonePortalAddressRouteWithChildren '/api/contract/creation/$address': typeof ApiContractCreationAddressRoute @@ -338,6 +346,7 @@ export interface FileRoutesById { '/_layout/block/countdown/$targetBlock': typeof LayoutBlockCountdownTargetBlockRoute '/api/address/balances/$address': typeof ApiAddressBalancesAddressRoute '/api/address/history/$address': typeof ApiAddressHistoryAddressRoute + '/api/address/live/$address': typeof ApiAddressLiveAddressRoute '/api/address/metadata/$address': typeof ApiAddressMetadataAddressRoute '/api/address/zone-portal/$address': typeof ApiAddressZonePortalAddressRouteWithChildren '/api/contract/creation/$address': typeof ApiContractCreationAddressRoute @@ -377,6 +386,7 @@ export interface FileRouteTypes { | '/block/countdown/$targetBlock' | '/api/address/balances/$address' | '/api/address/history/$address' + | '/api/address/live/$address' | '/api/address/metadata/$address' | '/api/address/zone-portal/$address' | '/api/contract/creation/$address' @@ -414,6 +424,7 @@ export interface FileRouteTypes { | '/block/countdown/$targetBlock' | '/api/address/balances/$address' | '/api/address/history/$address' + | '/api/address/live/$address' | '/api/address/metadata/$address' | '/api/address/zone-portal/$address' | '/api/contract/creation/$address' @@ -452,6 +463,7 @@ export interface FileRouteTypes { | '/_layout/block/countdown/$targetBlock' | '/api/address/balances/$address' | '/api/address/history/$address' + | '/api/address/live/$address' | '/api/address/metadata/$address' | '/api/address/zone-portal/$address' | '/api/contract/creation/$address' @@ -474,6 +486,7 @@ export interface RootRouteChildren { ApiAbiBatchRoute: typeof ApiAbiBatchRoute ApiAddressBalancesAddressRoute: typeof ApiAddressBalancesAddressRoute ApiAddressHistoryAddressRoute: typeof ApiAddressHistoryAddressRoute + ApiAddressLiveAddressRoute: typeof ApiAddressLiveAddressRoute ApiAddressMetadataAddressRoute: typeof ApiAddressMetadataAddressRoute ApiAddressZonePortalAddressRoute: typeof ApiAddressZonePortalAddressRouteWithChildren ApiContractCreationAddressRoute: typeof ApiContractCreationAddressRoute @@ -708,6 +721,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiAddressMetadataAddressRouteImport parentRoute: typeof rootRouteImport } + '/api/address/live/$address': { + id: '/api/address/live/$address' + path: '/api/address/live/$address' + fullPath: '/api/address/live/$address' + preLoaderRoute: typeof ApiAddressLiveAddressRouteImport + parentRoute: typeof rootRouteImport + } '/api/address/history/$address': { id: '/api/address/history/$address' path: '/api/address/history/$address' @@ -809,6 +829,7 @@ const rootRouteChildren: RootRouteChildren = { ApiAbiBatchRoute: ApiAbiBatchRoute, ApiAddressBalancesAddressRoute: ApiAddressBalancesAddressRoute, ApiAddressHistoryAddressRoute: ApiAddressHistoryAddressRoute, + ApiAddressLiveAddressRoute: ApiAddressLiveAddressRoute, ApiAddressMetadataAddressRoute: ApiAddressMetadataAddressRoute, ApiAddressZonePortalAddressRoute: ApiAddressZonePortalAddressRouteWithChildren, diff --git a/apps/explorer/src/routes/_layout/address/$address.tsx b/apps/explorer/src/routes/_layout/address/$address.tsx index c3dc9cf25..c28c71565 100644 --- a/apps/explorer/src/routes/_layout/address/$address.tsx +++ b/apps/explorer/src/routes/_layout/address/$address.tsx @@ -53,6 +53,9 @@ import { } from '#lib/domain/known-event-totals' import { TransactionFilters, TransferFilters } from '#comps/TransactionFilters' import { cx } from '#lib/css' +import { useLiveFeed } from '#lib/use-live-feed' +import { useAddressLive } from '#lib/use-address-live' +import { mergeLiveRows } from '#lib/sse' import { type AssetData, type BalancesResponse, @@ -1162,6 +1165,25 @@ function SectionsWrapper(props: { [address, after, include, status, hideSubmitBatches], ) + const feedScope = JSON.stringify([ + address, + activeTab, + page, + cursor, + order, + limit, + account, + status, + transferDirection, + dir, + period, + hideSubmitBatches, + ]) + const feedEligible = isTransactionsTabActive + ? isLatestHistoryPosition + : isTransfersTabActive && page === 1 + const feed = useLiveFeed(feedScope, feedEligible, live) + const latestHistoryQuery = useQuery({ ...historyQueryOptions({ address, @@ -1175,12 +1197,9 @@ function SectionsWrapper(props: { initialData, enabled: isMounted && (isTransactionsTabActive || initialData !== undefined), - refetchInterval: - live && isTransactionsTabActive && isLatestHistoryPosition - ? 4_000 - : false, - refetchOnWindowFocus: - live && isTransactionsTabActive && isLatestHistoryPosition, + refetchInterval: false, + refetchOnWindowFocus: false, + retry: false, }) const latestHistoryData = latestHistoryQuery.data const total = latestHistoryData?.total ?? undefined @@ -1213,6 +1232,9 @@ function SectionsWrapper(props: { account, }), enabled: isMounted && isToken && isTransfersTabActive, + refetchInterval: false, + refetchOnWindowFocus: false, + retry: false, }) // Account-scoped transfers query (non-token addresses): the D2 split moved @@ -1231,8 +1253,167 @@ function SectionsWrapper(props: { direction: transferDirection, }), enabled: isMounted && !isToken && isTransfersTabActive, + refetchInterval: false, + refetchOnWindowFocus: false, + retry: false, }) + const liveParams = new URLSearchParams({ + kind: isTransactionsTabActive + ? 'transactions' + : isToken + ? 'token-transfers' + : 'account-transfers', + limit: String(isTransactionsTabActive ? HISTORY_PAGE_SIZE : limit), + include, + }) + if (account) liveParams.set('account', account) + if (transferDirection) liveParams.set('direction', transferDirection) + if (status) liveParams.set('status', status) + if (after) liveParams.set('after', String(after)) + if (hideSubmitBatches) liveParams.set('hideSubmitBatches', 'true') + const streamError = useAddressLive( + `/api/address/live/${address}?${liveParams}`, + feed.live, + (update) => { + if (update.kind === 'transactions') { + queryClient.setQueryData( + getHistoryQueryOptions({ order: 'desc' }).queryKey, + (old) => { + const transactions = mergeLiveRows( + old?.transactions ?? [], + update.rows, + (row) => row.hash, + HISTORY_PAGE_SIZE, + ) + const last = transactions.at(-1) + const first = transactions[0] + const cursorFor = (row: typeof last) => + row?.transactionIndex !== undefined + ? btoa( + JSON.stringify([ + Number(BigInt(row.blockNumber)), + row.transactionIndex, + ]), + ) + : undefined + return { + total: null, + limit: HISTORY_PAGE_SIZE, + nextCursor: null, + reverseCursor: null, + countCapped: false, + ...old, + transactions, + error: null, + ...(cursorFor(last) + ? { nextCursor: cursorFor(last) ?? null } + : {}), + ...(cursorFor(first) + ? { reverseCursor: cursorFor(first) ?? null } + : {}), + } + }, + ) + } else if (update.kind === 'token-transfers') { + queryClient.setQueryData( + transfersQueryOptions({ address, page: 1, limit, account }).queryKey, + (old) => ({ + total: 0, + totalCapped: true, + ...old, + transfers: mergeLiveRows( + old?.transfers ?? [], + update.rows, + (row) => row.id, + limit, + ), + }), + ) + } else { + queryClient.setQueryData( + accountTransfersQueryOptions({ + account: address, + page: 1, + limit, + direction: transferDirection, + }).queryKey, + (old) => ({ + total: 0, + totalCapped: true, + ...old, + transfers: mergeLiveRows( + old?.transfers ?? [], + update.rows, + (row) => row.id, + limit, + ), + }), + ) + } + }, + feed.stop, + ) + + const feedError = isTransactionsTabActive + ? latestHistoryQuery.error || latestHistoryQuery.data?.error + : isToken + ? tokenTransfersError + : accountTransfersError + React.useEffect(() => { + if (feedError) feed.stop() + }, [feedError, feed.stop]) + + const liveControl = ( + <> + {streamError && ( + + {streamError} + + )} + + + ) + const { transfers = [], total: transfersTotal = 0, @@ -1871,18 +2052,22 @@ function SectionsWrapper(props: { totalItems: totalTrxCount ?? transactions.length, itemsLabel: 'transactions', contextual: ( - +

), content: transactionsError ?? ( + {filters} + {liveControl} + + ), content: (

@@ -2094,9 +2284,15 @@ function SectionsWrapper(props: { accountTransfersData && (accountTotalCapped ? '10k+' : accountTotal), itemsLabel: 'transfers', - contextual: filters, + contextual: ( +

+ {filters} + {liveControl} +
+ ), content: ( + contextual: ( +
+ {account && ( + + )} + {liveControl} +
), content: ( ({ + key: transfer.id, cells: [ + addressLiveResponse( + request, + params.address, + getChainId(getWagmiConfig()), + ), + }, + }, +}) diff --git a/apps/explorer/test/address-history.node.test.ts b/apps/explorer/test/address-history.node.test.ts index 84365c169..0521637cf 100644 --- a/apps/explorer/test/address-history.node.test.ts +++ b/apps/explorer/test/address-history.node.test.ts @@ -173,6 +173,7 @@ describe('toEnrichedTransaction', () => { expect(result).toEqual({ hash: HASH, blockNumber: '0x14d5b48', + transactionIndex: 17, timestamp: Date.parse('2026-06-12T03:58:20.000Z') / 1000, from: '0x286ad6cfc7279C8a6D86D15dcEFcB77A65Aa7E92', to: '0x20C0000000000000000000000000000000000003', diff --git a/apps/explorer/test/address-live.node.test.ts b/apps/explorer/test/address-live.node.test.ts new file mode 100644 index 000000000..097986030 --- /dev/null +++ b/apps/explorer/test/address-live.node.test.ts @@ -0,0 +1,93 @@ +import { describe, expect, it } from 'vitest' +import { readSse, mergeLiveRows } from '../src/lib/sse' +import { buildLiveQueries, liveQuerySchema } from '../src/lib/live-query' +const address = '0x20c000000000000000000000b9537d11c60e8b50' +describe('address live streams', () => { + it('parses chunked CRLF frames, multiline data and lag notifications', async () => { + const bytes = new TextEncoder().encode( + ': heartbeat\r\n\r\nevent: rows\r\ndata: {"rows":\r\ndata: []}\r\n\r\nevent: lagged\ndata: {"skipped":2}\n\n', + ) + const stream = new ReadableStream({ + start(c) { + for (const byte of bytes) c.enqueue(new Uint8Array([byte])) + c.close() + }, + }) + const frames = [] + for await (const frame of readSse(stream)) frames.push(frame) + expect(frames).toEqual([ + { event: 'rows', data: '{"rows":\n[]}' }, + { event: 'lagged', data: '{"skipped":2}' }, + ]) + }) + it('cancels the reader on disconnect', async () => { + let cancelled = false + const stream = new ReadableStream({ + start(c) { + c.enqueue(new TextEncoder().encode('event: rows\ndata: []\n\n')) + }, + cancel() { + cancelled = true + }, + }) + for await (const _frame of readSse(stream)) break + expect(cancelled).toBe(true) + }) + it('deduplicates reconnect snapshots and preserves distinct logs', () => { + const old = [ + { id: 'a-1', blockNumber: '100' }, + { id: 'a-0', blockNumber: '100' }, + ] + const fresh = [{ id: 'b-0', blockNumber: '101' }, ...old] + expect(mergeLiveRows(old, fresh, (row) => row.id, 3)).toEqual(fresh) + expect(mergeLiveRows(fresh, fresh, (row) => row.id, 2)).toEqual( + fresh.slice(0, 2), + ) + }) + it('rejects invalid addresses and unbounded limits', () => { + expect( + liveQuerySchema.safeParse({ + address: "x' OR 1=1", + kind: 'token-transfers', + }).success, + ).toBe(false) + expect( + liveQuerySchema.safeParse({ + address, + kind: 'token-transfers', + limit: 10000, + }).success, + ).toBe(false) + const query = buildLiveQueries( + liveQuerySchema.parse({ address, kind: 'token-transfers', limit: 10 }), + )[0] + expect(query).toContain(`address = '${address}'`) + expect(query).toContain('topic0 =') + expect(query).toContain('LIMIT 10') + }) + it('uses separate indexed sides and honors direction', () => { + expect( + buildLiveQueries( + liveQuerySchema.parse({ address, kind: 'account-transfers' }), + ), + ).toHaveLength(2) + expect( + buildLiveQueries( + liveQuerySchema.parse({ + address, + kind: 'account-transfers', + direction: 'in', + }), + )[0], + ).toContain('topic2 =') + expect( + buildLiveQueries( + liveQuerySchema.parse({ + address, + kind: 'transactions', + include: 'sent', + }), + )[0], + ).toContain(`"from" = '${address}'`) + }) +}) diff --git a/apps/explorer/test/live-feed.node.test.ts b/apps/explorer/test/live-feed.node.test.ts new file mode 100644 index 000000000..0970f52db --- /dev/null +++ b/apps/explorer/test/live-feed.node.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from 'vitest' +import { liveFeedSecondsLeft } from '../src/lib/live-feed' + +describe('bounded live feed', () => { + const session = { scope: 'address:transfers:1', deadline: 120_000 } + it('is off until explicitly started', () => { + expect(liveFeedSecondsLeft(null, session.scope, true, 0)).toBe(0) + }) + it('expires after two minutes, including after a suspended timer', () => { + expect(liveFeedSecondsLeft(session, session.scope, true, 0)).toBe(120) + expect(liveFeedSecondsLeft(session, session.scope, true, 119_001)).toBe(1) + expect(liveFeedSecondsLeft(session, session.scope, true, 120_000)).toBe(0) + expect(liveFeedSecondsLeft(session, session.scope, true, 180_000)).toBe(0) + }) + it('stops when the address, tab, page, or filters change', () => { + expect( + liveFeedSecondsLeft(session, 'address:transactions:1', true, 1000), + ).toBe(0) + expect(liveFeedSecondsLeft(session, session.scope, false, 1000)).toBe(0) + }) +})