From 306c164070fbd6ecec9ef16d8027eca79409354a Mon Sep 17 00:00:00 2001 From: Vance Ingalls Date: Tue, 21 Apr 2026 13:26:08 -0700 Subject: [PATCH 1/2] perf(player): p0-1b perf tests for fps, scrub latency, and media sync drift --- .github/workflows/player-perf.yml | 9 + packages/player/tests/perf/baseline.json | 1 + .../perf/fixtures/10-video-grid/index.html | 126 ++++++++ .../perf/fixtures/10-video-grid/sample.mp4 | Bin 0 -> 195172 bytes packages/player/tests/perf/index.ts | 41 ++- packages/player/tests/perf/perf-gate.ts | 1 + .../player/tests/perf/scenarios/02-fps.ts | 232 ++++++++++++++ .../player/tests/perf/scenarios/04-scrub.ts | 276 +++++++++++++++++ .../player/tests/perf/scenarios/05-drift.ts | 291 ++++++++++++++++++ 9 files changed, 974 insertions(+), 3 deletions(-) create mode 100644 packages/player/tests/perf/fixtures/10-video-grid/index.html create mode 100644 packages/player/tests/perf/fixtures/10-video-grid/sample.mp4 create mode 100644 packages/player/tests/perf/scenarios/02-fps.ts create mode 100644 packages/player/tests/perf/scenarios/04-scrub.ts create mode 100644 packages/player/tests/perf/scenarios/05-drift.ts diff --git a/.github/workflows/player-perf.yml b/.github/workflows/player-perf.yml index 937a60113..cee22abec 100644 --- a/.github/workflows/player-perf.yml +++ b/.github/workflows/player-perf.yml @@ -42,6 +42,15 @@ jobs: - shard: load scenarios: load runs: "5" + - shard: fps + scenarios: fps + runs: "3" + - shard: scrub + scenarios: scrub + runs: "3" + - shard: drift + scenarios: drift + runs: "3" steps: - uses: actions/checkout@v4 diff --git a/packages/player/tests/perf/baseline.json b/packages/player/tests/perf/baseline.json index 52211e710..866485a7f 100644 --- a/packages/player/tests/perf/baseline.json +++ b/packages/player/tests/perf/baseline.json @@ -2,6 +2,7 @@ "compLoadColdP95Ms": 2000, "compLoadWarmP95Ms": 1000, "fpsMin": 55, + "droppedFramesMax": 3, "scrubLatencyP95IsolatedMs": 80, "scrubLatencyP95InlineMs": 33, "driftMaxMs": 500, diff --git a/packages/player/tests/perf/fixtures/10-video-grid/index.html b/packages/player/tests/perf/fixtures/10-video-grid/index.html new file mode 100644 index 000000000..b4ec61add --- /dev/null +++ b/packages/player/tests/perf/fixtures/10-video-grid/index.html @@ -0,0 +1,126 @@ + + + + + perf fixture: 10-video-grid + + + + + +
+ + + diff --git a/packages/player/tests/perf/fixtures/10-video-grid/sample.mp4 b/packages/player/tests/perf/fixtures/10-video-grid/sample.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1cf4df9e128485aea50a23c5b4028313abd19722 GIT binary patch literal 195172 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̱ePF7=;ug`J2J%J46YRmzSGiK&vie>2m5HW)8_mIN$28vaS!GXsgQpPJ!zh+ z=B{kW%)6tw?_*oM$hH2UR;tOdTI~a$HBdA=)l!;5vsjULT6?|~=JxU@wMU80_1%$` zmIFQ#E*-8nd;~GC<58^O<|g~(H7e&y3BV(+kdn$&H%ik-JDSPjBH z3xc7|2&+|pozVVI*iQtx7sqb<#^(2_&KmGoZeTrx&4;gpZkDk4jn5HksfbR0)@Y4z zdr>@pX8QRK4u29i$eelIBJi;8=Hs^kmrCQzd*Z#s`!oDI#xtyo9zI`HgsLz3z&`^w zD{GmM5M5Ah6??%%D? z_m5xux5u#S+UxK<-FQb311^vG4r-vXc0v#b4pr0QFbAN)0ZliMJd6?h&XgTHax$xa{E9KIIN25hcymO>;g7+>d z;_}_ikCvBtYNMMFH=%}0_Q6C2mnvmtQ1Im)Yq@Y%;G*Wf10cIrKwQ}MH3>$7{biTx zuGHA=UII!F2QAOPU=IrKH`YodaeF}I-(mlY6iE1r3*wF-I0k? znVj5zdj&{FCuLDm#?5N*YoztwVrDN`YGsY zG4+}2MQd9uV*BdsPT|eOexY^^SYy$XMM{c9!v)+^R$riCUmfxy91~3S@7@d2F*7SU z+HQ#;84%9sbCyKlyPWaSZ~ts`PeI?}GBLlBo*K?k-F|@pyfVR)(7$=YA;5BXTGni` zB*kC6KZK0r=04x9N}6*v$NOV%Sx0(=zB(C}BSpX)`cXR9G~qW}{0 zQXN}UkXU-&OGv$N1^xAG<6^eqBT1@AcJL2%0S`;&C;>ZI z9>nF$u@+$R6Zv+6@E1_pHuL_?aYBETsA_#-&Ld#Ct$9j8BCXq_H={jDvFqbKf-y3v zSW=o}hv}F$n@=e9OEP2m%vwS%Anvc446joZWGLuSKS=V3%LW!nL#v)*)W zWG>NfApwAg#k5@e07#XIVUAgww?Iz#IOlCPI2A(oW*1|61&533+;Xi7>3aNB_FOK- z3<@reM4f;?d$qdpnk%8O%uRA1N#GF~igZU2R5}P#g{6r~VC50*5hrET@K_T}74zqU zP({l3F=~2VMg4s^=(EU`KX!Ion#k*cgD3HJk7uO{w zFGLEy`>)*C#PC9Oz;XhylVA0dKO z`~*c43|H^@Z;`eq8Lw*BNUL{7^1ZnHSDZ3_F{oxMptxRklGZ<(>(-MY<#d;*D~xBU zxQ|C%tM2FTtTT^s&Ct)E2q1}w#=b1@wC6x>6dZ(p%s;;cIH+WM8#TAr;&!Z$UDvpU zyV6{o4QhQP2l6cQ!#5c~y3dtYs(ra;7|x?x)xAj8E=tyB8C6ul-<7&y|Eo>j9V$3U zJ{FPtSrA!fk9gFx+u-t-6P;&!38Ltia}9LoXc#4BEoO!WL2;Mgmx9iktVqjM>=qBc z&b^pqqeiFOO=oFG6NSsQyJ(vjVIXDj#{!a4w-;`Ygu}C+Z-mOCScLx zh%fI8EINYBdI93bHu2!)3-y&F5M2X9+G{gypK-sH<;YEK;u;1zpSPyZl*mEjKESC^C~09>Gs`{pc{Ch0ETr|C$X_}SuuA>%_)NEVzf&#;7}cuT z9&-fCU|GD3Q$ok}vv>4TFtP`3q(%pFgU_uG+1r?-CTX7&xC>>Ij@-|MVt8DpB#b3D?Acis@%sMD%;oLtR!oe z#!ULT^4CN_i(IP(2-gSQ|JsC9_;SJp8e|Fb16m*1<-xBzuDht6-7aj^|zF;J59%1oVbpB#pI{ zk(at1qr1l3z6&Uunu?&>5ZapQrTQ9986U6_bgpU`3l$@spxoI_nnS;8W0DJG`x+Z8^4;8dpNq>g1|zwATEs@#*P%R9U7Uupw?Yu>1!2R^-26Q)Ys6m*`G zrFn&TYvXfx*7HPg3zI8Axyk7jE<{WQa#+Fb&!?4T{{mU2CslrL1=uVPZb%A?^wnv- zXmn`fqIZeT35j0rmU=>j+a|O2LKza8OldE<+TX_}78O{;Len-`uWjA!|6oIl)47ZKUhr1LMk;Q2j4GU{l7T>>moKb?C|Krl z^E=?fxlMpbV@D!hA$pI1stHP9k9oHRG&D%4?v9p{X?uJfOdQX)+I!Bj;7Ox$`!sa_ zhOrL6WC;Z7ul4l*{(S|DNHNIZ+V*kraTySIE|@%Q0XP;h;du zH_t1}#SVfrN++sBs@>xCnq}cvOUA#7PtCHrEuid&`rDFoCHn7ahMV%dvnhM23SXeN z#D<0$?f1MOr?}6AtIp@z{+ZGVdXX{>RRvQ^%pHo5ekWtrM;BY z!u_9TGdH6^uBg33-*{tb{4K8Ey)yLY1&~)}<)Vagib4IRxiL8OXy13yV%ylbH&xfS zcn)wbyAe^84kNkPOuAs_bT8i3nZtso@bE%M+ zD87MtWHBq#YzYE?@K)rLN2uLEd9!FVgM&H{#5xzFBDzC$_o{Br z5i7tv*1J&-cGUj-ePfb*&hR%`_eK-|d=Mp-kLeB}i-|ha0$%PbanrfkBVDhzeV0g{ zD(=@nxB7^8w9IT@r>}!WX2scoXUSHg81Pfa3bk2Tuy&C%@87EIQ5x(I@-H}8`G25L zubl?k{l-MBCj^Vk`C0S;ana(5t8tQ9-Qy1Rs)F(DKKzPu<+y zF{b?XOP`fGe^%S`>n2+ztgzk;d=jZX)6^Re3Fmx0!vxI@#qva9`XU+Rg9=qG1<#fi zpEw+d7M~T-5hO=TJkqEpRpbIudJIdMKj%1DqPejFgkqUFH;0s}3s2$ei%eF!$*qM4 zd1J|c@PBp9Ll|hEOIkO;_ub}^x+(WJ#fExT`P?ixx9Gd8@>&)uD#Bwvi{A{EUd6$G z_dG{?3duad;G^QVvdk>|rmdBH#Oh13Q%DsCtM8P5zLVS^CTvJ%-8tVwEx*iDexzHt zDEm4add-)6?=N=PboM8q26q2>U5L4ksa5)+PJt}9VD-|$uhYr~m@I;-NGxy$YU-)Y?=-U^x&QAL|F{s{^}`&k(c zp_2d$;<_0o(*gjM%79w0Jq-`ajbm0OSY_CBEgCEr<1`sj_E=HpX|J;OFNMs6Xi)aI zuM{?2KUuE4qNz^t`0*=U%oNNQ&L-Fj^~WDuaNhLI2XZZfKn|g*){tsB8u2JKAk)sJ zt>Q9cskCibAyc^p^SwoKKoFy|$4)TAv+zT88rgLlE5X=GP`_xq0ix^9y0l0 z6r1(=IlNAGd-6y20ttD>O~{}zzMFz#upzug=-6o~^1Ml<@g<0`>&b=~AajRnK31$yZY^2Y*Si#HH9xD?e-w`UD zs~6+w(Bch9=D;mg1^JzbB-&RlW{Xr}3ucRqE7+<%SKX~W$#h@7t2k1nJ}YR!4UlZm z2IXSLErDeIK1PLFFYQ?__Ck64<6Q<#)|}i}POjflTa|DOleY_o8q}kTW1N7{CQqGF zEyHqG2+ULYy7e5WK{Xc?*l?p&E!8~H`(b$&SKS+mc&SV zK4BPSG4T+>Bid#==eF;Rq;Wg(F#MOMU{0)q{3foF6kew$@r^EAFr1ZN)T%+rN_Vs% z;|QyscnCi`Z^HF;Te8rMpx2@oB2uN6MJ?P34+8G{r5#PaB?FZ1FPtbVG~t|S&s=Tl zY5W56oZJ2NTlbE)XFV9BG9%O7FOtExYP}CJ_@mv`i3uHJfB(A|Uq2&;)={Ku_+mox z41eI7{)2$9)FXo2ksI2By-CS)f&;}bE!^g<)Rn%okTV`lQdx|*ioZ{}7L|CSEr^u6 zTIiZqlb+*LB&*PIQUd*N+&&@V(P{+1a_5omCYW8CA27~G)SQYqut**3bCB_yo?|4i z?$vt(18-JD^*>la7!N>Ap%C3wj*P#?%aWF!w-GU3#F0Yppu;|(Qf0cZS}k#;Vne(+cF72<0K`SHE_ z5H<(B)U_1GdYb#jaWb+@Hd`+14i3g{1jd|&EadVIkqjzn1~l1wh+1DSf4S{4C=TT~ z<8p_Dq9uXbn3<(oTEIn0pady1JjV(xpZ^S|Hn@et7Qx9h3*6d`RerUw25kO*fxX(; zARp_D!&ZL9g!6{Qeum*VMhD$=^yre8B*9#PZ8Rx${n)ORaHvgcCD%L}ak%crW257i ztyB4y;C8QiAqDh4`J2as2-E?_nlae^r4YGqJC8(@uR2*rKdbMo`K;CRc%am8j&(_9 zGb=-zS{bUyd?zA(%%(!jXR~OH=41S>lb2mKC>s=TX{If6xMtj`89W}YZmcpvb z7qz^NmRIH{_@;$v_XSw~GfF^`hc@?0VDE);Iod}$skXQ5+XZSq;+;!sYdf?@@N?hS zN1rtU)OJ4&C}c3e42{Oj6a4&)T&f?f+pi>lWmnbp314o(h=gjSIqSvaqtJ9Gqnz>ZRmnIwg=+qU4Kv25xH-Cq-)~fz zz|<@u&-(*nsz9+wodq5r$WusxW3L%H)F(@mqbg(i+0Q@{b6LKOxJ{n{?+|X0``LdU z>sM=ph3z!@HlojlXQgDqi8}ET=+0IA%ZUF6ggw+Qvxpl1&guih^$!t`IY!MgI289O zMN8@lsCjdTuYM`%QePcu>RL@M1;Lj9eSz+#FMm_Z-e{^zeV3TM=ZPeCb%|N}BPjxP z_Fc3fx^coYR(d}=>m>kQt22y&WhSCUQjEQK^_eSgELs?y-48sMIAD`C(KwQ z^K^;|q9q1@G~R_7=r{-uHG&nxPbAzV{^RWsS%Yp_`dbmejH?NhQ3x?Bpc17#QwD)< zERsrgn;wK9UcCLk$x$&38uEzU19*a_D76AUJ-0E z6Sc5RYWrp-+1=aDRYdjW6zscHpeTcataqMcr`Z zOr_dyL(|MZtrRMdoe7Yd_h0@jJ)3a#7OhSE`tt0<267@FDeo*Jg_tBVp;3bUYf=~B zYidrBBr$>Kc*CL|>E%2WZ#XqiO5NAZ zi>6nS2W51I-c}2F&&94WOYf80E!7f7T13|cB+Gjzch|B}_tzgx3leaq{F$PL{^&~d z=PfQNf&#-^fWZgiy6sP*MiDsrT?-`B)rN4~&q`XK(8*QGpS!ORW>ndFZP&WA=GT;n zZRWp!>GvGncTdTU$HNcKifbWOxnYK&k~G>a=1+aGn%YZz`+j8N`tM=YMqB%LJQ=cP zyaN&0O9bOHb+78Dq!;Wb7A!%QGBe>!Vq7Yov@L6^<(aODY8p&O-LcM9VGTu2in#R; zRq_&#%GRrMy`3$BJ$MBfqa;hDM#q)4aqKreOxe1kJiT48OlYk0Kvcl-tudX8tECa>>DXEm#zKK{DC4Q?#Rv zh}?OkqMDj}CFzeXwp+=Y5#?CtUmSQBu@Tgz6l%fdF5X(d8X zAQ0M?2=!nN4yxh_wT7rcLn6$Be_D66K;shzv1{f#wcSWjILeuZsLX*l4H4zMbgO?59MhU{17gTQBx2v=@Pq5yqmh6*)3}e4d<_|vNXT((_BWml0ptPkodv>d7^<<@d z;Hq{e^#jw*A)^Gy$+!?K6keBO(z`M09&qzYZME5wgs}6kf`4V^NwdlMJz|f(!kq+{ z=x&2Fa7F+`mjWq9XgEYgKv-S~8cep0aFvIO$5+KkAZu6~vNBal70}3OTCoBbz6Q$w zb^HU`ZPll!@6?U9DT$luSD)~WoU@+_(6lUj)4>=27DIC<2ZXmbTy>6Nd_Iq0@`Iu`+lZO&##Xst@Af9VgQ{I0E zaRH-GFmIUls?WFEXYV_i6Ht5argeB|BqNu++7+1gv~^hrX^j>&U9|d}htGn$2pcwJ z&RR~lZQXRu&IvG_CoRj$Ux1!#pWu3kSj|!>n&mTG0;@oW@upW%2d^=@J9_{;-shXj zycRdFx)2{b2VQ{1^c>M&1(rhC3HprV3nLTG@PoR^sw97KQFH zs4rpSU^O_HXsrmsXx;lk09vRYeXuSTEs1ySEO)}EBrdq|VXoL~0) z_bMe6#T`wi!$D(#8ZomYD}-w-bYaaD?WblPmS1Oet#9A6Na=e{BH7f#zk0Kcf6>Kc zpld3&e+c~;mYQBPcWK<-IBI50u38lZ}S^|ZJb10a$mSoaYjEmM#Kc8t;i(eIz?NsIeCX_BWtnR zn{Hr@(KzQonZZ_fgvW0QUj3#(u5N&0AXd7-P4_o;kXc880juBqL68Es?*5!OS5Tu6 zZhuTOf65+OjY6|u7{8$zo*NxsP4`H{T)+mEr)!*Rv7_73Kxa>u)npsf5Mv*fWlb&P z`k;=Ib}Q)4&{&5CDo^6Kx|=M%`mPZA%#-C_YZT7gWL# z87E99-M_JZRUf3|_aHBl|KHAm)ZV>g0@XJ)He0`fxeoM@2XN=yt0IT8VsU_FhYQx= z!@9IOQ^SCdCo3<@9Jm($^1wlbuEJ^#8?;5N^X4Oi_(;CuYu1L8FtLR1$A8~X}((J4$N)k5d zC)5Q@QSB|ztzDUvGjq<2f^NcO)BUo(aY zwo11lVt7>A$j8*_vO&R2I5qK*>F-1WlHy9JR9(}nBFIqgDtnJ~6 z9vrC^@m=4JXa%PC^LqXwW$~Z_2(xBTRaEPO%DRoil zc5u4euyt5Iq2}f2R$z|7wk9~WWRf$=0ph6lS>+NdU3VOGI9 zTdi0|^Xd3?|LDt7?$IN8=VclO78SzabeIn&Pw!%Gk?(@~O>_)YiUDx57HW6FB(NtS+Zu-r;@qfs88YfT7J6;1AnQ3zsVnGK;(CRj+{=2E!1>jxPsQ&xaSsR2_opiMQ_e}gi zAXC>#vN@Tct=w5Hmi~I?>eQlX?PsD@X!Bte+rLN|hC)Q!TUmv{sYkEwBjK%oE;2#n z$um+U`%hhxgIA%d$W(>}v0k)9bHXc!Q+ho)BUgT=MQ>CO9x28Tle5>L`nzD-p<~= zP8HwU@)7Jr#}`8s-x{s$K*;uRHBoqt+ZkA%Nuh`Kb2M zG-bI@O^8ntCnBOh!%kMt*HHc1*O1n!mggPaH;)_#s|5H04dv=B%Rjqm$C&2Mp;aa> z5Xbf#VT|bFW#C{{2R6Gp{}e2KN0LCB8-cA*ra~w~y4{Aa7lZBtfU7?g%m%Fthn{P5 z7@|U>6qkV#4a=T`a-~KBK2Gub-I34BvjlUA!Amp!G)eMTC+QnW0Y3y)ZzX-p^fzzb zvI`pCMEAfH(@gMjgHwwNIFD@jhYM)Zw4lz)|M?}H#*(a)NCyYQsmo^{E{9$6nQ&5n zV*Khg;}JSmG-oMk$mI1J1663|Dd6$-veNXq5no|^?k52y1e{89?pa-HrPFZh|4K&- zB>#AdB%)M0sG-4a6p^G2LB2$n^K|+RkNB)biY^YfEW9Y?^|G`qL*{bD-&FxcDPnJz z1R^bbKVMe3MLM4ec7iBl2j#2FeLIg~0^+&mhz?}ue7yS2aLq8ayGL8#0|jO?fWJPtb+pjyb2DEVAd2#%swQ9k++jX0MpS zHRu-J*3}vVvh+m5iAh@w@1^v8%1#c7ra+T+yymDTUA;1-58GVEGIkPwQ<7vV)*92m5TJyEfgN0SJcpXT~TX&*Ad~PE)ZG0WR2{rT- zCdN#Y=Qi%|{?nf2zeO|ey!F0Dk}uU_hfZLtcEH`wciX;UQt7K31h_*G@?1;dAWx%4 zN9)qA+?y{7FW|4_IKhZI411eBRH;hFpJ&mPQ@ankEx3D?nB#649k)2IUZR@!qCMmG zIxMnxKCnb1P9o>@2{fW9I<>H;sEqiwy+bl~{GUhnEciwJl24@gLdg4;8H5Ri7k*bn zP&n9B;Si-2u_kyxby14LRq`$9MMn?#<n}}&-~~_Tsly?BhTimpJV&T zg=F!Oqr7+5wrNK4$GD`QXwx{sR4N_nL%G@Pe6R|$rVuw`zzq?$NbUN8d&CHmC8add zU$d(0D}}vvjs2lyX9~2;;Kxuy@*m;KWwKpYidK4AOnE(4X83cfNTp=joyY~Fd@`Rt z^M)}2&qag#3CIEh2RkNCwjR7 zv1_G0l_6Ck?29)!DJc6-5IrHHv3|O2Um-E1cYlc^#~D8AK>cvixwbL>z(-t?=_k5S z?>uR)zqAR-ai3@qfP-{H4<>s^&hM^Adw)Tedt)_B!%{RTC);C0yng zdP)z2nEU~`__Aa`&=GLmEi{)$HgTWC;F;i(rgrc12F$<&CaSHqNi>(0dMPqx5iP2} zLEzq@&*P8$!5bbeYq_l!Y>XFBAa4Q~m-*LHz<^1(w^ovFKF8_t1D;$fYVN~WOK~f* zFssQ_oE(iHe)=YEmQ$?NCIP1NkRmmWDZ$e%747v87E`3~2*V!?0mc;yI@%5KS%1|d zD8=JhSKp=3jpFZSsu3glY@eai_nvD}pHLQf1O|rYV5s5UV)SFQr85OmD&CGJ0|!f8 zUi}2VESMB#fojif$aM@W^JP_f2O42@Ak4yEV?13lZ1!EUd+U;i_oT!W_-q z+Tp6Y1TweqGF2NboQM6P@-Yr=g+ZX4LlRViWP-v*6>2su1L0b7jE)u(*oer!4L-(Q ztk&(Y8Xr@gyKsS7W81Y-E+IUHkagYg#uD%hVT^ueQW>o7b|nQm@dXOS5O;F}vea2h zqbD-V{-kji6?2iEZF$Uu={aGlYW6G`#)E>MlG_BpXj%@-p?>$L8=8)ZvW#U#q-aHwwYb zv<#`h^FmqfjxSK%c};OiKF?Uqk^F5jV?2J%muZl;LZ*a555Kw~h(^GjhWB=#yj^mm z`s@1zqcwV2n@{{qsfbBG3()*y6X(~Woubcgk{%$ zPilue-#Dir8cEx7A^rKP{m!}7|DC8s52ub#?z@IQiP{c4=yc`(ZErTsXEA;|ToKFy zPt~DsP-Q+M1@guoX$fPpi11{8i!<-rN?~;K17A1;{W2jL+R2hh^MTCSKHEG|w3O_T>Pdp*t2| zya@EVhPebJI zuO=sFzzIfK_qp4?(l4g(PVfam7RCd~B7qIi40Qc*FP2@o8k&1Unkq0-e3e?)1k<8G zonZ26{#|=t`AL7hVdanlDk}5JjV-4Gv2C<)AmRygM_6bTm6vByj79QFBg^ zy>QiE^z5=V9atT!X71Za(ObSpI~so$+MsTzqEF5}K6IoukCLJcZ!H%1Oz3|~I-HEx z<_SnMnIUDWf!Lghm7&8wK;SbK$55+n93)su_KbH;-i|swyz_=7$H~s(_&35zsRFm< zw4iT{!L3v_@de3EUK^Cwon_a$c=|W=Oh7x@9<4j5%Q*h4h6-jdFL&FnELI-PLU`Pp5VY4Vl<^saR<@^JCCk*h0mN#8!4nsO`UmT7a<2w~t-Wuquxp{u zlO74oljvHZ&d1v(BW|i;z1aqHs%aRHf0C6B7Zn7?s=}3jOV;e~MyFV;dD%0mU z2FHi^KE&pS+_t;4c>c49$Su%lwv~Q=OM#o7ScEOSEuFJRQScgqd^!lT9~0c}gk<{u zwNXB~#SP_JWJAuB%|kODbWp6u$GC$>-|d8$ERp3Y1&5M^+A{AfU+OX!7(2`OKF@h3 zu_L0Yye=0~lFn4@2O6PtJz|@CzQXAxNZ~yNl#@C=DG~b(XZDx09^$5Vz{*!2TrT8+ zDJ#{TeOphLKEcFGs@7#svWMql24@cROLosw;zxSg=oXvw9t{4n44Y;6ppM=PZ!7*w z?e$uTiB9SJ{IKO;4OmU`ghOM>T^~?s@@PIHLzYDhx%|%3FR^6ZdcKLCVf&t?=6Og^ zMpVim=neu`^=*@pp~!`WIeseZqted3pA}`N4A#@}oiZ|D;zJKl8F4DUu&8w<;q*q* zY`Up|yIg{dOEVrkf0_57ZowKfb-}J*hu!sh`kwU%7)kKuFQ>4PR(^x){N6}RTk}a- zr|lll;GvG;Ntw0kxg-GGX4y!r%ZJ!aHzpC6FogAEc0IQjllH zH&@RveXc*6<^b|6_z z{;y9>rOkDsJF&@Lj|sz!f?Clxl{f8`1H z;)8owL@s0(iOkYiVWYsfQJBBpFJqr)Qniv8JQyPuT<#W*TOFMoius|oNiCisp5^EE ztmw}Cq8^!9$!fi~|4)qeMCshe&(_rh-XJTV<2kcC8XWN&GiszIu5tChsTR^wwS*dF zj(bWV_=F905R=;p=tBN(drKxNaakJ%T-%B>B)^E^kXyvV=D0nWkp?q0wtPK6e1tZO3sOJ;Nry8m?2D+oIHkHucYs$TP+&>R? zgS*p%BvRA&g<&t)^%|hZ(s;KCN0q(?ZDiq?^bOhC?Hnf+9c^jdItxqHmn}Oy-kn#; z+}_AK?Uqx>Vr|P|4OPs($lq0bvJt zuaRr*o%SjO!(j8e`en#snF zFy$xZsT^l>QDs}w?ke73CwvE&(i!Va=zJbsqxc&O!jkXYPPf4Dm_zdCC;GhrBE-YE ziWF`<*EV-9b|ejd=%BzESoB7rCdclL3(>p<;W2#^Z7`XNLo~!7B>wJaEhpj7zXr%@ zh^Km&*>6G(K?|vn0{stGAGAKhRi`{~dJ$DES4>p*bw74kmq15ZfOlin_iw%GBz7}% zWN#9VVz%^c$#1b&GF?$)jg(CUWr3-oN7*{b1nyNw-bT^`~OL9@?bq_wLb9m|zc zaXFKsP9S<*szlFcdiM>=D9{ulZmI0Kw|jPCp=;rtk>VKmc3RZJ_9W4~a?swpfD_Ev z=<=aYLH6$MRIHIUfH&|U2AGLfeQ+;jsvv1v?GG|o^l^nKCFoB zqj4QDV6nN}`i`A=|M_6xsSz~JN|D_CGDe z(W!9of&_!|lYd>%Lufqr4ckKvnhHpwYbmD5+ut(FH>&}1r8R$XM4&?GK`$-dYZ7Y| z1H~b8W2e=7K~*@F2r9k8)QBfRtt%w+X>#j&og&KM)nBq1*)VCF@%x!h&~M5s$+r)y zHjDM1)XmNC5y2Hj3$4HGKr)D(-QxdD7!GxTsF^3MZO>7{xuV#Aj$Haf<$Bc5Vf>oS z(Bs)H3su}vAE4BpxArTuCB7v$Q?bI|psU<~(2-_oe-MtxW;UjAS)WVmg{+$fq4{?o z+qgCu!w8^kunWW)*0<7%mnF)1%9}&R=?@1I!&S&Pk@^ca?%0)C{+$-6b^WeC*7kN@ zIE3S(nirE=THuZptaLbMXK1YoGvJ-T+}P3Gm&@|qsx9-1Dtq68%5@tdo_Y;&?J9TM zwZEm}LHMHDz^^9rw{Uhq+{$BVNI)bZPy$1Pv#!!@EJCD_yf6@!Yo)RBfEj`+#wbSiH5RUo z;>KJo!A-<}yF#nzCV-Z)vFEc!Jk9VF{;{LXO_rt1GfJb)%I1+)QO<75Z5^7&7cU*x zlkko2wz)s~*kP(Off6l`ZC^O`J?wA_-|v;rVW8gy0HDYJr?12zphWLVbo$njN~Z?p ztzdO?J{h)~1_}H^nvDF0&j;GUryFoRIMZ2`QYUtFp6O5-U#DNJKMkz)VKivgWKO)J zvS^dcl~l=3p+v)#^nkL5x4KiwyabgeU}JLMdlsAWGJKBszSY&W4-?F(9$4c~lU?Xl z&V6Cm%}E}PuZ&;McfqdDZSrR8Byos3=YA8o9?|T==iD%9SWT^r(HF;b=-!pS(o!W= zuZ51|-1f3s>2*t4$yUd1?fwHPCsCvS51BnKVhZoU=jS7bCv+ap~F{ze=)K@g$DjlrIYIP z(zEN~tYU#B>N-K$e*`FDov?otCV^e$>p#)nnk73Car3^8nXM|X1_NFms~3^WkrTOO zV3OQwN|=b1Y|GRwgf!BkX(xa+GFyVuskzg57QK4nW1oRzN@|T$3-sF!CQpKTLHhC= zzgwV3R$!EdlnFX)3gEVp9PmS*w1|JDqVq>i^gH6D(0%}E0Lxqx2`l9KYpUPbU{X^2 zSn=LY>Qr|~=@|GJYN1#yrmc=O{RK>o&2AvnMJ615`zak_pnafo*H=%~7byJh*{C#v zXpy{-?PfwqBMODgGRp#Qh zF;N=9tXhODrRKgI;qI}A6?n}-qZa<_lB{k9fuO!-721qb=Rgb|+L6VeM)FzkJ2)1M zudl_A@ngOgfJ#@TzCbN77Dw_VB6PKZe$i*- z9A+?AUR`c~x(sk#D}B(t7?-#+>!@U6Tldy=;NOBwZH|+Bs3_Ec6}mw!Z^-R|I$Yn?dy=#;-Wv$`5&R~JXBCK( zTXw52h)d8;7XirN8ik0tbF)qZAO6D|^ppmCI2QPPr|CPHe8WSCJBGEW!`oBWD*VUf z_d?_7XyO{ekal``Lf#d=wa`+Gg~>>@CUi2Mety1OhlS)@f+@-{VJT$~z0UdGz3Ikc;rdVy>ZwCQyHhIo!W=(m5tm&_VeR=uuBRBJ}#z5_GQu+&UpH^3#?!RHEGC zlB@!5cc0nR2{&c*1_dR#VFIfhq|$xIl!W7ZeB~l8%A5nB2U6?-+>IshL2@!zR|PpA z*?2dutRMCM*UXZEs({F2O>@#FKU3zuhUIG#l6iyeTA4p=q4|wjm>lcDoUV_9+XgrH zR9GN$3uqH+dPOSYB z%M^bXUyk9}`(7k9*FUUluQ3!3up{Sfs)|J^B&lE9EFz;t8pd9KDJ#1$vvN?sURy#| zVJF|zBi(C3e$(r(hxD)A1s`)3e8|q{8@z_&J=YucSR#An*k#`o<^ehLE-rJje@pi5 z#P@|5lm5ZM1xB8-Xwza(?nAMht1KM{J2q@LF3ZI^KnV&rC{*RkHE}#Ecbp>WX!Y`< z(R535Qa-zGG%*gI@@vNt53a9+vdJPKRt?}>o*x;*jg|Kl}`uA;xgEqFJs%A$>@)+g^$2!kC1pJO${#HHh+SvC%Kw(YX^m&m{Qt+)yN5IV{_*28!yK|XMRJ%^ z$YG+KnPV!2jwl(abatwoX0sVOQYkuMbkdt@daHLTZDtjvOeb_;bDSs}!!~BG->uL0 z_r1Osf4Hu$>T-Fy@8|tErZ2fsu+XwQ4w18K)LVEibANAgPNz{kE5$oM!4I)9gDJ5_ z1ei#eK1&x?ZVnshhik|~}{yCoRL$h2kIm+z@ zFs+5-+`)kHjWsFJ1CZusk|xm~xomxVZ1N%gP(*y|O`wooI-Z{S9^&6I750vP{%Fl? zN!*eAVDxP3pT2ClsauKX+q!P|2`Md#g4w_+UiC&raH(zHS5u~DVyE7tHuN>$*m3EyLn`7 zn>b;DaJ|sKY`BDtdB$Dmt6)9z)&iQzhzc_7u8LCmKvhj0_j_1=j2S*1)`x%<$LI%? zYabR}bmLuLDDl40(po(reS1;Ts6U52QQq9~j;Yb^OfikLAAY?KIzLzG| zFWFOn^83{_W7Iv{K-WhO(L{}I*818FFDwIFmdVmvZY=$FX$wrd<$K1dZPikeY<1|* zSon|316*p$KlG{cImpCUhZVHspf`a}|L$u=!-E^ISBeEsrt>`TSfqk?FXObXqz zO4-{3Rr~0Z@CEL2g+9c7g6J1`A|hbp5FgEHeSEt{ha?NsELqAMlVKEE)+r~ehJA7g zM+b$L@1Fl+yuJA{`5!Ii%Z5B|=Ltpg(~u8iunoJpDw}gw@-0IvWx`{ZM}j=zrLIfjd*(R{Sfa*P-NBUpWtrqalhWI)G=sdC@ynU!1I< z%9yUqz_ecIT(!~a|7?FNGqN~Q$eE)Bt~Uw7d0!dYu7#gx%FeAzSG@Yu;GaY)XAFTj zc%uBf0;<_5^-^Nfst!w)fZJs4!`P9MwbOZGnL~fe2z!qLl()WpPJ5ed#327HNhW;b z>7Zmlo0C-)EajE(&hoAf*tYWaHSHSJF;Q;w)}2c#wcl;!rz3CZlM^2@HP ze9~{{W$hbUt$IEb59Z8Na)nD~&d=;|u$}N$%Sm`<9rAo(Tqed965W3lW^*`6<-0@o zCgXn^R$l3C_#Ahy1)b2etF!5*(7(MO8G^vvM$aO1{P|l*>2O$Fx~9)lMXW-FJM27j zI73PQ#F0W2m!KmjE~Am89j$E)+>egW02=O|y5#kdE8us3oeK?lG}?_X_LV}`}7>2&zQ9*zIVet(56$~v5?F6^=kL>?P!HVtC335 zsmger`!kbY&XMn&zjmY8eX4R${H*PJD<`Qx*@@({rjpA(_2RT;vfN0AMcH^k3;3TD zw2nH80G6!6g1gA`&+6PmU#z3k>#w>C3#_qkJ!q1TN%Tn5;DnzeVZMG_j2Htrs-kh2nnO3U^jBDIX@y`pi9@hFM;evcS_}rq*>D?pm7R=70iH~|} zbr+f}SE$VmthIYROLo1Q-s)`tBO~AYM4I(iHYPbJRWvb_8tOwePsPM6EAZCd9}h!5 zI3`tjXWWj+KclStpUTxcMHCnEC!agfha{|&hP|uV{)o;ac4c-R z$-gvXJTyLu@9!iDs2pWxp~C(n`n*JZ^S7x;3VPq1$C0cvEZ+1Dh-Gf}LsVjayfcf` z?z4ljGeq8e(cNquD6MgtD(;%MC5lb3RpUvQxe^=6O34a*cHybI4}|Y2%VMuHUJwne z1lbfdMS~k#H{5)kxBd0%e=mQ0wpm2bD{m&!TK2rzld(4A(P9@C+?D#3_e2|;_qkI` zuKIk8HmKiRofyXk_Cf%Nkzoh)Kb+5uQ$CY(C==pQjIauS9xiob=OVFINt{pjRzrLdD4O$HqrE!S?5#c*OTJVhuY+{{qcDq%I0L1Ld|oovA_=qUlIQiIo6 zm_-IGmrtvag7QQ{Y;3+2s)-C$4h|BKGR8Yw<;HoK@GOvjB^Nu5{%)@(@Xc-Q zQqE!Vr>{Ov3V3Hzsaj+PgAh}n<(!@erQ zf&&izmRU)qJTU#Ci|VZphbUpxBj|bPi~)Jq>u(2il8nsYo?gqp*`P`6a^ZUqc?>vz zX@!yV3-B|)%^rzb{tB@at^eEH=p+|zZE8lW$eGm4-7%A+_)ys2wr$_&f%zGoKs#fO zLleU1UixpPICl@~7VYlJkXVK4*_usJ7-JkOpqNGYt*x?q}d~yX%aiJ(xqA?xn_f>n+#0S{zeob5pMA zb;_#Uqf=j4_sOocnV}xGw@$L2S=l?L0fLGof%$8;kH&0HpMe*GI45v>LkL4j4*b}q zs)!bCSXr;hrn56LX8Gwzc6OuN2lfw6dNVDY<_+<+BF%p3_uai(nRt}5k$kXLWBBZ0_}d*frGKN1rrUh=tLgIU%GL$_oSZEhr7;*s}d!ktCyAq7kng1jDvckt~$#LS1r5%EnSfPfgK8T~k{Cr-G7TJ5U zegZwnYepE}n>rQ66COE0d{%sjX%2E$WsG8o5*H+$mR9RIH5I^ z^AWuHcuM*cah^Lwsrhry+k5oXcMt5;I9?<3m6*DpKZbyH4&T>!Z*FMRY459Y^&x1& z@a?83zBgBDbu2&-fGJS@e#}Fpq9Li}CfacUzNdy|9bs;I;c{EAyu*s4ob1}w@!zXW$6Xg^cAXR``5z#u0dSqAGT&|&&1%9T=IjNfu7?jGU^ZHLc5(mq( za~caA{PuqshrZG(Z}6?JY3=Whku7R#(Zm#tgY1W>eMp|B`uRpM^K*n<^TrtiJ;Tq@ zlT&7@n7)%Y6bUGuP?TBdfo~w!uxVBM_5c{>cALJRY##5b{xnV>Oe3hf@mtltL0{|5tpr9u z+Og%24IdGI4wOmu3^iFiM7O&KGv7?4LT9Z%Llpng>S8N&X^aoSQ{b>9$${v3iT6Jz23&d1B7VtS!3&Ca%Po9vw902V92GsT zfIEA#zw9_c2wz+?xFF zDaHIQYI^^z9X03&Mv?Cy-qk-0d2DyQF>&(@AkgQ?=DL8R%lmL=&a`aH%@g*Trk^{tNewsV;eI25EE2ORFr_I1}{bS@O=D8?H*%I53o4k#2RPBM3p-V(`|` zYoLQw>XT=qlA*J8f<#fGEBh}QtZFtt{f)G+Gs)+$7Zi71J6_a1w(Lw}=(CyFudSSc zhF@uM5ccN<2jY0;vR=k%Z9@DFD+hfjMsPJLlPQ52)#}nB)^3tdD;ZBsU*7%$Uq>W{y|n)d zrS%ZJU#>f;=ca-!p&%kJu^M$=z*W#>Y;({@X%p|F`ApNTCPsG7@2k62AfAx?dY4Ka(>G@nRsoxi+X^YJy;|NoFRp2#fVamZ-LCa^l`Z^t((bT_!x|O*EAp5x!g~&QlY@eIHC4 z!Pau8nt<3K^hYzbM{79CEY2^%_;W&Y0~}QqlqH9mKkbe!@JVlY;qQlWn7cgVTGWv` zx@3WnL-y0P_#rxlSM@oEdJ6Y;BdgY9>`sx&S2S7tgp|Q6E+9nllEyoY4S0z^T5;^M zO@9EW?b!UTBU;mT;_Wp8;CV}a(Us%E9Q2>t58(%mZ-Oq0YvX_D<5VD4575wx5xPWt zd_18N`0mOOU7AcWZddNunIac{)JvPg51=CJp{nM!Va_hCUY-Nyi9_C*%rtI zybUbd5V3Ic{h>`$`a&C_#8${#HMV4KOjMGK?Kk%6lG_MFEAk0T+IU}+FOD=EJw{4) zHjTI_IWUWb_;&B3QbO(i_VW< zAob57u5{b>SiL&2w`wDQrxnv9LTR4NTR#WQbJ{fLQPhgFQzR0f{yV@`j~+e#=k8Y= zEkrsIUIRsz{7T(GpQ=6n?_p)54TuH5JklP|r7W1{-9~tTwzI>!H0+%ttH#4;#>?yM zXJ+h7kxAou8Uf0y*0ds{eL+-Q=opx85GVuehT)%Q4VpND zR~ftuEeW)d+=^Ql#fwwE0oyBoZJnn+ty>wVaWu%dQscYuWG0WI?~R^D;>ytqqGZki zv#8smalo#UV_H`B7(~Ql>J&d#Vy zRs8G>MPc}uqVE=IxV-`2WLR~fKOJOLHNW-O`oR3MDQYbmb)2kgc$`bhJ--!wyf@9@ z1k?gsM-B3iTzq{-*b~VmM8<_9+GolAtX9u~kNY+Tyb<~n0GCWb`bscm2n@R)I_=k{ zu$@0eZwb9l)lc8E2#BppR4J0VXLaHGzY9K&t&-5l15}Nz$d%-FeT4Z7_=z(d+;n5k z5#c`9^{g|p>cR6(Oioxw_oK(LbHAAE9n8$}$?E!+H_s1AQFtxaGB>MB5bjij)eW11? zd;h&dkg~|DZRe|^|rtrkk!ONno*8A7d zndtb|a! zmEl~fvn-x>*JfO6vSxsh0p=)hQJB~Mj2hjd#C8~sOusqpz6#zAjVS$uZU!uK@-@zj zAsG1ecj%hBs$2^-Ms}zKMJF`B|D~Y#Al9JD-vbuRdv#|K-R7litT!`ViJku5^604q z16Xk;SIDfs6IK)4;cyt`gk zGtb28y;QU&8Y%6pRe(;N{Co2t6_nh7a7eP$iJF}7T_wE~FZ`v62gOjnMmWWTlO_KX zfI^FCv}V#sqpDU|J%blQ>xg2Fxm$&+L*objTmxXhtqDo z7wt$yUft(k`zMk|0pvaOZ&z~Fi|Fp!Yi0z=w1q(ChR9mvz#O}5WYwOFX4 z5UEEa%XO?xQRYuQ&*CegHlFARVRk;kd9szu0mdWh_lhUda6F?&tKUYL^&|39%VV!`4G@uM=Z~BNmE(j@`qqKaY<$|V7Zts- z#M=UnlpKO%Oml-ye)^MaVJm8800_;ErR=*d070Q@E%cZKl<|)5EBm96w`oqGUR(;t z0uclMx0!phd;G?yZ!hc%l}s5mD%)09b}EPe+1kNij-t&;Sm^$)1-*WMG#)%B3^D8V zlUJMAK0x`9Bq=(NtJvl7ZFiB~EwUerjG+TBBJFb97P6a6Y(S&zOarbTs%3^_Er^!s zy0nl=G*o_+=>!j05u!H#{^qCnlT1_dz3AGtp&^6EKck*N++`7%-NzRv)EBAugw-wV zy&4Zm%#{X0OkrlH+{2{vc!aOv8)L}bM$t2Q69g+>cldXS24*yeYpR9F!&*D<~Cvk$er< z0QqARbHP=Ctj-4dq4lj871jpRSE=3Q*OX86V-xGdvRNEEfX^a`rT^vd7dAZTdhvXi zM_xLW*;YZ+-rvu)q2lg4`<>wBOu!<{ZayT*BF$c5`~O|8s4&M_x8THRN6hs7v!mgg zurh(L5k;awJWH{AmAEHK;&gdbM}UkC2gkoZ1Al>ck)|%QbI>By+TlHPiVI7&BLHXz{O;n?7;0~+vTh;y@^eW3!Vk*t2-KnhvRq`oQs!dX1xjM zOTm~6_uP?J1qGhD>UY893fmu+i`em?er+u~hlFJnzDs>~^uaqy*+ND}4RE^Q&rOxg zO;j}x;Xmy3RCVCU0bb>Pe|vKknHE6M%P><$8W1E-0Rsy;UDT84wF=!1nC%M9MtY$2 zW$&}NQ5~4j6_a@;#=^5eC(m!tAC>UWToUOANj}r>4P*@&Xq=KED-Hw4ScQ--kKjMt zF)f3}DQd`guEI(+w&k_5{*T_w`ctaNck|>trZ=u1=3m*gRt#;))_>h>L}4U)B~yd>|5})OYWZI zM3kd2eEH`UFQVU)vlj~c&hAd6cO>77pnqu+%lQ5)ME~I)F0OW8NfdM(m0N#Y!&l2g z*%EFjO^V%~%2JPg^Zte&;_Z|Si7B6^qy-gdFEcgcRUQpfy$K_n;PyzZ?~+^;Ux+I? z4-d-3BJR}b!iH=*C@XCpa~SWx&y-U^R7uGX{2a4Ba0&YA#?fW83zb4@2fmkZ*}5OO zO=#0m7A9`H5b~0&{LfSQtH5XAopX)2ra6QzIi^$c3F5dXbZ=ZGeY<`EqR~6fp-}?< znu+LNt)I~BKoox=kuLmgcUXWe8Dc)%*=aqFquobh-h>6I8stRii!K&EL61A;bnWa0 zmp$lb5yYUmZN#!k92V3Y75}A(jxP!o-{D&rWXvgq;uG!6K5l&tL#qWhAaf64kNn4E zpCxK(0snAwldl@aTtR|73!)W4RD|1i;X3NxIu-)!kBaq;TG!Bs%(h8>CC;~|0WX1n zO&;dr+q1lL!k_8GbC;sSqPBC>J{9mohhl_J%Wvw0t=PMTNwr3=QeHFZ*bRBW-hcU7 z^{$cwS<@A*#U*OV{yjWrGsi_p#O$SzAA!m6t5H*Yu>|$#$S9|%xp7&BZ_+yB@1OVz zmgHBf) zf(g(9aQ^PR#7n-C93rP0M9oJ11>I4wVBgh519>>Y4qT>&>qNW9v%(&XsTcs1(#XysXj_DTo6pq}>GI)G;`r2PC zsHo_x0@8Q6E6MK<5oW=d4u6%^B)UDfAU~-((<;dq2B-#NE?h0m)w%8(ukdUV1(k?C z7vGrubFjl-@_UeP9yzxo$=67pl|Hwos3>VCbLVYRK-;G~Jj&Xe@mZ^5lZYpgM}gyE z6$&bA;+-!3sfiF29hT>C!%iLH9}{tTWjO(^3?_J?e16O?Nf)B=jlJy~%VkyW3j^aqaN&gbvNAkc| z@LwP99Hm^*jD}bU$BZ?ttP?Pq#ZTVat$dn?pR{Q&caE&3?O5M=swvh?>7!heysDMw ze=D?V-@oP%g4+{R)T2UvG|d_YiSH&0I31}!7xE5u^=_34tGy6ln0dx{@S`Y;_+^_D10{c9zqg_AQ1>?83gZlsM)bMdz&TQToWowLhj|-V}M3yv{G3 za0oB)8$kT}dEkYpKJ?DC>T)MG5V5KU6(xU3F?VTr6}hcOIY)XORTO-G78e?D`cD3T zGnLF1{SVbQzZ5=k_Px7%YEu&QvxYA0I(D-&6p+wRH8z};8#ADWr|q3nz+hi0bZ)YOnnH@f!5(H!Z ziS!mUr?e-iZSMG{6$?jYn%82V>haaE?=%rB3cHz2vyuRYd}m~<>5t0`+<}l8NdXV4 zWa#vauh~~KpVmV>bpBn+FoCvg%0z9ih>|Zn#IMk}*q!xqFXev2WbuZb!)E<*bUTO- zn-hsl0hC_|lIqI?d`wIDyf;Zje*vOhe-)EisxAzzDmuf#_oo?k&0f|>bW74?rL^!> zz?L{u^5DTmBgm5NRd_4~u_PN$d;M@xdMnYo{8Kcq;ujIKk#=93aF4Fu8IWO`q_oMp z^+JC0#RI_???gHMl=xlMk|49I**blTf=OmA3uf;TweuiTJhwu#w|=v#Bspn`l$2W> z`y&E#f={lT-w*Cb4$DA$TiK?JyKZcM6n^_^t#>? zBbyI8y}&aE5BH&|B!q#i2N=DLG_MXrygXrW`imgr!ZZev!`}zAYNA3|M@54`f~iyX zYsbG52A;r1zh|~Gn?}+k)GPs~H+6Bqzn~pSoRtPedhMQx%2xJ@sF&E?{i|31L%pa< zIsR(qIn?}-hk+HIjw|!>C0a$Av8W_=X+N!LmH=cWgG>5+fF9@ZrW4v@9@fl(>>H1D zrc@S8n61ghO3ulCWQ!m7m%svpQkDpkjxuFSUTI-&&CKUoyp#`9?_eQQpj$F|o}mSr zi*Ab8m;McSI9j)+Zl;oRA@*N^Ol(^C14_u&9>`7a#vDIP6M9PrUe=i3$Y zmb{!vhu)5Z$%=~}bbdKDQ9c(eSawI_X3w0@{+uDKxNB4Pyo7T~)cu`PE2Tqo7sLc2 zePN3RX_T1_}hg3(Es(fhiX))YhEJ=8AyQGo4()rE1 z3sE9EFV{WmM#x_1;kwV4m|z__`bV1Re6RaianbxZRpyR6JxC%iqj`7gDHPP@=LNXL z*K2f|c0R-dYM#lfRuxc!|44#7Q^>n)C4|8Rg2wWH6p+i!La6@9X3EP*yj**Y=kPeE zfGz*v)@dl9x}aNI#}$nzs>i}xWl7xu-d1Iy=fmU8-iG<=EV0NO|k3s366 zXWa7x0A!tjh4kNDgNX1S7rrT0VxT(%)D#)8{;0kA*N6euWu1-0k7WX6fG@=_Kx)I3 z#y9&L$1-!#FMAK?NJ0Y8Yc9)f_J>}?@~Yeo-(1@X!H(@s`x8l}mcI=Vwznj5*h#sz3QLhW-4ba6$LH9iZls za1;WT2fk==hF$yxir>)|Oli8%otl|U)-YpNRe3sc&pRQkRtgj!_KJVL7m+)C3uc=% zn||YX#}LnC0@`9D_dk%Uk*L+JvfSG-VC%M#giINdbaP3P%K3wH9DK9hA@R|L;=`Aj zL$eIka2~N~1x(GuQRjbR$J^g*wsfXo7aqmcfTm zC9|Nqe{Gt8|4arSb}yuefCcVOp82z;8F>_A`59ftQaSatgFltB^n@&I{VOc{S^bJV z)knQJoW$SNH}5d9@@&Y&V|nHi)9!LxppCikeOg3_=M`C8;GM?I(Z$`BXHe_)v=QrL$yJ2NS>w2%A? zYZmD9s!8+`P)mvl!sUsPVqES9=e6_rP7GYR&Yq7q5*O@DLRha(lk8hBH@V%?m%=lj z^jYw`*suBqzFG5As^cI;^~W68)wj05&>P$k6l6F%zn_T}ZUXk2!xU9tByP(ceW(N7 z)ZOZmv|CdkV?yUC*K}G8LKnd#Kpv$OJ5DIqV&&`KV0nn$;?9px=gNIJpkK)ziam)l z1-e(E_L)s$+M;)*$_9ZhEX_TzZ+#vrgksXj2rS6$D1WYw@)$2%1493kyc~>2<>|D) zgwjwIPo03aEynYf-Op|r>{(MI?e|`UiqK9eygX7l15)Dm+^q+2UN+v+j%g)ADhs;E()S2IgOgbpc&S2@@E7dXKn@ zxs9KgXR4eS-jFjajF`~iJ%LBQxq0S$krW(Tr|{vIdP4#<)?YPh7sgh|ior`CSOur%oYk$>C8~CPy$;nK-9!LjP04ktTtku!tYq zj>(pDe{d4V*4~$M`$XI!N6xtEu!;Z#>Mk$1E69;+HZ=Od3U%u@RkTs?@KGtYnZD z!Ok0t3QG{rG>@R%vq|`Pa%GC9ROIQ{rByFrI6jU{2icC+l`5;q6>;kvK*-{jH>&i- zm&Fp)p18%gG(9r2*`Q3@ZT42@sr43WrYlw{_HKPMt9yE``N2CzQc7NiC%>ZpxRO!_ zco1sa?g(I`u~)Q0SbI^$?rV=I1zO`+%HE}{>T<-xFXaaKGuY`Y0Q6yE7h=Z{$W5|E zNrA3e$__NbTG!xt33GPTl24+QLESdH{!+R6%#fKZ+fQd9Vd-L+8Ti2D8`^(B22vho#sY2glS`+9`_X%d`7}cd|_EDc~1VVr2M=t)B&llC* z$rp~fL9*>trV_1dA`Wi^ozU<{~l)inM0}O0R`WfxTtbZWR`%`dsJbK9UQk@lwCDL z*gcdU(KG<9ayq}~TV<7BNtN6Sx~u-vm5xi5iS{l_KlAC|qw=Ot^1Wyt^S0Q4LTb^b zskqiPlaZC&M$685SKX3crU;t-nfXrOU5jfuT{d$YL@MPqmkU2Qd=&)D;m=C)Q%s{@ zVXsMo$4Q`+Y{%NEv^vgHHedCQA-E3tJW3$T=m0gE;WE->a zf4byfQY?C#k%Qg1eAg&&AZ1wpc1TdLxy{Y6 z+M?M*2b*l8q2i4fk2D^?U0#ejcqJ?&fg?bE;7pmQC~A%*(;ur=28H~Bz`EnMW=^V9XeoRRMLi>$t@gp@69$^4&mM1)qpvn<+mA$T#Y+4Nk`KI7`-PmM zpP7SL{+urcS`s^6h!n+V)*oxhk`aO(JG67Syp;9asPM6Oo6oqpNg z7&0x(NA|SyGSA@K$DjPIeA~n_Zg}^`bw7W>M(ZFP{48~^6GX!Hwil_e( zJA#I~bOl#K=h{~=3yb>}Kap-Yc~<{#V~9nqp?IM9L*CE2fz1}?KUjk(^3@@dDhDB$ zGj@y_7PTW4Tb~>K`&e0wnj!Dl{D`;qTRe%B$QXn*Q=^ zT2Y+EPX;HOgU6dzlLR>EK2P_MNm78|w=hH(;8`>w*}Oh(cZ6B(v+gccx=5yL zvQ2*Q_dYEC1RP<_2Xt!4NN$w|x(0Me34%P+(OHy`1qg~rCRZeink>Mv>&E~vRjlv= zDhYF?ltuHZe+ z5g&l$IjH&Gv}=G)OiHX}w`XvtP#!M903QGj+^~pH7yW+%ep#lqWiz`Er$Aw#hdBSG z7l`c@{ivcz$EUuit$8rEop9wX#i$4KYHntGC6i+PfU^VGS2yb9$l6s)`k0`$b;%d; z4P$2NGlCW5rQ}RFE4{C2P}iYW#Hryd7?z!TX}UWBD;)bd1$=?YiE>|!Y9PohvFwev%yR{`RA(N9Q_PS-wKj# z{2Qh;i>$CGU*^%vdV4F`JheFfz~KhjQWNuBg}@*G#Lh5|`dUOmDPzZ!bq&mNU-{e# zU*2P@H4N6jev5Q9#3tEt4S@j{UnS{fvbi0uX%5%bzRP2A`xad zO;z4eU*`;1LKoMT2?Eqe6l~C*2#P)GlhtYmC{MJ0ednt}0x7=<@QWH4H<^ zEkF8~RH}-a;v|QFYil3KuQz*xRMqJyIwwRErn5=HsMJ%B^R!Eiwqv2%X7Ud6!hbs# z?J2NRf9`yjekg~M>Sh6kl|8Vyx`aJ8Ar&r_JE!fF>l{uK7Axi#f%FvS3|q?`Gp*s8 zVRhqwFY@uu6M8C0f)w9 zN6pGNSAPAsBbz2fbK4ycG+ZQg#a}tmZQbUGoT(_?+EgfNVt_X6{{lts+u1bS`N$as zm)@^Ffm|Qb$Ztr7xZxAJ1?L05F&ANb(_W zUbE>5y=2H+TN3ED_}df`5*rk5QU{Im-(~wMy7k_|&y?nv3q$YfySjk<9AY5LgvlAu znp7ug`S~kVqCZR#@Em*$WC=#uWl=~8q-OK;gEVSc-RK zEJ@%f{RXrf|4)>FQe{+PM})_X{8Y{g693euW$_+Q_S~A6XKYh-8LbB@c+WUvIx`rpOXDUC`O>J*c9Hy za3VOwE+%4vmv^QQY1-pXBl?cF)?iN-+|1Tjubr3ieRtdl;(;vu?_WM!_T6DUc~Cne zsrg2?Sd@`w=uxddXY~D4{wALTtd4mMv*5io+?DX;C z(U-FFQ+lV@V;bK#0BP&E`-(~F_H$?LKpwhpB0C57l*^sS_HA5cwOfCJb5~AORrt@& zBZQLa8wi!_DXKP;SDl+0R$Q~S-O9RBBTPw$JX8M6@58p?OR``ReRty1j*ex7f4;WQ zOYtjG?E1Y#L!{Szsg`&Xz1c|qZDQ%Km4OpSMC_n>ru<2qTprFqVh8B>uJscH+>?4! z(AFWbdIzcy7;CpjR+rKiLGUDwQu?I38A8jHq&I2qUJPEziXMv!#s5WqXHQ$jlG%38R-QEs~S!Tm)qXLEN ze#Tv%ZBCq%^v40eWabyY^R<~vpJ&RoeWtX0I5>?=-u5PxbD2EwvL?&`*L;4|X2*tg z*5eCkRTc9SLUp&@J2&>4(V@3K#Iwb3p@#Xv%8*83A@5>iOkw#}ZH;;hNo0p55HJH*QHE5*E>uwcdjAS$5hh?uRRY@b0PKlh_G&t(wwCxpjcQA9 zEm3C5CP@E+`Tz~MDN0=mI9b*0RR6Wyel%5h_w8bof!a#{sljouV}k`(F`$}BY(@s= zeBp}a5F)=<4D9?~!dScE3FX7y!0Ld2r4)&%buA%$iA^`(0A9MJ{4vy@>t8ZAmDaMZ z7-}}1UHWL89aO0DGEQ6YZ-bnp>`a>qQ?HQ5E`M6S4-^v}V*ZW($|1t8FMOue$?xqR zwa~q=H+a!*)urx7w&j&>T~O56f%K;+>DKMEJ26&O*bbVj%FhbbYNN&6$&k3aTVK-N zn8%X*u8mV&SmotNmx`hKoy*3@Cpw*1!nT2AB#%g8@E9#mhbu#hEuU8JJxGkz{QcXD zc3E~sp1f`Cn`5M*^2a+NFNK~%-wV1qiJe+qZ!V@+GBvGaf!^|^qMn6U--+W*A`9&3 z0c~6Zt=eK+*|5oLeKMwA8+IMB@H~2Vo6e8p|5k8RqhvA{_xL`>O1G0iJpK1S7F zd0#`hMt8T73MeZeD<$1TT6n#J-QTgkC7YtjoJ&pBg(7!~hwrB(EkwCQ-hqzn>) z1^d0(VoTY>t)gu;h!4V<3Fv-9H(P&%$Lva_w;f%B-(vK!m|krGfz#JrxYZFEphI99 z5ySt!;@};NvP@7^EZ)E-_jK9cJCPT{$T-B#vlQd|)%9;>f7FuJw0eAZr}8G*m%{SR*5qT{Eo5&zqtG{woKp z7kl{@<4O{ReF1$JUc3u=cjloCILA6M`I`@Ipqvh4Gth5i!V49R+=kdPm^02QDYU<% zR@vCye#+osD_dgeq30wx0r9FtcQo^-Albcw@Y00(P)DP39VfY#oBN+i)vS^Ktt?<^ zF=`jJmA=`}lxCCjmLZ-C3$`{rbCxxsiR6U0$!?fEpG?O~pJ`5YR}9Omq8etc_GpSD z!nr@008y9d2~H$*)AWUx1SotAXqc>NwBvjV&jUbI=?l6w9g?z~<;E$l*+Bco+EF-D z@`)sG=>ATX8femdh{lCQS5D05ee41F53V@w(t$Ir$2Rn~nG2rpNMG|cLww09aLxNW zF)ey4-fiG}A^z>Qw&o)`ypd10%RL}_F>zHDJ%MUr$jhbs}IuQN3X40g^ z6Si4qcN$OP1LMjviE`f;651kYN?%ln{{P`K(Zy=lOE@<@>_Qgq7f9U+$gD6#Rqcj=j^W~*f@=7aSxgvMeZ zLIMl4D#sB!?NMuVvd1Y5I?O63v9`_%{pfQ|SUw#vLhQ5L0zt;=&xqRl3TKa>XC7Ig zR3&F*|M)KZQ<0auCbE)3k&#Y_*HUa$}yq$}nqVK+WD)s#ic~`-n zl{V7n2}T@PnSxtl5tQ!^a4GN>+n^y+E_|p}|99<`W&{Xx&4eA^1W?QX!usTaSN*iD z;YW|OLm4O2UP7$+0rhpL@3g>w4@2d`U1oh=6odxIJ_3$GoddgOH5E3$XAXX7n`cf{ zT3MbLdq9^zR613xnc?{;BjnlSgyMgV<{zoBu=o=`yZ|6t<*{`ZkyC)3&RDTlCl(Y0 zdpNG+aPa!fahaC)N!m29^VG!4K!i^^=QSAFeR7ktn9ltTy+TK^g_u;z2<+yqU&tKo z-^dd4Z<{tWtZ#t8@>1B(jxYhhePP^fMyLm~_dlks@^mVwUwn#G50j;dqyMnnZ@TogiWQ_CwMMg7O?gy#Kb$ zwQ!<{wUOo;E4*!Y>tFHf-9~zG?LXRUh+nr9a}q?cWFQ*qp`E?3rnxp`4CrF6QkcVgqLT4Tavm4yxz3@ULmzl z`Q4SvvHbsytk$A%w0%SmfxG!KeP{vdw|pt?^YfQ|U27>%nz}IRW(0T_VbQpU-v|z9 zU;e@ZGHp9SX<*Cac$;^KFx}-6!T-n8x5qR2{{J(><~XMiIiE|C%5mnHq@n{l$f%@J zIaN-x*_=}jsZ_MlNkyh4$ze`K6gr3so8uJO9F~o3_xIBK^ZRKJ`QzTSb=}wXdOcsy z1EWB~dc}Du-J!bPJgx;~9rf_qMO(GTx0H!K-PsPo5xMnMO-=o|yH&r4-1>WT$R8R> z?jBkivA%@?N(%7Dso^0}%w;948QCU&9`}}{G6OAKxAueM-+k?n?MqAiWZJ_U(VKZt zbLAi`Sy&u9o$~tMvIJRA_qN=Uk<*1~a7Pf~tDvloQ|-eMPaEC*(e}4Z_Dy#v(R@W+ z1sv!VKck)oeF9NkTpI)xBxdDKt?eY(b6t(wR!dj5=X~)|!cBIXQ6-~%;H;=>vSI=7 zN}TxDDuhzf(fqAj50t1Mm8c6yQS>k;_EqlJwi@S_eCKx;Z5c| z7z<;GlJ@WXA`UQri{$-gYVW-ddhR*ehW4EM%QgG78sS>VGcGU&PtN<|JDca$liEDP=1 ze5$d-n<_X8w7I$rs{Q*p7u5!s!IXa+KX^bta}{4*v&x+WlWW7E^Z^}Vl!Zv4AOXF<|Fq~ez}cTWKY3_FeBF`d4et9g6>{*I>}YkTN=q4nw^#1 zdTaZ6xaWLUG*49I{Lv(%B^Xw?L-jV)j8r=AwF{ToNP>=%j(`JF&Ii z$Bw)1i`y-7iFG_Rg00g}O&5h#4(P&2*}w5VF0mHby9ArjW;J{!QuSB|4uY45E&;&x zn9DF+Su!qk=`yWycVMB8#g||Q)GEs%$wo0fu|Ek_Sj`5RGtEl3Bb?u?MVJ-WiaEa9 z_*~j!jBkUqj#zb8%$>-Q2<672G`m(!m*~*5*ofXQ!?YxiyT`)|pgz3-OLI6#-80Wx zNE5LK_5#a9ji)x9*>~17U^tWmCI#qlP}V;V>P_Wrvsw zj8OA@?gh12z=&4wcS=G?7F#eBWKMWjL-6*sR=6#n1aa?7J{9*Ir18_u9<+Vfase7} zle$JmOw@0ZvaQ;-vq*n%D}SCWbrKZWVBRWX20x`>wT`3wa&sc&s)68V%*+gFHfEc(1iu<42)r7VyJi)Utt@TT-CpL?XO?` zqL>gVh|B%%4K#`37}#*kE&h#u-DZEv8_|vOuE8JI#4nQs&xEd@)4xivwD%ANSIZYjl_X)*0#5jhf9y^I&P3tLs<3z6Hj!1IED6;qQ->xQ>R!o& z=E6X^9tRZu>KX<2h>Id$L@zdF?qn6D*-#l;#}c5|2A{kK!{L#8zi=+4NCH;ps-M<> zn`*jFP}p#!Z_>IS7Cnh{*xV>xRBX{MF!jq(X^0?1tTBa2>m*ew_XT;~b>QQALs&V0 zTL<{M|G0I@y+LX2AVk5_nR{l1n1&WR{aF<1@}miToJyk?GEn;n@T`zf1da_saxSm8 zt!pe{!9<+H2UJ9ovW^nJqV(lvX(Xj07lR8ryGU+-!uT}!rV-n2<-F7NNBa68?7gr0 z&ho3HEiiHK^=ecUNE1FOJ?fv}vK&mNZIt#d8M)T9_cxC)q>Jp17YLJ*WK`$b&gM}# ze<{tWo!(rLtiCUnuFa~=iW6)%{Ju44%*c}u`o`>^)sicB1STlP-GkREgksj5AI*>sChPwF}s#sjfloN^ecXnOj5^8z>Tnk-)J<3wiR4 zgh+6)+xt^+kxY4bL*&M0xYSEz{(T$`sU;n~ux^6u=5av*49}Q=C$6QnMm!E^-y|EL zjg8*7*#4BBxAXW2pZ3|2sYJ&dtO8_BAmk7_<3kq?UUF*x)kEmxY`@v+XF_rYyJ zo{#BT(2~Lf)3lIKaW4i^<$PY`+eL3Iw7?^{BlVK6d3IOPr!hjupN&AV;Xf#+KD>E> zl+L&Qur>)_m8VLzI^7sVK1@aDJk4eQKn_t9sY@F6y)!ha6Xay8zh$zWCH)qFQ!v=h z>tvDqW~mjeM}~k`f$%0ab&XTH;R4QTz6q?w;Z<(udq%!U0YPKwt@5jn7>WHB6MxlI z&Yz2U6JXeGwi)}T@x4td-%$_4N-0P2QG0xBj;Bg~1W2Ua|4Twji4M{f%U0X^kNjZ( zz*jkd00klbhGr$Ro!=Cooh9GB@eDm(k9$xE!}y$uCAE3V{IZ`gXyheYmU~^Y*lHWK z-LaZk^a;udXy?66%4*K^TGB73Vdw^q7kvRS$Tcn)f<=AYWOCLt12q#J>Sm|uJqg+gRYL!5uI9}B?Fvr^Cxw7 z^%#XBZ+ZNOvQDCs8=3^h?{Y{PYEcpTR?K|;SD232pe+TK9_NTQP}U!4zK4tNkjY7*vJp$syZP)S0`Y8wVJha*O0%16mwIK+)1v$v6Ex}LwNlQWSEY*(KB*PuD zd)I4f<+lR^&Df+`-N&j@^{U?ahh7x?<}g#g!5A0XEt;15eBiWwcpE^b zix~?+!ymocdx7pN5OH=!p*_QO73_6HNXbwMWu88V6z1^J#JdjCJ+FZQl=bN+@sL)f zsX{LDPD1eYq3j-vuyRs*kI%Z`bzgd*YsF5KtH5Et$QlF2%d0}9e;5MT(qSrC_zu=` z|BtO9&_c`00k_l;=w-2+_{jacAo~<@%2I~@mBB>yiPvf+m;zQtDz#w5s?ytX7@P9i z^eIVcHH8mXw~(<5lk!2KS_u>bJ>rq%h=cd(2@uPXR%ty^2k6P~VUi_fM;C?!8@&(L z#6Juh=av0NjNvAZkH+miRGhHVvsGNn(l3};yp>|!F@1q*3Qv@*J@VLLaCXT zx~r*=>!%DM{*2Q5g?{xmluF=y;zNixWwP?+TIIH5BA z2(mG9I^wDti{D?8SR+4-4jo#Nnpr0F?8)qW=N@;?$OF*t7K3?bFo+QD{uI4NB?b80 z>e9Oc$eUaLwem(W@A{34PI>A_fbEPysjSXPIVMZgWL)z|>iH$*jp3)KZ|dDqoD_Hc z`6qR=+E_s5Ot-NOK|EY0wO%)zku9o$WE!Z#pG+q2I9#bhm= zB|r;)$W1@rc|BhTriEOO+Ev<7m~G0Ps2SyD4Bs}UNhBH&&e0WSMZn`F=SF3797I(2 zCL>Qvo=u!+O-G3lIuFqnr@M_G?NWZMz&LXro)8zE=PaynTvx;dhM8dy7?%R-6!1(U zD~|u>8f~*8P@f33S}cPbbf%1SF%&D*?bW2_k0Ti#BeHZ5sP# z80S^Px6@{DX$Pg=6oo25WMG7k=&)=N7?Q1v_ZC;TJ|@P(G1KEovi_V;!rI?(xtEAr zVTY$(J%m*mRM|_=;jO+-CH)G7md#}3GLTQgJouhVG4(f5FnF|Zf2$yhzll(RP3c~s zZP24x4+#P&|2gQNy%KOt|#3UVgb?jH~$BSh8 zC~!fa%5w=^SF;|>iAG+Za;zGRHSB#K=$^T>ARp|b^<|gBzCXwO4FBo~GHz-FBAl=I zUW{u##&xCSwvfFa(fYE5RiA}EZ11~Y9)i~s*|bb`BuqfdD?E~7mqb0PYPwlk8yn%8 z!>|)8zFh#Mk1AAdU3bX7=fdj~#nwO5PxPl(=|L-lM39~7Zcn=-;P3(1 zl=4S3pVk;oOA|6cO9oOki$UnR(G|T5tqrHj&c0F(Rc>VCgu~lb7P7?B?UT}9q`QuI z0!fdev`Rg#+IX?JIV2EY2ey2m0%)K$uUYzZ>5kY}Ic42n6>!v5gwr=x z1uB0u*1%@tPMYXCT+Ri{FM9~8j)1J!VmDejMHMt$Yp@rvV*{LUz^xHRk9tHD=25W6&u zfkf@;v)XIc71RUE98N)N|9YQmJjXMzB&>t-qBtrIZ*iSb(q6bS=JZ!#ld!XVnJ4M} zF3NSO3{AT+CXZkEIqFx1qx#=onc!6hiQ`FS17k&?e_YXVr*9RbL89o)0~@l)}K~x zXyIt1*~rdDA@(wtmj5rSEgR5Qw|@Akf`;FkdHreA{=f*fwl!i2aq3~tS48>^JM+Qf zhs(K8tNEtCciSO`vrUrC*yKP_)%~Bz+t+@7__yeq*2ZuEJ+rSoYO+Rb75M-UeAT+` zr3yI+oAKT7t*IPi{%}T_z~eAf3E~cQdsvb(YU|GGm3!{K zuu!Ir#s(n9^7P02(Lsz$FekX04!Ye$3tUj9@L$1T9^p}Z;BGjd!=7lvK^n|WYHPb? zi=L0%=FSJGiOxQP$N!8__``jzB#=l-iHB0myN?j74xr{Rs0*^d#C1Sdj3g0{vrEPR>kA+aMTfO#B)cv@IS|G{ES zR@#WVRC;ACdR`=hAPjl=810_mkwrPjNESKC;;Z$oVWTp%)pANv4UrdUk0n?RylIwq z!1SveYS!b4VQTs*%)u8i_q4Ib*O!Dh73qWN)SP=k6KP!pf+Zb{6LC<0`%oRb*Qnvs zVK&QW{Po6eStgBs(X2IzKuM-T)uZx>zXwFv0{33@z z_iAoN*)Ab(9;sR#4;!%e_ba6&dKxJ(}o|RD!yU_Keu#La->2m*LaE19=x{yDhrrBxB1+Yr{cuwk7}A$$s)} zyco15q`7Zu*FJt@q(nx!Mhq~l)3Co*RU5l$Q5S~oM#3N8kUD>&@YZJk&DUzP>X-E~ zX%EXq-pwTRgmB2M%rhq;)`2~IpqvYFr<+~986U#cUlc&S`40fHuYZVx9}=Q zzjH{V)vxBSV6HkHSty$XsP~qpt7=Xj1NWgCjR7`AePnsj(+trP@q;`K=vUL3rhMD% z&-!>g3}29_eNd|7vu24$ufc|+rQc(IRI2YzGG4xYDgAX|p>wZZ@!?Hpy%jDXMK4e$ zUBsL3F5K^juWM?iS4ivkZvMkZk+siFY?iump%HS769iKDoOGrI$U@B8y)8`5_C&w1 zQeVjy7S{58XgWzo>uIQbubsRWZKUYPdbanIQ^yAWh@DxF1E|E<_mTZU07Kr#*NB>{ zNBP4=uDG9}mz*qa@wff?_6c1cc@v{0&nvYw=3@;7fcIi4{43=FJMkh1ID_^ZBV)N&LyM&s zZf;L8o>?3lvmP)ePcLqH0&qzJAany+LBGX^rM*`X$p3y)CyQRx?l+JBV! zMRlI6mz(nK&dJZ~ZDUn-)F*%UnxjGd`zR~4o-YWZ3T_ICdjlb}908QlD2-Kj_%E^g ze`FIaa!<<|X8tliR_8M#EiHy=(@T1GRQl`ey=TIvBuTNh!#hhiWYmR16Am(#_l|Gj z`|b=TaQSZ}_CR8fYzZy+$ajfuqq83U@*?+?59nUYqnjci$Li zka|`uG1zo>1^eEl)<)6B2BH(9%;*5uLZY22e;$LsggnMh|Bti+#swn1Mri^lNv0;T zkG=$rw6MRAmacjz+z9ug16GH=5cK~?sLh@R_2WK&I^(op+aRjtR;Z>xC>(cR+NYUx zvGO-j(cj^2-2``IuToXU!c`I0Dp5U7C@rUFaXxYCp#607iLG6!P1nB$U2rdeVq;P8 zn2{2nvBA+My}G5IE(nisQ3M#jJz|K5el(HaE%OFmS9+7J51GT8isSbRMO=ORdsv>c z1thshLsjV)kWfm#Q>%45If1|pYDgtUb~LX2_~^$Fj$D?k*z6bIbU&8RHKtF{Wn|+~ zb(3s{PAeXh0f1al5jBv|;G#B#ybp`0TNx zgii$ixKDDlFwNQfAx3vph_L2YuTr~t&G9e{S0rQT#~^kYJ1bYO(`$KJz7xN(7VkO_ zNHW;2RkXcyR0!D9r4ty_;qZcSOz#%ii=0tag!2gyNRw>Fl-N1q4Sx}_eT$!?G>173qqLK94RXPkOX#;2`VkS&%K zIKuQ|J|wU$d4~;bJYpj1yz33xzeRhKvoJ0Azd69eWSXkMr#uvR-K{Yj7y2O3zUAo`YWst|>?a}Q_K7>&ht;sg9kIskm3zfz z`FIaWo1{5CpyuS%8N2=##ajrdnqz1V74)j8YMJOrI@Q)xm6({i<^jON zfg=jJaRp<_t4za!&knpEKD^*xd3+Kuc2{p}-&4wW6|k*zEFV?0Hbd&3PU0g~O=u`? zd`&)G_jeHjO0fyudpT>ynu{1(V=s(NLgwEjZ8m{5zUY8!Hm+e%IEZ3DI>ax58!Tq} zKcZ9^|5uJgoI1J~aZp#0!78!4PgxG^c7kOvzoicsdq9YY&8Kx&dYU|Mx6+syqIRnk zZBgumZHm|rr5GC+x?@lL^N8=dlNDep=f-s!w>hQeXZT2^QrA4Xhbp5D(Nz z3O7?e+!W4?)_M~ah8*UGjp1vdRWL;Qi5c8v@2aYdu&l68mXx5c-HyA2&Cj<2yr7BA84r8dfRru|#~Yn=|1Q_G=<9F3i3e)&wZAC+#s z$||v`@Ezp;)%s4nx88vXO5K$07Pi?{pVM2;`in#W_ko%(zm;ugsT=+ZHEJf13XV`@ zBcScZzDT6=mbv@Ar_lt>HA@RkZU?@eeA}nb&F$Gc`Sc5J-ZfF+z2(M3&U`}u_*1b* zygl>lfL2nes{oK!)$rnd(w>HkIL_j4e;^brOf283^5FJtU=&Y?v9D^xLTLN}QEiKx zoo4%SrNItv>nS}=4ix1P>)r_)uMC87H<(?1w(MhI`&LiggWU#+0d*sUAJ;veR0;|rXTo%+V(+A<4D zp;wqIO;3?d$xf7Po9&1v{#$JNnsQ&tJn3IuV-v>T6onDT`!wR9S0$bYetj*yfqA9< zUHH(y1&;Dd`JpG07qxqCt^SWCjxzr<@9+uE3`#Ve=Agc+3c96=_s?~I z#1!2rIn_^CS^|-XDng`xqqMi;r<;<$9$z%Bh|&+=@1VO(lrH;>T{fp}f9c66sF)uY zmJIp#rYQYazB+w-2KkHi<2)HT)UXz%L@e7mFu4zDC#-E0zSc>@3pG}_;jD=U*kD`w z%IF^6FoBk@ZnJq?7vfMYUk#D#0&hqOg|}t;Jeu^ZO*Wg{S8>cnmu9=4(z5Y4=gYlgIAjHNO?>!T4Kpb8@($ zb#3nK*6o@(dpG@&XfOL(TDv%RVc(npJR3Ko2R6>gV1Jx|yOC3SN^8lO-f<~lMrpM|5vm3^FQbJ^JQMN>dm0+w8h1<($672) zz1YbCO;q8TgEvkIQT_DyBlkWo@f8=fgm9&=mP;QjYdUnL`I}9kuZS&GbO;q|cx}8y znm|xt=L~{%H4hlKwja-@+x}<^B<6kc@0Kp)8{lJgpvCh)IuOoJ1nk*D2=1DLy2b$2 zhia8j964%g)7rP*T)020VC!5DcR)A$tam|65dz0ZGOrYWiv!F8$TS^lb?%W}_V_|L zt*X2~u7v(d4RtT?S8r^2N%aQ3`xdQ!?Cb6)!kwC}{v)gq!w5RgnwB@kWP&2TNmLx1 zyUmDGe%^aUz$6xCK0ZWXoAw}gu!vf{*I!)BDQMnvD7v|>cB^F?;VaTur%(Ud`zUB+ z!@!PM-bZr`isFbq-L9fM?7<2nXW`eo!@zzmA`-uR<0YegX>Fowg1^xFQYNWU`b{zj z67Vd^fAo>|WY5L6y5&MXnP_|CipNrHgzA~%;P=fn8yLGFl1%&-xr0}ThD#kzg-nXD z*+)71BK1B6(r#Au3F-eTWgn<%Tadl9%%A8Q6RwK`D}41X=!=4xjyAYx8ZO5Ba>dqP zjP9}SFPcu@s1K2l5vef8Y(ii22|D4cRBk`Ll|TS1lB_8{cvn=Lac1Y|aM}3<_F6{B z-O@SZpqu)vaXjL&l3jq+Fd*f4`lIO8n*`}fA^eY z#IC(*r!A(@Lg|HCmPrhgIyjH6Sy&K`Bo5p9UqNeew?5EVX-NCJb{d^NXvaMfy~2~5 zU)6Sa82UxH(eJkRUlp9=%{XRjvn6LnZYn!0@t2mp3WPy_r9`RHKq`y*Wxwh$vECSER?<*UW=R(9;m*2%b zeK3^X+%c4CA!~94gG>aYUa@n4Dr*bQZ6Pu4lP_0SVx6dn?n5C>EC}VQ)A4=m7Mu^a z_FSOXh@EyKN$&}Mu^b)^!9|+b{;kh>XoGK`h43Vu;(dW2uk=mi?B27+9yn08GR)Hi zD^2htl#8XS9GCs(fFOM?G4WeGglJs5%o#aseqv?MI{tW|_!9?(rmuqtwp&zkZePxZ zgAzP8p*LzNEv0M|TI$dppJ%aWDcY};kewuS>i)(4+sA28a?-D9_DV+UPu4&$=$?+N zeAd{t`w{WpXNCdHws(D&Haz!PDG?Y&fmwgLQ=86O1(i7w3bAV68}_7T!fi~Fxc!%k zmF50Nw0@lw#NS?5PN=;2pU#X4h&TB)58D#{vj$=lWr}0e^ZuSXItbI7o+M+A->eQw zOlH`V<;_v{N6S7Ns4WG{*Vc^nxwyPGiS==~d~j+zUUK`YxvM}lLhT;oTo`(@P@`!p zNO1Rd-fRuR3Du|!gO`hhDPR1rp1x1$P&2Zw^moG8VoS!Ye`?3~zrg4IgONfkYrN2; zN2 zz}85COTkL58`*_zpluvHdw3$5df|L!k(=W(} zHVN+%0`@rV)#bBvdEPDB|Nn1cEhxBAJjG>r9~j^yCML!QpvE1PI&`CXbo(|wIa%h` ztREuwsDzHJI{*79*nNL?a?_9 zIU$VamyA3}ucreQBinx?7Rb9VPP^~soP^4k2+i8x`haWE^Q`MAd<&XYTRV1pCduH(P5ezKT2fc0 z3;VQKw}VHDFot~23QG4o|C#onjo09P%Km$S=;sic`?kmAR@kY1KNmMhJmkqOtQ)1; zq;qA=hkKU5IQaoL+7Whi{oea4WXLj})Bi?*OJ7;+&<;N56PECt8-C<3?IVDOd3e|Q z_Sk3M8PzxiLHMTk{`4Mf9_PyxB-gRjgY9IueVay8kbdija9Bz$nprDwUVprLW)5_- z_8($0X$$>7tAAI0if5-oA&@(?z+T~e0$%?^yaB!&YPEoZoSb1-bmwtf=bgZUYy&)9 z+mEqlFL`4-ICKDPK@hP6RieL>6TC4lPn#G9KGokR*h)cz&=o^IJF~VNZmcBVd;1ul zQDP?4eiOAya^*Kjq!v~j_q<2v1ZPJf4K6ZL{dxr3mASfse9MO6S)D^CG_6VMbb>HP zEFw3-k@UQ)wPT+ULwu)KA*SJ{LRLE*lGS(#F`vk#6u&zvvfDB+;u<@T2eNFN4BQV^ zZi^sg|0Luvf&yGk*6DUZtBEAL8v!$l-A6~My18V*PhX-#J;=CEj>duKhb~gDFM)GI zqWBaZPDxG`UZHzP(|q)b(%}sEB4cVU3f|RMhxrN zwoxh^v;%P2sMQ+8mW6gaKwyw&CFHoz5%zBoptX^BaK^Pjq9$<9pZBd#R~jY0^rsKl zb0nXJ@KGClG8v_eWGpLP7mlEe$nw`7L+L)9zA03Gydi&*dwlh=vXG8a5W-1)4uw!o z@nH)I)0-zoP9Czdm=14IOKsZ-b__PLMf%-}P-CNf+~z3rpP03=x`iz9-rmFBx?`+`}0z7%AJt>o$s6t6`Xeau1jc)rV5db zZyT7KO$m>zyp5Nj32Ao-*hr`OH2D2zOfc>0_NMJI7S}L#KC%f z0Fa%3Hd1e~xV_LTzhHYX(d&KrlB35Q1!pva6Z>_*zQwqzy0 zZSW6BuN#*x1+>#&J(pj;rL89X#7n+@ZP<8e)lr1f;}~-V^*Xii4?f~xl6MOl*T8;k z`GK!LjKIaL+G7R)YVm3%Q&1du!B>e7I%sio#(DXYN7;hMm-i%%_b7ON{3(=l+@`Ip z#=Yz%Dhe&*71Ej&>W5Qz3qjfmSqMS5D2MO^(OdLtYzNj`+$ocZw_*h@fBH3>eVHOm=O2kT8s1^39ZQ8n|52+ zcXfp392?mmY`!XpX4~m?F`dYP|IiH71}aIM1|q0be9X4{XE@~$Ok0OUtX3MmAjsyj zg|j~0D7j2v@zQXaD2~1NNt^l_LH}1{zc2`wDC8QH3J`~B)Mv2LY5%F~N1-%FuVwHp zJQK{sEWe*}`M8isgKdv-BlQON8n)p|Cs*vdjVvyvKR1rUW2@?&hm9Wo3G0?oWqWe| zUX52gP%y(n#bmHMKKf1$5f0BkJ2MeC>!7k&zqHbmv4(O@bk3|LJ7HqQzHQy8sqYl! zH1u@u?}WxY(YeL;9_%fXv}k!b{^In|Uh)rl-}irGGVI&pM|fRz3u5i!34PPHihP?J z-qarK8{!8;7P|4|zz=`m+2f${-=)J5KCMj_OM;{J!d+9#2r7)0poHbRVhN$K$@RKR zfB8}(&TSS=AQ;1Cb%FwuV~3B(uPQP*fS`-+Y$V#+pc;04dYY)oi6I1#HQ9%`?-{Ud zKPR>U6=5>ex;;H{z6nuRJ%llk~{b*yS-%@wQ&ZqZCoh?Fi;@Dn0Fvl0y!q#{n$Rs5(F_l`JNMR*g zN6TnQR&i}YIo$t9IKQfto&7CGT zZJw3P^I9d50hXBiT*UWg#ob$3bmHMiU2_AgTa{__9d?wth~Y8>XS~Rvy$OyTvd^)+ zPz|w09VS8Y7~Er*JYc^-Yc(n$V(}Eyi~?6 z8%F&?S19Oy9FTZgH?|rPqq_8~YuWf=3+mt*QLSTfxRAu2%|1{CyFlfw$EZkrKSD3W>xpYuhbv_8C#aT}?7k^I`D8Z$Gc z)QR6uB>;6n@KwZ-{JbvhzqQ6GSAA{Z9cQ8l{7KmQ&Ea2;N*(7WA6;6^HE9hliTEN;N5p~Bg9z+#0!z3+&zvfNVIaj=-RtvR zSRBpbBOYw4*ZJ+>F3ok}$Xw)bM%Ps8%m^~ad5+jD`|rH&c^qv`Ow~d>JZD^(pgmH1 zK3MMdiT;l2wQe$rQGKG?_ih++s~W&BtYt*^=dkAAxw-?&X@#&5p?Mqtn zix#HSOAg{tdCs?ZUgqsn^6eJym$CEwL&H7dR#8RD<_6>w&g*2F4-otwU?jEq4t+7? z%Q;P$l?u0^w;(@@%qrOMc8PK==VMK+OP&9}H`2VTzepMLxrV@DPIE4x0cyl{*@EdM z00VsRb{UVtCU|(@to84-8FgTVjtUQgg9R`@oX{U}$w99!_%f2ACE|eNrHHWYS9As; zzMM{qm4eWsSW)^MB~Tt(^mm|$s=sUAJ?GHVVnrG^3uoJyS0q3XkKOmI(r&#`F4t*uubnVi5pJu^UlsWMUJuF%a_VWm zi2JV#?*^dz@Ad(+TLI1?QqR-)(mFFL;Nb17*S&!$QZWvcJ=!xrUi?_u$9x^lmPpDJ zDg5xbSyo`t3N49wPP2>RvUN6U{8_=nl_;-$%P}d(+wVCK>#+aRrv%*zEJQ6#(~Fzd z{ijW`134dCT*L)17o8xt7HO$3+sSEDP|-mT=q6|zF6bx=~$)yapQtNv^IP0I%rHk?w4jaC7pvtSMaWD)9xeyV`q)bKQQ%N}TYdoIqx4?h(j>}HWrs`Xt~*TLfyCsqUGI{H zlb!6k_cq~1f?M?;)7V}?nf|K87Sg)1rX9ql1s&vnhXwC>JLFVe`+T>U*%u~K~!s6u$2|1n|kpOV~;;{aXV)HR(s#}1XOuzs? zXKYyFPt)#!r})CcSM=9NOK`u#*Nx$3(5H;p*u1M3}d;lmM}|G(Hcc zt-+I~s+!M5=!8H-m<+~dgP9t&DP@|x<*(1wcE2PWNYrZ@ej@7K@g+PR1czS6a*sV_ zNG&0Up+H2bj@rhr@_InUaNB|P{^C9ej*+X_S-+;}48xtZpN(26#O*@STd)O?5XE(Q zt*c|=+h0NW6wF86!!%31&KWgDhQTwQ5t024&D--he1llS>kt7)CW=8wGUDV4mBy1} z6Nj+{ASMfx8O_eA7S4tnGH4{!F+#)dk*+vPFo3^7#MNj7D3)3cKZyJr`_v_ z>r21i^W1ovk)E1aU~wkXqpj60ZqXn2LU4D~(WvSMwCVO=A>Mtu2~{UhOQbF2yyr|n z9q}vvyf44;XX6rGXMYsTE*b<}TfIIC5@306F_W<$+Mn3v8XN>ob3b zx>M0YWLi!i1k@$1>+kTZ^7mlEk3s(}2a9Ee{Y;8D#2!E@)~!5 z0t;9^C!v8cB;V$Y)E*DAX1U-pXDo;cplN6bAR#&dg-ts|-S=Kz{#+r6avhLxy_#%y zAW#9~d)GC~Y?IcTy8yOZhZD8z(-1WI(DnuUy9xmr>yfA>b7S)+^L3TVFO?32^3yXE z&6IZ!jFfeSLLDp){(%Sf@RkD+-`qsXS&@vG*no$t*B#kL#9Hg*FDlC%nj_RiS zD@8jrB@~*@sUKv7?z$AWQ0Z|O`P|_K3?`oQEklr)h!+b}S=5uc$kqu1JU0mwC&Pm} zbT{kNo}`C5%gA4;)hx1(QYqU#pQ~~D?24CPfBU_p>C_ztzHn58!kY~dO?2^4%Bagp z9VJ`*!L19o%=}-8!RQd&zESe}#zO;!*J|b83LYlQy>?=hh+vX93r`pX8suQIQ0y5R zpe_i0zuI~9;mdwN0jTK$=UknqzR$w!;j|9C#W+uX6vb1WQb*&`NorLuI${bF8XLQ7 zxlVv=^_PIjiYfQV01(8?>umdp6%6}W#L+ftO8L2ePLT_7^@Fbz#(=^ZH>1{$qlGTR zGNR6^iMraq4U7nYK5lv!zpTjW)+Lzv@VnyeZ*hyYZhzL7b#V-;&nq6_`W{KvZ zwOo(ar$ga%bWX-_`guG4uV3ES>=V0$@w`VNsa1VZ;2HnD^hlHMo;!JGdw|=8`qvQJ zEVv+{QQpq?cY6p$azgTMwb}TJg9TFSjV$=^bWLRgp>I8JnxVLokbZg^GVX_l z*A6d7&R4Vnm;Jx7=G_bMfg?+_;f2Z%g!l6ZthDHT(CGpwAVDN4dT!N5=pRcP{lWVZ zUm$m^p1Il~eBh0D;M=)60)-kz1l;Tc`40@C3!rs1DrqzNm;bltl|iN%s1rInUy0^E zb+bSaARY{%Hb_cySP)P zDZOk_{`17Qiub>)g(>{$_6E_{UOdJwt5S+8Jf?7C<1V=aGWLO2qSf+w zqYDyGtzBxC_tD`iKG~1x7R$HXCn;iqLPlIrxaFXJEBAH={KE{2=`sW6OH}n1waA+t z&e}sY+;!?9%VHCI?uv}SBvbIHHnME|$`p-{5G@XU+lvJCx9IxC8`S=ho^8@j>)2<0 zwC8D`f#AxoaMl6yk|HfLkKN|FblA(V!=F$!xeL0;3a`2yU(YFQEy{m&1CD3?oYS?kQNqBDb@H)iTsBv@TU>P}Q(16y)0nxF(;)_V13zb(@nuAeRFPud z0|~V~?C^-PL!Y@P#xEl=%=DGwobB~CKWbeYnpUje-X*=J*_d=5;JQ=i+GBZ38#sL( zW7vX~0-hnaC##Wg#X+gXW1$h$=hPwrE)o(iP622eU#*NHUI>=PtfbogN|2>xB4ta> zDre*oB%=CxJzYXYYhC0+_W=LgEhh)^UH=?zO@HPDQiEtC_5}R_aJT$IoX~-H_*q26 zZWHa@MF?;n4jYa0Q;q9nPRh%)Ti~WKGv&VG%Y@k+kj`wQed7%;ls2Q+GV=WQT&?%V z?4gySbM19=9&yym^_)d}$}b?C{aSr`cNma3XjhAbo{NnKHpa^#+}3>QNhvA&k2nxI zC=5-xWxH+~-JT-v$9Y_u_J`V2Glol570)#cM?+D*GSs_r>~Ga6gtb?_qFu5Vuqq&} zvh>cAk}*DjguMw6XJWo*#^lTGxg~WT`Tk#28yHvM5dVY97<=IgEhy8=T>n)X3S7y# zun8579gcJgKHXJ(2e3u^n;u7{7DoIkqH&dBh@2D!_n^zgdTa7oVk<(J3;v4AuR=Vm zO>LPnDAFSEhYF!2@@P=EIoE^dyo~@s@0&xJY9|mXi*FA>5%0`Kq?fz8;;pVwfwuVZ zME`BZtBtfGryUPHE9ZRS+9gs*xsC6ch_;s~((!gioD_CSr_#QvSn)>na3sC}n^v)` z*Z<01Sa03x9g7#;2H}p<`Suuum_3V)fm#`Ffsu`Hdc^1Bl$z+!}AOSlOR*K7KFFn_iD$2h2Bk$+;sN<5tq>6l*JTfQSS+j zIVrKRsPj&W-)T92iZp3xCihma*=*xkxC5RiBTR&ot?OqZ)J+U1-_TJ>v+QIY+yT!w& zJ~3PZ5RYc1To`>}hx>-@r%i{g{|WyJ{bJ!F{cARGu!wnEG-hB`lDg3N)q*_r=qUJZiAcVT`K8+aKNjkb6pWEnxKvmu*6K%oNTU3J^lXS zUSq6%tOvM*xk^@l+}ymb3pMh;5Sv8O5f`*VERJ*cK-G|(3LSCvN0Y&M)~R=Wq^ce& z@g-C2k|p-6V$5*pOjyC+CX%SWQ)vyqdMJ+P&EjUuSxU1@nse2TyWO15BIZ*7&tz00 zK;d1`FU=PLv{efdo+u*XX{|qB9Q!Wd*3&RSFvD81l(-uwZN3rEfqb@Wi!%%Ou<%RV zap?Uo8>dEMn$H0=elIP zbrRb+x!&RY`JaT0n0B_k9u8_Xo>Ux7B3V(BpI8}Ex3*72m z=`+$SH2z571&mA=b77EgU$m=jg*WRk^qOwva7vhR!;rWBI(s;#&0FbF#P0BszD{p* zLQ$q6%}=SD7& z>biYM7EhXF?5OrnSUf->Jg89G2v^@&4*d)vD(h8nE&VWT1+MTJd})V-Ur3AmB@odyd49qX zzg}0uj#(NQT`v8sUO_n6a8!?xrU-Yq!|!Sa7P=c{60Pa$u(4Xk;(UtKc>+_Z`R+JP-w^FHe6ADu*m5M0W*%(<=C`m=8R0^4{u5Cu;R;G)nWSdJ9vbk?| z`TXC$zyIkR=X8_m{ds?0m*?~Gq^s0zkRV!9DcQ&URvbUy{SA&dv)jr*I@r|>vaD!f z$niSpM{9PpY4A zJl32U6I~5ym>>W7h8H)gx<&LuC*Mt8H*)agAve!+0@#G{Gc@eg&yoc9X{i^TH{xZb z$t0+a{q&E!aiRus-+>z3e{am@N@2v0OQlztsW*>2zgXwHrB12?Jra=%`DjNJ=&}2% zS9XUSv)kX+*Pb}!7MWVtvDo|>U94%a&G>p;Yf6d{V&aE1HBpQydA53UA=F~y{N$*m z2fRvRen;kUOj~9IINcJ&UWixmoJRvsfQAz*htZBV8>04&sku6{4m(vGr9Xxf2Jr;d zMQ_>R6sTz^U|qi*7pNF@bF-Hyb;dx$s5b4xp$Jsp;erGb24~3tCJ$B(oY}XyhC$kmQiia%RLYsJ)eEENZH~;~ELg_VK!Ivd*#c=9gZt zxif=@#-e-y7A8p`Rwh1q+4t{>@vSmR5_a6p;&pBbr$zXN#;sZqMkde?J}bSX^cU}U zn~PPu5$o8hmW;1-(iuQ`w2f1VdiWi1V|QK{=*|8cd;>|7DS!4#npFqz9xIU^bkP&$p9d-!Mtd!fB>EdiczrY1Mu^-o>zeC;TtVrsl>HT93FG2C8CV<_ zhQ4pbKQ|~=Gd_YvfHc=XLL{jZOTP^PNni$xk+C!9}FxdI^`3{3xLAyk^nRIKO1KvgF8PLs1 z^)6n){LH;k{{A7VnKDMBsB6LRzV-_EJuI)XtteKa^-20@u1?q$%l0_K_cePPJfeK>5pR>-Yg#2SkFazdA~k4! zuC{J5lRe6Hh2}n=q;M!jt`Jm+4v45LKMt#PvK1mgR7#K`&~2)`)whYB!cE0rG?Y6{tjB@qZjsesReNyV2o#Mztfr{Y2-#4d-n*A|XeJni`8cdQH-ty@S zO|egi95(df-NNSW)LfL7UY3OfbJa~wdiGx`8o^*%mJQ&1;DAsA50jokRg!7KQIesa7%mzRcI*emf9@o`Wif<>REk!^NwiZ8YyyK zAM2^M1$NVe`SLiInK~=`-C6^-!-K=t(@Ue0%_j=9q0e z(;dG5OJ?jwRh0i>aBA5D3I^6ZCRm1eQC*2oQ1-4avAL^&y4+|d-*{P^z?F%UQU9EJh=Gm96)g5fpz#X01V+=`l|QGk$q)XMAoBclW)MNP?*I#&rZr6lXCJNv zYyxUAiDOP1_;gK%&R)E!fw}&HK;DMKci7LYd*3vCfW*79ikqzuDW6|&vPG+KHon|x zo70Q0nQ#8>NGyZc%60O(V+n?9yCep1%fFJ9g@h0EDt9d}trlq@T+w(>LjVz!L@_;# zer#S8PK9+gWg~qa)QTEeMYDHg3r4?wUz0yL>YmqI*Sq=VbYg0^p2FL|!l!uC4{rNU z#w_wda`xg4YzEAvD&QRqFaLrIJ}(097b<1ynu6yJ6P^0kF+L!I?A4K;%0EQdgED17 zc(Y$U8A^>Xgyu=+bc?iX={Jy$rL>)IkZ~&fGCX1eg}|A3r|`|>oSQR{uxKCFc7_}V zj?i|)NVj}^7j3aB8mXk4SF`kS51$bBB;i26`?h^U(&6cOa__GY^-j5sBlB-yo6H`u zJP_Zv(*xG=%tZRmeP~G5()9N8Qx!=T&AE?R#_nbN%Ad_ z@r>1<{k*E#V-ow79@JT1t8CCqbB5OsQY*=$m_An_-iv6F!6iY(*|HaAxl}g}1ZYS? zzICa`+e5jsgYfl*-TrKi@3|8{q6F={4|g^WLv(AdPkNI>u^(?o(%2o|c1a?XCGdj_ z25lrzx1y#c4q1zm?C-VfZMzpWQ(VcP{rreFjj?7GIs;3^4ce%4#|)X9g}Il-ySxcx z$qe_~r$#@kMnrv$_QLF9k-+%nceHUy-9m}la8xib#5B$lcTZOX79o@C#797?hE^WB z{nke!rW;NSuGf1xlY2DGR6T#1pfL2W>JN6X-fJf1^-^)A$hGtHlj#6vr|VU;-+%O$$>NN7z6JZLXjEjFb*ypb!5!^|qVV-KG5xA(i!=pxEL?k(9w8;+J zc8Z^ff@Bd_aauMPd6f9y-5KUhhI5@MY`QvuIUJA=g{t3QyZi>@vOE}a>!Lkq^DWE_ zC;nAA7S3UXcS?y&>G_YF7iSE`WExA|U1FlzU|G)JRQO+sXvA879_fpvU2;Q;SRDlE zb#cEwvnbfoudDdE6#zU!0^dA-c}W@DE2vcRt{Us}wre2Z5$3!jaYI75v4IelTXx!%T*4Dq~xvTzsYQZ49GbFk! zuf9Ph*=;yM2jm$<+y>&0Ggo8~G3DE5aX}6q8Mrw(f$kWRs4BI`k?`pDGl;Ph!#1sd zreNcJnKV7A;eB9B*sprqc;g=f1@~H16AIKzJL_*&{?9DUz069te1rwqJz?jHH%Z-F zgfV})Kn*{k+In}sq&S6uuVjp3&qu$V&0e0LtB9w)m%tONKc;p%#ejTKLLhz2%K8kZ z2&n>w){;O1i&W$H8hiY47watw5Qp@G6n~gwi-ztiwe1WYH_1-#M%B& zK3Tz@+Nt(Z#SVM+HA=8jy^`llF`R$tzEaePYgl1`vv@sRDx3+o`o!~m##`>P()H^U z-x6pUm`(O9B|cm=V4`aV=hHirR7+Px(`IOjJ=2(w@wIR=S2lYDhT3E@4?IBo?F5oWwuMpsc~ zWNLr9MMlyGi7i|0vR3E4Y0Fswp8`*P@I0nWg>?l)??y}`f{#x#LB+1|x1qCQjJF>d z&o|j*<-!}D1UVDIzijS(N*pazO|clrNcg$eHos>7y&*JZ)2f{qdzZ-;K?l<#W~EN& zVtWcLbvuQL8YI3GbkjrE5VJV7KlceZrrE&n0sh(2XnaIL)$mGXjFTXs1(mANSpP|yrZ^uM z-_>K^D%_u`rXE+FC?bbalgX<)58H@u8ElwJUtAbS`bqP2w)_Vb--lVc(zAl0+v_B& z6pw@&ZCbUzH5wuw-(9D8YDySUK6e2Y_vGq74-<+b{9mJcDJkt(b{@6!H$zl8xOX#D zr=Xhye7m8>Zs(uMH>ZAK5V}J97}Z7(p@qNrONRH{BS%Uj{eV1SDB?mjJoojOK zX*L5hvVm_QF=K; z%~_&f-TsiYQQg^-qr2RR@#A!#;YR)d`9FHv2IMBA50S;WA496VXs9>}kW5KNGGUwTGkW z&l5OF9L&K9SG?2rYuhKF%8WS05do>jU*?Z|dCvKfZnfd?j(hHDxd|)#^_#Xktn0sV z%=Ax-c=!3Lc~OJI@!7skHD_L7ZZW`{cRnksU|?IH#A-*~Z9t|4M-*#1(q&txe#68E zlX1>*CZzii$e-*}{k8;r6HzbeJNI0=EEG`vGVm-gS2_&L5Nat$>Rn3?sOg|t1$u25 zt((-9F8ZrN6kV{guZWF7dLc97g$c%2ithFDnkB-Dz5qPs4`j4q+(2zZ7f#PYvX;X2 zl(P=>5@Ab&ucMaBf8uaDmi%Mq4mFG{swCC#$rrwd<{b~O`Flo(M@crX%cMikUVVM7 z`qh!w;u6h-da2y6o<5Vs{(oX4M5kX_(qX z$3!4bS5mhQZvEd<$W(b!B0^xgl^)}_5(R!L??fc8v%-J)DtoX`c)3R;FQ>TvuTe;uj95%hj-as3%D&wKF#;pF(nFEa{Dr)&T zm)6lj-8R@qV&yZB0W$K?k5^0+R_1lYg(kijP&Y1*V%d7!mr2}gr+m*+}+8e(X3 z?x)NE>ZxyOIph53*H1GnEZ>VX*cTDILQOvI`a3mrVEwJRfDR#HF2O9T6rJW%r}XF01-?2Z zrTNGy-26(Y1C%`mMZnrVM>Ce+Ug8p7K8w5Vo3T zdU5tTj)dia)OTw?zc*awj^m!X#1UtisQ0W7}-E zlqg6*&3rLJ4gnYV4~GB+mvg}-{>JnP{!2QcIqlxC3+p+9b)#qLS32YhC5$=(`n6)F zV6h|*XGk~sbIc#a3updiP@RVW11v82qE2WM-#=k;isGa}#_H?zco|MV*t6!oQlBBO z>c1+vNXm7pX^rKm{{OzOF;%`OtKiOgjEz}zdaUy#bqSKcH3u7=XaDbW7&RMHDXoAWrRtjdn+pY1$WeCMGNak z*NGV3j5R@`w`R&1c1$9(^6gr`-=!BYi?nfs%IS>F-}GMtn3>7)H-_9xaX@}AVWdTu zk^jHqh5HSDO+s+~h)0hLTxC{K!C{ZBIZWo+Mer%vbBdemO!)Dv#CLQTFg)8X>4L_z z;=7hhah?}j>aY(nkaCqqnvhkPsTj|xm1@u&PDK!uJQHy%ci{V=?dC$d-Fezkgi-NAA zd~_phgWc!=7Lp0m-*e9!XB`~yAs89ISlki7zJ175Jf4c~woJ{P-so1Uc$Hs9M}>e3 zkTVum5dHP|R<|jyfu*hRXHJWlcFOl;s@|s(J*@W2KK82`_s4ueS53~VRb}$;wbFo1 zPZ6%NWY#doJ~Gp696OdX`njcbH0^CAsuG`M!|(g(h5z$xN|eiW|@R5^C}!&LsvKC3@VL@LzBpf3uIe)x}utY71tyM2d?16R73i zReSdyEaM5&SLUYN0IS@@fzS+B{_@aan6pV&`f>CHGt*RC@swuqeZ<*31a$GRAz^YB z&5FK_={JTcYAu(sZb;ZpkOrJE81s;??#Q9$o{qXXG>p2|RaMB&TH=Qz)7FGW2fik~ zAusTZ;V|R-7ea!OWllV=Z}6*I^@=GX^G~3pc`=g!pv*+ok>!a7c2Qd2@_mWIF`+;V zQ>g|=bhpX*!m=y4WQ|}r@MZ{DIhY{|&Asvkv}6mO3iE4grB>1YJEcfhcdpL#1Eg(! zj~&$fEEpU{JG69%9&h_~xRmL0qMI63j7>DzSIi|k_BTQ`39?$}NG_uJ(M(Y6e&j30cn(+igSvBr{WX?YQf$T4@w9(eGNqbw*dIchZ5PUZ?mf3Waf%u)?>X`-dgvworAN z11FyaiLetX5A&Bbt$MhqVlVPq11GMS^98Ry@z7q^@ew9yLXehKFnjZRReTAATI1ZE zi#zTCk9e>pUkEv2`MWL^2rSF7E}K8nT-#c+qJEmVe~99`qDSq##tgT%Xj)n^uQm-i z#14J@;Uh`LAHr}RkmkN&lE7h%!L;5;97N%wK8UXpn;M7lj*}3s2Aso8U_Ee>q$rv4 z%}T;O znGCOqA!m^?vlaGx5qBu{W2ozo;Njdja<{cwB;%P#MQgHuI74QSI|!KeFy3ajhA7!uA*J?R=f+k+KV|!T z>S5Yn41w2QP-X1nwJ~3|41q`TqWd5q3HHn=3M z!h88jZF|wIDaZ1>$iTpk+;drCo!2TFlA!x4=zGxKrs1<;233_nOG99hoZ)qs$%t?_ zC#VpbXBC0ZpWEUD!Ht_)&2j}{p>e1z{+>i7`K{`R#@;ltZk1n<+q1bu$-*>pO zz{GdRiEZFLiYijR=h!xYSRcDDg}|`^fGUl%UWcsr?HF=HXI6HbNo?zk40pUnR(wwi zn0*r_BpXKr{S&^wclmWmwyMe3yO@ubtjqI~W}XLoF}@3$22mOrhLgx{T`6Pv=83IX zy`Ybrf!bA3t~4^m;_y>HEFEx|mu9b=^r+{h#}0`Vtx1e{UcrEc<6=o$>&YS$=ul(R zoILI{>N7Wo&u~pyfB!Y(t(NIv3_9bF_0K|Pg~;R@@VaXCba#SLclR_+$sKfRzyuSv zL83i`bx9HAUH>DJazF6Rod4;FMpW;*s1F}aW#^c|7{+0}9H3}vUfc63X?miKvZt;m z5mirBkF00;3B+WCsjH0e9}W(RMUyCZ1_61ux@u#5Bk%e<(YCQgxI?%0@V2GAI={Og z8fcA(IAspP*x&u5$oB!I2M&udT%%85nU-7q6J1K()_1>!CcCoN|G*PfzK4=bG~fE8 z&(SJaZC4otlxk^VcGbx81exuf*K?$ck0+BIdESWgNI&uwoC_Qo(xeL$!#;(iwB!$1 zUv{T82c>JIADC!$0p{2eb=a`+b-;$2C?PDtrAB7WF)L1eydV)DsS9VT%!EC3ax=Kq zq_i)=jBgBgtxk}w#lk7R6QUtalpE{t*QB#8u8v@-U@&2X zrIay;{k-ecMB2(2D?)=ZQ0>j{!4?x2^0pkt0HkO&%;qMccGceAb2ujJAt&T)bFK=@ z#~FTs7YR2(kjrMsB>=cOrg?B?wof8;>#2}j32iE5H8x+mI)qUUbN^cg%73qqp$Wz6 zP%bNJ5j>tayRO_@^15ke&Ecn8UVdomGQ9O-a#HhM3Lv%Z?O~RsThMo;p&+LMmw>sw zj)XSe*9T+(FU4L0@5Shiy7h$A4vC7NGVpi5nEdrb-ER;T=2=)SF&pE7mXNm%@whWJ z>maL)R=<0TNW4f=I&=j!1W_n+F^`xFNnlN7mqfU{?34_Ub`kD&Q;bFt>3%9}DY#uQz6P35DMw=(jZ8Q9@d%IK=O z;eV!$w8Tlm`L9=!uS~ta4|Mf9}9t;?t_}%!I17gdOwU)Uhcf_Hd9%pMK zUEAI|%{t$TNst5-7<-MlXtkSxjAi}5`xaf7hbT!AMq(^mnE-MWZ+iZ|U~)t?Ph?zGq1kzU}E*8&qm)nGerpFVnt_k5`bPw8BO*&220fC1JZ?xq{`Xy}FAfPd zZRt|*3k>4kg4w(yhf$^8aIIDrDM(tC=hd$(RaVZgNU27+?LakHjtbARR~krUkw*Xr zqKxO2m9Cqnq%|XsK81!`>8-6s9P_yX>X%$~dN55LkG)&(3ZvkV6Y0z+8r`1dq*ItH zVU+%?6DZklGSgJn*8Q=J%&zpoJ^Iz$$Tb@V6LPO%D<|ka!N^u4cdw?~nz1$e6HH_W z5gu@#4@|1>CM)Ao?fHwVxmc((#?aR69_=$h;4e|*`|r3dF};3Jh3FuE`_T}*J*d!# z?su7){q4=m2k&quq1cIbg|ek-nodG=!PAV&tmjKs;rI9V@fS7}zxO;O*2n!0AgLar z@CLF_CeM?{YQ~DZK2?EHAw+68^m)g1vJQ5e#rN}B0Rwc6{jtZ%`DioI8=8<2zWC8{ z_|EY2rbV}$K#cg-bIoTrGDbB;wmjf5A|gFBfzs97JDgUpvW3?j&Q6JVgk7)VUE4G- z{4y`u5rw(w_VE4suO(DHa{4?|)0NnT@9dxqJ*ysaAYh?l?S}&T=3}%x zhOFy(8RvKa3cQzaT%)otae~KXPFNoPe5z5$sp#Le0ikkuuB_{{W2Z^-@I($~Jvgj5 z4*;15iJWT$HT{6(rMKcFVON^T5pJ5E$(YM3olXN0b&-SCbKWTk%%(9SoQCb6V)hHNrTfhvC1kXkczRp=ADqgOE z0?im}P=#z;ZjV(isJCZZ)E%U5qm7u5$}?c5#XEwC^w&1_)44d44K}?#2G5xsbsF8Z zx+mjHISuKt-iKkoJQpLS{`F};6Uxv3T=Ls`p2wcp8?LZ@nt&L}#QNB5@60%uV0M$M zPY*MN_g4F}8@|(;r|5^=24D7daDDx=AEHWLeqC`Ge;qYc6c+mOIzIVyEoAz$cd4g- zM}kQq+~7aod@)kp!pkDoI>257IM?1)ADx)+bOR%T!=HcW{s2Hh)omrSzo#9>LO~js z17*_leg1^#m7*?g4q_M!|8Xe9TzlH)5U7M|I!B8Tv_h`A-5UelE>CI#;v@}N9`2a& z)(#2Bj3z#-gQ$VS14HMhhwd204072kQc4v52>DGGWI(y%H*kc&7Xb4HzJLu~LmAPz zM=Lweo&CUP+jGP3*X%u%byPEC`us-w3#(*Luu%{cpSsT^tYl;3?1({Ov!(OaMsi@s zb}b>4_VudAy%2WuF3Uc?X<~IQ9uZks-?^sW-U};0 z7X=zW4BY8QIMpvtOrH6#Yh#fJ@+r;R-h*f)=BMC{B}#&=d*kwaVebRJNjE(zV_gab zM2!mYHiAti?k~I3j5oO5cf9+V#T7?T6ll8pMaV^IGbZ3;DME$Ak(5oV4|@Er6eRet zgH+)&B2$wUH^1QIt=zBr zhINHI;Z(?LS-6U)zWkEQe*EGhN%s4LHh@-r8~pQgvlc!RGY)l41F*WTs7FoyRnE)n zxGfKHKP0C_i+J|s{1i^@H*(XPz?49Sc}Mvm~$ zG3yK|Rf}2$S2vlSv`?x9dE6@-UST7MMS_4CyWI|RiZ{^Uz3YXzy2J<{DuL>zXs%kc zQg79l3UdjzMI-!*ZbhBeK5e&My_YLB2q(byd0ei9!IpvPkJ$X zAC#x}98Ecd=SdSEK`9VkjjdJzFKYg4K!bSul33TK$sca%izG(yO}E!w(J%{L*QwjB-}RQ*z4w&XnEFo zz2m&oql1VvggfZ)x-~GCy-85(0Qof^>5&7{jQ%Tp;Zhl_PYF`(^YdaTMWnYVErXiD zJwR>%G~pVF)LNasUa~K{%9-0Q)jHMJ3h@7M+d@*BD#;^jB4^uIY@O2WCL|b0EMFC@ z%$0ED*TEWT)!*GO!BC82*`|NJaY+%5SKNJE#ojoeId|oLZ86b1(%KKloTvNORfpv7sE zA<{ru_7hMiidGiWT2eFS&xZ}RL8ywSO3w%|~Kj_>sh?oHfF#16kJ`~;PoxDW5T zw$H5b`q_T_bL51R=d5%zV8hip>|5&Sf+V{WEb@TmWE5i|2DyrAwi3j(YidiD0ISJB z)Zu6Xt{~UyPup~5@yotHNeM51j?M$E`f<9H`8Zmq-T-bs~;8h=YmOj#2EIR#48B!uFQw(i{*Z>3Okre8GROm6b_qucTOrwQo) z5Y5lv#@6fQ{BmA_lPW24gOc5PmRs>|!e(z3L2A|^Gb zL+ndjNs`$rNgL^ti%iX}&iI`a*cNaixSPH!`sz)Y89lj&5|rxo-Z^gTl|o{+RMwGHou@lR>bwZ zsJ(5;Pu{yB&d+!U8><)aHizGG(IYPxr&rUB_O>0ytKHuKPMCimd_#t%+@mvaJk1$e zE(utq8Y}7JGC=#I+5v1E__Ru}tzN#k``1muR$)dkYhrZxRvqrG9PssmfgB?^P>>q4 zHOX@y5_Zg1htBGk_gE{zUamfeI6ujAJO?}Xe*fIS?>B;e>ns6&RRbjwDm`$aTvBHu zLEuVBK+FdIhiE9^Ja^m-1|Gh-fqFd%)^#CFBZsj;cHX+*no>B7+oW(mdG+G8_&$1k zVC*5VYT)_y_9Au$+gxC(zj*v)_m}T6JT(YWP%z^1#4~cnFtQ|;?7FtAERQ6`F-*>$Y}Ovi7Z;Z zUo;M69C6u??%w--&a3a!hO;%;&p09NwvmD;rJc*EpWT60@FVmcjmqYy*#`s^Yx>}} z(5BX-=Q&?++yDN8a+U++6PIrL0N6)%^{OQ`_`kjT3CUq&FE@8XWMu-1^rY{mV%#f?b?<5^t_UC|lmr z(J%TWI0OGf34Nt6PUio3hk;bq=v{gBI_A?@tG^y?ddU87z~6+mD+u&%$Ez!Lso~=HM^M>jpH|_qEr8q7b{)% zXxiB7F>gf+OMrHp$Vo43Xb!G$r5$f_-fKQ)xl%}qUhk)S5B0s zId0pf#k&ndg)<1RA?~IpZGYr5A3Y~c&QCXVPKzB&XzRY1c9l2H^Gv=aGI+nwL;-JI zwatuBdl~c_<`Ci}DF1DqRxtEN=9TW}Z%FD0&3noMq7UJ7O5Qr8c z5>j&pn|;`+?;|f}|M4&yzMi#E)vG7)QBuC+S#BzUFU_;wONOE^Z{4Y?Y4s#GHLvB8 zNbTaLoiA|+hG(+ofMwaK^>Lig1j5rjvHOqTZ`~4vlZ}#=mcG8ikMvRX_KrwajM^gz zZi@x?!=|&u_(S4Ifu91Kms&tQpn0xEFY1?gNht(Sw)bRRuSr;k0c#>~zo^sC6{cR# zQTsH5*djP3Nz2E-p(0}G#ZiMuxITozYS9(tcKyGa>l#t)ErJYzz(!GaiyzV8jE1m9 zZ}+Sy>{5P@xq#=H5%1ot{ouND8i}S4r@oxUnWWHq%qMB03dtUD>XuD6K~!YZCIwp^ zX_P3mkm#isKX`r>;M!TT71la*JPLxP%| z7*=A3`}u5M8x&U`nc$Q58J2Eb3iiJLVa=9^|15J?$vVZVPs$R)wO@QES+2yZfLl*C z+NBfAWh)W0JGNc}e|?{&!!&;KzxD*!C9>$@gvBm>qDd?*I+9dCM8*SXV!=IRtae+W9PG=a9hBjD;QAkuJ~{!2j*ujRy#aw)J-V1t zQo*+KL5%UdMuF%S)w=MJ@fv5wQ2i}+$Rsb-HA(fPG!IcR#85?EQA~WNeb(_CZ4dQ9 zN~zbw`vxykju?BMKg8z}h*F+egD}rWyF?0`#@5L_PCeRYlp1nGC-5(Q?~MBCTF(#o zs0RWIagzP#oix#tQmb{P`eA#$tMKftbtWqkG?f2x_-fjJIiS)ze?~`$QA|l;nWw~a zWUs)_4iNgcDO*0hvWp;2x6d{O1qN7y2JyWRFy+H)lOnRe1o&a|gP9{jXeOzT=YF-9 zO)=cJO6qhk!3APwNGsBaQeJFiI4@p51xL2ZSP|L1;-FMJ`mY~mo^80g$>C71W|&6> zTGE>OZXVJDie}&iW8{NDXAc>s>(j*ggm>lAUL?;X*EXkfC@TT&DIt5e(y84}uRjrt z7*YWWvg?Hmar3TsII=YxDCG!=^c#G948ighlSS%Rmp;|$k4qVE0Wo?+V7&{B2T&nPdifB@c1GriHr)^okaM~%`qTOk%nk&@vutP|@ zSC{VBjk^|XuhX(D_kaSr(`gRQ=Fg{Lyb+BvN@{i z!$+39MxH%>imjSoLR7{#-Km<(9eZ-!#c%vrxnP1(7DMPZ|MZ5`0JY=y7Cz`Jhek@x zWu$sYxUn6f$k~<~xBC7U>t&OsT58BVlJiEY$9Qs5z?b|5XjJH;!vX<9D#A9UTzx?r+ee^lZAZ4^N2iXObL!%g-Bg#bWD4+rw;{Gp=A`GZ; zH+0f8ZF4&FKJ0w4!1-t+v0oyJ+yF93hP!5<}Jp!dfzbb5*J+hGW)Ul)yq3 zV7fbWP*0-=oPXjeLniAdBV5Up(@$$+Cm|?oG;0&2EiziNsjXd04h(*~*&LGq?BZVk$qS5FcFS>)XcbsR-|d7m-w8x> z&nqCq0ZvH0_ACO&la(=mvVvdSNS@$aPtD~Q8RdGv<_C#|hoYD6NH>&%7 zm6(mabO$%4(FgwA4LD5$tu=PX2$VV6qY$-gm=apfFt6|P=#fDjM?NTTRou(=q?fu} z6nACA<5)r#y6BDqBu)2{ za1SOoUlO{`{*1i)Bu=tibA6!Srd+>%(*mFH+{A3+(n2ghK-*AFFcwo9YxflfZEX%XAHmX1GY=HBh{gb%T87U zUbx}nv`)vEcJlJE11AJ*oOBkaC20Xs?0JBgTdp|!WX@MqPp$uD?C zymY$VA35FTQ$Z&ML)Kbh4pT>8e)#k6O>BL?S$8g00ZrUJn=b2Iask!Ekvwa1>_oU| zj)`w2`Msr(29q%=w&lrz6|>jd?k)~O<8Sw)t0<&BcgIx^bck8aR!O1_^@*7%z!9@k z-jBXoc3%)V%3nBU^ihJa0BTCIXJQ^NSESbFKL`qRPLejJ_k zCD85VXP+O}e$?ncNRk{DqGu96P+HI_gJH@t;FF#lM$edJowgACRvTbw4WTQ#wXyf! zyQIZ#X6(j&@w?DN%e2DH3({Lou%AO!^9#gGuOIWuL6?GQ#&wo`!H`BFb1=;ko!CB1 zw`|+R?D0Z(V1prDr2FH0$!C{F`HZXoO}>?Z#1)i~icSa?sZSJo(`+G5iK>=abCdP$ zhKElSukn*G^YCu+so{Qy8{oO*idc8}$$!48;?5>+Ws#br&m%C3ydSMy1>Az+xq&D3 zo7u{hbLvM}mm-&oz9+~FO^Wt!0RIxI7TREAVKLM%#qr${s8 zN>X>Ka~V>~p|KGxWQR>rpODKVs zgG?*VSb}=iP12;^68vGRp%%nDs>~K3aP~h9TV=GWt&gr<)20%+Z@tA5`3h7vr@V40 zEN%38ptoQ}zR{1W>BBIJM9co#$>zA!Hlvq4Y7(`B+g%C75QC>#VTFKjlTjBtr`Y(+ zQ2IquB=l(Z`s~4ZkGWNC%ty2BmsoFJLwPf$Pkw)aVL7u7NS&sSkB!(JPFt+xzISgq zQB-}R?4HN?oy`Rb+<$yEX*m-(lMZLd;VrvYV&Uh=<8wjRaq~+a@Qwm|FRcOcBxaX0e0#z_@yeUlinuH&o{?HO)=5=2~+FogCi$vfPV- zWzxZtVA##k4ttfq1C)2VK$8h3(U)S6$t6E-bZpsVvIwzSL1UrRpwzOVYEo}6vjxL0 zJf3ExEthnzXn1I4|KfpYH4dlo+}WfBNt|*8d!?{ciG-}FEDcg@Wi|RArcN27r0|lAJ%2E#@ z-1xkcj+7b`B9KAWfWcw8SG+W#K(&+G;}BPK)nrQ)T#5uPc2E@VHd&5AqV3UK%fyzwWJZ=?3Ihv)3_ z6n=7|8upPdBXGY;zg7lCjKQ{yokz&!`gC#?;qIt;dFIToj??~#PskRMU zE4sb>Z$zE3D>NS*_JH%TI=_pVqF}0L_GvtS(LTEhLzMCea#yjg&Yk`W_}!pag)ijWe74Q8VEF z3EvT?gFs;*iS;M79Vdt)KC^PL;7YS>e*TBwgOVhZFF%=o;7sWn)SOxV$?CmIP6D@e zW1^@5DJki%0O1YZsAfde|9b6D?B)#e5z$2#vqNhx4yqwqchg!>-I$w%eV;|^a*J=) z;j_!iT(JWdTXHR#pjme2yN=80h9h7~V6Wk!Ohrw}RBQboQ{NuXv=t|=XD`d?f@-O2QyRl*DgW@uM!RAE@su{m3e9us^{P;=TpK( zOdK>3vbfj@?2L|IKk|#~nMH13q{TtnA!eol%`6J0*)okAHq0<*$xgK=zpghCH_$0i z(xkLs@b6HdU$~zUPJ+Jv^KcUPB}J*^h5}>8&h99SH-P}N*qQWU)u8ZGFOlZgvDqTA z&|3gb@ld?Vz3DFH_Zjr4=Jm8u@*LE;pSN$*v;U@-|2}z=n)5><)cO;TW@Uk5`b__w z-O7Ehd|+NMTyW@bw3%*Y%^fQMSt{YC4E9o(H{GqyoK8OB8~`uU{#r_+|2}7ViLVTB zeeh@ahFK2{ONGs4CrBk4=<-nfkFS{(5gWHi5u&e!WE_@CNE$bYlrW7q}Yc&)z_h^6_1)X*u;-ZWa zPXX~bnwnvQ5#0VJRl$ck?M#ael;XKoV-uPtuQe~a^7xSZ30@|?BSwi!c_VG<@79Uya=0^hT_Lv= zfA5c3S@s#k@vT{!g(7M~ zlPi@z$ZWTkEwF?SU)-`Gst&5&tSL&RDNW!F!s+#1r!X7ibeXoRAyp@sX`|xhr+7tj z`I$CZ8fGAmuh3Vdm%ZBBf9_OXk_D-cX1yx%Jwy6IL5HerNoCu`Ke5M;bCj$P0m=pp zlN#(|Vlku7SB#o7v_=MXw6n6$Z4!Uk4rHx9zWX&^?WrHH#Pqfzb7N5*DB_D&@b8TX zcSy=TSEV6cW6mkc(>-stMb~a@5jzCF&ciL1KDSk08B&RQ7ar4}-XqvuC%lY*d+@@X zW{C$M?hl;)VF}VnG;|GR^hy0NFU<}QMD!WKiut)$_>?SB$8`rJU37rlJXhf4hik(> zU9?Ahh3AryDyV-f+J|7{i}DEw4kGQ)W4M^3N9%L*{5eew!XLBL8Or;u9CP~Dhc`(P zo0=nsj0ld1_CZfHM3tLmC<>8?I5#6=%7y=d6bYL$@?gN&%0tu5uL4;E19wuLe8zAA zfQFu?ve*t|R|B#2A^ZAJ1CNC*Z_FoepPHge*)km8M*U;4xGJ_JM>+{2$qWCFjW_3J zg!2f7KrM6a(=cfU_qK&UO@4heZr)+CO|byJYn1maS7{FceIH#42|Z5LDiK;dt{7vl zieBu2wu2fG?S~!D#l+O8tdY3w(D4CJPnx`>67-&wZtx zbfdo@R6ID~%DOG|O0~1{9oIY_`<-=YY4glYXqV`^>HIQS#|e>OM|`tFICsTO@GGYP zd^`L04f`&WC1hsy!%1C#EVvz8V2jj^;;kbcixv!;74td)q@MOUOXeC}c~W-p2bviE z!#MAp4b5;$u=XbXPU?Xi2$k=XCdw?VIcxBKX7W-G)meL9UvR7X%^{^y36BIQDXu&u z-J9=lzqqHJZL@_~zu(4p77}TyTuHG=Ii*1dQ4QO7BJV)?iDpOXE|ZFWc-@qF!JuW{ zJhZFw$zzX~1cSEOqfU1C7uw#xfWLg!LEC}S5t{w6Bk?&WWp3sym@0nu9oX$fMrl*B z-oTCwL)5HBd_mPfStL0iyGCik==Dg;IfN>(PLAN$A*!}yMFK>Kip7|bQKVEQNYeDP zI=S$-GAK{AQk9&K$6cnNHkt+h{6Jxq$;}H$cP%$D?>u-W_B!%ng3+@OIFzbmh=6`eO04MQ5s~xT4h!+w%5b{`xPCBnj7$NWmFe?<$pkW%CiB*49gbOC z7>e+`;J;5k2G}zk%lh&~iTlf>jcsA}#IuTDKT@gVvttRBp+Ca@z|BgNU*zseDJ}va zXB7`eg&i1NW&@D--QRyZIa?T_GWqseW5O?O!Nm=8!HV}+z0Y3#;oec`qEwQBlmxIH z_v#AirMj4hQX>|<3Ei<*e)v0P($}VYt$s1CGvIA1Uev_aCuOtp7x3o2ZUbXfa^AoNd~)x}@nyK-?pdk) z0R^VpbGO_(sd`g#V2I0td{)tM1fzVLoJ*wltHrWVaRVx0Cs0}q$lZ6H@{`!MSC)|J z_KG@~=r176FZapiQy|Y!$`j{IgGDAxJq1*qn}~>gQHke@(|JbcqG2Y2$G%l@>zG zl`r+j3T+i>2LZEh*9Pz#J1@XJKUQ+!?BtJ+Rtzn^^$x?+uLkByRdLh4rEfW)S;){8 zXUOdy@gvI2eheylG#vG1Tz8rqKBz~6Lk^#4JU(m}44ygd0VO)YaP6JQP67v{+e@1f zLgp_F2OM0r&zp0Nt5Lq4!8N=cKl-S$>!r8E30jq->AZ)k&u4{)45f#Wy=TOKX!Nqz zr5W#7{;sf{y#;rTe6g}tz}nvyTp^~7s{w^)#!NCc9{zRaQTzR8;`c_ipb>c9+)^22 z5gOqlnIZINuo6yuV^bq)*^e zIWXqd*CD}h&vP?eGn=RyKeHvH#qSK7_pSCFt*he7oh4jf^t@ep1ia_jj>e`k*#GgMyw&2!aI6{6nOIi?`D zuV36$rI|h!=ks}yESBcjrV&T)DRH?|3F@=@*#Q0OXYI;9=WljC4nG0@&fNRiEsxG#f~a(z!!e%xeg>P zHNM>}0gb$}c&%y<`OBU_b}2>tYrG%Q>QbxMxVLb4XoW3o$*m&C^pFqQU`~3U#9V7~ zGdY`{NKq)=E&IHBM_%OP>Wl-a>;Yu1PfPjjMN-EPy-9{2WT~|Lv)r?#>g)r-dJia8 z#|-kw%VJ*B@9Z;#>3JN&K56>BZXc;s%l7cXFWAw5%AZTEMZU9pKxpu^k)`6u4;R08 ztgL4CQ*!Qk0+(~uB>&zn#oTT0&V=?bGcjG_I>Q3LSAHi%pIZw2Q;b2dQzds7$WEWH zNETwR)`$*Rpv)|#(@toTFXUZ{6`W4jeK17a4=JsI@K>cbNL}d5<+}$?j`bbmdv>lY zYL85ET+s-s0PH)!{=!r+TNL!c@+sn$_nUC8uedg9{HxVJQ?Z$#h%Fu#o*j$H4>OVRx&hPW5UOw%g6|@Lj%eT%4!=nfU8m54sPhWTz^6I=L-vX=3y9CAJ~rn; zO0uq^0p0*#0@czq^E3q4wgtRlk0t8(w0sTSdrR-SLW#GXZ0cNN+mW4W1T#yw05OT| z+9PdShkc2P+2qYvubypojlboyfA)jpZVCCP>B38+`zzm-HZ}g4k16Sv#x;)N} zNo>;|IO5!|zhb_D<|#MN-5M8k$Oet1SjZIxohaGjfkBpZ&?*zY$~6CZoygrv@JP7E zT=UIjnQ^_*L2G{cx8?2zg?% zU1t;GBLf&Fh~+kA9hsEnC$BdNy@}|N77pbypHl#Bkpz)e z?!Dg^FztWmP#I0j`&2Y?lVn`h9lqC{Ty8G^6k?%Jm77fq6bH$t{t`BtOE;H0a<9A? zhzBzWHs~yZCvWq9BsBQ_IeD|onxurI);g|lc(?BEp5GM1Uwh*CN4Kn?QiQm9nmF8X z&(ixfs0?E0|6tjtDQ<>pO{7RQp$8ZfBg>$si7qpJuc#t)YH*mZs2UeQlWTManfx@s zKa#92LU<5={uNP&N55N^3L!vyj{{JJS?{R8B4C#At9|nR-9*x|<{scobb{lqt%e&+ zhom>ETtL=IZ4aTBZ{7IgXOEustdyP`N_|DljR!tYI39MebHSiPb(y@J5fyiU;r$_} z>ecL=gJVlV6!+^@08y5^aqQEeS^g-7TB45FnYA-T|JS+U+#3j=rpmVlK1^~O2J2~& z{{3`@+K^Pu!Ato^Etq8xSHD-|CM_5fhbU%lvTqb3)f<61v75N$?p1xvrk=kF&jI@% ze8RF6XG!AYeXTTouS~z};+=0#g;UP#xL|;CO{b;@Ft{n3b`P3h@?0+a-;V2RP7L{c zQDdU84K=Y@6-t^7Y1W8_BiGy!+ex6R1l17y;2{$?1=F~BM5JrMqF`ROv}kYXjKsdc z+;zh@q^2v(Z(dq%xNh|Bm~ywPM~HcD?*kmArAY4m`PB5p)@HHhA0}YX9lkZ@xNQb9 z5&l48g)fwTvR^br_;0?-byCTXR1~z6Fs;D`FY&AUlC>WJiHP)ztf%#M3B z@5{}@s_4!p8K|vmn9;XX?l>2BdRnDl`O`4#HQa^EbQsz%{@a2NOF}0-^;kcPfawZ# z$0(UC!O++aq+T4uGvU~v(W2x}=|Vg(h6lv2O$uJ7AP|x@FMQ6s#9zzgi;E2`Ej4SG zFdb;NL^{9?k^!n#mX|-;UEU`HJ179TV%Gx}Ntr&Y;!ehwp$J_OKROFTx8R0J)cY?6 z)x<~bbY2iXB8UpU_(3%tQR^F`ZP}@MP~wsKDCJa22Qqe`JdFM5@A_+;!WF)mv)Q|Z z$jT~+W4$0;BR7RcgC*){?yrVW8HdM*4n|P8{(GG$H@Kd$v)o|$3kUQr3gvteR|dUm zx!1U>u$Urgf??dmp{IRS2X?FkT$E{#B}f@MiodRzB}eR;3^lJHnT|>CiT;`5c(os# zUKEN4{dPLdX^;L!SZM$g994)fmET`3MAq%v&J~PCD)}TCHOk+fUR*u?oG>`&MGj7s zR8*96%Tw{>c>l~ZpZVM~8wcenPW|E{%}Yhc<)M)GcWaJfwD2X`R;C0TFgg~(6~Ys< zKJ$;J#o7wfbSAS#DV|SN$98cRwRx$B>zlXi| z#Mo7bCvodAX=e9ZcUF7d9C7@bTk|kC{gfqiml|K4`GmJ5@4kXV=6Y6LnhZ}3B4|ZE zYQKfP?sZ_DluD`0=u4TVj}}h@N@~)!QW*_RGK$gFbo|~bwtG2R38Tmll$$A+FqkT9 znk>8Z(E1N@#xk(GRLldIv%?*@XUfsA~n$ycwSBdX%t#6`VRZ_I+s65uAdr4P)aM38|Gh2iAu1Z= z+tz6qWJQ5S%tC|qFPryoirzo#u9@`td1Heihtt`7%|g58sKq$)(Z)Ri*g5q~nLzGs z6qkGc5e9BL>Vdi39fysIKet`B_Ws4nHulZrezFg^=?BqvBW7d#EnO<}O~Y~b6iw)w zR*>27GM)Z>*+6X4NamonSlnyRHQB5%%QuK47r(Hca#E>evr2F#m;2rcuq__ zxJ7VzmdRXP&JhYa3^}cLY6#4Vq)6g35{X@^G5F=rHHJ-w*KS^cM@U%HmpszBO)sP@ zHhqj% zWJ#C!vl@ISV7MO@K^f&!(xyZ#jFm_bC%V(!&C}8H8cT^iX)5?jZ`&inN^5iU%RQeM zA{1q>!3&u?OHYPiBifsd5oA;P$3^Z^kA6Ow8#@6LifJV|Ozl`t|F@tHqAdey z!es$!X#JoeT$TZM##*Evh^32vRkSFC+&o0{T^LB3hnio_Iw&G|-!|Wf?VV>pYH&Ps zY3l`ySmPT2wNy&gp~s13gUwyg^+c1tn$7-SR7b9962>LwfS`Eb@1*AGhMd@dQ$?L zlCKGfp}g;cQmd5ddY@5T`&XmHpyfOvpSX*HzTp?oWuzD^P8&qG@*F>qqvl`Hq{+!{ z36cHVd}%uhyC+m)+bd}5k0EyB!I3z^XvLXtbq|Ve0gY>mEV-=Tb4L`{z8GJVH)Bw# z9xx8oCp`%oMC@$XT;&@aWL2%SvHIc!RhVS**Q)e;459bb{Z)boUm261w{dq2bIS!x z3vHb@&|)7?;yXI!>8MBi)x`G8zp%Y!P}#7CN z9Mm*eM2^H6VVJ7b?#UnOyX5$JFMW;Mu~1oYWdHF-SW?$zd-oR4T0h7xJQZTG zQoLd4B0ScDpUeNwV307=5<-^#(0wo;6P&8H_w9`DZhW=-$aH_LV9X80%pG{gxiob- z8{AlGcE!I3GeuTXGv5u;(!U_OKD0;q;tzY?Jg>+;7qk)z*TRpX1vUx%D9Fio!9a2G$w6$; z0VF9d3hC}W1&G_N?k%fkz8DS=KlUy6ACjap`cta^I4sjWUN)G;{h>4AIIBwBcAw?H zr4nLVkFA4cA(!G5G~}<43pw3JBis#IUdW?PESIZ3RR^@vl$}7hxMWhlq*yrAAaNc5 zOCUY^cOT<`QtBt0Ri(@~vNIsRJh8Mz$SthR zt368FDGU9&Pp**b7vp?u)p=^9VXKl8o=qK(Q<-#_xkrq4T11;!STdkopfM%5)AQBQ zNXRdHpY*P%6q8sf14*&nr81F-MPaj6+AhQ1TBeTT1qhAKaZa1Tiy2L3I@ZBjY-6bF z!qPJ`G&R^CCaw1Hfxi6oHK#4Zq_wA)Vr53dFMI7RL1b63mTYHYk_<*>=rdU_Ag`^0 z`@wz!>qu8d5#|I5s?!lm2lfU4w*|g$R#)>M%aD`pp)e{xo_4~w`0iF*rp{@njCaM@ zAcL1G{ZY*GZ1M7rNSSJzFD;7sFmKF*u(Bwwk+UoeMrU;;Y&LLx`F$y{RL(DJ-w<8b zG^6yQ72Uq+&R!{B-DG#a$oE6mExA2P`G2Uq&(yZai06b%@-_p?&X>8KEkR`a=GT&W%X`bXMQvowa0CJveCQG`tX3O^`j5Ew_U}DN_)8(dH|Om>_Vyu zg_<#^ZAdkEx7V+g#HGC{|NOlkY8)zFKDZVsrJh5DhzYGlagzZ(5m^pLT2$>)PWVX_ zGv0XTY2~uWn|G7s^SCIT{)V_ktm+B~jPAf?@;_OujPv`TBRmn7g@7D`#qXw64;$3x zG&2XNxe z|MYmW-X3nx3dJH%ZF_K>38qcmvF*%R#|?(QU*k?M$PK7*rB!;m@ifBzbtD%5$e3K* z*0c8qKJQl5m2-JQoG-maxLz2K!#6Lp0F&EDpYV$d`i>pI_J;L~%_^sOJ!RsSguyRg z_aqexgPlVRJ%26Jw5L!4x`o6uo5&#frVF(b!%Y}mO9fOaZS{K+DP_<;$C2I9dUmtN zOSpM34<7SG+tFCdJb##IS1y42=G14TB*(V*M?GCH1KATzUdutX?XKmRm)l9G`Qn(F zJ}|#DjeR^Fuq)1plh2Y{bJOSJmW&EK#_cvA+ARc;7_J*K_6kkhe#HK!^8F?2H@&mE z?b%1!j}8{{=q4H#QxF$ERi~Pj%1=@T%<;QaoVIRo`lF68ttYtEn%0^}F{?t#Mo+L7 zyo}@_GXf{Rp^dh9qfl)KA5)aDTi6zS6(;YTcCxc@+C z27+{aXKJOvGhct;WD(?KxqVqw^Za|#W$e5|;yd;#u~cSapZqm2j9hm-=so^=B2jbH zvmO|Yct408SUAYdWSuY6cwzMc{r;jpz|8XT2yAOS(imsE?x+ehtQC`>6ibs8i5qmx zBgYgqo}I5I<2IA}ERMbNdjALnsx}cewYIeqcaiAVh5CG3jh3oXugWiI&o7kskXa+& z@&V~+Y0KPwhhX~0>-VTQm?S~q@TtQL)u%~b6YJZ4=x*q!ku^Fu_GOCm-D|9vw;!v& zsR`^CKW+YTsaf7_VQz^o_3xu`F#^O297yL$ztH>dCW`2boQO5`tP9%@^N)3nFme} z1GO8wr)XU^C^nbYPpP@9-SwHIRGLgwt2r}V3<+n#jo{b6up@VZ_qM*Cp=)0pgcIuUo1aAZTn>nX)kyjHf+WAXidhosQq?dS3-crHjY0G$&vE4@-s=6}G_ z*E^=b4j@TFFGZnk?Gn@D-4r8$z1A`Es541azKDy&cOT;0eE4TZejiS2J+O2rN2vL2(=uaVk4fT-5 zOwpChQyuNxkLfq2lmP64jdHW||DjGEw{u{i{7@kG%z;jtl3NrU+uD8yHW)B9MZS!m zl1x!*(1MCAL;^zm-8vFOK=S|*i6u#h9cCDnfo_o?L6z77@!c$J@U;GT>O_T9;e{;*RFFw*f+(sWFf@2-xeG3C=Po zu8=lT$)$uLbFs>gKKu$y0~PgTO6rhmaY$i=7&Z72-}M1jrgQw&JYXru9e$M>_NdD` zL;k?=7RymDlf!plOh${0-*((cHData>YzC7^-6Z8`)4Agpk%qYPma}m!UrRJp>X)F zu=Ct)mj;oGbeyD)*TAGwLf@|2k%;yK)OH5EtnI?$FVG=($igufb~3U)={}shBl^nk zUUApba%dAci&SR+c9&UE^c^fV$d9d%P^;;R4mnEZciO=M6^qFWU3C zo`lY@0`rfjAoT=f6CQ9unmr-?S(5PB$$w^>R>KoMaKW1P*06BJoP?iOby}UJCm#gArmpxGvoLz{&OTypO6hf{U;3Uz^i^*} zE0&6tUqD~@z8W!&EE)R9(QO|hZu$%~V07f9N~sE-JN-)?nKy>tx~WhqU+sxS8y+uw zgIdNEgQyHUz|=?r;{iO>d7}w_tFPPj_*HEwH2{*~==i7gYd^*yKn1;9=LeB(43XI{ z-&eRyjr@x(PnA%_x874B0D^qLAOYXHgB@1J%+MQIseQQi&2L_X3|js23X9IkjLNd$ zW=M*Jvzs;BsZ_FkDm<7VexmU{29$xR4!pOb=#rorc&EQXTrUm=(tN(Tm~_BX+(dqW zYC4WjQ`F2wSB;gn9RJIi2Zi|jg1sL#L9u7Y8`)Dznp=p;(U zIchT^MeF9{`vGLJZAgeC&s3GN9~dn^H8P4N`gui@*!S`8zQ|kiuF*5@m$vbbs$)-f zFwD-!S#mw(*HXzghOWDvHQ(;@<;|+4)Z`=J7Q(37lw%=d;EbLxA zDwryn)h&1^bCEu_BKSj84t!GkNB9-+`kUIm+o*en#HQRjbXPdEDAaAzm}WT4X&_?R z0qVIQulnEt?p=v@=*io`1JNfAt}04<@CoB zW8ey&dmolR2%VtPB5j{Yi)E^ut?07VBM?|~Pb(0EgtP{rd}vKX*aHKWLDoK*5>5tx zi>7mId;Hp<^UBf&$o5`7iN(p|0uJ+0o`uW|xPc$U-{}Q!$!Rqn3>byF#E?J9T(wY0 z?UTFf&-d;aVc^Z_QAqJUm+Z!aS$j4k<<`l?<}LQXi3o?<%TpszcNlv3>tXVKrL*_> zXAL?9Y>CXYzql?MX47q5$QjA+%mD$`65Lnu#PMmEEpWe08ujDjE1BJ6=x!3xNCNxO zO~GYM)Dv`OZ2BSO%!WQEFY-?gYAfTY_=+TSSKQeg!FOJ>=+AJN10?I{5;b&B7FGqZ zr$g|kFgctO@|w$y1HGOLPKr;>tz*!Aft2}GE(qB;KSo{OxGBMP58%!E-P98D(Rlk5 z85^#oRF+38jzZv`(u?iaD>^LsK4{=r^*_x2RW75Mieca7@MK0o=Zdn_WxwA+=uF;C zlHz3)ukREQPoE57)GZ?-QzRM?k;8sa4EexO@F`4ANQJ&uFtg9iGC5b= zjDrOG*FpJvv20`E$=@gZOQ{(}SjeOc(U7=_;!$J@+Fe2apYu(F+--n)jbMJxQYajAMJIa>96j6Axl{~coswlU3%VeO<&J^o<33v)p^U$ZxZ#JgnoEn z6mOP6pEjZ>qGBa(4QbtY-WCBU6Oh&<1m1Xn(GDt(fuqiakS3iqG1VqE$dgOa{iR;; z_sP%TyH%skZ6#gFdGUT`cMEWVlG4v?tAG4OXW6ob+*hYf$d`?**!q6R~YtUV=X)y~!Hp zPi;1mG4hDDmxi%VBdUHJ6pZl$SdbCo<=(vm^4a7-7OGDt28d<-{sfueqTonQJ41

do;ns7uTz2_U{M~{7t)d(cgezC`MIHsvRGKRy1{60(Qr+6VLFxmCv&{>EEfIym z=qHQw`!;p{0T!wj?dBu%JS3l)Ey(IVG}=EkH96i(an^hX^VI5DyjbI!s8mpXXJ-&Y zFuhEk<*7KnHC~^dTh=YU-B6n-bI%8blT_Y7Yd*j*6GqJV z;U5|fy(Y!a00UIsPwwTmDD|nmuCtEsFUlNlFdBfb-<+a~f;;1=w*H%&p)<3^{Nwsn)kzSb|MK&gm<=ZJ{x_Wu!wA0Vy0EOv}$+EM389dPS zL>TTu{1o%f2qm|B39RmNRZhN4(|L+wRtuEm*aYCFP)E^|2)4q5TBh!R{NqE|F)nQ5 z%AYA=ts9bikB!G(=}UsS8I~j)?>+_F%6Q86t1P`dp%|7~iwraLJEY*k5&EBeq!h!t z+29@t9-Ji^)Gfr%886(v3Xz-=8EU-}@Aq_i*yr?GC#0bHRd-B2W?p(ose4oluO_Ta$6 zBm#Vy=xKT5Gb3Z3N_Su5B)7NKYvC*JgU&9_>h_r4R_XzhA=1~Xr&&Ka)WytQWS&LFOT) zIO7t{0`Fd}^xO)4sFoHl|4#vCLYCF)_p5&z;Wy^%r(asYj_l;VAd#W2d=6*T|A- zl?6$$!zrqw>zbYFL~*h|G@qTJbvNi%|I^R}0qX67FzPE6gcRIRW@^t<2}e;2M-(z} zjnh27ALV?*<@cLhVPfvP_APNGzY|v2BQ7iZ+Ia&Vp47vniX-a#W0ukq%b;T6nu^jm z#LI!9Jmi9!9|Ig zNo2`cDH-|92}ooa*M#wwc@7zs+2Hq1?2YHHcuOmsWH z5=pQiptixd3@+Be_H{iIFoX?8BFI8!BFD*Q2UT}$NRNfOu_V;(Gmmiax+@oIFd(Th zPgRWC&E291V7W`}on$T3e+!rql=68a6rqPe0nyCd0~E4;RM6d150Npnr%|fsZkFg! z`aX4OLJ@BR?VsJ5;FBekh50Ed=o0_ojxhQM)7%W+MjNz5zA3!D{0)6@nxJ~7E57Yg zFE%&x?XaN5XJukqrCWpwY+P^ZestIr3x)HUafd29pswwi-tbzXl${XD*Rg`6TxvRv5wv$S#AWjW6N?vcm!pQaKdlkXw*G`m`*tWr607F&}y z*62u{WHF(eK=wcTE0Z)BG+G{4|0h#?Ls@n~L`^_0j8t;X8TeJqL*@QOczDTH@k2nG zk__7|Lzjh`n^uw5sLUZc_BKYYodE3q=p(!>*>W%+J;$lD)kp+!1 zi{Rac?d6%jk!d98h(~iXETQyC!mCw3{Ox3~=i#J-d@bQ*$PJlev*GME6xnji{LR;D zf|=C{pS4s73BnEk>GsyDLvHnVQrBMYQwUDl;k#QYE9;-U zYZ_Fe<_q1R^UjD`e&W3ipU#=ckrkO?UNsAWoGp}bW%>6FMuq=(Cf&xu`2M zxt79fUBjV-9sU)cZd=v-SMpnQ3nIr0OiRqQ79w(j+N8ahQwKEkQQY&G;Uk2`s`&t* zGxI1jb!EX|QuO~3tajDCwUPK;?q>Yw!1v4YZ#F3ruz@F+c9}!=nr46TfVK&v)%4VC z3*SrZ*3UrasLe{Zl)UEdIm~Q16(%^>_FLm~v~P@wqB5iEPb~QQz5&d{QIS zi_ED+MnrK@zM)LL_SW5JPdTxpc6PMS-b@JJ@JsD!^)hQc%S0BS1&wl0B3c{oHhR!54FBD^~r}gyk ztsY!=Inm5;Sd9vIo5KF*a`*~s!F%eJw2L?hnk$+CkR^w+_UZvledj9QSiZEAspME+ zMKpk$QvtD#)dBFY2sOBE<6Cw1Czcgd{_(4MKG5}`a}3vA3@I_9oMe79y%KnK#!rES zcapXccw?GZcM|c7Hq8rWI(+0i`VZf3>cd!gEG#Lq)Z1l6;DsfKgX?^?GECko|oP4hxT9Pyl+73|QeUn~0N)kh$C zT`vQYo&4g0Xs|jWEVE8rAocZTKC+4-lmYwOfLIR(#L@y(7>wOwq7=Sd4;_CUiu=eE~A?X5+7^YlOJoqMn}+#D4Q#DTz=cv!<;ck}OYaG!JL^Av&afsB@A z9!dplKuji{6wXRL7UV*O?1l^ZeTYkyZP=qp#42B!nC&!_4wsgwXg?KaDCM3y08`)O zms3IQ@e)$eTz|>ib732c8>t|?b3rZX>Kt71b=eXKIDd9Ms?=KW>T8a}(XS*nFuE@V zP03wiaTgf+Zk|$`h;Ui+Um(ne0c&+o==WPY0>IEW2+PI$Yrii<6~GrAnewm^>0F7s zR@C%pp!7Fvo5Qk|fwYBGWW>1WW_l+Q67>L^);}bCy^1>Y-iQ>o*6Ef>CT4@I!7Qw= zykMe0xm@LU@syLl`Dhtn(4r7dM6*!oo-j&miz7{QR(1Sx9>Zdtx6e~pLWT%x;FN$v zAX$;`26VFQz-6h6^CwppHarrQ_K@H=LneljX1i3Pv1zVlrEkl^RPh2SfP*DSoaI$Q zOgK+fUvc~NK$_hu4&D79@&4qZ9hHtR4NL!AO=7oJy&o!QUgG!OsZmnuOXQ`wZDDrY z2g!b9^so~|T1+d79m-xnUWPnt>LJA)G5R^n#%M8tZ@hWOl0-$H&fk4R^_@miY>*5O zY|~B4XueE)UdS1x)D&f950HHc!DCUPZlY&aSWTp&gwH8A%6EQm|Y>kBjCNQW{g1A zugA(aWLk0rhma2Iw><|Sg~Q$YT0+B|?5B&5KKZB@z`MH=Ur}eMQ{qOKpp}F{kOfl@mQeOisD+(fx@$@m=Owt!_7~D4S;qoK z*L@Qx25SLGmgK$ASGBR3N(xJ@*Vqb(d&UJK=Vp;6G16dOBUw)GU( zvs58A%?OodTVJB{YD_xw=v!gJGNMU;WD0WlB7Rj=n0`JetSm9u;BPb+r5uMy+{O8d z&{yrR2ZoRp8htbr#Bku+w5t2$Zvo|Vuh>7Z^!%F3ed}Ih%O>r=aW^M;PRud9epoah zmHJ#KRE`Q|l(z=VS8~ju9#9Fg((%9Y+D7i|4G&cc87{wqFS(|^D%o2kG{8lS+*yur zx+{@Y?f4;jY4xr;xUOsSg_W`xLYv`(Cl?_vB2x%hlJ%%_bD1togPFi&tJfxDRu?9= zy}_uMU^Rv6pF(|7qDf_GM_YhlEK9qw&1=-md0ZJqGu{Gh-5bvg|MpvvovmrbZCjNz zzYa9Svw?BjQsKaO(UTMRWLwMOTDw$u#7M{D591@rv#l;#P;`zssAi_}3iV8AoNW#- z)okHhh$H%$fWx1_%WT!xy-O{-lGx@heC9~uy*F$EG!7qewQ$K;_%tI}HS57V6I!#K z_tGq?QP5&1oeDX*dFonNgTvhjm(;PETCX?nA2T!Tcwf*r#WcEzm7uc<_0C9Crc+j6 z3qsKgW#6W#vB4W(TE=mmpIR<6G{jv;*7E{CfeRaUj|r@xV2LVd%S}KGn&>H&9aF~9 zq-iiIdsjrRQwE!N{>8Z7l<;ncEigBiRKNXo$iTsafQJ1E%j^l0wIA-8F(9@?_82oA zc2@LmaB=q8H7ak~))3wwKj{ZopMCr+$}MHn?_jF!atkMqpdxl{iU{}mxIP@0O1sTH zuUxtY!J5W08;rhmm#CYDN>fv7I9$NVSa(vcd>fOjPi@fK z#Jo>T*}GJ6Hnu`0lWhSi^g)(>q@C>oItqYOAJ4Po?}ojDUO&Av$93uiJXb{1LA1pi z_N!SXsi>IEM}$yMUgqlVKQrP0k=K7uj^R;`!C!yiB{Nyx6mD(| z6N+ztI29v=x&{B;!NXc+6NYfT`Of`O2in`LRuw&idc2qLlfT(jsGHIoy#kE`n&<6Y z;aK0BQx{mqWs#pc(k`znNJ`%^0H|Gn9qQf9z6Xvy+2==sJOG(0!lk!KfBh)jSG;^T z;e4T($)9{y=7RU+nf56^P$pG%pw)Qkt&nqvj7Lb^>ghw2&3&AMM^vw*PB9;j9!g6c z>Xu@8>q^iVdk{aCt9j!m8`mv-)QsfrOOh;~IkHq0wkF|P!(idlG1~4Pi8}X9uZnQn zh}2K2xYq4Is(_Z5E0qH2)u_UqtNx{xXs<6TE7Xv5HnN1E(oB#S>lOy&k}B@h1fsuw zLCBEH$X~A6weIy#!QJ4&b!y98qud~u$l%|4@PoB}usva@lo8Vwg_0H(xPbv2;UVrg z7@X;h9Fa48jDLScW1lsOmt`s7$n^9owKUB0zZSv8!&?W_c7~Y)6+-C7qg&aOrTr|G znRpFCd{qosc*1^1lE^*_K~AU*e^53x>ST;>{RSO)K`91u%?PESFJz^(6q)XizTmUl z^ks;(5|LJMCM@!tQl`Q8YXyiuQ^^ifcdW0@Rkl&!nSjUcr&~1GZCCP^oGzXQiNgGGvUG@keDy(LD)p>QL6!YBdmf#pUtWU6s z!ra4JLJ@17?|H9Krz7{e-wuZ2!OXbr@Jq~XytJmymC2Tg{F@|r?zNu^8BOq@U!71$ zNauxc9FCI$1OBce_-DTZ3jzEKr{z}urZqpl7EQ;~HWo&kA1f=h0zr&v<{ zt7$OGZLU$fKqKO*^RWWX${M8e=ChX1{P1zH-J?)r#iJ_u?ziWvwQg3q5nQ*pW|^Nm zUI>(KMjGtZ`+rP*dpOho|Nh3XId0B5pM^3V#EQd~% zijqxxR$?(Nsc6%F$pV~!2*j*hw*Mgrk>h^LQ4lr z`{AVnQUoR|)|wglQ-E>6q4}Sf+~C`X+Tdf&yA!Ao=WDAM1)veL;kq#R3gRSq&AYHF zH|r1F0p@;_L(;iU)bZwk?Gt>m6Arh#aU~Q%w~T`iHU3=yXenil1p+NtC?xQr`jQv$ z9QJX<2XY;tHVZ{$ydwn8V!L8Da1V6tKP?F!6F^d_B5nRgH~-DBz9ht?rxt<6kXui|}C1|1O^d=Rw(0F*5 z&p^1%m+V~hcl#8FP7Sl(618&nsig@=A-B#mrm7r!8&BizS$;gs#EDSlsyEN^xd6j_ z?1$Sr;yF=tf|XhYGc&!q?!=*s3=8hZV3t#!h7DTEr zaowly1!Bf3KOy9v;OP4?;X;I*EwsgA25MZ?^7gyu6M!y)&P+W167E}l-L_2OByvl) z427E9-hp0Aelxb+wE1lLe)j_kXU|sbv6NZfh!!Y0D8DTmG*>7M!_rZcoFS`@&kp0a=dE*voHQX(`c4n~ctF$gm$f>zN5T)p`nl!LRkNi|AL&H0 zNOW${Y;u-k;{nF30cwEm#`|iGJjJp;stV#`i1xIH%-HikApx)6!pa*(9rl`6ALEAcmBacv% z`sU{jcyW}6L1U`H@x_dcD#5E!=H)s-TtVrKwBnHJUTyXQQHxF3(q0EG2OX&NJMW95+D$qKZYh;s2W)6? z&B0LH8|kVmdjJZF2hG{NZzf<>zGm@byM)HMDT?0x3WqtOgAQb`A5*Gv_2B6*@Kr-S z@{SV~t7@0-yw{$*O%=k=ml~XIunyLUk23;Fa4=2BB=VI8W#xtmN8{06EHgvafqdKY zh0?l#cPWA#9oloP>0&f}ndsJ;G_S&)6hDdA)!X~=;_!2JhR;!f;z); zBY_!5k!rbLqbgu#N?sti%&A^-zn;=Oe`LkpTj8ac@>~3*J^aG$xeE2`2Zvi{9^W4Z z-CYr=F!tjrQuqO7Mge7$HCMjzSR;-16Fd|8_r{p}ks?}EQxW8gyUc?m^U`;&{SFm9}xk0IZ>q=4)AE1I$4PGzeawR;(;Dk0EnyefiMu(jB zJr9M$7_B7&l=#)BJ$Ap72fw|tPRV~5yT~ie*>uu#P{}9qvoH=S(i?s1u=j-XwUolD zw?wTcxL#xD)SKq|pRUTXM()1MRp{Bu>{@Rc;g2M#D;11CmzR?NP0p*NUK-xrvWlZR zZ(SYf13*$ycUol6d9X;l5HaoqWTuyYp@u1?Z`E_zkmz=UaBSQjBS-O53Mc4awh6}6 zO8s{Z)?Yo$id`nB_~<$(`$jBT#pA6!f4w zes9!MRwPfuRIdPRpt1XCuhbVK1E_hH4%$|Oi#$Ai1Jq>Z~Qm2T0eZaE3=>Zq)iU440bh85m%uFUr{su`E}$8EMQxUKrl4d64q z6s9-Dys{zkLh%Y3mvoc$=%h$pL<Iw-jUgdo@{|YF*~9D|p|_e_Yte$j_RX?0`5yNBs$+kuk6yyji8jA%&jv27fk^@I z*o`#vo&kzP(92zL$I)z3eJd|g{xm)E<{t6ONjFx*w-YTMEy9MmIc^cx;ZO<3YPf`< zw&HQ7!GdlhuN%ssT!+X@vZBjygrd&vU{^GFy zJ^YxW*NnIcC%$F8|A5CQm46Q?_TDWPkv06|v}+@$x0QKNdao2P?WO!3FItD=FQ_!O zKdk?Txn735A%<$VHy5WUf zwnynLfBltWsB$5L1z#V2$AfABWB%bND0vJ=+tXK%?WSLk0$XVWIY*{O-lg(~q9JBf(31PfyJmDs?X-R~DHVnqx*Rk%|YfloIzYaQa`A*d2 zYq*u=ypaapIS@L2qTwd_E<1l^+2j*-qKVJ|dg-@Qm&ZsnlG!Z1VvqQaHONfFJM46|>Sa^pzHp?d3{|T55JVvQ^u((Z z4zR;#j37tdV9JfG`T4&|K zx+bfg)kb$T1H@-na~@V!?b+nDRk;SVe?;yG-lUyUdS3VV%!Y|T_J+RX6RstSMX}c3 z^|pw6^LIi2J;je0Hsg1(jj2$=H!eO)75Jkkz4MA@=?TXl+d)0m7p{xelqM?9?X2aa zcv(6HTb(6#B;7^l)PSnMHaS}xR?TJ)@eqVCmb#l`FTWCc}Guxh@IX6Aj1m-Bs)xrx;G7 z?PP;w)5*f^KNd7t=~W)sb&5xrsSl94aGC28RcL*Kky zl&~z;uKb+>3X-Vud>&I)B)mTyu`l&Pr2PeS@>h*UsH1AUlf<1E7b^L8$!*FnF1*v@jfr>mkFZ>?sY$qa1S^BoKJl~V6ndqhkoJ4Y##FvHI` zp8mRYKJy;x_Q_^>`ujKT!Z?d7ov14FCS7Uzhwx)CGX}fN=y{W=+Xt(MNu%yd08jTD zO_v&5j5xg^rvxpSl0}kJPVsiK-h$O^-O)hg#8OgkXp%G{>o?mwIplsp+oF#2$NmL{ z)V|(m8~zGl(v>%!Q~J? zLh>ow=TZVi<*EAmuN6*;s9Ya}fkoZ}9<;?F@JOobIk_uTNEGFPfbs0B)?YB@WOXGe zsq}oYwIB~Xjy_KR`A+GQiGToiMuU10Hne_8capd}J@lSx=3m~HO!)a{br-qqyM689 zRSq3ZJI;{Q*xKaKdXje<L#n2qRa`7NEVZZHHYF}% zCPj{<8o?fI-o`jX_UfFp_sL+TSrRht3np-M^VXwat^rq<(7U{#(YYEi>m?WcMIhkb zbc^Ztc>{p|6itF%ot7)Z%1GzW$o3LJIhC09B`LcXU+bB3h$%#{8gl_G>o(hgQvV{5 zPwLUM+;jTaGW@s>N+h zm*2;C>-cc;thlKh9@mH=HsXhTsAIYMPy>I=pcA%P?R=E8a}l;Ph* zaArOyml?E?+(bOo2dOfFwD|)t_9dLlLJ0s^==a;lHcXHzYml z34@6`Wa-szX(`BE4pA82lllBK#r1Ae_^%t&)Z8UeYbqx-m!l6@C;V_*7+abX2sk6w z4h_0@)`;M02#ABUl0v-pQxE(;k8p-WKPW_mk)6b@E`^X0GvjMbjyX!!CsL6v)y6lp z&kLlyKaB&+4}G}uiqdAKaB-{g4N5KXKiv=B7#HM6a_TG52}Kkm78}%Z)013=b*4Rd z!$+3z9gl3|pA9*(BJWop!%as4-n;O5?NSiDjEJs)}L5 zGyQ)jbnjeEHgQsaq4l9Vkc^Y_T7I$0##uAUa7i9bjRV_G?mPRKl{7|NRQH>jw#C_t zXwdR2M^?avvZfLTEt@grL2CI!U`k8$5kCT0y`g&%ZaFh1r*Tgv3G?;${&`vQ`3TZQ z^7}LPkSL{#|15Z)6&A4x3mR=%%7GfxUa#s*cifpIq-MBbY#Kgv+r>kNhxkhnM8_@8 zp|n7{uZMWtiOV|~_T^}ify9qH$H;~9>RML6fO>Mph2!j1AEzCy8}kjW6WH|@32lbf znuGes9c?d&41NgvQmwV)JT=2135xl)^!-&xMP|jm(|I|MZbr7m9Qu$XeiG|anendz zC~bQ8O~PHF!2^TQE=2x0k2)H5MK!CUyQcHW4O@rAO>fUf*uHoDSk$w=%V~66n0nvv zf7DC$PN)i!E=Ni&;pu>aX)Ilw3LYb|`R++5Zam;A%EvU2C z$JUoQRS$Qk&y|vBhmj9ASLse4TdeNgK05k(-FUgWPKWt*s=&5)B!E#M6SNI8(SB`G`Ka4Co5#8L=KZK^2(xr`wb1(`{S!G zodNDsdd_gt^{NZN1rj6!>8#?2k_!}9$>r;S@O0OPn&%U4SR+RdacVz#Ic>?LJ+34c z5K9kvs|k|HBBgRN)b+3>ad6XW3Hg~}QFlx7BwHQV90rgHhOce(#u+L;MwkySVJ^ia43D6~hC$~jAz zWRZKYxKqhepS9_b`;k>u&3j%PQ8*dr1xBARYM)JyaDy{L<+ZgV+*TPsUeQ6?WnC7uKg%LRPrXe z{E@|N4D1CW=s6Sh$HNpHqHv*zm&-pFt9NHy#d4kc=jcxK?JV4L=$xOb$_ymoM;ly3 zw2NZ6xV{L0W^lG&){LJ44^OS$$6_24>yYML{pNmTb_D=G)PtU}wn&*L9xkRTO*_cV z)cgj8QG!ceM1T=MY&o~)MrBK#YaojFE5)IN(iYTh9UQ32i|WrWB$>7_<0P|;cR%dG zaQ6e^QU##rSdXqad@=q^RZ?d$^gG91mnZrxR*B8VB*uM|o^ajMbV$l=Y_+qTPd`@x zkktkNM(jIFRuF~#H#3Z7dhfAApOB{`4ppF~Zw^uL=qckR+uZV%rt2 znk8*rA<4i+f~DK~KaCaM-m7ZifGvdwqkzj7f0X|rKV9)ZM!df^&XyN3Zm?rupp#az z8BRe7QsT$-%MgYe+l;Sxy6GUsp{sxc9_L=Gj45PXuq6@P9}(^(da=914?2W^X*z_W zL-I}WzG+<&@GY_@?XVbSQa@m8oy5w)8pjN`$X$-#$B)0%6lD((iXNZ0 zfo}RMcyM|SL&3tzOC`Fkyds1L35;929&T8(g0EyX^cc7Il|AHEw)i#lB2g~pmQGkz zJ&$ruqdF1m@f!y#$0}BhGjWu=HvduvntYBjaonNEG9@e&?Wc@eGjiMQzb-k^T9?2_Z_t& zl7qn`SH)8IhBcE1Y3y7u94mlzKv?P+^q~(;lKXPthD7?PJHV#7f`QUN6x`L3pELwn zfBi3fKV07CcoSR>$Gga6CGjCfr4dl>-Vc0R3Xuehv+a&boG1;uM5wJ?f?w6|mV_xd zi%dEeB8{RTg-8S?kf+nferO)9NVY(EJRXXR`Vc{f3Q}5i%LA|(rzP<3yEi*pzpLFP zz%-(z6}d{%1$9%-=YBUGhAZD6w}B@ek&5+WnJjj!hQ_bI!!JMrE9Gu?M@~xF=^ybi zwc!fWlUQXApueI6+-l9J5-kiw4RLg?r=3fqK;2G9n|_?M2)#8{LaVKJ(p~?|xp&Jr z6kj`sb+bk}o7BvnJ?3t7~-$8qSe(c0=LP? z`fH6pAKo!1sgBaM{Uf*1!=|}Vb>gQ*0qC$zMDHCq9Pg>WxEkXn^q$mTyf68B0fA}b zd-cSwT8IL3+XM03m zHk{cpjwQLq@8RY5dkyzq1@66~{`Kl;>sLB6W51Z$)-F8w7q^7$1i-0^=?Gx2t7k!) z9XM!~1u>oKlvRlhlJH?UVlKi$Fw-#67n@ONu9NuvtNMHINLvpfi~b}SnA+=ZGcquW zv)@DkZDc-9IEZ(7IO;$3Z;*TtOA+1G|B3uvR{NY&k}gH%OI0T#6fW4HufsM3Wu0s~ zGIR3Y%bX7<&QYn2oAUmCnOXQ#D|eV4&~HZh6OJZ9{tT4EzT^}+bks~HTP%7>mQp62o*9>y3C>X3#E7XibGH zR&sWwfh-Y*^?H0*_MtGoy=a;AATY`E65$2mA`ZYh4Hzeivy5g=^6nSFPQA#>Rn&2f z`*3QnY93>}8rJ$^5M9=Yz=FdkIg)H?3YupRpWIzS`7S2#!=+_@$U7TwdfE-($cxn} z+lH(hFh_-C+;GdUoNF$B5t^7gdRsR8w0>@fxeVU#Xhu_7#X`xu=8B=KrvOe5UZI%N zV{XhHZ0b$DnZqK@ipvU@^j{OGce1}0{q-slE2RIh%);Zi!KtT)qT8$a#c*NdU#T#R z&<)>gkC}5@Tz~>}ULMu^t3(oIeOOc2wm7^rj9g$}Sc-Y{Af)&xDC{&N!KCb#j@$&r zp7-)?tX5B2W~@H-!fo;l!9GX;I90cwC2-S%!M_N;yct`193Pr1BupZW_!E!@z?&`= z`L;ODz|~gIjHfdV%b8Sb(;Qz#119wIC+I2+mfm0I+&l6H2Qw@c<|R8e6hYeakF5Tu zUqpB2mptfpV*c)0TQYvW)v;jtS{Vj`2m59aUV?HjaIfKC^0~vi>Jp5ky%?jcuHj@; z{uQl+^kj`^JS9*2--Z6+iulV)s*>1(jh?w_S9O}kYK3mP!?biL^(O25oU>Wud1d<@ z#VR~&>m5O&oH)^Evli(r*}kZrU6>q$xCD!1LY}e!L%uTw3=?GJrsR%j9bJ!h9@0QP zt(GgIVG8{d@k-*I&-##5nbmXCbL0dsH1`m@WS3NPhS-b8_IjN1ez&^amrn@ybq6_~ zS-u4HQ*xi0$FB=j>*vl(9nYOsABa(-@VgE}xhq#LhOM`;a-){4EQJrQL{Mt=2#mK> zU@XfXDNyCa&siT6#^FGhSnF-UQ1e-0^DwBXjMIZj+yz^JW_HI|a$iC#N>VRzoI)8{E;;A zM=)(c)6-dM3B|;|g z*3D0f-6LdUsJ{ue-%8(Z;ktd7RJ{QD$+X!HLG&Z|!IA$}ToN*Lt zTkF77(w*Ti#vfS5e{!L33TA4~xl0VVQLZOiseP*fim9Mmu<)uNw>Tn_xcZ(`+$6$` zIl<=b-YO1B`C_aGAeIV(;}2%}pZjDL@K)^CIf;XPdfCN8(HXZi%s@)5;n8E-{2Qw5 zwQ;ULT+UXH=4WL}C@jr-Y)X7L{zC+E2rjtg>E+?%X3X$EcSkh21)g+Xo#yqrcJhr0 zhL~jdqBN{8sqC0AWTyVi$7%JF7@}@1et4J^z&cF}h6b*zGy5Y&U*3Md8p0Owi7Jbp zLDpSIZ8T;g@Bfq6;iVb6{c*)5LJcvgz*GDXrI$(UqT4c`R9+^Kge27~v)a!`5SM}e}yU&acOiy z0()0`>5%J!j(0`PyassNf%jdcPY#ijNQe^2P^L=VaK0N*GH&DAu2dM>cP}xd;)Nq( z&$HMVE%Ua$^LQ!GZNY~hxMsF(8n0;l=)9f$(!*&i&Dq@Jfe}@3mq} zmf3}f3rvyL_|sE?xv(=;KV%jh)O&_<7Bg&7XU#i}Pw^~mPI(uMv65QY!*M!$z~M8u zY$c&-C4suv>jO(4%f6+Xduv=JX;$5R-vHI3?PCv7Zm1;P(>c>kxTiyLxtMxE@?bjTJcygpk;@n}4@ao1?Dm;D4lNf3XNA zA@tf)i8FUMn3j{m7UN>LgZt8H(^AKb24R~WaBG>TA6{tLFzF90GQU~g7Gx)XG_V8T2m&f4PCb4QwTPj?jo7EJNSJKDTp=>JE z&RK!voecl5q;IX;UAp%H+3}(RV>-a)+!5@k%iOQj%i(fmoq0$tlaSysWuSy%w;(7c zZuJk&J4I1UYS%44hmP-#$hA4C{NLeC-4FwA_`U4->)jT*`s}f}DO01o*Epok&-+Ek zjLLCvOE9;bEv*j#BZ6%&Fo#?^d6-6LH&UIF1YQ0K4qS6%ALx@_Q5cpaTe>edJZu=y z&nEdBwW9i+nrmS;Lz+|%$A<#saOs!Bo3ss~S`eMaBdgXB(!!CYYmUj!7PFL|Tre$J zmS_jve4YCpcl?hTvSI`w!`AW1W&OpXl_It~V6uD85st~a&#%HH?C-Hc3=iLGuyp|J zB`yXJ2j)~Q9Vi;ZY)Zk`7%}YCquZ~%R+_&@;M{;vS%lR`cF_l2P!Hv#m>}2lE!k00 zGoJ2Ls=%FpOyGN!(~iGv`z1X2i@@p8OVx_{KJr}EuoULNpBKJCSKC7)$LYDlA?fi0 zfAaeYr$xKw6PO3I#;S6^IGM}>FdV`6oSn?0pB%MxHKOVE89`5AI&R8F_m6uGVEEst1_$8GUrk z=sdv#T){KC)5DMO!(#UX%J2s${gKe4P9_c#d!u<;+ucDOWYhzl>+fYH9q?Es*;G)P z_wm{y2Viy+WvINfwa*0lql=)Ga zL|h}MSnseI?BdNF33iorEs!2#pI|TZj><45 z0srAvm{bCH?=ip1ZvAS5gris?sqx6ox~A$@$==v zl~=*#=;hTQ0#$ScC}9gN`ir#WL^{?Bhf! zT4Iam9(`aw6<$5TyNov3F{eA#+_PS(rJl8eQ^hdW4vA~4U5xLBG7jSr6>AiT>-5y! zvcDqIF(54!FW;e8$0mnnJYMhGWxf5VtVQexs$Z}pGey>a4@JgOmSOBb-H}=mMsMRZYfzkM5b0O zEAnxjhEjpU6$JZ7J_V(tzy*WOVHyc4P!;m&W_VG_#?I1QV4C$tLuIfVo`mZ*FAeC! z-dyKaXP}4a5_{pA*hw{}D=?P&3?@q@!94vYxq->rZ!yE1yx5iS32>014?9{N_J@f4 zuIGmY^Bh`eQbMJx5l!424g*o5#ND*+yJ8T!+=+n_MSuTo;cpI*-_G8h*Y3LI!!i21 zEiXDZHovuDa6dv8A6rFFa&8zYy{s`O+-Z7f`I+yrV=8IT>I>LEFbhRl{}hK84WD6F z=MKM#GsdL95Z^g<@+zEa*S$yhbtY%$%UVM1f!2_e{NH2w5<60KA*$p+%`)1Co~KNl2U-*egmd@H8jZ~jB6M}yh|&qI0~$vq4aeM30ABRUh0VYA0e816?@Sk${ycuXH(piMAk_~&h^I0T54>i?s9+J~ zh2N>92Xqw@GqjgEojemT7R0V_ro#=gxrM8Lj0}3kh*Lr4+R`xz8OoGdqmEMMWZ>zE z-FFpMe1QU>IqFv97Vaa<7G*u)=8L{)tdXcff0TjBFAcp11Lw zwpS_kf#lBMDvFL?{{1)%LyZ;=-@M8^AawmXS}u3Km3(|sQmu4zw`0Z+5&cUnan1LI z=@5&*U0r6Zo^gaH!ozV&7RR;Dcn#Ep*-PRGi>t_dn9ja+dD+E&vmddCF8!J*AS6(y z2cz&S4w>e?GQk{6ks}c3WQvVuy(8tvUFul=g;$>j}zBVgDC-#0kSM~EJb-`s& zS@iFBV)0KkTek{|IDyk{e!Dvzde?tVu|Z2z|+ z_4tgdw|A1m`S^WPSG0$KF<#-+<{W@mM%=deHA)b7`cE^2$3NB>Cy#3hAB8ljr&s z#<80g9KmvKwxR6&4=Z3Cw2W7TFW{ltUqTdInKo8x1|vhsSI zt?gI_cb%ftX}f>!u7fHLo<4X{yg3u)jxij_9R^_TDshW2%!ssUg z1HvKJ-96qcJi?anOI(yDK*54)0d0mKL?sd4N=6G>59gIr4J@F9nr{J(&MI^o#K727$@o&DBMPv3$XjvfA;$2)ksZ^(H;~a<8r^p*hUXRC4cUmJ<4G|5k$O$ zdsKfVAS*B4Ri3YUxrOUK029B0<+8R6GTxHj)@kZ?vZ7F@Hkjb`s}Zs%8|SrwG*5kM zPQS3*r*kz_4w*616^6kRUOQ`FOMemYSJ0fuw$SY!I@?5hV7ouak~15h)Zw5?Y6=LE#<$2w%& z#Rf*9)=RLW^0~#F6u)?fMOl-D=r^Wjdu>2a>%N$gD(yCZeSHL$`PUhuV_^M7Iq!UQ z%Mgdt+l1Q0miFcB+%MGVD(jDb^Kwx@Xc<~wDQ@F-;llV+Ik^>9FN62w{cDPjoz|?o zbK43gIfM|EFil%QEXB$0oQ2vpIBeLseXSB;)l87THvJeA6eMzWTH`IjV~6F_-#7Kz^bM#^e5^;pCv5=UFH(f1*e$s_LoPO&zYg+(sGe+7O&} zj*z1&e(K$}+BM=eC)DDyGO@$#qCoK>965CVBK-hwcaUKp;yIXdLhPmvGl){cNE*Ch z-|%p{|pVkL$HMic+9O@WY>k4{!?AX90w*}*;r^7}M*CP~Y=&R6queMEDc z^2rGgCO}Qy0IlmN05(25yEZo>d%P4$OrB~yN40?jcg>Xm*0&G*(_W|jMf|TK74+!v zozT8#=W&ny;cz(Q3L^RF&`LcrXa0{@B@QIYgE#urPGC}nNbI9@s{e^XuZ0%RZckRf zlyD7;opD<5#1Lt_6Ag)Un~z4?V??ObaOz|ZuGIUGTVl_7lt>>3mZTxdMF`xo>mZ$p z^Rm}Kskl|3i8r4ipHwiYwF?E7Pe~%i6v*kc@L#9r_W?Ev*dv3(;D6$%S5JgoRYcy3 z!<(Rh%^VKxNaF5;U&@&EBXVMmiBL&Zv7eFeOK79|TV(UbGhaOaC-eT?!DCNF*^3bPhNKFg(EYh!I zJznR#Djuo9*cw^C<$eKh4lcpgP7_U+x&d7^O1@da`gBLj6+O1{o@o6TNTHUd8F!l; z9HKrS$K|ROoSVZm^(-@3{dyO>aWFb3moA1~5Xv~; zwJdIm**%VCMLxMbs09j}JkHAd=6?gaUFTVETY(2uj-DwGMf}hNfGT`2vizeKn6R)n zmAC&u8KOxE>&5|Fc+t&Hpc3>m-hM`fXF&Rrq1<*B`!p<tX;@7#=omOjJ7HJDCv}J4GA!#=k%RYx9Q7n|kPxC%V?VECnskE#K5%G&p zPzc*zU@#{6$DAU!&7G%pynuV%TpX4{POjF5O6jEsypMxqe45p}UeDr=(gu^z<2lwe zTn9IONDHR6JOxF-sUIm-BHxSQ0`VB#r#&OVGaT~uAD^TnttXH9#)f_A*Vl3YPb9i@V2_~9fnp%Yg zG)vPU4=0}p;JS$nsho3!(Znzl9JwNRMcslB&)4EmiZKAG%G5 zdZ+Cwrp$T`_ZAlb%2yB@3($1OaQTZPCgS6?{8j<~bj*ADt`mumwqK96OD_FKYJzRO zN{}3YgOf@(fo{IIu8H+lDrOkEBkBRWNK4WO!bLe5(|W_+7=qp=8)F! zDK+$>U|FVxxYwV z>-|dcA0_(<2a#Ccx3Bzk5S4>^eg3x@#fXV9Ya=^r9yhMC2EZtz|0LD(XYugG&m6wW z&MtZ@OLM1}C=uN54SI{enXt)`~dIJiY307ql0Yek@{H z{KQ_(i_dZmBQ8ZX%FGk@<(C}zd=!S_`NcUjc?Ak;egd2AkquVEz=CH8BJ%t=AlTtc ztD|?2|5QKYkhXU#{K$$wE->pONlNvlPR8tyGrYNkfTO1u`{VQ+tW5YypiA7HW~+lA zL7&1A)4IzgbC~o=^epLL_E@uHGOoi9Et|}!;yS~$R{3&b+mtAZ#=#}_I6sp~S-xBX zQ=of?X8uz)`M|I)-(?G+%a{ASpq=v{@4EN@lc^p{F3~l(SB{frLYaKX; zv?+H6$YWI)8p-e7@XRT)Q*@h8D!RBrOZQ$B!^Rvm&}tgb^jf{4*wLGPEbL%K#+e3d zWi~Z736Az{x-Q~2^$vunux%?rh;;IkR}$AUICy7Xg4X~DcdF>Hw<0buaU_X`ntMpo6S2o-|C5~QJ|(b`J7l+W zlFB^8%?{pE4+<#}?Ds?<{|S_ag&+%8KH5ei1i31~+ff2*jU7X~k}rpU7%Vt^al!NO zo|uQ`<9h0i$=$O_rO0Q=?u<cKdJAaag=9JauB)W@-88f7VLSH=DGYb0CBMy1 zr3NK=gdP8|#W04{<@@O>U*^O+0=^IsxiBO=yS{I%#7Mg^xxXZ!y$Q9`&;10>7({4_ zIDl`(GIECIcihe13kI=mr%;8uG1cxp(^4o465OX~%5>JeX6fM)zEp2LMwqa^N`2}T z#bX_OCs=V1%q*^P<=?e^<0uWh=G%|q*exG)GSJ*~TMnT?fTJj*m+0m{Ybu$cV2k%T zdvQ5_N+pd@0y>u^qq`zT>BPu@`NH)Ov2$>WyZYKbnUCI97IAdPq5$g z3#%CK9{B%KAb z^hsgPTu?{JWvBFPsi`2v1Tus^zK_M&C=VW$9H-A<1bqwTe`XQJTKRF#MZ7gNJh~?I^{sMcl+kGkUicp^sPF7bN(YS6`$p4?=B$8 zjk8E~ChMxtur__X*z|5!0g2mN%c&ZTTUq{CjEMS!bhIge+&WqGH&UNj9H%3#9$R0R zg;cl63b#DV8Rad9aXU*wV%wF_d99~gTHh*;Mc1gf;q4tB}o0HPa#kS{HqyWraON6#W_45PhtKRCuNpq<)$p@2V? z{x!Hr`?|lM?q6;ixs82IeY^*Jz#jlWTG!RDUqC9xo4l87vcu_S0sZD3E$4#yj3brC zaQ(io?n;waw2N=!t1X|ZJqCd8U|)gd)^?}ZV*C8RTtSe6NHKQX^JT%K*Xs*{nURw( zjcR_g@+SsAsLU|W40*cObP3pW;kPNNU(&d0hgM=ll-|da7~a zs{S)Cng5@O9mX>~gu5%c>{UiA=*b?@z4Os zDwTKu*a%ujx7`={+$#YA$?4>hSWywGW8@2USMHaYg9vz`hS{9Rp>r1XxZHf*!+YG_ zMlXGns|7~3QINsNzW=&Bsh`*Yi_2rBDy5O&ei0E{^3gmt2hCPJzX_Zu|BM2g@h6>7 zt;Xus?@m7_z!_!8sf5Yo0g#Wq8Z7IC8U$|oXb0jLs6HDtv#*yqX!$;tr0I;s8ubAe zwYnpVb!Y(qCKbQCa$r(4x2g+tso==HNb6DKyX*5pq`?_lRDa5=a1kO}1#*8aTlR7B-jG`P8mUp>U% zO)FqvuLh{y`bX69rm8E;*7S`_6cKChT%Enj3p?iKJDt*9OEv_6F?+R9R3_BM9y)j#8b^QJ zskOuS=M{;2cWm{IpV#t5z1fRUFAay|hyU4!uTd?4wn-)OL2R2>=i{F{KMcmfAwpd_ zF3-$53gRIBl9vt?^yRMtHmCsp-Z+OaOo@9Gs1BnxM@Q3$U@uqC#8%yibgB$nCF;(| zT50Z1$fZ{tTq5P3UsHAvzq$Mvd-*N!p*eOYrP`Jg4STbjnN^V_m; zMqu;+^?VvOwzFe3dyX`@wpiW8WR+U0wH5|)72l83-JU#SBnn@6 zJrckjTYB;a@v<4O1z;yN!+<;Mv<|Kpk`# zEeW;3=#n6=QV+o{oo8B_rpc8M)xBwlZhmA#_?jZWSnakc(&AulgS7^`t>Ax8@Fj6b zl8%T(a9BnyZ*@YpU9+v&)_2 zT`2*OOO#g=C)dnrlMS!hPkU{7&D%r1_Nxg7+nm`Kq_hu5OkAxt?s71K(%h169gb)K z8P|e%tuz%#bDp;SDVbJ2i{7AF)Ado#6ulg5HUkg&)NUbvPk!4hI7kIj&Y)*V8R47{ zV!m6}=F%QhR{`hGMni*%Y!H0ekK6Cia1Nt+P2K>CM53wxy}7mROE=OWzSLe7ba4Lc zuDNkylSjX{A#;kiygD8h^lb5;cBHUw7bET$Xy}Rk&EZQ36NDjg0YBeSzMQ{-Ul!Qq zj03A{+Ue1>&~^i52iW(ueEoN=5WVF~T?a+7s8vw6ebZDC7cH&f(Z9AA?eE&^m~_Dc zFxET5?5SV=B_>H9t+EU`iTiSlJ;GE0wN9==oH;zs#HIic=(qkF_4FlS6XL?&ELMB5 z&cb-9T^I0AcCKoK3y}hJAxprwVkds9=26{rLz2D|GIb;8=6vP?K;sf5>>0zycW-aHtHi z?CdvCf{mKJPUXyA*Ns{$Nw2l>6Bx5w$>KV0Rq$@b!}qR#5=b@Z6CQh(9!#Coo!Q{* zC}*C0jgJ+`>qZE4%vF{i=q3t4O|p)T_15Q-fID5Trg4n3`OyA7Ix&?)O;07thsXOE zdjxxsG~F@{>RTPXv!Z_cn&N!DLuVUyO_eiUUY_0BM-7SmU#-`s5cllYB6Q3VX{Aw4 zVudiKe%1eD>f6Ja{@?#+hB?nEhcIU;a!SrNB$Yxbhr;NjQaM#lvoXg~tx~BlIv*%H z2qiNr6`4+^l5I{CYIEM$_WC{7`}4i7-{rdMpE*Ck4n=q}lB5R=U+~xE zZ?xrH!TKY2jfp2;S2P{#$95!7q4)4J;fhhX>x$hYZzzwexFcB zWO#@7sXfRt^JA>RA>tf8EB#F}q@U)j1!6K~&g`mLz&oW8sU@RtMm#iM4KKt~P z?8=B?`r3A26YciFJ$Ih7rC|?I~7)5TrG?Pv2r~129j!t^HdH`Ld=L z_FOn$digd3iqa3>gamZ*-dGNsZC+B*U=d?)h7SM@IY`)MxqM@Eu z%WRU(tS)aX6&_q%TFCRHzVxuflxw*2mmNKNKP$nLeuZyQwl|uc!yTvvt?$`8Y z(ts34vH>CJ%3vp2kB@4ZqdZIlpk8HGhb<0(C&CllOk}Z^A^K#OTCY^Y z%Aicx?q6@P@HsgAd1pE#M-0*_|-;C-{SMRyp;JUXdeckPgn{ag5XJ(%Uea3H- z*KfE=x-JM%{rZfjDTVStOx5j~7YEjy63>+#EH#;j!4XWbgk27Y{TwqMJG zA5@Qk!29DRmcaJJFvY4tXsV&y?Dr%Aiflm|AC*@zx>pT*I6bBxNy@#V?IH!h77syYy3ANET0kUMCx^ozd)OVHHV z^*d&Ki@!4Wg4!ucY7SD`+3QjqqH5W8F-ZY@`5(jS%y45_tx|wW)4@Egu}&RS)p$<|c=bTb&A$9)vMlDC)rRNkHcL_u_Bbt9!BMtrrJI?X%#0qPjX z(&nPJW0Ci;u(KztOuo4%K;5z*cVCAsbNdP|Rzm{)BS%JgsbC{xW$HjCdTnQ8C0Uyp zsz=AUM3M_^t2uXYj$b{Trh{YbKY3;Z`x&8vusE9GyuB514H3fDI4JGMxz#+{wW<`z z$@P8Sm#|9X@(%l_f~=YAzJu(n_zx`^eC@+ohpkEA1OXApvx6?C-$xklUkwien^BMA zC5*Eb%_4=zjr35rD`ZlJ-YxbL;)HWT)GJ6R<|AKqy8g@+IZqqP@5O|_!Wl1OR^yUW ztJbx1OcuLaYU(#M0vJMx%^D=^92KZ`+0IX8dn0q?T8PE}W`GAIJYGp!E)fF2$cXy( zZyv%ZfUQD6SX&!oz`g2ljJDD|$#JW1U?0R^+FPo_d#tS{Tr| zq1PH4PuLLiQkCM!s~3rF&47c;+pw`MB-?qg?%dAmG&tr&*^g3)gvi38q27E3InLN3gw^hV&>}lyN2-) zQd*%cr-Wr*xvIUsPK~exojyZk;+^P-q{79Sy0cyiRbYW=>c}aVI+trqQ_Y@+n@pQQ|4Hw zc*%wkAtZnQ5a@L*p#j208IW)m6GgM~buSpHoW=#;io5*wsxa*_^}V?>=LT&FS3d0F z72wWj%Q&AxJr%YMFW}C8?>Lam6C+ zU3Pn}`jh4#y8Fw2z?pC3sKFy)(qH74MLgJ@x(|N>p1`P6Sb2h-VKfmZrRH*;bpB2f zw8-KsKU2fwx33Rmipe;+o}2&n4JfJH1{dtkk~|~7-|r7UBbE%i!otxPEMGg^**6ss zv;A>V`mwD{g`pNAhsS5Qc1WZuo$26tmrlcbWD}& zJ2|XT<&{c}8*j5)f?AafIOhrZG2{qw_B~l-5J`oG)YrVv^R~&uu21s~MX*+&Tl4w5 zA9KO2^od1ov4&_Wo&_u9Sn##bB@RsOIn(NCu+ecbGS9a~Z$S{PSkad#!EF%gD{Pz_; zC(a?U9W8XuOmjGYMRuYZYkdgd@0va@J>;neC=hJ&>FZ6xshhE1iJ>}i-&Zy34rJc~ z18xz%G{?kZ3Au6eOZLMq_8wr`s^9d*lj!gDC&Se$&B*84D=n&uMym9rG$h*{g5tz97k_j6huOg|zp|kZ!@^_u-blUG;?K{6uk&1t0Tc>x&vFEr%)~JT<=b+@$(D zYS9eo$QKN;H)@`U_awO4bU9)?wJ0?YVu`O}I-zM{A<0WXxAte0 zYhvCMBoeAI6>0B95~EUJhdt;;*iZ}jw}txz;+5b?vLpoG4^Md;R+3IzM-{byn`^D) zENeFHhY(i+<|~D+(Y#jg<<|*F)Qvl+3vd&Sa4E$slbE(gG1AJ>H!P4>Bm0#LPa|b` zBpG@V|2uy7+H=yzT>R4TljRF44V1%^nbE96%GZZvB8VfUxQ9eu?0>`vY@RtT?62xs zZ<7ONyZS7Tg_4$ri=Xc>`kNfYw7*xQ36y@0kcW-OusDjA!@Sx~w}X_3NPp zBs%Hch~-sE?kQOZQAV_^bdOu9WUvO}vdW47QGZB@Q9E|*Y<{LD9hc|glL7ZI?f*wc z+BzjgMqI7SMjWpVVUl*H&<#&0E#^o+lm^OZR*PPyt(2k25C^2WsAJHV6!Pj5YC zmyK{$SdMgZC4NIl<+Ts_wqP%9_;q~r-(0#+$3B-IvR95SnKAFnC~_Z&0kZbB?pBy+ zq+5=ZE>$^-cd=(P%cT;`9CKb1Knwf17N@eVf|Pj=+3at}&k%#5^wEF2TGO6;I?2)n zw)RU1)bhiz->J7Ag7?&gbi;rG)gJp>t=C$BLUc$g#`tgHn)otU3t-wjeAOB;={1yi z@{Y)R_v+o%j}*??;{Dl5{;Iv3w{1dL1=~Fj+TK$CFpMH)WGkh*PX&^YDqqfCtlB|o zv4MtSE(XKQkucPRhY`%kUZo;0$-rQ7riEY`k{c#;iEH(L8hIckf;&4H(WSvi|4r`C zS*zWfku-hFoo6BH2dD63bl1-0Afk9@wXSTP!Ab$`(McSPLiNd1Zz^jO0|)Kg=+<*- zxfAk{fHTX}PHoCcaxFH;Os#rc}!L|0E+(blwtr?fL{O6obT7Dskx5>M8Y z5r#|j!aSgF@*-cXntN_3=%yu<81u<4D~NXt8${`U`AVrJJet?N!?U$C{sFk}!dYUT zgOIDc{K}+88wSLQK}ak(<2(PeGc_pkFG#a1@PE7Qkz~gUDr|KY+7)3zxmu&11o2a5 z34lHrQilVK>u$wO<@Sx(wL$$#a{1_(qC=Z&{%Y>%TJD}R8s>r0ufn%&Lw_DoXs*pc zheYa(@A(hSr)RfGbf>wtPlyE$fCmm{fs} zk>S_g#5_-SRn*R$wOV=M%|GS5?SVt#5D#_e=3DFupJg6~%4C0%J{PA&lM6O7^45lG zL#EsF26GjDq-g+=6E)FD_WdcBfQ>BE6Mt}vIbR;dPQ@}c^Yq=Gk)s1+2^nOFF` zXF6!>Rvl2S1R)14a#wDTBUGMQy_kBE`y2^V3(i)*K}Ep4Z_+&O;<^5KVI>~5=beHv zx!pbl`RX(}sqsy?8ZPyUyh2zyIl8q@RaL`ySzhJauQPEXH^p1zbIer!34d=@o^{Xy zZ3`G5iDR#y69zqj#MDPhk5_1O;^-VgRVAikL~z{2iQ9%b?yX8La2NdHy-D(kjw>VX zoC^dl9uf2&OvY4(l^G!Ol4yE(+~xJup>vl zG-nrn0(pY-_?2`B8P6T9W#zW%igy&vh=db-^64c>kN4pprxx!PHw2y1-z9_YI_caY0vQ)2GDUj{gF?Ld98)C8nT}2J>Ls?4oW#;ou z-mxD`Y-4%zDj(y!dM&k0|GEd8nbLa6QN*^sL{$8HzO@TmZdbCzctM>??TgZ!lfZoPQ(O;zV^m8R)G#jv$pcUO1jcZXlfz~)R{q^jY(s<4kl zmE8I?)s^Qxltc0}zAuR7x-8kPmzPiZImmBp{!d>b1Rd5jW~&Z<0`PYcay4*I0{1)5NDU4`==pm^~=pS5W0E9GZhGV+GvIOC2eZlzX z#x}KvLf6DbskZ-dE|Jq*M0U1>`~z40y;`+x8^z#(_fwLQI9K(7f3;Bh!XGA6(7C=S}h+RG~Ntz;JLOkf$7^F}^lB3qO)a@y5oo)qWVMklU2W^_&8 zVcWhjm34s|uADA!X08xxJyS0M3&O+yc$ZSni}Sjex?3}eYYaJ0T60o!3?`A@Im_t> zOkY6jBH!|ORUh{G%Rk8HUAHTh z(i-Q&j$Hc1y6%`=^!yP|_IuQTf`-#DrT*A_BY9+v^AC$dK#edhwT*8-L6>nT-uoP2 zl98pV4G5JQ*7?|9w#XKAL}#fOQTg^Gv3=&vmt8^D!{M90ya8S?1>_Lh!ZzDN{yGD^ zvIa$AZ#(e%=b84US?vU z$|$np-^`^GHl2@PD`x?GM0o+;$a(_R55^h8sD_1U^hD_}X88iB6`m5xbLSy>8Q+^L z6YqC64{A?O@irS;&f0$G)V9Rb-J{*DIvGMsjWj%P@;cxSO5DXx>Vc_a>v7Wy z(J|!gqBcBe92329ObWHle{H{lT)7{x*SZhMYu|_ZVy^gTSxCD{dmWIC9y`UlT6TAF zg|SchH@xvbFRsf~i4*VV@JfbT;vb>VtuCRA|C%u5=A|CWB}oMma!5-@tf}ul%ZT zInBHXgR{p3iQxOaeES7AKYqRJbyttR33J7x%pqhH+|O61hK$FOUIYw3+Kd_n62xmG zp5pBvMVzK3hSGyB^gt##xmIN~i*tu~M{Spe%}GzLxW$*|amDz3o=ZMs8ZQCJqjD8% zFZABePv>{k%zu9bPR}~M;)Ytuu~Fk9P`)?8b#U!H_SzvJ(aM_T-Cegto%upOFU}C$ zgz_9H@*Eb4SUKs_MQ{g)FB}}8Fzs%HzhW6Vr@)R&B`I2dNi&jbUUrijnI@L7%KkBb z}fWA(F(_WB(nC9vFn$7K8^IG+P!;%q+8;^tpJ+9&F1 zskE}Yqlydfa~yL^J<2`-jpvVWe7I15bjl3nu*`L0Ul5JDz3G9QvMCwb*!Hi6G6Zd-^aH!V!&GcV|d@UPtose_q*g@X7uD_ngb- zqj{^EkiXa52(yf#tm;cLL^DBfCM6b zn&w;Q*OdaF`tlRrSG^UZ)8w_k#12Fr+L;3n8b{pQz>DHx6Aw{4JSFQ0TM{cfbME^) zY3v_j&evp!vUc;XBay>K)h72l)Yqk8y|T^pdAlS47MoMexG_sYS@RFGzLB5C{g^41 zc9eEpBW-(J<^_Z2`_)v>#HSGgTzNMq3kJb$LJu14%r-BLqK?1dDyANxLv$90&~aLc$#@hB1~u#C#2V#fm9(un{K{Ra_KN zsxptt)mvzH-*{`mCTm(!G0M6Au^wPUF{_kO4LW<9H_s0RQCcX5S&E#X^xus3z{Vq- zZ!_Npu802dJwJ>K%v84 z`J%!^$mM`3)!AsOmpP6kI|VW!ygOrwGbI}cNl7d*%`-kZ6ch6zLDwggL0`Q?jNo-FL-&s8&4HhG8XGaLLmzGCN#O0a_dp8CsQW8G^m&8 z#vh@-0SRHB_r|AJw&^ViUf1D>NRcqC4Fl}nq-!M9+D_KFbuK|0+1qx!?75RCOT##W z$>_2m?(|cVpIDuJ4M8}HAm>WUziI<5Q<-v(mEFZkiAlPC!NH6b8Y=t5erZq^5~NiA z%(?l(H<`=i-DgqLj1W>VZ$NZNl|D}k=bN$l8DyPtFjt5+!N1&ghi~apry?a*ZXyDn z$QJ!?(4-6;SN{sW36t7(#aPx5xL*UfSbIsg!zTQ_h=BB#t<7n_=b(ZJt@DaWL9bC% z(dxH2>Z7=+sbTaN%*Ukw8LMiyg5B{93CpQxokX5B2U`Q_O3xVMxu?*3m9#x?f><&s z#DhR6%^UNn(IKG`#)hvTqAtyQ;_S6$uk5Vv@UZsVJMZ-wNz0|%F`Fr$ab!LQS$iaL z%=f)#4BRv|eh6ZBdZ=-TaF{;W_Nd6Zc(UYRLipB`%l|La!Dz6wERA`fusLq-BcFKy z`|}g@fbZsE?qab|`j#uPb*$J{ggux1U?Zf{0Cx;)TCDpDri&1!#h|s|vQW7mF2xNt z`9e|?zZj;=Bv(!cDjEo)mp7C|GK^V;EiJ)$D3`7C(gj{pnDc||(qn)#312<25B7Q? z-|`aA%usexrPJ8HbK1;`Nb(&zw?6Hti;bWbBEf%WsXfWW2_|DN1J@w;_Bq$DBtBCk zgk?cJ#u>kA^VJIy)wyi#TUF#fVd-KQ=*1ZqLaEZm<2!X45M=+J_Yb=XqIVgmUuj?S zw3pa35?XKRx)LE|MmX{P?^=O~6_$o~zcW!pZ$?m#pckK<`VC!Qp~Knf){BJQWbqXo zD<*>~OC~AI5{~Ra?W<{HrE;!5#L{80uS@n79*>eF2>j*q?(r zdO0jHcR{IJHxNA^(3G>PJ}5TKo{)~HwA%qOCgykp8G>3vr49~eW{7+-hJ4EMq!5Bm z`c+Eq?b?}>IK~1aYn>tT?+j@l-&7!+Wl%dniov$iS!tgtY%9@I!*A9gZ+d0$OFugj zNuFps5L`k}J|Pw#n&U;Wfq;G}0jwxtlXn*SwJ~F3z$T94h?l}e)sP{BTIwl)g$G;I z{?&sx34Qq^UWcO9{Z^c~Vf*M;aXKC)12|(w2mE}*N!frxj_|zbo~`uZMOO_EOD6WV z$fK_D)8jqr8vc#RkfG@Eq7qEU*0AF5CHSVzSBKlmQ96N#*GjPKcj9!nG4aeSl~+s7 z|CpV88hErkVmqeDu4M0O(pGtUQBJ2(Uda>yU%5rvXPVK<;dieu!R2r?W&VMTZ)+yr zKC;2_aJ&E=FU_0^nYH1_xj)yY4T5_AIV4GK&6>qdR7;9bB+6T<9JT2LaBC?U^l!WL z-)vaQboNIJm_DOM`9>v!paK;HT_GwQCT%qQR~6j%NU0rJ&3ia$9l7zhZR=II@t>Z$ z#6alzM0_&pP+6MM<*L1}jd1n2YV`AfWzcvVXsgU2~wNKDN^p5-)Em1m{gY zrMYkf!?1~yQ6a=Sl0JQ5QXnbImzBCA!Nqt_I-5_$(Kq8Uw)87OoTm#O9Tzrq{SR6g z(#-yU=^rZdz54ZQquUmr}ywvWXmx#44PNR&IrO@-1bgj{9yVp zWeJE>M$A`ZsMkP-BuO7MPswQ}GFr70pThB@acwI4%N~E@ykw8v|14pJo%GQ9Kzu~J zu1F-R6GB8OLMkW?@aX@@#P&2qFS|9bQXqCZX2sFl&NgI=AerLrjcP98lgox!FC@ZG z6ZeBB8WH}7OApl|rRs)Cdkp0#9@AzW4h~n4C8v&2Re{&`DVMMu6h>Sok&eCFPu_SD zb>qp}&}!2IM=J7Q5B;%s)S79NF1!T_I06ztu`uQS+ZGoMPX zl6Y$7NV~KkwQo1-*cutTe5Gc$)qfN81)T=L@8`bUk3>P5Ua0&dGDi~Kd`nvgO*$pi zdgL!BZv^NAA>A?#tN0$ut;gbMBTWPl?sVo-XL%Db?<ijqd*g2--Of29A+THQ5S+OM5g|}>CeH#dBZa;;8_E6!}XO$DpD8i}F+tKT-Q7J{Z zHqY)5ny08m-rU9HHjYowPg)m{^Rs0St=t=&x;#sa1ybs?5OqZ-w8q%7IgAu_$4F|& z3?-Y$GeH-BpE)muo>fP>?apFY^;yz|NLMB%Zcu)X$dQo``m{VQVq(^Ag4zXw!lBlv z#^YNZBHZXWyV3MtdhPuS#0$oq;EJ2%g%}GbMR78PMNMqQ2D@ut_JuS(pj!ugM201+ zeLlGEQ6TMT>eJ~(8NKT6{rvqC6r4*uhsuMfwQl_nM4Z~|etZD~+-_hvfT@@k5IJ$v zDJ`iN1Wy7L%Y_#2lpFMMp7am=51fRS`Xq4vj21Iy7pnOm!6(GA+K88_-3q!3tEnZ7 zM}8uK7gw|)I|P6a56uqz21?M=DdxY%TU)~11>j@*g-QnAmL@lL#wnKWjAM~KQ)y;q zn4B3PYc-B@1E3SWqXVujc^-Yt>Nd7D;*EE5quw#?AWG>*l!>uwUpFX>mi*@kiryA zrNVR*T1?+oVSjHmf#!a%M$nOaLF*EWL+-=T!BjRa=OG@IK&$eLV5Di;I~OXKDQBDT zc7r^oxFuGu;bz6)oo%*z)NJdbDq|uhbP68Oz>)`PMJV3-+s-KQlLI>mR!KVYRjJnX|G_^_7@!;hHOrkyOF3WpderOe_ zE#nC@j5k+2qgI`f6OD5s{sIy8R%*(x8<}(>M^0`qF8em%%?j#vd2O6-TXr;F=CxN@ zgt3|NmiK)&#g+_l&K_~bYFwA9Y9|`pamdtUfa@dTYHt@?)$A=>67WqJ0@kBdJ=SH- zBME<(zjUJ9Z>A&1A~3wG>9@DtFc%StMCbQYJIbqBezg%<*ND-NO~SA8H)_-D2OpH8 zB~>)+P4dRKIOZE1Qq&4?Y4SfSS#T%{$4(4?TWIspG;I8I-4GG8>BQxgD$E<>s~go+ zH&OG%+c2}MFAq^}`FB1vq~_PHS8_wZuwze8^~zH{mJkJynzosX9hA!hd0Yi}o{ zcUF#xp2nj?L97;))BsnvGxGR;@^P@r{nk?>^gIk-0@-dHpZ_US2PT$coB|wHNDm&! zfZoqmFWyzwzTG?$e)W<1ALkP0JIfevW5CfUmH-$O~YwZ3Yqx!smz!^4FDrt)r51&!;I?M-~{xZXy^N3zE z1<|=m&$=;ux$ZRSQx&uznQ4ZN$miEgVsPT#Mu{&|cMp)Ts!5*{mSLf1T170%A-%Jjcz9Ux>iV%T1Hjt$27j=Gu58x%sPE|-{H#I#m5rx zIa-H>YtHeHdeudNkyDVxmTdsRW*au7&LoJRGI;LZ3Vjov_OlO9av2eS7B2|Zn~TNC zwvV)<4L*{&qm76V8q$t2H*KgeOvjdN52_Uo6T2eKrU-MCi}=FuiUYdhIU+rF5EHlH z1w9gr&3GYJf@aqBtY5Mj6Ch`g=rh+?Ie=m?UsDwJVYGq^antyXf}l6TI#BYF|5&=m zNP#{rNh3h~)~kT|$U)kR(RZcL9;#P1ngS_|TBz{_p1k{nY|yACB@A4t#`F!j?h6o2 z>dgmtE=1bIR(-dj_J2}%9yWOo+F)TkWp5IuIz>&9-}Um+?&ed*@V)@a{FpPqV#kIE?SN+UQ>!K;;pp0n~ai|U=?ojLKf z9?KYrCZ@Y}0zwa0R%qTb(K+2|eNTP;ib=KCs-$~h)FkPV{vy8}0Q&ycDj9?^6e`L9 zww(hw*|5HAu{g5ah0q`)thq6a5n?=3W&&|lErP-E!oQbUqP*wOV ztz|1l+J_=xJ?VW{8%ljLu3%ozHu@T~DqG9}&)CSjYIB7mzl4T~+&H*fyb1y9XsxIu zEw5oU0rxYnqu9%?nA+K}30G~N|I9OV_YSc^!>Hga&5MW$;9r~QS-A)BaF=&FNO!u= zXL@}~d|i)or(-SWf{GN!*D|LeAysnVjJpNm#s^>))oLo9#bcJ}ex1CoUum9#-(EdW zHx|r%YS~j4!ZX?`Zmh&Upn4JkaA|4y+q;XN`spW8@Eg~;joZAWs*2k!5NiV6yCZb# z?=#!!@T(lxsVgU1T!6Z!t$(|Jd(Xe2CSb}+%nl1gk#`O4I2RQoRbH$Qg702RO*0*M zxvOu5=5Uye>n<~QFfivWCA3kJZU-Kb%YMT>Qqns%ZG{jU z=6JoUv$myGs012I9*`GOYcANt8&3U@5|f0f%C=w}AU+{bZa^jpJL*Og;QRkayX9@N zI1;gQU{j$N60f4q^F?A-fa1+Jf;zD$huMlAsCOq;+u@hFgzVMKsx!4}VqMzcz6T6J z&&=nqyd~E&B56~?TfJ}0mb=>bIZdKcUVY7wRaN6;6aU%6nf6cXW5EPdBeGwIIp*Cr z?%8tM@wYjeB$GfgPu_f`gjSg6@a=<_A}jWtijKrODDdp*DG5F51FU_C7C4Prjqu%u zAo;R;lZ7W0aII`Ve*#kbbEJwIK_4S))(Q9+0#EQPy^*HItG43R_1|t4&aV-uc6;b| zSBr?g!M5i;jL*~_WO=`t_VMxX*PilEEAFvg=8TK@K<${&nxP=MV1!!KB4pjKgk!Eh z&ti(=YWu66i#RV?A>FTOm=&2HGK6p5(m;RRMfF0$NNIX~dR=i(-F+zXL%IrGmZ&t?8R|%Ss|6H2fV4X)YbJ-5 zy=9XfG&0DNs63w24@@}a!Rj@kvb?>+9$0l_7@#5hA0crszDkr2Jr~S8>Uyzid?8QX zRxVik%9`np)9>e_az<~TEqXs;b40kz5M@27Rl;*}MZZ2gaj0s0K7rAGW!;rEG4V#K zPS(fP2Smh6-x?w7UYLBj0}iz5yz70YmE6IzbhTh#re(R7Eql5D9gj+)D+`RS5IV)& zZiNaS@@Qk*+c?3rVF!P9cfj1CkWs^`8`Sp;#Bs3iRwVtL<78qqIt8?CR=BIziyov> zS|+AC==9AP`@PK$S;D!_nSt6Jl#X@>Wr0-+2kADNkN;(#YP}-8 z=>Qi$#PSv&uG=^)(w96S@S*QPGU{?Ld10>&^MkhSEP2*nKmEYD`d$5Ml$ab$M(9DT z95pDc{yoBSHKhk$of^eyM>pF>&T$?&gW{k>rODOcZhAEO#>KovN#47&3O7U<{%rwU)8EeD>VXXhQbetV})c8Cn;SYyPFS=Kdu#_Z_rid5X+;26LZ}rE}x}kWicg7 z7!ZpnGjO45JFmb5%G*sSe2rzP$|^`<6(qv4n>RfOFuz}itCTR!Rs(V)ZBhp~!XQT5 z2{k!23=Sk7jp5S8E$Tr2!MaXVX-g0IlRm*eiqo7pfvYX+wrMsaB%bFt&$BgB+AKI| z9la3vQzNtO$PY);?L!WDeMQc2E_e2{1Ang5VdWDu&zvefIYPeu-(B*;T#T!}IDGZf zK7pIoGdYfu=-6}?zRw6bXhfwUL&av5OaW~#?%-j}-sntK_?hUJkSEoVHd&m%@F2;O z(S^DkZcJ13YDPVtTR^yorK{ZJuO8=_PVI!KMYBgTDAd+1FJFEU#5J`2d@#8%^IiB2 zIqo#N$Oi^$LFJmRf)C%GExr$1*}1(q&v|aDkaUHnXvughBz^_BUE)mY`T^JG;b>pu z=!br;S-uC7Ufat?dzf3G&ZDKg-qinvT}_TX`U(g4X00*5{n(1IZe1zJW_05PBzBfO zANxq0^?LF3B$L%A4^;*7D8T0q809OSwuMFQ?4RMMq0r$bfpLf7)2FPmCA(7NDecBzcdx!3rd)#_;tOlD&(xbjA=S&dqR@g0D=&jKmo$|AHlFPM zznq4F>o9M&a(Y+ZEeH|C#3;&MD!tjn=;0Y92oi+(sc$jBSRBAD32@KDaLjP6%DQv+ zIlXH0#_%7g7BpNXmCUMQJx=szH;$-w!L{oRp&L5_yq1K^&>z%4rQgin9XV+b^otCJ zOKCAaHnMb4v=9}t_HeU5k+L#6-S zzDJfUeFU3tg(a81w-p;c1)%ot;)u&``@5KupS<`L0$a(jt-AYP;|z3c+ZJ?C`8fv7 z$SpYrq?^5ZF`ToBe^r3*V$;76_KCeAtHc>l!EYbSx1-c5tj@#_yy7oWDd1Q8)>XDG z7kewN-AFrA$uesQ61OWkxne-FU~68V8f&~9=>wXob8{s0rpor0A-&?1d+t$f7GXzeZma-Y}oI$hCc4c~Qt25qKRMZx*MX z6IJq!`9Eq{?};u(rm{q!OH@tad`Pzaz4y%I)4CALu2M7Bg=}Wq$8LM&`DUFQN3?>R zAyR%576eeJTp8iHbw>orJXw_4`La8VSh3=$cX|+RyUHodq#|BWepzTC`orapR>df# zR0UNmwqx%zrD9eC<@<=a?L}UgZPkvbxY|7ZG+SVWt!jI#o$Lp^3uA4Tz0OJ%*Wj34 zo-BN;fXyXaB$AgKZsyzb_5gGrX1f45@1GGFIPSffxtjUK%Wl#_yHX3#e(n4Yc92M2 z1Noa#85-XfW*7{dF{=RNljzP^DxKEgB8eq~XK9-Y2gNu*hu5A4O)=a95I6s;o1R`? zq_2t&gbM6f$|W=KcEdZAW%|=Xv*N!sS*d zWZz{WQpE4JV_qp1v%I(6S!=PEheD4&8FB&0=yPu3iYySeX#A1q*SA5r&`c&?d8*A& zhuQ15BL;=v>xsEI3y*CS!mvN?JNg6Jl#O{UbP{OgvvUyc_wH$K4(KNW|DXW`te~j3 z1$p_!qBPR(ujW;-W08zr}cK3D2yxceER15aGu@4S+Lo;CEk3cdL9ZWoxU6^T!GI4Mp3eB zZ@GKu*0aBl{&PLMqKh8WUh*xPPm5C;__43bhCS5g=H*~3LXm0wl~;8oW*To_Zb`kO#-W=! z-YuyM(-_k-h)e%4Gobb zcY3n!4Sw-HLH%j#t5UhLC%0BKj}71dvLSUzIFC7W?%gjceaqY+D~mp5 zNs4Z)?lFluIRSl(GZh+pEYL&<2cai#7M!2;fE4+!HhWuww55AS-)M(54ZW3{k#j*f zgvrAKEoaLP4s=eK{Z}{sqoH5&+lQ^>XCvJyCi0|FU8aso<#O%_W%@|cUx=5S_XdI> zB-rO>5x--oZLnaM)~EIwtZP;V;kIYb%hX?5E}M@dQm8o>tNiPSJ$?Jsc$V5gL_i%L z7MMz?Cy*^`Xl%>z0TeO};mWG4t$ied=hXxYj!E;ji2f%_kkG_m8K#+@loWK}n})j9 z%;n`LcTT6%Q2#nSFnW^^T!D9rzJ6{j+oq3o2mM8zD@bfR>7n<&)AkG1#Zf^zI0q?Z zCmH6-^>>&uB@tAx74NIUxQVj}Y&ae>XYDZu<)!(uwD?BT?{3UO**%urGe2Hb--aR~DqY*d*XC#;RN~oavph!)^?}3V9OY#DEU5Sd4S+ z)yrb5uH}(jvM!sbmz=)RJ!IkddbKgpRZnM$ExVRab;+A}O@Rt>xEE$-hxi7UzKiml z7N#)rS;C+;oMblu)=)6l&Q03R$oZAcci0Vz?V)6*0eD;>m-4Rex${5H#k%V6LRjtz z$_^*)TKv+y$j-3INL%bj8s2Xu3k`0(5m)EPz%w9d6wD@wxeF4voLq5zW}_xqZm0Cw z81G$Ptcm6nq4(yve*L5)XYNBk1~Trn<_85CHetzml12`wb0<-7x^=0ve^#Qe56XdC zPpWOPGseC=wm~o^Cvji~mG0-r+BBoTvIs}2-x&8oljP*_jiQBWTFlvUW7G+Q($W89 zlAr_RNJw{1!2Y~x_(ta3!4(z=Rpjn8f3`AYiQI(AX*HCBXIFvy5o`o_lA9@q4}0@s zMj>V|u_~llbzV9Vwfd}d@52ZJ(w;7$vT~R1X{dNxA)gtWpdGm+S6|1IXY8q!;+Gy; z9be_u&_rdC(1Per2dkyXOhk{0)&j!$cOw90gQ_Eb;l@#ScoMz5CCPBs5`qFDJ6q<_OBxcS5w4r1&XD$tRz`R`*FpnXCQC_s>ROUsbpqd- zw#$_`3e~}aaqPc!RAntDT3a<)K!`^$RX3+Mv>y)Mcbm!O=iMsOA77wfy7TjH1?fty ziv@12d-`MpcndGDy~jzP6x2K+FWxoayu~~3=6FgdFF_SE0-=vB)*HZUmzB7C@wR9> zuAxj=InJbT+66@JzZa2XE~u9vH;{8za%4A+Y}a3`eQoTC%>^g5C81yqZ^4{Q>0rI- z|DQbp!)n0A2eAH#j}r2{SO8JJ0PH;1kNBe~gw*45=fS%Y4tEB5vCXa!MDRIe+!d!6 z!?y-d2(Z^y*S4k}I^d=fi0xRbGqfN5#jx{s(+6?lKndk1cNKeJq89%CZ@HeZ#UiPCD<{zt2rM{l}?v(fhxZ zBmCe(?afpn+?41l+NwEmQcT{SN|&)eh5|fW3D2Q0M>gm)B0G19*W*x_)eCc2s-Gf$ z>alqsOd9ji-d)w$fRiQYAj~W+kZ5bLaX{?zN^jLERd=3m2FZ^6&W492zZ|(mv@ak6 zyX23T>;VV*0?QyioS241srE);5XNWB<@99bKdF8otibEGw)RSMB#HoFvka0u4u82E zNd>>Bl#9kH;I4gD3Vr?6x5LYYLd22#=ta#3rA>=e$Tb7Z+xeTE?m6u_yj?DP;Lz7p zSND&{=AYmO4R3PmsUQ5sx8{2zJZA1n$g^Uc8I|utM?9%~v@)m^m=^*WGN6h95pwXK z)}9pGgv8P<{YTZ-e9k=hA*lTRMYDMvbS!f_U>A5`vV%$nAe-=QkRL+sE_&;CugiHx zI4glIvmIBiohT!e(%RW~eE5E#O~;RIqc`^jMZAF(so#9aM`o@_+?|YRwVX0s%`>7< zlNz;V2fXIMciLhpTljco`)cM~F3MXo&Adca41ANk6&VamL?J>^X!(f_J)*0=L7!O? z{O?~*I`~tCyh4`&sz9J8=>}`-JhI>xts#Z>v}t1EwXutj3D|nlE~Vs}C*CDRxR_!~ zs?Fxa@(T-uOibQN{hbHnO2DV8@r~f-6he0HMIi&U>%A>GnBuSfK@smyXKKpbCMWxG z?h=eslaCObnV#f!E22SldnfoAWE{*{`w%%3zhJzdrbI3=n<2Z2b3vUVzi)jMMSL@BhckC?Ftpp)4)QT8C_5(hkHtL>lVz#ZGCssmTUu0fxVQ?fH@1#jh ztRQEmooTq4ZMfFsYVpn;jXFt+tUROxMFBWi>(qLZo9;h^qVIQr0s%f@X~g{ zyD3%i;GTG?bzjbFq+{+@rbZ4Qox>+e*}tAzGp6fiDH$8j^`4p+>$_go82iokI!nP_ zHkc`PbCZ6$vt_es>*ODt`4%Ea$5;;`zEES_6Aq+`> z4}c`lnX`(>&Knj4$p{9_g{Hj1U~FPkTays9H47PfqbHCfpo3CUO3OCG6|~ZC;eBn+ zK=NA(w~CB}doV{OtcW1CQsGQ95!spO0ZQfmpu!e22)|Lt)tc^G4$DpqqA%qCylSmv zgyj}B8b5H7Pw3uT%_|<-{wh5J;0qZucQiv&`1JIi=~5NkgSqmvgvwXZVE}yQyv#1` z2RusI@1gyRbX+H@1VkEDfWc#jyYk$d^mgUx@=%YKJ__9JpMXsxM$5tItB|UYjj(;+Xa`)x1d%+cG53r6a%pIvO zVp{cud911gY7suDP$?rH-#BcI``z(5UWW;WP=@>raOR2uXVMi|{HfUq1*Lc#0u4bq z+3J+j*@%Mer?|MINd)+hf?W;`nUuSW(jl%08<<`b8<&G_xm7_|5F(crpNz@$%dGi- zM4fv)({K3ynPGDr66G*+EXU}89OhJ#LI+XF=%i9PC8yaKB7~Au4%1PkOlL})Iix7l zaUEovLnCTq#>Tey@AmnAzmFe(C}zg)-S6wZuGj1Nn%WZNQPRKBPB^Df&%2R!;!QYv zAab4R@Dr=WXJi@(bXRE6id#7LkY-bovMgI(Q(^To1xqgf{X-F9kdUYzq90E~c4^}G z+TWNik2iC>JHZr-))(T`jac&D$Srj}l_F!)K(WUWgh?YJGlN~)Y$%`yrR`@e-alQL zU7&l6qK$zOPi-qO=>&A@cx~x@Ss%HYKAZWZ>V(MTLc0l`f5s-)8IQuf!=90Yr<$wD!RwZS zrdC!BQbX}LAZ~)L@Q-Gel4D?jxHaiV8OE>c-%=Y zSP(mwlR8d}=8qxdQo;6U5?Fv!=|i5?zM;2P&oQ;tAMT0kDfxG67a<)|4?nfpEMRW> zWZM0vOX$W@_!FWreJ!D|(1sEBTyw)+r%#kxGN+2#E%yD%z;XVP6qnS}#1ov1(h)=P zcvw$?$MIDc|EpsLw}50?{@xk@&bbHojD18LsK2FISbS)xvc6R~`)M$kDa{aklCHRN z+4!9pkC7s+!&q-p`Z}J`7m(8|{Zvq1U!r0UrOeFCt$Y(W;s!vKaG_7}xswIkHS+w?cLW zK9E`=RtQtKorBu3L|uOA09cNhKw=3Bm@u#o=Mg~bX5y{n*7nLy@5*$r98dmnO}<=$ zZLj?sA9E$0g`GY}+YV6K#rEpODqE9)=r5do95EDi$sy#MeQQl-%Q5fZ>JlQHxAxt@ zqLv1^hmE`DPzl*3omNOsU7>9J&7Vh>X>gqkhevRVWmT&V4k(=5=$fY4bqoahEcb=! zqu65`z0U>?7a-mk7Jr0*h!>Ie&8ip;M``FjZM#ZN%3AaekZVCp7F)1hqd#xb%*9f! z>=pabIFu`YZ(}0MObVYE4gpgYg4*H#j%C@1@l+pxn?z5%9FI?$U7|=uAz<+%SAGpP zbkq#|XCVOH*6iOa)3X&QVzkt2oT;7a@CUJu7Ez$Bt80|FDL%^uG|xAa!2U-n`AKX$ z+nz(z8S}N9oB#6S3k7k2-0l?bUH%j5bAYO1=0_WsYN_?-0kjV7j7(;*Aa-X1#SHsc z#mz5gME501&6uE11ap31O(oWu^+uuY9~)XGX0A}cdeE3gMm;N;3SCLxkZE46 zZ+xykErv3}uHe*72dBJGg&3Y4;8lQ!2^N;P=-?#v+$ifxvC= z8?76JyWeFwbU=Nc&wnubGId36(}Q5*>nCY-cYU>Q@Bxu%GMhnoT8j|O62ZgW2>|dr z$lfJQ!S@*F_|gquh`^3Ef{14M*-Y>cHWEPsgG(Mbw!zaoF!H-a4W%`SwzT#`{_t6cuS%;BUk`6{S1;Zaj#4#(k%^!;z`eh2wH0OfS0!97r=u+gKt{f5X7f$q?6Tl> z&Rio_+h*3fg$4KVtN~?;sjOFd(2COBn~nA$ z=DtYB&M;O6(IaB=<(Ed-%f&xvTuk{g^l^XXRhDFbl>5Bx-Ys(GgT_jn@V@L)4kbwO zLfn5;4=|VrHxrCR?u+WQSlMqT(tgfA-_ff$Sk>l6>uBG$y&$1Z`?M_TY5$K5GswYJ1ns%Z+<#f4i_>!jvN^-5EqiD%0){mFG>G)P=t&;pr?O3_e zO{eZ((I}oeJN6v>eL4OQ+gm`Gw?0@`8bHCWXLh{9PGvBET}0I@}6e8@p$SbRZP zUGqE6eJAMB6UG@|&YmO+?+f`hM}eyUGeS~NN(=tLq&Bpo5d5ZMny$4 zjz!p1ln#*+UA~|a?5q$y<-~SosIyMH%BTnRwOWE_keQzUK+BmZ+7MxG-PZPb5d)>; zzHIc8ssvRA5#i23BaE#?K$B;68aK@Zw)oUp3C$oJf2$A5=AtD39KXO5;SV;+nCD(UU&w^0rC$_8pd0!BA2D-=lm48wC}0K7^O| zu4WLWPw5YP?p%$_KgBBWD%mkjz5=DpS*z(HKTo21r>sUn=n0tKXN-u3rz+nr{vUxq z8$bI=hDlJRC&iiBhURu)Z;vH&BjRVyp&7p-h1`+W`hy8L9YX?)Dj@hIBYdetPA-Eau4@> z_oVHf5CwMKp0bOfT+hGRG9^96ji6x$547f!uC%hR;4S7}$RP7sPoJ%oWZBa=1J5iP z!ZTqXnWIKCnf3Z)yE4!HMXDB$;f}0n^O~ER8`7hX0pv;?J2ch?!*1NB%2BIc>D(nH zU*RNSr!I7{T^6c=uRZ^g#nH!&=(<)?z=t_lveV)Woha#Vki3|L7)L zax+5m^15Y&M)a?b^uee7tB?HcQx9Wl*xgMvVan(r^88HsOwx7JTiKlY2{4^YKA22H;YHq&zXI4PAt5C;bObRpU0%wcQ?hR zFp!*>2%m30D(`(eb=j5l;cTZPzk4tKb;8~1Ui0NGri&&GBc4C$ZlC+b7(a>X(aJ&S zD>WH*|1X}p^H%MaZhqZoFHaXBEY33f=^kOM|4D|>rIo{!%=!L!RPx|bi4|YgyjF(P zKvc^TJ6Z6e3l4BZ^Z7Z^5`W&eRkLbXpuo_f{e6`f+?%XamLt2ThH}&{yJ%A`Aeml& zuyN{+BR?*$)2F$M7Rt2hNM?1!Y@nTI=e(1k`mGDiLC<5zlj__04bzvF4hF7zd^^sO z%&=No?m)7`9-FtqX`|n6o%3r;842Rz{982fxZc%uu_^PwOO{#EF(Jdx5<&tDVv;kM zL>y+2p$PnxU1{_K5*Hrv0cgV7pS?2t63s}EfU0D;-C$m4=h6u|dRiF$DN+sYfQ zVbyvLy>)w&0%hsmTmKjqVt+*5mk7noWt9iPjRi)-HdqG|w(>;YaKCrDqP5KzU4K|N zM_mdU-lbi1^~Yj~jOf;m!)auCfrWAv2rxluB8$`T0D4#%5K749Y50%Koy77PhPW$o z*)Kn%q3%>eZ%ywylWP5v*Evf9y0jAl5Utz&aRyc&29ffIxSio|=}I)vR1=o>?JRnG zcec(};YW>f<;3fqwY2$HI}xtfxc=o4Lt(D*C) zXh)wBdHim+cp3BC9n~ozr>+`KcUzU~U`&_Wf5ocgw#lFUa|Hl>_jWd=Pk`>5GPKTi zCM2wv#6A48;|i@k&a=Xh_h$!l`hDoMv_{Yr=qTZ#XkJy+9TiTqZB=vb8eI$qBZb#h zkv&IAkM&pq?RoD6@`NAq3kx#jWvAwV)e=Tbp@zlI^@5*3ckdRoN>&4?F*Q%`H;elC zy9||(|0;7+y6mt9=tv8-_+J2yckz~X>@1aaM7Pc~y3g%BM9QO}P+=T^vTJr|9F)w8 zFlz*r&~C}KnTQPs{`dBjNmU zHlxE}twxp@Q5;`K;w951wvYd4h$7pI?x>b%o^#!ehE(xbNh$P;<0= z;3!Hr_{0qBjnD2fwG;W)q{58Chz%Eh&itsUPiN9KL!9bpTTtFB0Q7_VUtW~Px3=?N z+%FY|gIP*O;QT!Eg-p#6p(payCelze1$lZI9J5uQiTZlLU81l$1z$4&HFwmac?bep zgz0KJL|{h&gY*x{m(F;TIL>n7TyO5n1u5+HL?P9by{FRzcnb$=xbVCUd(I7q92nlm zdOj+%Zl+vdNBnVX3_j~_!_*Z>r8HO+rqhA00j{G35k6wK5R^&BS#e(xF(wV%cfg?8 z#3avE!t+RuWn!7%2b08umIBgoL3?Tex^;@_X6S;sS~JBA*4K2Y$!A=cA|XQp6Vm?ueWDDdw=CZC25BwuW$fd^&rQdA zVn5(s8Ax-V3ujXpa6t_RO?l4VqM(5xzzuys@MUwJ2$e!YBcx#KQ@9JHjvhVIx}cMA zhaKx^%*}Scer3u~aAOoCE6?=^G0d(;thn;(#wUl)hj9!1f-oILel~HwQAIX}z5w8O_%@OuW_= z4(B(yWani>sF>uUtV7v1M+j*0l(95-KI5JAMNN)=8%b$7AF%fm`f|0RqLz1s_ZW~F z%hf?2C-Nd@RrCI6FLq^>_j3n+EAC6g=R!)(S?jIQyDPrs!wz$P5&2S3 zNz0GN?D+IwQFvnB{zl6rQ55{~JajGV%M967uMPiem0QrTY)d}r7i9<))a+~3Kqrqa z?FQ5$bKqJdCqWdzBlxTHi7ZWB>A`-%1|>Dy`t`Rv$iio*t+BHq>&Pp0hJ#`29()%G z<0(IG3fxXhy)L9n9B=P)%}(DwskyYGi=u$+p>?Y6g(#ol)i*}+&`~Z4|7BLFy{tQ( z_J2aS_L>ngrR_Y3D!HAZd5aGk&?5+``oH=kaYc|=R@91+xMjoZ?L0GxAIoKybe7c< zzG;B+vI*EZ4qr1Ul@Ra;xY7O6agngt`D$@-OnC;i({YPfrG&b$8Pdf4kz} zG^2SL?cT5EaaBJ5`4`Cfjdz4E`K&vt%V>VId0pjDUuUO;3E!T{&I;}nswE4BgNOvI z?rchdTj$~oMrt&=;MQpbS|Ke&wSx4sqYWv*CZ~IJj1`lb)9P<+2Da>r%TKqW1-}Fb zr~--mGnz-~z}xl;u_g`~NaZpmv*;sf&%{Kjs#D;9_d1xM&OaSGzi>X{{$pmxNhaje zb3s}&$@ec9aqCQ!#qZ?u^Glz(uN3^`nDtFk$|6B-__?B}+=MOy=%nbTirp3#z+?I* zS#w){^Ex=$Z4avwbi>v1Q;V2155k)Mb|JSuvT5mM<1dlTuRE3z`oNWKh{y@#oTc`O z*`@zAm&6jD-V_R434FY-dU?FZlcMU`InZ1x%H-m*fU2Zl&-fV9k}xCKl7ka6nAzE! zaQ}|1uhlhfGUt>QPNw{&rqzd|*J?1rOEUnX19dtLv@6c1eegkS%_JY1rP9}i9(yW` z_XRx=r2u;1mkW=i3AOPNN^(cxD)+U0pDEZ5GIFEuYcEUnJ!7_Jr-7H%%v4f_?Axjn zy(eX;jp4v6IRup6$>xaem56IbESO#$b6cnfORijs)JbJE^rrecDC>Ol)9|>INa1*v z4`9FTu#VK!@N$ki9gg}w>>f;f2bZdtiOy3NHI6@VD&{eGRa{) zd;O%oE+zd%v;O0=6v>vb?~)ZdFSFh<6ooU8i+uG!iPi}0*=|1(_9GJ+1)Qx9%5 zHy7f|WP!JW$hUtG`w1Dmf6awMK{JHX?+Xi!rvIsqry5?&?2-s&>d!9%u9;Ap$9@KKYyX4$1+K+~Do)g$(~%Cy{0fabuiT+nF72>%O7%2~5_ zhxey&UrKT{Go3OW#1p@RB>%+Yl_R>E0}i!RMDo;qXrD9_EVvzZ3C_Y_M|2&nm_Lax z0Mi)1xq3J#5d@87E}o!-+tTHkAjvm2fJyjH23fCCCxW;-w+Y8|aMIHYm1 z-;7-{q4qO&Yswb%Fp~Nn{)y*ofdvG#k4CfEgvk+X22p zA4}Jacd6b4JNs4Jdf--dD=aE;t0%E6kNMzevq8qfXp^~o)DR$dNoC>llGU^|r4p3s zb2`kbk$tRap6w-Z?82_ob#W3gl4MDK4Wi8ixW}E8zA)LLxkOg4XTf<{?`Y5ID*2K> zyCjc}v8@+)f9mGlCbAWXN@(z2Sd*xrI-~Ufn! z^}wTIqR#MSC@c;O^KW;`>_>TZF!_KB@?Vi#2Tpo0HSTXL&gxeZlQI+p$~=NB_{EUM zRAhVQ9=}>_J+vOl-R()``yd=u`6mBc$G2s-qEh|;fVFfV$Xq>oaIYoW%a?r$ zNwz=Ti&r2S&mUy zC<@u1r4?oe5F5KRNKPvh@vAfXvQp@JfqJrg@bO%eSZBDK$l{-}A9Z_1siXgCv+jH>IZpDqNkA9VknzKxp4LksZdv z6*onHO6El4M{lM6^;9Wm5c~Z6{M%#Jo75k@@H6~W3C^u$mIoEL?6C1ONjZbz?oThG8GU zf^vVlPD>h?+f?99#390B^3x}Mgr+LaAzjA0ohGmF+gNVBQ>+-lBA6X?@u?}5!&HVu zzj|ri0>{PxxNe>ESEn^2ntrWZQNgImSr!CtEYZ)m1WMsjua5l<9z?^|tH!F-20-t%&QqX8l++*4mfjd7sx&doVlOTj0L(1$9QwuGa6vqP5NF;Nvx%rfp~-q)VJN)!>>x$C<6O*!@468*c+sBsZ-@JV&SnEiH{kdN^j<0)%@@AolLnm z;>JBxG>>|mN$zxLqZe<4{(DW*&k!7jOu%}54s^L5?=u%Cu%Znbf1e;=a^6ZSDC}m_ zr!ps%j=Dqn2eL#+O=u|9w?FmmJaQQhu1pVS5N9H#It?8g%!99V7IC!rvrLhH1nN31 z>pa{O=7*Y)OzOW*qZjBKXC*D7UCOV0s9go7{NwSrW<vgK+V;b7+=mTp zFZHyCQR~ZVX-v-B)$5SK`FnWs%VVV6_7(p$biErmnx}6>zCbd3KFK-Gzm>7pK=*_k zLD}2MiuS`1d95!qwbPaPr>)NfbCL3{I2*HDU~2}OGoqS?96+EIS&I3t{TjJFCr%LC z)MlT&$KfE`q8u8#)J?IuRI~-kb>42cGzP294Eu^=wUaHF@p%X@T06GiDF~bA8HuE7 zl>-C;7cV0M=lKl5Y$#KYR<2|c?PBYt$KT(G*FQu@VQAHpI?PUd&Npky`@>Bx+A_1g zPzm8r$1Co77?#uL+_%5Zkui-)coHe70pkywmZLM)e z<_8@wNz5by&xla@%<;$~5B#q#W?I*iCD$wh2>;zQ9n}X|xm9y>wKNTjL@Q+D3W?K!bGT$ zb@<;uEmLsy2xZ8qQ~(+z$sCCeuO)GB!Ab2XP`!G*Pe*`X`k#^^$?{MxVfmIDuBI5cJOj*w2CcTCvOZANETNJLOpe9Xjx4A@n^_dT2 zENt1x+dso>XFi+wv~}m6LhN4nMcZUB+HJ(%Om`i!Lp+_*%lLy-Fg+~N$oivIDb_2F zhQ4z$XdI)|xX7IMG`LCE?nXG8j&PjRkULs9;@ZMIv+vuX9NK{8ERStwRUb}-yCi3= zdd|lu-SNJ694$q7mAU~^tUU{=UIxG2>Sar8T2Y`j$R7*PUMhF1^-h;7u60!H@+KYc z(EATOY_H!Pn2*i5QTC>HWthQ>%A-JlmK`NPD7T%dNHl#8Sam1-cJiZll>Z$ZOmLS^ zr_~^n^+kBDtGOy(9Z7xR*(B&6nBQh2=f)(cSxnejMb=2$r+Nj%~xx9YYvA8mx^PAL_j~@Vb)Hd;VjbG?i;li?sY#^t2ciHP@{r;6) z25y5TP&c%c)-vAa?s_Z(-{K$D7+fY9jNduj_3L-$u9o$owH=@8ky+5AL*i9F2Cw&8BMO-RIM5xfFmICHc~~Y$Br`;}b+QVBdl9 zfJ7M7HB1D_Q;=&Ukl2oizQo%q{g!MmYzh#6awa~5trIO3g0{c>ALCC%=vVy1-YGt! z_|o&azb)ZrxEi@KCF?_R@(KtEQYU98*?o0~Bp8{l=(AGSN0qt{;;!gfe|%0tW^vXd zwEQ_Q64U#PBha#%v>uw=#nTBq-p`*(HkX))&u9C+P=DiXL79yO{EArexwdh&92l{G z9YL<6p$zYCa!&c3+Qg#Oe=jL^7Ch@&`w-?Y?$poxu!&o09RJh@?ym2e-JSj1ZYPb+ zvUB0UH}JfK(`^P}ciZij$J}-CxX539!~W#<{-@WT6UIw3LQHGruI=KRJ^Dvb zke}IK&z&HTxTEIYq$NFKzNg2~Pg44jS?~Hn@PhUGhsEJ-Y?D^7iT7u!P5{)D0MeiQxqx5v~p~4ZkHdb?+ z{Y3!O&#!Exu46ZFR2!W+2dID<3EBrdoN845I>cImL;llwMI6uN37nYU^G19wFQ{td z$|s~q+_O{1LE?Vud3BzT4(cvezUmR1-)_v#w0Ar{znbuP>`g}5*t{z? z5aQ$|-312yGk!S5`zqoR;gnu2^~_0;AlOzY4!jmHZ}^(xv4lpq`Wu{R%w?8VI-Hr` zPd)Go?_W#XO6hpJS_o!l#|EKYyvWcQ{B^?OSE`GK_6n%)>#(4le<$9y^1<*It{L7u zew5gB#xfg$a@SW5R#ZE(0{Q5VX6(m&wHm^~%pY$Eu;crDe%UCM|1Erw;jEwxPy|sX zYo{VC!nBZh3vhk$@vf2s$HI2lN|=N=w~*aGbv;+dH*VS}2}?Ja{$a58mf$S}yDNd= zF(>2OHt&dSg>rUOkJKJtQ-%osi&O&%t_>j}-?|vCoqT+ipv}+D zYLLjS_KDdoSY?z(CFCS;#52Vn_HgvM4S$m9-4|7L>9lxlN3m7@MQ3*H_%R7csfj{U ztZ8u8G-}6rq`AI+czD&wefdGv*kxJ(D^2KDxP?QQ-6<(3K4eEjm_1p$lMtCkl+@Op zLuAmXLHZ!e5oif!z2JKTo*E+qvP!j=u75AXEGQ0Y+*jGs^H8oy>t9@Hy4;IeKE^JI zvE(Zpu|j0uY2sTjr8@Gue1h%$3I?Bu%2Km(yu8cb7kw7i-OAVZ*`xg3J@k3RYa{31 zb`-pd@xVt=g;*1rbB7P@oul;of#kA3*EQAO5Q5KA=Uq%pej^pXK_hd}hwT*2>)~(b z>1xXXI{pqOyIV^!5nUka#ufM+G4aB+`Gk`!=XMwLPi2|eUd?RvJZO=B$zo-r06z~& zx`A9he_XHRF&=mmtIXTxkWR7A*Ta_Op_i7SQ)JGhUf-V zOTD_g>AuoCmyJta<7Z{~F@ZR3tVJ@MJT@mpt>Y;@sTO6xCB>_`WIdyzO{=9| zExMF52%yqLgw7yH$*H5Kp>mNrs7_hEu;bB(qF( zm441%XjzQ$s`Zs2trX>=l&aO_)({8E2H@be6OE3_0h%qWIk*L!tUzV(XAn|Hs?5`oF3_1iYgyWXB6gZo^;qeb<$QefadR?oeN7#LUi_ zso0NC6?h?LlGXDQZP{ME=Q8AS6WlGhO1?)L5EKCgsXJHt=V0he!o_64@ResLpc`k8 z^xi`*!R9L@Q+{u9nfF@R8hc#=sEg8Ni}nJK|A}K6gfDk*03taFAcDiCEiU@2Nw*&E zkR?y+Gzi|}$v&d;`D-v8<()259{71IhSUl_zTVXuGGGh(5bGI3r~ueikW zgRN1qC|>s?Shh51K)s&AwmkWh07_(=p@x@bYy4Xk5k4DX$&OY4Xw+=HzuBlNnYV=Bz8TRnJBeDLnTw!m)_H+ZWhtbY0VK;l3866t7%R#3n|H;nq1yq z+T?fa+wKO`sIJ~{>}S$fn9mUp~uORHPq z#J0^}OE-J^M(L$Low0t&$a;WJv0Gb9 zBmMH2t7U24;z+k)X+naSu%k6UT}1KdzP$-|1xNxr5(mP%B@6gf7Gtj@2POtHpq1XT z!Mst29*@Fofx@S5m+2V9)WZ=*wgNZ-cekn^S06OLvTQQINh|5llyh~99!i|65>q*Xc2{UcOr-tO8a@g0F<8gt*qL0aJpRm>Nz1J%jb)*-Ba{1@^Y~}1 z%4r-`4wC9UrtP)2D2YL+d&-i8a$`&M{fn|`8b{m{g3`{!L-<$5-EjW?DmUr?yt>EFJE zle0nQ$S7DPd*eEIiWsce(wRllE|)B?ZsNNXKN2m;x%|y;iCPpa-zo}~RVu307LeLp z-l#L=LLa= z7)XNdvuyj6N~WhVoYqih(|2isH>szPdp$TuRpC65{T2iZnXaLc+-SSW1-??HnOB^< z?fKQQH6nPuW$cp`dhawrI(61KLSn|@9{_u$zr3rl!G+FA1i5BLDm+26;vF~yeYo=h`%GnQ}HZ@ue#kQK=%DLlTDUD~B7^c&*w9um` z;%I2#*Tth?MojtGZ&}zgc~wPKm3c>VUb%Z*Xeu(F!74s-AoL4&I~?7=241W`#Yca;x!q)TSNAc4_-{wQ{>v|aax z3@LA=9BGu5K#n2p4(`Li4}hRuf{DayRxJud|Lm61)uhfKoM}i8-BZ}K?-e`GZR-S} z*jhxl1*~(YATO5o+o=J;uHuF5s0%yi+RimrC(c+UG9wcyQ)~RhrJBRv%pLX_mHHn5 zXC}Onrm`<^$y%y<`xn>k*5|n%K!4MUYZ*Md^ZD6Y=*q~+;LCjfni032G;nTGF%Eu0 z>)Rz8Zgt7LKSR5c{}&7%18*EwT!*ctZPFqG-3fLwF3%E|ac5tQtr#n=A` zl$YWO+6ou>JDjVRSVqnzFp0Y-IDg&XGC>6^|HUq`C$KTb0a=C!<%HM(oX2{NX1~#j zsO*@i2QEf2N$pkS@WUWLGC&SBt;@Jr!KfSo6tn--Gc`bGj!NOKP`2*T#X@8}T^JoK z?m`CAyi@v_xPX=6g9&h7Y-K&*H~Ydkq=nwpDXV0!Q1cTjHY8-3#Dp&E&c`Ekaxm6; zDNg$sL#d&uKJno&_%YJnhZFl7_aEKCC%JXLUGw|v&*wAVg-*G8f3dOzQ#;f3`d^^( z324>knsIi%yN*|&S_-?E62p*#VIfQi9!0?eO$#@w=On^e5~*~S9wN_KH^R(^s=Ytx z#IfGDWjla!&%>)~KpB@w0A3j1G`yKqDosqshQYBg&8SZ0Mx4lBq8%EVkbByobiUE7 zKRuMLnf(N@f+;fd8S3jufOIp3-Z0q4X2Z3Ay6)+v3vf2x0Z6p8h4YvfnCjr^c9)hNan#y$W;Q=bojCnx3jBMJ$ED14_Um5Z*7^ zIq1BJn}&DDxzu^rFb?{AGx(SJq}yT>S30E&H_AMso%kT;Hkz(k+Oz4$UIs;Qo(R8R zF$=kdiH>R>H6o?vh-Q)3txcO2?U-f9|84I3yJkDHhTf{-_dNIGS8#* zI_@p+8?&}@WMh-VU{cy7Hsmz2`482EAKb4ix5ZG)cFjV&@d*iPan7&^WI!E=%hmt6 zFx23BK{NN3o^CIidADDqL4qkIwxdzlf;|0IW)HYkZpO^(0|ExP>age9$!`gJWCL*X zd{Qe9fnOBRqyyzSDw(_T{H||=1CZxCrxNWI2Ow^?*yzBT^BYonp%;?caj33x<&5Dy zj(M@UZG_g3PpFT7sqj<(j+}gz`}~zy?soh!?3Xkg)H&6>G0N{=16>J323+3Ex03vP zRoHUIjmS|v+y7(aL+n$bwbT5$(0OfZnzt#YY|^tSL-7k}n`)#wkxA-M>c*%o4F&vn z3oHOIDNZ8G2&l_R#6K*S(!Fj(y6r;+mEak0pb!M+x4s--qFE|q^daduez)z@}VJy2`G1+POvC>izvwz6804^ zpBR6Yrr}fPOuV_T$@15~P_%8kjsu0m9{2y$R%)=>nwte|NL#jpS-@s&d&CN|hp%dRP3*52O0)mn)p}pk{BEq~ zt?rm)l>gR(r?HmObv;zmaasASDdWOW^ffI)BBd(f!#9V?SI2maB<@nAlo1v7r#ph| z2zt}@c6nBJ>^VPT2BC~geH|VN&UL$SwO0V{rj*;lADHt9jj50Ho=n*n+g@MJ1tsvJ zxEu(5Y|H^YY_j&n{aMl5cHv)D%3g@v36Zy6QZid?u4!eqT&Kky<%|q$UURtj@pO^5JPd>*L#~Di22MT ztYj&NzU{&LeVY%wrbuy{{Dq%&&h*3`;thojM|JM9z*v&>eX($TAC>EeYJN&EcjS9A zsjpN`0Yjx?KoD!kG}oO|P;p3xY2xCSIvS$lpfkrOwHZ-{1qaszbG?+?Hl6emCAop_ zGWChs6S7b^Y*P8r2#^QsVSf7fiz&IWZ~w5MJ&HJ>SHchU(&Eg@o}n1d@ID!-E3 zu*ND^wwc$ziui#C^kKe@`%rIs+qQ^&5t69WULXE2X`&U;DkkzYg_~|!d!HtrH&M=WJ6T2kFhJs*KZ*`n35UB zo3mrWTH0zxrQmnw@;~;g9j}A({4Rkd?_*Nh2@pghl>6**W%N1UVUe$%05A638h>jW z?5fNhhd?5{a^ErEPdx>4Wd#tQ(1uFG;`qOKh%E)yF*%4Z_vL0Sk~Mo-8sd)t0Q%jWjJBain{9(uYM5`=!w3+t@aWp_S?Rj@4`p2vZUe(Hg|$FyH3 zc2kt0ke%@W`$L=LEhqP>r}Y!6M4R`(6dQ>G=v2~N_j@&4W5pf7A8_n@vTpn;?L-Qc zZBMR*VpH#5Ln^2>t@f!~74_2gDc|Kx+JQ1P#)QeV1XQAuW!$L79W%ib;t)$&L!Si* zR?lr->C(m5+#Ie@RMFkb(ab&F>>yJEHwJx+-O@WgdsNI>{PRPHzz(WRFov(E%VCfJ z5=TJ6J=J_tXVrZE!jG_R`L(DFyz$@?vF4BVG73Qr7Ky~v?e;vn#eFC+*DQ&@2@x!A z-}oG>5yfbPFVn<{%-1Hc?~mZxD$?t*yI^0TKP^!)Et3M2oBB<1 zzD8-cS-7s=M`>Tm9lc>5a`9$cOjNX6_9s_@vQ{mQL4i7V3V2T#`#L7-)*9DeQ;pI+ zK;EHKaeN{K-LAc6c{RqwC!hGtP^*__sT=tf9f1^ob3C^w(eE^qRxhJuJr5|%O74MY zTEX_#QWdmE_ff_(jj(>R6OtLViP@~|)%IVSymWZH$Rg0bpC(`A0iyg`PTMA44Yy!x zDzKjiE>8pgXuWClg=~G339r`c5^ezkTEanE1mj)pcgo!p|3+y+NZt3F(n9ok!l(;L zMTq^~y-DrT zXCGF}Or5)6abz;ZarH8GFHpc%qi<0 zEa%P=M~Sl6DT|wU9miw35mCAqoBA_Pc33aV>(7(m;w zekF5|ChMOx_-N2ZjOS%71klspCTocTd+=%?@CJJ@#@w_Y8MpTC)5*{rzJ*i5<~j1O zblap?hvuyaxwJxmXYbVWd*QQQs5Ca!O2{vvHIVdKUY`p#1F;V>=I1c2-C=LsH0IR? z8Js)=cDaOAd!5^T^iV~M*YHd)kcr*!U9@9Lm1*HqLqZ+SE(bzv6py`uq2%&xYkz%b zx?*qy_zZwP&-LxtzGNI}sYv!wCV_}BY{i!E&Ag(<{V z?N6+z74U`9FM_i~8S>TF5!b@3ZtNR$NJ%1ZVknOu{CaUzJEaJ*>9C`C)Ill87@fQC z;aT)1105geBl2%N=PmyayCwfd5HAuq54AmvNX<8H%vCQnLOjtsRQ?DY-5=fU6@Rk< zh%ME;s#_kJA` zf}vf+^GW~c0K2#)QRH+BoDb^-ty?pb1?e+4`Yp4XkU+aA4($b!au!C`TrN!(7%i$> zKtQgXhww~{w7tkA;IZ5^|H8zKSFCz0Bvhbo5b`=M+nIe_>%GSda$*OmJQ{?WLNM=w zA67+Ex`M`rR0?UD*FE_qGy66Ixk0YW<&|dzBuuKD*SQnSW*OYr3zA(wm@IU%F7_|z z@hnNY8F-gC>9Qo~s=Y%va~srAZytosXWFexX+|zld#Tlh2>0z@YZ|Sn)8@#olWR77 z&}(@JK$)_K%v(H&qwZT3lL9NhLLUa}!B%^t!V`fH!7!8@VS0eufx!P)U}6VgdX9ry zKpkOCLNAtzZgxf-^wk%4FcdGk3=x>IxblPw8Wu3xB^OEPG@sY;Qe+UMCig!3inuOZ z-87d-!+(aCq}mmWUM|c+k=daWxw=$Du-_q(>Zc5~3I;e%BNV>y8Ma+@)Dd(1@w;>`)aND*X{LG#GdklThd}(L$n~B{hq#2muf}6&k|g3>>;~u zr$}JVVIBh*f9s9L=ps%h@{!a)MZg;G%}Er0l*n-HdyFwL(}YUs5>XB(ZVr7ov*u!W z^Gd3xT47uNiX)0JepeV%Oi%JW3`^PSM)n})TRDq) z`~w#%XDdBpJ@V)5=NSo{VgqUNwajJlwuU~n#kbR)swbCpfef9{m(yQLWCVEp)D`7` z2>~RFt_yhVLH3}+m(P)z^TC-miV*kZr`!`%WDl3vv(c6wW%?l&r zb4vS!%PrOMD2aw)uy$}T=Y3H7$W!9V&{+h z-}yEACBjhTyDXQmd)&X>uorf(<@6M_z)!*t;0F+k2U_zZOaG+;S&AH@s3iAbh%UX~ z%rr~o<}GENj{dU{vQcfY^3R8eKl4O{yzxqrKgaM$u4;O=PP$^=r|CYG22uL=c_tN@ zV+n|)rZ5x^VolLfhEP|Q8k01dF|x&7&X~}d01lWW!~d2Zikt2Ly~gjG8(U5rn-gLD zh$Q1W?_FQ`YlQMN0_wO2WEo75=y??h3AP?DiUBB?d`u|Blzn7RpD5v z<1_=ujVM@K3&m56Ku(tCgr<~BxqN=CcHK3^&o8S7(-$5>jACLL9!~=)8tx6%T{B>` zM=2{EHL$BJb!ig}ZtY(yllLk(eI1fa*)2QpnTGNB1bO@O{8I-|k|o5mg0q?^ zg#z;+&9KhPeo1jZbG3f^GLF77mld1ckp|tEvAz4x5Sf^G4OcR}#e=Atmmbuox`HJuIYEmq{zTw6uDhnmkdIz@2cYHHiKcRrT{l}T%)fv;cDFm-1X21la^GZe7EbiO16&JeV@Z%5PeJVcUg1qBu$oW z$y3@ihUgcosLLlBUjxKmdiq_5UKU-Kxjv^E+5iimL0zSs@c8*0&y#e=3Z z$hDD~PLksiAf};S>BmXn&n$q#F1T5Z2s{CixTXe z^~e&FaL_swb{0g6?Vm~#WX-;dOHAQ5kP3q(X3*qj3)}hQfP6uDR)I~C1BR&A&fjEq zPTJQUa&N2|tTFwBRWUln)!Ite&mO6WXe%tgl$>uQi9b{36hb`lY7KPf3$E5N?D$K_ z$J>6+d#jXg_%7_jb(BSS)0V?ZD}2-sbJ?5L*Ovvg4DY#ZGA>QhKV?n(u&Lx4a{qSN zPT1jBk8k6$ZN?rZoOC3dDzW3U=CS3_~@kUz8U(^rb zE`k8b1*c$p-rG=dGl(D?nC-f6Cv&#^IPykw11xD*=_hJ9DkxbpVa}_nRTWGfZCWLF z4YV_2U91&m&Zms1=+@GJlOw^Xxh?N@sr(lglw%N_Xg=BtN#HkT{_?Tt%tx7Fy-M|z zDd}exEPm?={^mq0O}PitW02g_^fAB@;zo62b)xd0i~cMKzh)<=Vv!U;ZzZV1uu7oo z*mk6ywf8Mag9lDJC}w_Um7G2ew~IIdm&-K+ZTn=XZHok6T=80Jj68%Y1);nJm*Ed0 zxk4hZ-HoV#nULSm8v~4vp`5#eraPS`MyPmZ;`g;gL#oxiBJ(?k-Ykv0!K3BE5L2l;z=(r#1Dr-C!esFgRQQ_bkl)0m z%vtEIFajabGp5=FrV_bKNbb_$T=%J!cW1c_k-5&xuQHYX;x*R#*qNuOwX5f(x zQSN0cw;O$h%M~i2-7)I>Q|HKhi(l@d(i?QO`Vj{xUw+BA=~f#Y1&(2KT>adx%qZel z*zkdg`AXu$>z~_V?%hbe@jVJ4+=igDs#*dAa2e4a%Oq_qr9{}k^B=@VTR>-;GTsff zV-q;H@k5@a@I-RCVv`@TAq0s>5z=KoyK3WhPkOXpZh!UuE0u7!^Q4+f?y@lzcmBKj zQ9(}Vdq(h|#CH7dUbku8tc*;VAAlE5$A*4SlL+=rjM1s&|iP z^8e$9XNEb?nR1%*DRZbCXO2k<9UQ|*g;Y+-A&fawDCJNxI;j*&FTaLza9I5J>z4+F#Cm9tp$(@l2{P z+BsXXfd3feSlf^GHWu`+Nde9LosRd?PV7Mz2ZWHhj!PpzsiuFD^(`O}+l;gKWq<&8 zg!Ee$sHUq!%qNT1+X$yi*Ym({R_M|gKXSc|GHrtd8Kyt>ejEDR{H1pj%Y9_YYNbw2 zZa?wCb@%JmnaZ$PYf0zMl;@4ukLGgi*kJOSd0y#PxcCNCMP5{g=ANzw)BCMYT9s_N zlC|$X{uxUI{xQE^t_OfS^L<2BdXn(x{nh27NzQ*O5RFKl)GV!4n+oHP{A`OOANn7E zJ!iWollEBb=h;uh{>RjH^9E7o@>s+4XFbt4)06>Ey%Ih9tJOs}>0G{zW&ua8e7>3? zIL%i$Y0ZOZgKT?aD}`G#Th{=0@!6J@>kaD~fgPfJCyCcYHUUSC?p6U>#k8 zVcW*A%_#w+gpl?MmP+-1mHYy%>Vt2yAKHuD6`1L*y4vL3JjJl7fTlW01bfWk4Lh;e z#F;okDI521R|}@tc^1d0opnLT&EOK-JPLK)WgX0rxm53SV`i8xWSZgQfeWe8JLMUA z(L@d|?}gb*YX=UBmbTi5KL^0{a;M-UqZ>O4x`hujqx7HfwP&P! zCu+SDy2!BULRlY&iMivggMIQ`a{g{@RpZbGoa<)NtT~g44i6orAQmrXE*uS%AsnA? z=gc?u?Hwbp7ZEi>zV0(<*3Z>(RWFXFfrVF$XIobcy7Jk9PYB|6@fPzo-bMO))^ z|GX?(2hfy1ZY|6te(4iCqIV^eQdl(c=c|Yy%6aR+7FwRB(+_Q8!%if(<=_m@QA-12 zOX!)c)gN1eVGp(7hwBW6Yq5J?Zz1> z-UgIQ{(K?g7DuR;vr@b?2}oBP_qRSUf5l;y6tG9CU%mfk38Br^={=KJuA$H8s9zei-X{MbrpUs(Z#@)2c2$|z~ko&uDHOOm^3pF1_@-U z{;Rq2%Q{cBtAfA{`P1l!9E$;c99|*9j{R@XmrUDK&rGtk=0sf)s4eS3^xb*^lGP=4 zNM~o#ygB0Sp1Va^lMl=YS&vH40}VUR)LF9ZfMQ503E!TBQ|777S$cU#Y#+K9iqy73 zjoZOl!ngZ1+9mr92x=VS7hgyLQ{y##*6Bojew)CT(gpFJ2qzZV2>1|qA5#H1?R(=` zyOTs=uX*8aDC9f7eoqOUlc@&IRS**5m8eWwA!gg=CPxVy{B4oLnLHjfUd8Fqn7mxZ6%DSjdR;X=ncjIB znwF{ouhL6{Z8nyWJo5rp5fYvlYBQt6W%xn)`mq<; z_P8Szsh24{@qhf)X!UaZ+@IC`9^SV%;T2;&0wUrPWraR0#^WZxTtQfAFFjnlLyOVzsZs*csBAfPP+>Z%eJ|2{p6PVz=sWBUuZ%qk8jw&VFq?|ejpi{k}T8xMFZCw#}MGa zVc6Zrx3X22OM{46(L}O{dQLv`1#*e;Wrv#&T(li&Mbzw$*DqL89nC8{mu@5{sT|pjh$s(`c9Z7)Am5H?DQRZP~C6yl#$R+B|UHrmw2pz>uSb@hm+t> zS447s`42dnyH`y)DI#V)sU7Yjp5^5=ORpVSe^+CL(^e|~Bmi*q@X{&B5(X$6TRdT( zv!{W5BE>du;13({Jz~R`qYVp4oi)t3gTY#Ku2Cq z0w~ZmeHG{wO zME1;=P8k54hux8y6|RG*88Y*NlK6g?gKspoaY|}DC6GIwrNwopLoPQ@Oy10!-u>_A z??iX`%xy0?cKg5dPhe`UbQ3ta(}3At+MP$3&&ya4W=2R?1EI;D-Rz@aPF@H?lR+s# zTl?RB2XjYp-NSF8YC`SI`<;RAMI`cbKG}L$*2;a=CCGtL*F!P0uqja;r!kV#waZq4 zT3?80oOJ>F64!|ckHW1^$+}88gG2B;(F`?J)p{XlW#^6NyAP|1M?gv`t>8~AtM9xJ zaPL?vvYT<(F7yrT5+1zCAi(?%ZaMY<>(yAckPMV|_2(Ac6FPRvAnJ z6|ZTLV&{MWH)sJlw2zqLaka%tUtpbZoizN1r#8T?CcAxU-tMMLDd^yWJ`I>jDc++g zj?{D3d>Ds~`|V#KnX)c3fA|m-R2G+riqM&Yt{uXAb_>5v#HAdh8difTpB|dzzDfIt zD@3eAZ$u!pVW8HYNMlH82QnTw&T{h5={n)sjw;R1nc?bgMy1^ z%vbSK9N6h$-=h1ti^(rhnx8j7#rMr*`qqF}Gm8!|vTN9mKd6@?hoY%jd&2R9tv7IH zd<0yI<1-iBY*|7xpfO~~C( zD-H_C1+%HaQy3(UZ7TG9vQv~+^00D;91K?LSb%VPv+8QV-iCch|JyBM>9J#q|5SK! zu#2kQj?1BY(>7s7w}zn$`fgOkDt--aT66ws zauowobXH+XCM>#(RUKaHP2^yy|>tSkGs;^i_dxsoxYR zyzUewQj93lm*qYJ>Yb%pR!@O~!dcAof0N=DnNEL}!J_gK$fMvfBIGga3c=M2XV>}s zAc&m?1!Q7C6iugbK6YZ*6xmgGd(4gJ3zuUh$Ra^!)6C@fbrK z8>#(t4^s{K<~R2fvw+{l9#c~~ShXnxR0rV{;1q3#+UaeOP9j5o&VZnH&^&WsCFJ&fXjTp}sxLPx`g)_#Rzz4uSWUDpg# z1uF=gJoF0{v02dD)PiYD;dwR4U6OA0Ct7IHtD3o4sHnv|F?hiSxkSXcgzy`402zyh|KpeI!0qFk9h+ z4LyYeDFnabN2YiXJMjJ8#@Y77H5iU;;@6(5TZflQig5hAJiPfJ>g9!*PQh0r2*q~1 zl!?P8;b!o{G2iwzlt6nl+11(_gvP{WEQlzl&`7UP-c`aJ?sFcmxfQTVr|r*FZ&Sf*AK2m*M638LI8C%`I#(v0YyvfX8u$Nifxlo-4$+ zgQ~EdjnC#+zZKvG?2>V<$N}xyqE+@W+tQ4DR{Q@5i3T8E*zD6^PVWr~0j9OUtn&qi zX{wKcVn4Qx=_oFSAB!-B7+4!dsBbSfv0-K9rd&CXBY)m2mJ?}{7b*O)Ga9cXH>T?- z^8C=tQEBrUZCLF-;0lNvACtICZRw^xPaK-=S7mLtCKJbJ|OB2lw%iSTw zc9t+?fk0_>yojsygLZhb3=?O;vytpGk!UJdbD~mg9LGik{cj=9=J!EdNwj(05Co-FJb;%-IDf4P=1)hC2^JDy{7ie7eU9%hJjEp1gM&Q zurdwo1EG5K6JD$@s{-EvYCN4i6tS@$_?q$ryKFoqm?UZzOAR?0j5pJ=r)3X$Im2V$ zvQ1$^yAmmFDfeNDVzTinr%X0J+T3csT~k_zX@|197(J7@t2YU7!{a;apv7#6SKZ$S zR8SM50v^dY2Dhog7g>swF7g%D2J|(#$13Dh5ce!zM7X-8MFUbZk45it2d+r376GC& za#qdmVD8+^L0B=`u>%eJI|h)|_Tc5|mY@Ql=6FK5o8TivK!O{Ca}& zIsbmekJU4G_RjK=WR)SJcKUNur+)U#r0yWSA&%Z^{K}7B3+U#N_dD1-ru)5J-V1DT zAVK{VoJ)21IXd7+QCE@$d^$_kUSfF1`ck7sZ{r?@A*ytw99ui6x zTPxao^55Zx@xg{-UG9DvvivgtpO1IXd8fGXtJTz-kT7>k>f6fs%R`QB7jMkWI2gSv zV%^(4O`j6%AeSw4z1**C(A;$+qfbl!#S2k&$lRqfKujpi)Y%)LZc(m_R1OpH*mfH+sghXh;-GH{b z9KYw+3P-wZWGfAGB_2dY%2q;@r{p0po{1DlI?OTD%*^z<8$>KH9|BdoNrG6r?7mdg z+#rY#Hy~WxS4<)B@Iy9k;g8e?Qef^m^~fMT8v{|^9$;KnU%O=tQkai;kO;;gTCXoq zz}#or*pb4;K!Dn`AxF)PMi_JVKiOlBrXSUUz)c+?TwJC!h>DCR_)6jHPzrbvEi(=k zSF`AZb~p+N^6ND_o$GV71MleoK z_U-)H3V6~oea+J^=G!p1S?XK6h3^oP48-{D&ECnaaTWd68il(aIbBxt$Xjs`yh}3Y5m#9Tl9bGw+bnHZkxVTw-0ghDb z8f)lHYkDlcpV#Zqw~(mataYa<_`|yopLQT1!4_x<4F@QKCYdtc&6CC z8^s{@Fm*p54hui0SM4hm8~Klq1B*3M#?7VEYb#p*&nAOMZEnxSzkL16cfIzTFT+n> zE!cZFDRx|}%jWRl+`YMsw{wDP9d~bu#>|vBwI`U!Q_xqw&D@hcX(=7dWi`j=fm+7R z&|MF+!Y^E<6tCU86iU4mniWc~Z5gjDjd|*JB*IiAfDH-QWDC&xn>rdu;4(HSgY&GY zJxCqHEtW!JDDoXz0n*e_-G{3p>oJhC0H0=N_`?k9RPm+m>5gn&rkKLF-j7o^zR5By zG`VvAinyw8Q;d1WQ*-D(|DR8ClVgPtg6`q@N%Trp+z%1>*!SiWI^c0!>ebRiPvz?b zN;CvxrWSOcNPaIw50`|*9@WMp6fQl1Ybq9&)}GbSy{A3$(`C9PfnM8`(+!bL(MCYv zd-g#?j)Xu1;_hP8PL_1{^4mt7gBZRI^d8H2;`N^W>fDHjpIDY1>GnB_TKC0kX9jIj zKjtyyj!|ZAKm5~X(30}&+0Xp|zzs2VtBi9q4=T1awxF+xAS=8kxs8Ekj=+}Nb|CC= zfZEAg+>Hnbe(`0_7zd(aau}eUpZ?`H_V2+bfG53s;w=et;s0)J%iN_)ap}rRvr=i?!Q7dQLVXAy_s0`Gw#KAM z`(o3S>l{p`AldtBm9{}DQXUrnB9^%Xf&auI8@U-=qN86LII;l-et+fDn_5ZeR5AS? z=8GC@{Ve3+=K=azT8ZX6&`)J4wvrqL#Dd61^lS=+Vi_J5m!F9Jnztu zjP?5oKP+H-^0bK%m%_K?E*D(N8Kp^{%wHAa*F#sj#0o7#_1ud=P@f&ILLRG;o0nmr z$aV~mRA5{32?!ShAy?8w-W9YSu@7e(K!D6#g>}E0&r+wu38%-7hF$@Ht>BDO6688H zW)wFLqmZOXvb7qne{oL_)V9pgYllK~gyPiSAzByMybKkl$U2xPGoUTs(@9r2L7VlosqX54Zmr}G&{efM5Pe|cKOC)BxfKLZ2JZ*!@G>Q zQnJrnvn%RNUS+_faNgYc(7MI@Jpiyw4n5&4(5lkFJYW_KJ!=YHvsWK^&tsN_LX^E5 z|I@EaOMQWac;O;Mew{WOGm?d5O*i+ZaNT5FbN*3k136?nYrXBb0g#dD86O4W_cAXZ zJAKbw*nW`f%NOE@u_yLwIn3QFM4&+}>Nad?-sLK5IL_Vkhj3f{4`fjfAoKs8v;WO3 zyR!=&0B*}bXD?A@xL7L8)3k zjAWJO9h>wiwea@V=;f}K(PY!CPHWPr<^=4zxZi;lF?b_}Q^nOG_|R-q>vr_)1Ll=b zintO7xgcF4ewY*@Om0Mx8%mxgw^Zyt&i`kt+j6Fp12o7HXPo7+-&DGtC>J^YPFWLEZYa65Ls z$}RoHfsVLxa~!GibenH%+QynEMBwM`HO@b$De z#su!vK5NKs4<%kgm+(aJ{|u2^Jfs$xZ8vyIfnaDiAezh6S6|7wy)9P$=y^C$tEfP% zl?zJG>~x4Zq5X#^YnB&0}b%bEaXQE?!}* z&)`3=@cL`w>kh`ky-H2Pq)k%&xy-O>yO z6<=z52R@V#IJEK$1PV2<%=Lu}{=e00<@ zJ%45n4+dZ`y94TYQd%y4K1YzDuNE*DQs=p5;~QirQ&v7Cxx|S1;TVH)`|5aIq_Uk# zKU_TjxyVa4X9Ib2J)kw@X!fMxuWYaG>4o63$XD%U528{_V>Bj|u_Z;Peta75GcvYm zI}}$H7pgH94P|@ml(~vfTLndao}Hxa4zD9(*QPQZzSc#yhD7ri8vMj!=kVt9K6Ee+ zO`o4HE-o%%i0+cmE z9^wMFd92H$vbPoTHJJByGwI!AdUpfAU0EOY)8E}A61ztzM93dyS|1r;6EIF5{53Q* z6x_F)m4aXYl2h>8ZlJH;{Tnnmy@CtIUFjH8`RTFx+ZE5UR$5=dZG@$@=vfD6@`;_J zSBP}HncS<*f`UzqwM>WaLX!;j^B-k$CKtdHXnA1a@PI5NL^*yYoTTw=KR>^G{Yq~- zOqtXFMNooMaqz#LY_ik5)d^&sT+9TI#=ePSc4eoSYa`BlMHMq?Ey&q@R?9HqS`LW~xv51A2&iU~Fpg$-gN zc`Yq>QE7zh7N4icACUZ0<+3P}&GSQ82VgCDAQ=Y9u(i%2D=4IS0hp&ql>>1)yL@ze zJj8YngZh5gS8EHybVF1SA!RMApk+ap1@D#E!bE9nHRu`ku>$beBNaHzaJje#6n(9P z!zf6%=uF9wd3PAei-r~r!|uvmsla`L`W-<7_Wj?JHW)rpwPCEu-so8n_u2@S-CQx* zyXV!lPY+Hkmm4PUozTBc1Uqy%(6~zd*$g$jqIve|SEkglRz%om!{eZkj_wb;kMbqG zts=Jj+XY-4*n+6zn^dka+-;PC@{bTU=6!LTWvAoX@7~tITw4qU0abi_0X?mGjzJUFZSiJFO4s@sTG zDckCtXwkM6HL;~YZhss|FLE{2FWWBFr#fmJwt6-CP3b-Xo$S-nQ0HNp^;n4}#U5yh ztti&Mg0_K(evVArZF5>ght@ zNCM*nOg|y{OUze?Q@K&e2k?IG9iEm>WE*k*jq`8fEEu1*%TI5EPObGw=WiQP^f@s< z@oLTWimHt=!ARgYSdj%)Im-eH{=`A@wyPso>s znouTcoU(q!GWF7h9selQ*z9AV{0TygBQf|G#csKyiaSJTWo`;N%&%W05N6w)GcjOSTq+R@dmbB%4ncvCbY z)e0Gix-qodE|A`Z)%}Azh#x$U*vo5Ke_a}C;k1R|ce9cB-IW@YqZd)YyvPVF>HpB< zB2m~z(b?pPusTDNhrnqm0m4>L4_18#yGOHhNgy7ncAUB~iKM0nvntb+UjS7N+$< z#!ahA-4(A$(+D4P;TN$_W1npyh$s>*)joxS;%jryMNFFFCJQy#S1?@s)28TaR&|t2 z+|+;KTV}VINDn5mXBk#lT(5DHa3Q6v1Ujoaf!EF%2d*WhppcF58Zhfe(7+un#)VeCwl6V7O9oMP@L+VC!!!5+o% ze*5b*cP_c6Wb-X299R?RR2iPJH?lKTNUWz%v4+7>@s23`v-6V#euiTAb^Tg%n+%lz z&HB(?R$;x>FBGSFompV2g|)v`BMp26(CreD+e&O?$%It_4>}6&P;2~e>PRHYt>J2Q zc8MxnwYxB`UE6q5r!P9jjvdf|{wwf+7Eq4&3J7m=mOuV{Yy4#(H@N^Wk4}%20$Iwk zBB~h?PZHKjD$gyxz1&VrZQoN@_flpwY&0q4W@bB0Kbov}0P6$0Khy@k({XjQ>Zkmr zt+(akK*g`MVtAX#`k*y3DPk~YwuFhS1@B^Xz4Hj{6JA;h?B9d;knuJa^fh49z83%j zo_&efp<@U0@KQ^7rSz|TWk2?1gQm>i#pPuUII;tMbTsE&-e2H0%6&%DoRyb~eAf^b zvE%vTX73hIK}<<~SAE8}bHtREYnq3`OYJ&%fhZSWMv9mh3IF9U6JaRI%K@Ddb!R@x z2)lw(eLaWBsefZB*n;0ld-&RtuPIdopQ!X?Z(`2<<^B^KZcCEV^;5+g;7>@ZAArOo zyw%EEMWin;)(@z;5AcJFKTt-gN~Ux7kmr~alTnn`_4Tof-TjsmEIR8ZY=})^Z(7|D zs9m3Wey)w*$Z6(<2AhLmnFj7fo%{`I22-v9`%bUkGuv=m9}I40tUQox0BnS`R~e5Z z9w%xp<94U}!CmN5|3HX~iLS zi?zcLjH!L1hE;v(xD(-t{M0_Yt`~dg#@96thUc=kz`ft$sb7n|7{*qDtMx(IW2n0z zs=I{be(y}B;NXl;!G;nvVd_u(FvoByU=|6ADBp)Ry`Ah|HcJAD^#Jcv1O^YW1HrLi zN@JR>Nr0bY7HuS-;J`Vl(O||^eh2nmZUJD}3VF1HU2alZ)Arv>-@XDbNr%S+-hurl zia%1cf3jp&YOI7K*f7C#$Nnc&4tCHbuD{rx@3%bgUz1jrs|r^{S2EQ0a7jFXFSE$`a8a2n1tiN=%?95$mvkd;TB+t zy>GHKJBeZAl3HKO=b?3E^JX1zda4_`J}jDm6h=S$1V8G-)~kYORuQKAUeDBO_eYUF zM(Y?0*76Pda9qDcZQNRBSPC$>L3FdwV~}JI97(>&u|6CK*d9ghlPY1#} zn?DF%q8!^;0G^%j0K%Ag-1(YntYoy@;q7=9WhTKuX?>>dIlrhw`iD*b^gJEV*z*IZ z943kBi2b~nSLbz8VCqQdcW&=#Y38{vVVF;H5J6{cn!C(JL;BhtVqM<$~?gG)Y zyCDP5T2GGiWXHmHzMP0D*Z$UlkqR8ab-B8-L<1M{nb${8Xbgsk9nBAW0xEo$fH>>vPy(f*U_OC;aYOi=wO?G#&Rx_hL(ef3yebez~O}u|u zX0xB{`ma;G?*`KmguWdDz@3UCe2FQIHLv4(1;P5eM7tc9%6jt@7oi;hqT|PI)Db=oyYhrbmJZGNx z%f{9zeI4vDM`3qA^i}FO|60iom70ijM=k;emP>0<1}lPVxWSpaa)rpxRtX%ju*HR) z6?X7fT6Meg_80z=j?12WTcDHDBGv<&&Xo>EjX2FELWVBhsoi)MNOam_DT5KD{U1Ci z9L|jPNqc_;gg7D_Q9khLlS9NkTTJHH?#~S83ZaF>Jssi_8SzJTe+6)|{#bdrj06ov@&njt zI!rl@mdXoQf%rmpwwctH>J1wtdu*KKdvUr3%=+X{DfR^pIu$bPZP3G z9y5b|ESSjnD#cQwf(Wj%6Me}i=)=kuAi^ay+`abv)1(^h4k@ZOIaqC4YBX;@_y5u&Q`WWnZV3OZD*!;I1z`%_6KOEbsBdQQy(&@J{`OrfWABt7qR{np8kkQOn>D^Fe^fR-Z(uJUB~FZj0Fk1wB{D%VFp(e#v!~)y3frNmI^CI-hzMIV1cXc6xf6B58Md_^q^os5qx|#u+@hl7 zZ^nrMK4J5y6kMN@C0F=Nf9KIUo~MVem;FFdelYcOBDXzXHUdf=rvrFRSG4><1oA8c z%UCAg62-z#-P6`3;Q8Z}1zD|sF020#e}k{z6~gvjvi=Ce3d{GG_&=tSx#sxRWq$rw z!mv&NS&^((uPu;`!>*{IJXjhV$|BCB3|OFk*zVsxSXpb8o)bDwglXLX@s#(|%tX5s zW@tstI8!5R*^C~wy$0QriBss@k;y8+tynzFm|O!`XdjdD8js^>3>eFk-INxT#nY3) zc7J*m>N=|u91pNvh{)$e^|%Q9`1tskNg2+x8gKTC?E;BXgOJ@}O zPb%N;q^>neOl!55{4gF2%V$-p2Z3g7C|>adP4g16V9Nxh^;szlS>Rwh{8TSvj%fgh+>BCP4K`Y;{}>?UkEKL1kwBF5x(WdL z`L!lW+S+w-%QMWs&=Pb@Pe$BtGUv3~^0qLQt%u&SK59>-@1rbhnnQ?lT#AfD3 @ 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 z = { + load: 5, + fps: 3, + scrub: 3, + drift: 3, +}; type ResultsFile = { schemaVersion: 1; @@ -88,7 +99,7 @@ function parseArgs(argv: string[]): ParsedArgs { // `mode` is consumed (measure logs regressions but never fails; enforce // exits non-zero on regression). mode: (process.env.PLAYER_PERF_MODE as GateMode) === "enforce" ? "enforce" : "measure", - scenarios: ["load"], + scenarios: ["load", "fps", "scrub", "drift"], runs: null, fixture: null, headful: false, @@ -150,7 +161,31 @@ async function main(): Promise { const m = await runLoad({ browser, origin: server.origin, - runs: args.runs ?? 5, + runs: args.runs ?? DEFAULT_RUNS.load, + fixture: args.fixture, + }); + metrics.push(...m); + } else if (scenario === "fps") { + const m = await runFps({ + browser, + origin: server.origin, + runs: args.runs ?? DEFAULT_RUNS.fps, + fixture: args.fixture, + }); + metrics.push(...m); + } else if (scenario === "scrub") { + const m = await runScrub({ + browser, + origin: server.origin, + runs: args.runs ?? DEFAULT_RUNS.scrub, + fixture: args.fixture, + }); + metrics.push(...m); + } else if (scenario === "drift") { + const m = await runDrift({ + browser, + origin: server.origin, + runs: args.runs ?? DEFAULT_RUNS.drift, fixture: args.fixture, }); metrics.push(...m); diff --git a/packages/player/tests/perf/perf-gate.ts b/packages/player/tests/perf/perf-gate.ts index 60cf7f52e..a8125868c 100644 --- a/packages/player/tests/perf/perf-gate.ts +++ b/packages/player/tests/perf/perf-gate.ts @@ -32,6 +32,7 @@ export type PerfBaseline = { compLoadColdP95Ms: number; compLoadWarmP95Ms: number; fpsMin: number; + droppedFramesMax: number; scrubLatencyP95IsolatedMs: number; scrubLatencyP95InlineMs: number; driftMaxMs: number; diff --git a/packages/player/tests/perf/scenarios/02-fps.ts b/packages/player/tests/perf/scenarios/02-fps.ts new file mode 100644 index 000000000..0db9792bd --- /dev/null +++ b/packages/player/tests/perf/scenarios/02-fps.ts @@ -0,0 +1,232 @@ +/** + * Scenario 02: sustained playback frame rate. + * + * Loads the 10-video-grid fixture, calls `player.play()`, then samples + * `requestAnimationFrame` callbacks inside the iframe for ~5 seconds. GSAP's + * ticker drives rAF continuously while the timeline is playing, so the rAF + * cadence is a faithful proxy for the effective render frame rate of the full + * composition (10 simultaneously-decoding videos + GSAP transform updates). + * + * Per the proposal: + * Test 1: Playback frame rate (player-perf-fps) + * Load 10-video composition → play 5s → collect rAF tick count + dropped frames + * Assert: fps >= 55 (allow 8% drop from 60), dropped frames < 3 + * + * Methodology details: + * - We install the rAF sampler before calling `play()` so the very first + * post-play frame is captured. We then wait for `__player.isPlaying()` to + * flip true (the parent→iframe `play` message is async via postMessage) + * and *reset* the sample buffer, so the measurement window only contains + * frames produced while the runtime was actively playing the timeline. + * - FPS is computed as `(samples - 1) / (lastTs - firstTs in seconds)`. This + * is independent of wall-clock setTimeout drift — we trust the rAF + * timestamps because they are the same numbers the compositor saw. + * - A frame is "dropped" when the gap to the previous rAF callback exceeds + * 1.5 × (1000 / TARGET_FPS) ms. With a 60Hz target that's >25ms, which + * matches the conventional "missed at least one vsync" definition used by + * Chrome DevTools. + * + * Outputs two metrics: + * - playback_fps_min (higher-is-better, baseline key fpsMin) + * - playback_dropped_frames_max (lower-is-better, baseline key droppedFramesMax) + * + * We aggregate as `min(fps)` and `max(droppedFrames)` across runs because the + * proposal asserts a floor on fps and a ceiling on dropped frames — the worst + * sample is the one that matters for guarding against regressions. + */ + +import type { Browser, Frame, Page } from "puppeteer-core"; +import { loadHostPage } from "../runner.ts"; +import type { Metric } from "../perf-gate.ts"; + +export type FpsScenarioOpts = { + browser: Browser; + origin: string; + /** Number of measurement runs. */ + runs: number; + /** If null, runs the default fixture (10-video-grid). */ + fixture: string | null; +}; + +const DEFAULT_FIXTURE = "10-video-grid"; +const PLAYBACK_DURATION_MS = 5_000; +const TARGET_FPS = 60; +const DROPPED_FRAME_THRESHOLD_MS = (1000 / TARGET_FPS) * 1.5; +const PLAY_CONFIRM_TIMEOUT_MS = 5_000; +const FRAME_LOOKUP_TIMEOUT_MS = 5_000; + +declare global { + interface Window { + /** rAF timestamps collected by the sampler (DOMHighResTimeStamp ms). */ + __perfRafSamples?: number[]; + /** Set to false to stop the sampler at the end of the measurement window. */ + __perfRafActive?: boolean; + /** Most recent rAF request id, so we can cancel cleanly. */ + __perfRafReqId?: number; + /** Hyperframes runtime player API exposed inside the composition iframe. */ + __player?: { + play: () => void; + pause: () => void; + seek: (timeSeconds: number) => void; + getTime: () => number; + getDuration: () => number; + isPlaying: () => boolean; + }; + } +} + +type RunResult = { + fps: number; + droppedFrames: number; + samples: number; + elapsedSec: number; +}; + +/** + * Find the iframe Puppeteer Frame that hosts the fixture composition. The + * `` shell wraps an iframe whose URL is derived from the + * player's `src` attribute, so we match by path substring rather than full URL. + */ +async function getFixtureFrame(page: Page, fixture: string): Promise { + const expected = `/fixtures/${fixture}/`; + const deadline = Date.now() + FRAME_LOOKUP_TIMEOUT_MS; + while (Date.now() < deadline) { + const frame = page.frames().find((f) => f.url().includes(expected)); + if (frame) return frame; + await new Promise((r) => setTimeout(r, 50)); + } + throw new Error(`[scenario:fps] fixture frame not found for "${fixture}" within timeout`); +} + +async function runOnce( + opts: FpsScenarioOpts, + fixture: string, + idx: number, + total: number, +): Promise { + const ctx = await opts.browser.createBrowserContext(); + try { + const page = await ctx.newPage(); + const { duration } = await loadHostPage(page, opts.origin, { fixture }); + const frame = await getFixtureFrame(page, fixture); + + // Install the rAF sampler in the iframe context. GSAP's ticker is already + // hooking rAF here via the runtime; we add a sibling consumer that just + // records the timestamp on every paint. + await frame.evaluate(() => { + window.__perfRafSamples = []; + window.__perfRafActive = true; + const tick = (ts: number) => { + if (!window.__perfRafActive) return; + window.__perfRafSamples!.push(ts); + window.__perfRafReqId = requestAnimationFrame(tick); + }; + window.__perfRafReqId = requestAnimationFrame(tick); + }); + + // Issue play from the host page (parent of the iframe). The player's + // public `play()` posts a control message into the iframe. + await page.evaluate(() => { + const el = document.getElementById("player") as (HTMLElement & { play: () => void }) | null; + if (!el) throw new Error("[scenario:fps] player element missing on host page"); + el.play(); + }); + + // Wait for the runtime to actually transition to playing — this is the + // signal that the postMessage round trip + timeline.play() finished. + await frame.waitForFunction(() => window.__player?.isPlaying?.() === true, { + timeout: PLAY_CONFIRM_TIMEOUT_MS, + }); + + // Reset samples now that playback is confirmed running. Anything captured + // before this point belongs to the ramp-up window and would skew FPS down. + await frame.evaluate(() => { + window.__perfRafSamples = []; + }); + + // Sustain playback for the measurement window. + await new Promise((r) => setTimeout(r, PLAYBACK_DURATION_MS)); + + // Stop the sampler and harvest the timestamps before pausing the runtime, + // so the pause command can't perturb the tail of the sample window. + const samples = (await frame.evaluate(() => { + window.__perfRafActive = false; + if (window.__perfRafReqId !== undefined) cancelAnimationFrame(window.__perfRafReqId); + return window.__perfRafSamples ?? []; + })) as number[]; + + await page.evaluate(() => { + const el = document.getElementById("player") as (HTMLElement & { pause: () => void }) | null; + el?.pause(); + }); + + if (samples.length < 2) { + throw new Error( + `[scenario:fps] run ${idx + 1}/${total}: only ${samples.length} rAF samples captured (composition duration ${duration}s)`, + ); + } + + const first = samples[0]!; + const last = samples[samples.length - 1]!; + const elapsedSec = (last - first) / 1000; + const fps = (samples.length - 1) / elapsedSec; + + let droppedFrames = 0; + for (let i = 1; i < samples.length; i++) { + const gap = samples[i]! - samples[i - 1]!; + if (gap > DROPPED_FRAME_THRESHOLD_MS) droppedFrames++; + } + + console.log( + `[scenario:fps] run[${idx + 1}/${total}] fps=${fps.toFixed(2)} dropped=${droppedFrames} samples=${samples.length} elapsed=${elapsedSec.toFixed(3)}s`, + ); + + await page.close(); + return { fps, droppedFrames, samples: samples.length, elapsedSec }; + } finally { + await ctx.close(); + } +} + +export async function runFps(opts: FpsScenarioOpts): Promise { + const fixture = opts.fixture ?? DEFAULT_FIXTURE; + const runs = Math.max(1, opts.runs); + console.log( + `[scenario:fps] fixture=${fixture} runs=${runs} window=${PLAYBACK_DURATION_MS}ms target=${TARGET_FPS}fps droppedThreshold=${DROPPED_FRAME_THRESHOLD_MS.toFixed(2)}ms`, + ); + + const fpsResults: number[] = []; + const droppedResults: number[] = []; + for (let i = 0; i < runs; i++) { + const result = await runOnce(opts, fixture, i, runs); + fpsResults.push(result.fps); + droppedResults.push(result.droppedFrames); + } + + // Worst case wins for both metrics: the proposal asserts fps >= 55 and + // dropped frames < 3, so a single bad run should be the one that gates. + const fpsMin = Math.min(...fpsResults); + const droppedMax = Math.max(...droppedResults); + console.log( + `[scenario:fps] aggregate min fps=${fpsMin.toFixed(2)} max dropped=${droppedMax} runs=${runs}`, + ); + + return [ + { + name: "playback_fps_min", + baselineKey: "fpsMin", + value: fpsMin, + unit: "fps", + direction: "higher-is-better", + samples: fpsResults, + }, + { + name: "playback_dropped_frames_max", + baselineKey: "droppedFramesMax", + value: droppedMax, + unit: "frames", + direction: "lower-is-better", + samples: droppedResults, + }, + ]; +} diff --git a/packages/player/tests/perf/scenarios/04-scrub.ts b/packages/player/tests/perf/scenarios/04-scrub.ts new file mode 100644 index 000000000..6e19792d8 --- /dev/null +++ b/packages/player/tests/perf/scenarios/04-scrub.ts @@ -0,0 +1,276 @@ +/** + * Scenario 04: scrub latency. + * + * Loads the 10-video-grid fixture, pauses the player, then issues 10 seek + * calls in sequence — first through the synchronous "inline" path, then + * through the postMessage-driven "isolated" path — and measures the wall-clock + * latency from each `seek()` call to the first paint where the iframe's + * timeline reports the new time. + * + * Per the proposal: + * Test 2: Scrub latency (player-perf-scrub) + * Load composition → seek to 10 positions in sequence → measure time + * from seek() call to state update callback + * Assert: p95 < 80ms (isolated), p95 < 33ms (inline, Phase 4+) + * + * Methodology details: + * - Both modes are measured in the same page load. Inline runs first so + * the isolated mode's monkey-patch (forcing `_trySyncSeek` to return + * false) doesn't bleed into the inline samples. + * - "Inline" mode is the default behavior of `` when the + * iframe is same-origin and exposes `__player.seek()` synchronously. + * `seek()` lands the new frame in the same task as the input event. + * - "Isolated" mode is forced by replacing the player element's + * `_trySyncSeek` method with `() => false`, which sends the player + * element through the postMessage bridge — exactly what cross-origin + * embeds and Phase 1 (pre-sync) builds did. + * - Detection is via a `requestAnimationFrame` watcher inside the iframe + * that polls `__player.getTime()` until it is within `MATCH_TOLERANCE_S` + * of the requested target. We use a tolerance because the postMessage + * bridge converts seconds → frame number → seconds, which can introduce + * sub-frame quantization drift even for targets on the canonical fps grid. + * - Timing uses `performance.timeOrigin + performance.now()` in both the + * host and iframe contexts. `timeOrigin` is consistent across same-process + * frames, so the difference is a true wall-clock measurement of latency. + * - Seek targets alternate forward/backward across the 10s composition so + * no two consecutive seeks land near each other; this avoids the rAF + * watcher matching against a stale `getTime()` value before the seek + * command is processed. + * + * Outputs two metrics: + * - scrub_latency_p95_inline_ms (lower-is-better, baseline scrubLatencyP95InlineMs) + * - scrub_latency_p95_isolated_ms (lower-is-better, baseline scrubLatencyP95IsolatedMs) + * + * Aggregation: percentile(95) is computed across the pooled per-seek + * latencies from every run. With 10 seeks per mode per run × 3 runs we get + * 30 samples per mode per CI shard, which is enough for a stable p95. + */ + +import type { Browser, Frame, Page } from "puppeteer-core"; +import { loadHostPage, percentile } from "../runner.ts"; +import type { Metric } from "../perf-gate.ts"; + +export type ScrubScenarioOpts = { + browser: Browser; + origin: string; + /** Number of measurement runs. */ + runs: number; + /** If null, runs the default fixture (10-video-grid). */ + fixture: string | null; +}; + +const DEFAULT_FIXTURE = "10-video-grid"; +/** Targets are seconds within the composition (10s duration). */ +const SEEK_TARGETS: readonly number[] = [1.0, 7.0, 2.0, 8.0, 3.0, 9.0, 4.0, 6.0, 5.0, 0.5]; +/** Generous; postMessage round-trip + frame quantization is well under this. */ +const MATCH_TOLERANCE_S = 0.05; +/** Per-seek timeout; isolated p95 in the proposal is 80ms, so 1s is huge headroom. */ +const SEEK_TIMEOUT_MS = 1_000; +const PAUSE_CONFIRM_TIMEOUT_MS = 5_000; +const FRAME_LOOKUP_TIMEOUT_MS = 5_000; + +declare global { + interface Window { + /** Promise resolved by the iframe rAF watcher with the wall-clock t1 of the matching paint. */ + __perfScrubAwait?: Promise; + __player?: { + play: () => void; + pause: () => void; + seek: (timeSeconds: number) => void; + getTime: () => number; + getDuration: () => number; + isPlaying: () => boolean; + }; + } +} + +type Mode = "inline" | "isolated"; + +type RunResult = { + inlineLatencies: number[]; + isolatedLatencies: number[]; +}; + +/** + * Find the iframe Puppeteer Frame that hosts the fixture composition. Same + * helper as 02-fps.ts; duplicated locally so each scenario file is + * self-contained. + */ +async function getFixtureFrame(page: Page, fixture: string): Promise { + const expected = `/fixtures/${fixture}/`; + const deadline = Date.now() + FRAME_LOOKUP_TIMEOUT_MS; + while (Date.now() < deadline) { + const frame = page.frames().find((f) => f.url().includes(expected)); + if (frame) return frame; + await new Promise((r) => setTimeout(r, 50)); + } + throw new Error(`[scenario:scrub] fixture frame not found for "${fixture}" within timeout`); +} + +/** + * Measure a single seek's latency. + * + * Sequence: + * 1. Install a rAF watcher in the iframe that resolves with the wall-clock + * timestamp of the first paint where `__player.getTime()` is within + * tolerance of `target`. Promise is stashed on `window.__perfScrubAwait`. + * 2. Capture host wall-clock t0 and call `el.seek(target)` in the same task. + * 3. Await the iframe's resolved Promise (returns t1). + * 4. Latency = t1 - t0 (ms). + */ +async function measureSingleSeek(page: Page, frame: Frame, target: number): Promise { + await frame.evaluate( + (target: number, tolerance: number, timeoutMs: number) => { + window.__perfScrubAwait = new Promise((resolve, reject) => { + const deadlineWall = performance.timeOrigin + performance.now() + timeoutMs; + const tick = () => { + const wall = performance.timeOrigin + performance.now(); + const time = window.__player?.getTime?.() ?? Number.NaN; + if (Number.isFinite(time) && Math.abs(time - target) < tolerance) { + resolve(wall); + return; + } + if (wall > deadlineWall) { + reject(new Error(`[scrub] timeout target=${target} last=${time}`)); + return; + } + requestAnimationFrame(tick); + }; + requestAnimationFrame(tick); + }); + }, + target, + MATCH_TOLERANCE_S, + SEEK_TIMEOUT_MS, + ); + + const t0Wall = await page.evaluate((targetSeconds: number) => { + const el = document.getElementById("player") as + | (HTMLElement & { seek: (t: number) => void }) + | null; + if (!el) throw new Error("[scenario:scrub] player element missing on host page"); + const wall = performance.timeOrigin + performance.now(); + el.seek(targetSeconds); + return wall; + }, target); + + // Puppeteer awaits the Promise we stashed on window and returns its resolved value. + const t1Wall = (await frame.evaluate(() => window.__perfScrubAwait as Promise)) as number; + + return t1Wall - t0Wall; +} + +async function runScrubBatch( + page: Page, + frame: Frame, + mode: Mode, + idx: number, + total: number, +): Promise { + const latencies: number[] = []; + for (const target of SEEK_TARGETS) { + const latency = await measureSingleSeek(page, frame, target); + latencies.push(latency); + } + const p95 = percentile(latencies, 95); + console.log( + `[scenario:scrub] run[${idx + 1}/${total}] mode=${mode} p95=${p95.toFixed(2)}ms n=${latencies.length}`, + ); + return latencies; +} + +async function runOnce( + opts: ScrubScenarioOpts, + fixture: string, + idx: number, + total: number, +): Promise { + const ctx = await opts.browser.createBrowserContext(); + try { + const page = await ctx.newPage(); + const { duration } = await loadHostPage(page, opts.origin, { fixture }); + const requiredDuration = Math.max(...SEEK_TARGETS); + if (duration < requiredDuration) { + throw new Error( + `[scenario:scrub] fixture composition is ${duration.toFixed(2)}s but scrub targets require >= ${requiredDuration}s`, + ); + } + const frame = await getFixtureFrame(page, fixture); + + // Defensively pause: the host shell doesn't autoplay, but `pause()` also + // cancels any pending autoplay-on-ready behavior and guarantees the + // timeline isn't ticking under our seek measurements. + await page.evaluate(() => { + const el = document.getElementById("player") as (HTMLElement & { pause?: () => void }) | null; + el?.pause?.(); + }); + await frame.waitForFunction(() => window.__player?.isPlaying?.() === false, { + timeout: PAUSE_CONFIRM_TIMEOUT_MS, + }); + + // Inline mode first — the player's default `_trySyncSeek` path lands the + // seek synchronously when the iframe is same-origin (which it is here). + const inlineLatencies = await runScrubBatch(page, frame, "inline", idx, total); + + // Force isolated mode by shadowing `_trySyncSeek` on the instance with + // a function that always reports failure. The fallback in `seek()` then + // sends the seek through `_sendControl("seek", { frame })`, which is the + // same path a cross-origin embed (or a Phase 1 build without sync seek) + // would take. + await page.evaluate(() => { + const el = document.getElementById("player") as + | (HTMLElement & { _trySyncSeek?: (t: number) => boolean }) + | null; + if (!el) throw new Error("[scenario:scrub] player element missing on host page"); + el._trySyncSeek = () => false; + }); + + const isolatedLatencies = await runScrubBatch(page, frame, "isolated", idx, total); + + await page.close(); + return { inlineLatencies, isolatedLatencies }; + } finally { + await ctx.close(); + } +} + +export async function runScrub(opts: ScrubScenarioOpts): Promise { + const fixture = opts.fixture ?? DEFAULT_FIXTURE; + const runs = Math.max(1, opts.runs); + console.log( + `[scenario:scrub] fixture=${fixture} runs=${runs} seeks_per_mode=${SEEK_TARGETS.length} tolerance=${(MATCH_TOLERANCE_S * 1000).toFixed(0)}ms`, + ); + + const allInline: number[] = []; + const allIsolated: number[] = []; + for (let i = 0; i < runs; i++) { + const result = await runOnce(opts, fixture, i, runs); + allInline.push(...result.inlineLatencies); + allIsolated.push(...result.isolatedLatencies); + } + + const inlineP95 = percentile(allInline, 95); + const isolatedP95 = percentile(allIsolated, 95); + console.log( + `[scenario:scrub] aggregate inline_p95=${inlineP95.toFixed(2)}ms isolated_p95=${isolatedP95.toFixed(2)}ms (runs=${runs} samples_per_mode=${allInline.length})`, + ); + + return [ + { + name: "scrub_latency_p95_inline_ms", + baselineKey: "scrubLatencyP95InlineMs", + value: inlineP95, + unit: "ms", + direction: "lower-is-better", + samples: allInline, + }, + { + name: "scrub_latency_p95_isolated_ms", + baselineKey: "scrubLatencyP95IsolatedMs", + value: isolatedP95, + unit: "ms", + direction: "lower-is-better", + samples: allIsolated, + }, + ]; +} diff --git a/packages/player/tests/perf/scenarios/05-drift.ts b/packages/player/tests/perf/scenarios/05-drift.ts new file mode 100644 index 000000000..eb18b67b5 --- /dev/null +++ b/packages/player/tests/perf/scenarios/05-drift.ts @@ -0,0 +1,291 @@ +/** + * Scenario 05: media sync drift. + * + * Loads the 10-video-grid fixture, starts playback, and uses + * `requestVideoFrameCallback` on every video element to record + * (compositionTime, actualMediaTime) pairs for each decoded frame. Drift is + * the absolute difference between the *expected* media time (derived from the + * composition time using the runtime's clip transform) and the actual media + * time the decoder presented to the compositor. + * + * Per the proposal: + * Test 4: Media sync drift (player-perf-drift) + * Load 5-video composition → play for 10 seconds → on each RVFC callback, + * record drift between expected and actual media time + * Assert: max drift < 500ms, p95 drift < 100ms + * + * Methodology details: + * - We instrument *every* `video[data-start]` element in the fixture. The + * proposal called for 5 videos; the 10-video-grid gives us 10 streams in + * the same composition, which is a more conservative regression signal. + * - The expected media time uses the same transform the runtime applies in + * packages/core/src/runtime/media.ts: + * + * expectedMediaTime = (compositionTime - clip.start) * clip.playbackRate + * + clip.mediaStart + * + * We snapshot `clip.start` / `clip.mediaStart` / `clip.playbackRate` from + * each element's dataset + `defaultPlaybackRate` once when the sampler is + * installed, so the per-frame work is just a subtract + multiply + abs. + * - The runtime's media sync runs on a 50ms `setInterval`. Between syncs the + * video element's clock free-runs. The drift we measure here is the + * residual after that 50ms loop catches up — i.e. the user-visible glitch + * budget. The runtime hard-resyncs when |currentTime - relTime| > 0.5s + * (see media.ts), which is exactly the proposal's max-drift ceiling: a + * regression past 500ms means the corrective resync kicked in and the + * viewer saw a jump. + * - We install RVFC *before* calling play(), then reset the sample buffer + * once `__player.isPlaying()` flips true. Frames captured during the + * postMessage round-trip would compare a non-zero mediaTime against + * `getTime() === 0` and inflate drift to several hundred ms — same gotcha + * as 02-fps.ts. + * - Sustain window is 6s instead of the proposal's 10s because the fixture + * composition is exactly 10s long, and we want headroom before the + * end-of-timeline pause/clamp behavior. With 10 videos × ~25fps × 6s we + * still pool ~1500 samples per run, more than enough for a stable p95. + * + * Outputs two metrics: + * - media_drift_max_ms (lower-is-better, baseline driftMaxMs) + * - media_drift_p95_ms (lower-is-better, baseline driftP95Ms) + * + * Aggregation: max() and percentile(95) across the pooled per-frame drifts + * from every video in every run. + */ + +import type { Browser, Frame, Page } from "puppeteer-core"; +import { loadHostPage, percentile } from "../runner.ts"; +import type { Metric } from "../perf-gate.ts"; + +export type DriftScenarioOpts = { + browser: Browser; + origin: string; + /** Number of measurement runs. */ + runs: number; + /** If null, runs the default fixture (10-video-grid). */ + fixture: string | null; +}; + +const DEFAULT_FIXTURE = "10-video-grid"; +const PLAYBACK_DURATION_MS = 6_000; +const PLAY_CONFIRM_TIMEOUT_MS = 5_000; +const FRAME_LOOKUP_TIMEOUT_MS = 5_000; + +type DriftSample = { + compTime: number; + actualMediaTime: number; + clipStart: number; + clipMediaStart: number; + clipPlaybackRate: number; +}; + +declare global { + interface Window { + /** RVFC samples collected by the iframe-side observer. */ + __perfDriftSamples?: DriftSample[]; + /** Set to false to stop sampling at the end of the measurement window. */ + __perfDriftActive?: boolean; + __player?: { + play: () => void; + pause: () => void; + seek: (timeSeconds: number) => void; + getTime: () => number; + getDuration: () => number; + isPlaying: () => boolean; + }; + } +} + +type RunResult = { + drifts: number[]; + videoCount: number; +}; + +/** + * Find the iframe Puppeteer Frame that hosts the fixture composition. Same + * helper as the other scenarios; duplicated locally so each scenario file is + * self-contained. + */ +async function getFixtureFrame(page: Page, fixture: string): Promise { + const expected = `/fixtures/${fixture}/`; + const deadline = Date.now() + FRAME_LOOKUP_TIMEOUT_MS; + while (Date.now() < deadline) { + const frame = page.frames().find((f) => f.url().includes(expected)); + if (frame) return frame; + await new Promise((r) => setTimeout(r, 50)); + } + throw new Error(`[scenario:drift] fixture frame not found for "${fixture}" within timeout`); +} + +async function runOnce( + opts: DriftScenarioOpts, + fixture: string, + idx: number, + total: number, +): Promise { + const ctx = await opts.browser.createBrowserContext(); + try { + const page = await ctx.newPage(); + const { duration } = await loadHostPage(page, opts.origin, { fixture }); + const requiredDurationSec = PLAYBACK_DURATION_MS / 1000; + if (duration < requiredDurationSec) { + throw new Error( + `[scenario:drift] fixture composition is ${duration.toFixed(2)}s but drift sample window needs >= ${requiredDurationSec.toFixed(0)}s`, + ); + } + const frame = await getFixtureFrame(page, fixture); + + // Install RVFC on every `video[data-start]` element in the iframe. Each + // callback records the wall-clock-aligned (compositionTime, mediaTime) + // pair plus a snapshot of the clip transform so we can compute drift in + // node without re-querying the dataset on every frame. + const videoCount = (await frame.evaluate(() => { + window.__perfDriftSamples = []; + window.__perfDriftActive = true; + const videos = Array.from(document.querySelectorAll("video[data-start]")); + type RvfcMetadata = { mediaTime: number; presentationTime: number }; + type RvfcVideo = HTMLVideoElement & { + requestVideoFrameCallback?: ( + cb: (now: DOMHighResTimeStamp, metadata: RvfcMetadata) => void, + ) => number; + }; + let installed = 0; + for (const video of videos) { + const rvfcVideo = video as RvfcVideo; + const rvfc = rvfcVideo.requestVideoFrameCallback; + // Headless Chrome supports RVFC; bail quietly on browsers that don't. + if (!rvfc) continue; + const clipStart = Number.parseFloat(video.dataset.start ?? "0") || 0; + const clipMediaStart = + Number.parseFloat(video.dataset.playbackStart ?? video.dataset.mediaStart ?? "0") || 0; + const rawRate = video.defaultPlaybackRate; + const clipPlaybackRate = + Number.isFinite(rawRate) && rawRate > 0 ? Math.max(0.1, Math.min(5, rawRate)) : 1; + const tick = (_now: DOMHighResTimeStamp, metadata: RvfcMetadata) => { + if (!window.__perfDriftActive) return; + const compTime = window.__player?.getTime?.() ?? Number.NaN; + if (Number.isFinite(compTime)) { + window.__perfDriftSamples!.push({ + compTime, + actualMediaTime: metadata.mediaTime, + clipStart, + clipMediaStart, + clipPlaybackRate, + }); + } + rvfc.call(video, tick); + }; + rvfc.call(video, tick); + installed++; + } + return installed; + })) as number; + + if (videoCount === 0) { + throw new Error(`[scenario:drift] fixture ${fixture} contains no video[data-start] elements`); + } + + // Issue play from the host page; the player posts a control message into + // the iframe and the runtime starts the 50ms media sync poll. + await page.evaluate(() => { + const el = document.getElementById("player") as (HTMLElement & { play: () => void }) | null; + if (!el) throw new Error("[scenario:drift] player element missing on host page"); + el.play(); + }); + + // Wait for the runtime to confirm playing before we trust the samples. + await frame.waitForFunction(() => window.__player?.isPlaying?.() === true, { + timeout: PLAY_CONFIRM_TIMEOUT_MS, + }); + + // Reset the buffer now that playback is live. Anything captured during + // the postMessage round-trip would compare a non-zero mediaTime against + // `getTime() === 0` and bias drift up by hundreds of ms. + await frame.evaluate(() => { + window.__perfDriftSamples = []; + }); + + await new Promise((r) => setTimeout(r, PLAYBACK_DURATION_MS)); + + // Stop sampling first, then pause. Same ordering as 02-fps.ts so the + // pause command can't perturb the tail of the measurement window. + const samples = (await frame.evaluate(() => { + window.__perfDriftActive = false; + return window.__perfDriftSamples ?? []; + })) as DriftSample[]; + + await page.evaluate(() => { + const el = document.getElementById("player") as (HTMLElement & { pause: () => void }) | null; + el?.pause(); + }); + + if (samples.length === 0) { + throw new Error( + `[scenario:drift] run ${idx + 1}/${total}: zero RVFC samples captured (videos=${videoCount}, duration=${duration.toFixed(2)}s)`, + ); + } + + // Apply the runtime's transform to derive the expected media time, then + // compare against the actual media time the decoder presented. Convert + // to ms here so the gate threshold (driftMaxMs / driftP95Ms) compares + // apples-to-apples. + const drifts: number[] = []; + for (const s of samples) { + const expectedMediaTime = (s.compTime - s.clipStart) * s.clipPlaybackRate + s.clipMediaStart; + const driftMs = Math.abs(s.actualMediaTime - expectedMediaTime) * 1000; + drifts.push(driftMs); + } + + const max = Math.max(...drifts); + const p95 = percentile(drifts, 95); + console.log( + `[scenario:drift] run[${idx + 1}/${total}] max=${max.toFixed(2)}ms p95=${p95.toFixed(2)}ms videos=${videoCount} samples=${samples.length}`, + ); + + await page.close(); + return { drifts, videoCount }; + } finally { + await ctx.close(); + } +} + +export async function runDrift(opts: DriftScenarioOpts): Promise { + const fixture = opts.fixture ?? DEFAULT_FIXTURE; + const runs = Math.max(1, opts.runs); + console.log(`[scenario:drift] fixture=${fixture} runs=${runs} window=${PLAYBACK_DURATION_MS}ms`); + + const allDrifts: number[] = []; + let lastVideoCount = 0; + for (let i = 0; i < runs; i++) { + const result = await runOnce(opts, fixture, i, runs); + allDrifts.push(...result.drifts); + lastVideoCount = result.videoCount; + } + + // Worst case wins for max; p95 is computed across the pooled per-frame + // drifts from every video in every run. The proposal asserts max < 500ms + // and p95 < 100ms, so a single bad sample legitimately gates the build. + const maxDrift = Math.max(...allDrifts); + const p95Drift = percentile(allDrifts, 95); + console.log( + `[scenario:drift] aggregate max=${maxDrift.toFixed(2)}ms p95=${p95Drift.toFixed(2)}ms videos=${lastVideoCount} samples=${allDrifts.length} runs=${runs}`, + ); + + return [ + { + name: "media_drift_max_ms", + baselineKey: "driftMaxMs", + value: maxDrift, + unit: "ms", + direction: "lower-is-better", + samples: allDrifts, + }, + { + name: "media_drift_p95_ms", + baselineKey: "driftP95Ms", + value: p95Drift, + unit: "ms", + direction: "lower-is-better", + samples: allDrifts, + }, + ]; +} From 2256f558259d63930fad3f8d2045305693917d19 Mon Sep 17 00:00:00 2001 From: Vance Ingalls Date: Tue, 21 Apr 2026 18:37:56 -0700 Subject: [PATCH 2/2] fix(player-perf): replace fpsMin with composition-time-advancement-ratio metric Addresses blocking PR feedback on #400 from miguel-heygen and jrusso1020: the previous FPS metric measured raw rAF cadence and was refresh-rate dependent (a 30fps composition would always 'pass' a 60Hz refresh rate but the metric reported on rAF, not the composition). - 02-fps.ts: re-implemented to sample __player.getTime() at 100ms wall intervals and emit (deltaCompTime / wallSeconds). New metric is refresh-rate independent and measures what we actually care about: whether the player keeps up with composition-time playback. - perf-gate.ts: replaced fpsMin / droppedFramesMax with compositionTimeAdvancementRatioMin (higher-is-better, target 0.95). - baseline.json: updated to match the new metric key + threshold. - 04-scrub.ts: documented MATCH_TOLERANCE_S rationale (frame quantization on postMessage, sub-frame intra-clip advance, runner jitter) + TODO to tighten once we have CI baseline data. - 05-drift.ts: log coefficient of variation as a soft monitoring signal (not gated) + TODO to decide whether to publish it as a tracked metric. - index.ts: documented DEFAULT_RUNS rationale (load=5 because p95 over n=3 is just max; fps/scrub/drift=3 because they pool samples across runs) + TODO to revisit fps=3 after collecting CI baseline data. - index.ts: removed dead reference to docs/internal/player-perf-baselines.md. --- packages/player/tests/perf/baseline.json | 3 +- packages/player/tests/perf/index.ts | 29 ++- packages/player/tests/perf/perf-gate.ts | 12 +- .../player/tests/perf/scenarios/02-fps.ts | 186 +++++++++--------- .../player/tests/perf/scenarios/04-scrub.ts | 33 +++- .../player/tests/perf/scenarios/05-drift.ts | 18 +- 6 files changed, 183 insertions(+), 98 deletions(-) diff --git a/packages/player/tests/perf/baseline.json b/packages/player/tests/perf/baseline.json index 866485a7f..dbe0e7466 100644 --- a/packages/player/tests/perf/baseline.json +++ b/packages/player/tests/perf/baseline.json @@ -1,8 +1,7 @@ { "compLoadColdP95Ms": 2000, "compLoadWarmP95Ms": 1000, - "fpsMin": 55, - "droppedFramesMax": 3, + "compositionTimeAdvancementRatioMin": 0.95, "scrubLatencyP95IsolatedMs": 80, "scrubLatencyP95InlineMs": 33, "driftMaxMs": 500, diff --git a/packages/player/tests/perf/index.ts b/packages/player/tests/perf/index.ts index 9e363d36b..e95f2b901 100644 --- a/packages/player/tests/perf/index.ts +++ b/packages/player/tests/perf/index.ts @@ -43,7 +43,34 @@ const RESULTS_FILE = resolve(RESULTS_DIR, "metrics.json"); type ScenarioId = "load" | "fps" | "scrub" | "drift"; -/** Per-scenario default `runs` value when the caller didn't pass `--runs`. */ +/** + * Per-scenario default `runs` value when the caller didn't pass `--runs`. + * + * Why `load` gets 5 runs and the others get 3: + * + * - `load` reports a single p95 over `runs` measurements, so each `run` is + * one sample. p95 over n=3 is mostly noise (the 95th percentile of three + * numbers is just `max`), so we bump it to 5. We considered 10 — but cold + * load is the slowest scenario in the shard (~2s × 5 runs × 2 fixtures = + * ~20s with disk cache cleared), and going to 10 would push the load shard + * past 30s of pure-measurement wall time per CI invocation. + * - `fps` aggregates as `min(ratio)` over runs — 3 runs gives us a worst- + * of-three signal, which is what we want for a floor metric. Adding more + * runs would only make the ratio strictly smaller (more chances to catch + * a stall) and shift the threshold toward false positives from runner + * contention rather than real regressions. + * - `scrub` and `drift` *pool* their per-run samples (10 seeks/run for + * scrub, ~1500 RVFC frames/run for drift) and compute the percentile over + * the pooled set. Their effective sample count for the percentile is + * `runs × samples_per_run`, not `runs`, so 3 runs already gives 30+ scrub + * samples and 4500+ drift samples per shard — well above the n≈30 rule of + * thumb for a stable p95. + * + * TODO(player-perf): revisit `fps: 3` once we have ~2 weeks of CI baseline + * data — if `min(ratio)` shows >5% inter-run variance attributable to runner + * jitter (not real player regressions), bump to 5 and tighten the + * `compositionTimeAdvancementRatioMin` baseline accordingly. + */ const DEFAULT_RUNS: Record = { load: 5, fps: 3, diff --git a/packages/player/tests/perf/perf-gate.ts b/packages/player/tests/perf/perf-gate.ts index a8125868c..86cd75ddf 100644 --- a/packages/player/tests/perf/perf-gate.ts +++ b/packages/player/tests/perf/perf-gate.ts @@ -31,8 +31,16 @@ export type Metric = { export type PerfBaseline = { compLoadColdP95Ms: number; compLoadWarmP95Ms: number; - fpsMin: number; - droppedFramesMax: number; + /** + * Floor on `(compositionTime advanced) / (wallClock elapsed)` over a sustained + * playback window — see packages/player/tests/perf/scenarios/02-fps.ts. A + * healthy player keeps up with its intended speed and reads ~1.0; values + * below 1.0 mean the composition clock fell behind real time, which is the + * actual user-visible jank we want to gate against. Refresh-rate independent + * by construction, so it does not saturate to display refresh on high-Hz + * runners the way the previous `fpsMin` did. Direction: higher-is-better. + */ + compositionTimeAdvancementRatioMin: number; scrubLatencyP95IsolatedMs: number; scrubLatencyP95InlineMs: number; driftMaxMs: number; diff --git a/packages/player/tests/perf/scenarios/02-fps.ts b/packages/player/tests/perf/scenarios/02-fps.ts index 0db9792bd..ce04595bd 100644 --- a/packages/player/tests/perf/scenarios/02-fps.ts +++ b/packages/player/tests/perf/scenarios/02-fps.ts @@ -1,38 +1,53 @@ /** - * Scenario 02: sustained playback frame rate. + * Scenario 02: sustained playback against the composition clock. * * Loads the 10-video-grid fixture, calls `player.play()`, then samples - * `requestAnimationFrame` callbacks inside the iframe for ~5 seconds. GSAP's - * ticker drives rAF continuously while the timeline is playing, so the rAF - * cadence is a faithful proxy for the effective render frame rate of the full - * composition (10 simultaneously-decoding videos + GSAP transform updates). + * `__player.getTime()` at fixed wall-clock intervals for ~5 seconds. The + * emitted metric is the ratio of composition-time advanced to wall-clock + * elapsed: + * + * composition_time_advancement_ratio = (getTime(end) - getTime(start)) / wallSeconds + * + * This reads ~1.0 when the runtime is keeping up with its intended playback + * speed and falls below 1.0 when the player stalls — a slow video decoder, a + * blocked main thread, a GC pause, anything that prevents the composition + * clock from advancing at real-time. The metric is independent of the host + * display refresh rate by construction: both numerator and denominator are + * wall-clock timestamps, neither is a frame count, so a 60Hz, 120Hz, or 240Hz + * runner sees the same value for a healthy player. + * + * Why we replaced the previous rAF-based FPS metric: + * The original implementation counted `requestAnimationFrame` ticks per + * wall-clock second and asserted `fps >= 55`. On a 120Hz CI runner that + * reads ~120 fps regardless of whether the composition is actually + * advancing, so the gate passed even when the player was silently stalling. + * See PR #400 review (jrusso1020 + miguel-heygen) for the full discussion; + * this implementation follows jrusso1020's "first choice" recommendation. * * Per the proposal: * Test 1: Playback frame rate (player-perf-fps) - * Load 10-video composition → play 5s → collect rAF tick count + dropped frames - * Assert: fps >= 55 (allow 8% drop from 60), dropped frames < 3 + * Load 10-video composition → play 5s → measure how well the player kept + * up with the composition clock. * * Methodology details: - * - We install the rAF sampler before calling `play()` so the very first - * post-play frame is captured. We then wait for `__player.isPlaying()` to - * flip true (the parent→iframe `play` message is async via postMessage) + * - We install the wall-clock sampler before calling `play()` so the very + * first post-play tick is captured. We then wait for `__player.isPlaying()` + * to flip true (the parent→iframe `play` message is async via postMessage) * and *reset* the sample buffer, so the measurement window only contains - * frames produced while the runtime was actively playing the timeline. - * - FPS is computed as `(samples - 1) / (lastTs - firstTs in seconds)`. This - * is independent of wall-clock setTimeout drift — we trust the rAF - * timestamps because they are the same numbers the compositor saw. - * - A frame is "dropped" when the gap to the previous rAF callback exceeds - * 1.5 × (1000 / TARGET_FPS) ms. With a 60Hz target that's >25ms, which - * matches the conventional "missed at least one vsync" definition used by - * Chrome DevTools. + * samples taken while the runtime was actively playing the timeline. + * - Sampling cadence is 100ms (10 samples/sec). That's fine-grained enough + * to spot a half-second stall but coarse enough that the sampler itself + * has negligible overhead. With a 5s window we collect ~50 samples; the + * ratio is computed from the first and last sample's `getTime()` values. + * - We use `setInterval` (not rAF) on purpose: rAF cadence is the metric we + * are trying to *avoid* depending on. `setInterval` is wall-clock-driven. * - * Outputs two metrics: - * - playback_fps_min (higher-is-better, baseline key fpsMin) - * - playback_dropped_frames_max (lower-is-better, baseline key droppedFramesMax) + * Outputs one metric: + * - composition_time_advancement_ratio_min + * (higher-is-better, baseline key compositionTimeAdvancementRatioMin) * - * We aggregate as `min(fps)` and `max(droppedFrames)` across runs because the - * proposal asserts a floor on fps and a ceiling on dropped frames — the worst - * sample is the one that matters for guarding against regressions. + * Aggregation: `min(ratio)` across runs because the proposal asserts a floor + * — the worst run is the one that gates against regressions. */ import type { Browser, Frame, Page } from "puppeteer-core"; @@ -50,19 +65,16 @@ export type FpsScenarioOpts = { const DEFAULT_FIXTURE = "10-video-grid"; const PLAYBACK_DURATION_MS = 5_000; -const TARGET_FPS = 60; -const DROPPED_FRAME_THRESHOLD_MS = (1000 / TARGET_FPS) * 1.5; +const SAMPLE_INTERVAL_MS = 100; const PLAY_CONFIRM_TIMEOUT_MS = 5_000; const FRAME_LOOKUP_TIMEOUT_MS = 5_000; declare global { interface Window { - /** rAF timestamps collected by the sampler (DOMHighResTimeStamp ms). */ - __perfRafSamples?: number[]; - /** Set to false to stop the sampler at the end of the measurement window. */ - __perfRafActive?: boolean; - /** Most recent rAF request id, so we can cancel cleanly. */ - __perfRafReqId?: number; + /** (wallClockMs, compositionTimeSec) pairs collected by the sampler. */ + __perfPlaySamples?: Array<{ wall: number; comp: number }>; + /** setInterval handle used by the sampler; cleared at the end of the window. */ + __perfPlaySamplerHandle?: number; /** Hyperframes runtime player API exposed inside the composition iframe. */ __player?: { play: () => void; @@ -76,10 +88,10 @@ declare global { } type RunResult = { - fps: number; - droppedFrames: number; + ratio: number; + compElapsedSec: number; + wallElapsedSec: number; samples: number; - elapsedSec: number; }; /** @@ -110,19 +122,21 @@ async function runOnce( const { duration } = await loadHostPage(page, opts.origin, { fixture }); const frame = await getFixtureFrame(page, fixture); - // Install the rAF sampler in the iframe context. GSAP's ticker is already - // hooking rAF here via the runtime; we add a sibling consumer that just - // records the timestamp on every paint. - await frame.evaluate(() => { - window.__perfRafSamples = []; - window.__perfRafActive = true; - const tick = (ts: number) => { - if (!window.__perfRafActive) return; - window.__perfRafSamples!.push(ts); - window.__perfRafReqId = requestAnimationFrame(tick); - }; - window.__perfRafReqId = requestAnimationFrame(tick); - }); + // Install the wall-clock sampler in the iframe context. We use setInterval + // because rAF cadence is exactly the host-display-dependent signal we are + // trying NOT to depend on; setInterval is driven by the event loop and + // gives us samples at fixed wall-clock cadence regardless of refresh rate. + await frame.evaluate((sampleIntervalMs: number) => { + window.__perfPlaySamples = []; + window.__perfPlaySamplerHandle = window.setInterval(() => { + const comp = window.__player?.getTime?.(); + if (typeof comp !== "number" || !Number.isFinite(comp)) return; + window.__perfPlaySamples!.push({ + wall: performance.timeOrigin + performance.now(), + comp, + }); + }, sampleIntervalMs); + }, SAMPLE_INTERVAL_MS); // Issue play from the host page (parent of the iframe). The player's // public `play()` posts a control message into the iframe. @@ -139,21 +153,24 @@ async function runOnce( }); // Reset samples now that playback is confirmed running. Anything captured - // before this point belongs to the ramp-up window and would skew FPS down. + // before this point belongs to the ramp-up window (composition clock at + // 0, wall clock advancing) and would skew the ratio toward 0. await frame.evaluate(() => { - window.__perfRafSamples = []; + window.__perfPlaySamples = []; }); // Sustain playback for the measurement window. await new Promise((r) => setTimeout(r, PLAYBACK_DURATION_MS)); - // Stop the sampler and harvest the timestamps before pausing the runtime, + // Stop the sampler and harvest the samples before pausing the runtime, // so the pause command can't perturb the tail of the sample window. const samples = (await frame.evaluate(() => { - window.__perfRafActive = false; - if (window.__perfRafReqId !== undefined) cancelAnimationFrame(window.__perfRafReqId); - return window.__perfRafSamples ?? []; - })) as number[]; + if (window.__perfPlaySamplerHandle !== undefined) { + clearInterval(window.__perfPlaySamplerHandle); + window.__perfPlaySamplerHandle = undefined; + } + return window.__perfPlaySamples ?? []; + })) as Array<{ wall: number; comp: number }>; await page.evaluate(() => { const el = document.getElementById("player") as (HTMLElement & { pause: () => void }) | null; @@ -162,27 +179,27 @@ async function runOnce( if (samples.length < 2) { throw new Error( - `[scenario:fps] run ${idx + 1}/${total}: only ${samples.length} rAF samples captured (composition duration ${duration}s)`, + `[scenario:fps] run ${idx + 1}/${total}: only ${samples.length} composition-clock samples captured (composition duration ${duration}s)`, ); } const first = samples[0]!; const last = samples[samples.length - 1]!; - const elapsedSec = (last - first) / 1000; - const fps = (samples.length - 1) / elapsedSec; - - let droppedFrames = 0; - for (let i = 1; i < samples.length; i++) { - const gap = samples[i]! - samples[i - 1]!; - if (gap > DROPPED_FRAME_THRESHOLD_MS) droppedFrames++; - } + const wallElapsedSec = (last.wall - first.wall) / 1000; + const compElapsedSec = last.comp - first.comp; + const ratio = wallElapsedSec > 0 ? compElapsedSec / wallElapsedSec : 0; console.log( - `[scenario:fps] run[${idx + 1}/${total}] fps=${fps.toFixed(2)} dropped=${droppedFrames} samples=${samples.length} elapsed=${elapsedSec.toFixed(3)}s`, + `[scenario:fps] run[${idx + 1}/${total}] ratio=${ratio.toFixed(4)} compElapsed=${compElapsedSec.toFixed(3)}s wallElapsed=${wallElapsedSec.toFixed(3)}s samples=${samples.length}`, ); await page.close(); - return { fps, droppedFrames, samples: samples.length, elapsedSec }; + return { + ratio, + compElapsedSec, + wallElapsedSec, + samples: samples.length, + }; } finally { await ctx.close(); } @@ -192,41 +209,28 @@ export async function runFps(opts: FpsScenarioOpts): Promise { const fixture = opts.fixture ?? DEFAULT_FIXTURE; const runs = Math.max(1, opts.runs); console.log( - `[scenario:fps] fixture=${fixture} runs=${runs} window=${PLAYBACK_DURATION_MS}ms target=${TARGET_FPS}fps droppedThreshold=${DROPPED_FRAME_THRESHOLD_MS.toFixed(2)}ms`, + `[scenario:fps] fixture=${fixture} runs=${runs} window=${PLAYBACK_DURATION_MS}ms sampleInterval=${SAMPLE_INTERVAL_MS}ms`, ); - const fpsResults: number[] = []; - const droppedResults: number[] = []; + const ratios: number[] = []; for (let i = 0; i < runs; i++) { const result = await runOnce(opts, fixture, i, runs); - fpsResults.push(result.fps); - droppedResults.push(result.droppedFrames); + ratios.push(result.ratio); } - // Worst case wins for both metrics: the proposal asserts fps >= 55 and - // dropped frames < 3, so a single bad run should be the one that gates. - const fpsMin = Math.min(...fpsResults); - const droppedMax = Math.max(...droppedResults); - console.log( - `[scenario:fps] aggregate min fps=${fpsMin.toFixed(2)} max dropped=${droppedMax} runs=${runs}`, - ); + // Worst run wins: the proposal asserts a floor on this ratio, so a single + // bad run (slow decoder, GC pause, host contention) is the one that gates. + const ratioMin = Math.min(...ratios); + console.log(`[scenario:fps] aggregate min ratio=${ratioMin.toFixed(4)} runs=${runs}`); return [ { - name: "playback_fps_min", - baselineKey: "fpsMin", - value: fpsMin, - unit: "fps", + name: "composition_time_advancement_ratio_min", + baselineKey: "compositionTimeAdvancementRatioMin", + value: ratioMin, + unit: "ratio", direction: "higher-is-better", - samples: fpsResults, - }, - { - name: "playback_dropped_frames_max", - baselineKey: "droppedFramesMax", - value: droppedMax, - unit: "frames", - direction: "lower-is-better", - samples: droppedResults, + samples: ratios, }, ]; } diff --git a/packages/player/tests/perf/scenarios/04-scrub.ts b/packages/player/tests/perf/scenarios/04-scrub.ts index 6e19792d8..0c063c26f 100644 --- a/packages/player/tests/perf/scenarios/04-scrub.ts +++ b/packages/player/tests/perf/scenarios/04-scrub.ts @@ -62,7 +62,38 @@ export type ScrubScenarioOpts = { const DEFAULT_FIXTURE = "10-video-grid"; /** Targets are seconds within the composition (10s duration). */ const SEEK_TARGETS: readonly number[] = [1.0, 7.0, 2.0, 8.0, 3.0, 9.0, 4.0, 6.0, 5.0, 0.5]; -/** Generous; postMessage round-trip + frame quantization is well under this. */ +/** + * Tolerance window the rAF watcher uses to decide that the iframe's reported + * `__player.getTime()` matches the requested seek target. 50ms = 1.5 frames at + * 30fps, which absorbs three sources of expected slippage: + * + * 1. **Frame quantization on the postMessage path.** `_sendControl("seek")` + * converts seconds → integer frame number → seconds inside the runtime, + * so e.g. a target of 1.0s on a 30fps composition lands at frame 30 → + * 1.000s exactly, but a target of 1.005s lands at frame 30 → still + * 1.000s, a 5ms quantization error baked into the API itself. + * 2. **Sub-frame intra-clip clock advance.** Even with the iframe paused, + * between the `seek()` call landing and the next rAF tick, the runtime + * may have already nudged time by a fraction of a frame as part of + * finalizing the seek; `getTime()` reports the post-finalize value. + * 3. **Variable host load + browser jitter on CI.** GitHub runners share + * cores, so a noisy neighbor can delay the rAF tick that would otherwise + * register the match by tens of ms. Picking a tolerance much tighter + * than this would gate against runner contention rather than player + * regressions. + * + * The metric this scenario asserts is *latency to user-visible match*, not + * *exact equality of the reported time*, so a 50ms acceptance window is the + * intended behavior — but if we ever want to tighten this (e.g. to assert + * sub-frame precision on the inline path now that PR #397 documented it), + * this is the knob to turn. Configurability is deliberately deferred until + * we have a concrete second use case; YAGNI. + * + * TODO(player-perf): revisit this constant after P0-1b lands and we have ~2 + * weeks of CI baseline data — if the inline-mode samples consistently cluster + * well below 50ms, drop this to e.g. 16ms (1 frame @ 60fps) and split the + * tolerance per mode (tighter for inline, current for isolated). + */ const MATCH_TOLERANCE_S = 0.05; /** Per-seek timeout; isolated p95 in the proposal is 80ms, so 1s is huge headroom. */ const SEEK_TIMEOUT_MS = 1_000; diff --git a/packages/player/tests/perf/scenarios/05-drift.ts b/packages/player/tests/perf/scenarios/05-drift.ts index eb18b67b5..1fdd64a5c 100644 --- a/packages/player/tests/perf/scenarios/05-drift.ts +++ b/packages/player/tests/perf/scenarios/05-drift.ts @@ -266,8 +266,24 @@ export async function runDrift(opts: DriftScenarioOpts): Promise { // and p95 < 100ms, so a single bad sample legitimately gates the build. const maxDrift = Math.max(...allDrifts); const p95Drift = percentile(allDrifts, 95); + // Coefficient of variation (stddev / mean) is logged here as a soft signal + // we can eyeball in CI output. We deliberately do NOT gate on it — the + // baseline asserts absolute thresholds (max, p95), and the underlying + // distribution is heavy-tailed (most frames are sub-50ms, occasional ones + // spike during the 50ms media-sync interval). But CV is a useful early + // warning: if it climbs significantly across CI runs while max + p95 stay + // green, our jitter assumptions about the runtime's resync loop have + // shifted (e.g. if media.ts changes its 50ms `setInterval` cadence) and + // we should revisit the baselines before they start producing flakes. + // TODO(player-perf): once we have ~2 weeks of CI baseline data, decide + // whether to publish CV as a tracked-but-ungated metric in baseline.json + // alongside max + p95, or wire it into the Slack regression report. + const meanDrift = allDrifts.reduce((a, b) => a + b, 0) / allDrifts.length; + const variance = allDrifts.reduce((acc, d) => acc + (d - meanDrift) ** 2, 0) / allDrifts.length; + const stddev = Math.sqrt(variance); + const cv = meanDrift > 0 ? stddev / meanDrift : 0; console.log( - `[scenario:drift] aggregate max=${maxDrift.toFixed(2)}ms p95=${p95Drift.toFixed(2)}ms videos=${lastVideoCount} samples=${allDrifts.length} runs=${runs}`, + `[scenario:drift] aggregate max=${maxDrift.toFixed(2)}ms p95=${p95Drift.toFixed(2)}ms mean=${meanDrift.toFixed(2)}ms cv=${cv.toFixed(3)} videos=${lastVideoCount} samples=${allDrifts.length} runs=${runs}`, ); return [