From 15d1cc0b468e87dbaf0fb590d967911646477f04 Mon Sep 17 00:00:00 2001 From: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:26:28 -0700 Subject: [PATCH] Feature 345 develop gha node20 (#347) * Prepare for next release * add missing end quote to fix package install * reset_index is performed on the float value #322 (#323) * Update release notes (#328) * Update release-notes.rst formatting * Update and rename 2.1.0_wcoss2 to 3.0.0_wcoss2 * loop over statistics only once to avoid data multiplication #330 (#331) * Added sphinx_rtd_theme to extensions * Updated requirements.txt * Added pillow * feature 497 headers (#336) * changing header for continuity * Modified the other headers in the file to be consistent with other repos --------- Co-authored-by: Julie Prestopnik * Beta2 release (#338) * Next version * Feature 332 di doc (#333) * Add difficulty index documentation * Add more documentation * Add more definition * Fix indent * Add figure * fix indentation * fix equations * Add table * Added remaining tables * fix table issue * Add links * formatting * change link to latest --------- Co-authored-by: Tracy * Additions to beta2 release (#340) * Next beta * Bugfix 329 negative bcmse (#344) * Issue #329 return 0 if negative BCMSE value is calculated * Issue #329 add test for calculate_bcmse() in the sl1l2_statistics module * Issue #392 added test_sl1l2.py to the list of pytests to run * command line updates * updating yaml file --------- Co-authored-by: Hank Fisher Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> Co-authored-by: John Halley Gotway Co-authored-by: Tatiana Burek Co-authored-by: jprestop Co-authored-by: Tracy Hertneky <39317287+hertneky@users.noreply.github.com> Co-authored-by: Tracy Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com> --- .github/workflows/unit_tests.yml | 1 + docs/Users_Guide/difficulty_index.rst | 171 ++++++++++++++++++ .../weighting_wind_speed_difficulty_index.png | Bin 0 -> 58646 bytes docs/Users_Guide/index.rst | 1 + docs/Users_Guide/release-notes.rst | 36 ++-- docs/index.rst | 20 +- docs/version | 2 +- .../{2.1.0_wcoss2 => 3.0.0_wcoss2} | 4 +- metcalcpy/util/pstd_statistics.py | 8 +- metcalcpy/util/sl1l2_statistics.py | 3 + metcalcpy/util/utils.py | 9 +- test/test_sl1l2.py | 22 +++ 12 files changed, 241 insertions(+), 36 deletions(-) create mode 100644 docs/Users_Guide/difficulty_index.rst create mode 100644 docs/Users_Guide/figure/weighting_wind_speed_difficulty_index.png rename internal/scripts/installation/modulefiles/{2.1.0_wcoss2 => 3.0.0_wcoss2} (83%) create mode 100644 test/test_sl1l2.py diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 83f641b2..1b0deeb0 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -64,6 +64,7 @@ jobs: pytest test_utils.py pytest test_validate_mv_python.py pytest test_future_warnings.py + pytest test_sl1l2.py coverage run -m pytest test_agg_eclv.py test_agg_stats_and_boot.py test_agg_stats_with_groups.py test_calc_difficulty_index.py test_convert_lon_indices.py test_event_equalize.py test_event_equalize_against_values.py test_lon_360_to_180.py test_statistics.py test_tost_paired.py test_utils.py test_future_warnings.py coverage html diff --git a/docs/Users_Guide/difficulty_index.rst b/docs/Users_Guide/difficulty_index.rst new file mode 100644 index 00000000..c10dfb1d --- /dev/null +++ b/docs/Users_Guide/difficulty_index.rst @@ -0,0 +1,171 @@ +**************** +Difficulty Index +**************** + +Description +=========== + +This module is used to calculate the difficulty of a decision based on a set of forecasts, +such as an ensemble, for quantities such as wind speed or significant wave height as a +function of space and time. + +Example +======= + +An example Use-Case for running Difficulty Index for Wind Speed can be found in the `METplus documentation `_. + +Decision Difficulty Index Computation +===================================== + +Consider the following formulation of a forecast decision difficulty index: + + .. math :: d_{i,j} = \frac{A(\bar{x}_{i,j})}{2}(\frac{(\sigma/\bar{x})_{i,j}}{(\sigma/\bar{x})_{ref}}+[1-\frac{1}{2}|P(x_{i,j}\geq thresh)-P(x_{i,j} z>v^vG{@(A;_xsb0ZH8gixz;*zKlbA|SCEo|BsL}~CK3`7wzSk66(l6oIwT~N*XZ|w zPZ;)|C;~6Y4l0tbkcuGW>%cGmCR);_^72SbzHms^+` z9@nh76D70B7GidB-n?F-I6x=SSsk&*b#r{7&z5N0*GNFMe z`hOpx6pp6kf^|?;#_+$3Al4IKT;cln(zl=9lTPz`Srjbs5;$R}DhgC`&kt90Al3U? zd*v~UZk3#_O-+_g#Yg28-WrwtSVONtvsBOQTBprC<&3vej>GbPr+V>**{h}R{-E^5 zy?A}N+K*dnGxNJt!_d>I(q>l2X=9}8$gXm1-hH>8*yD?}{7KD>Re4_-C-IVnm>Avh z#^`W6nQc<67_qi*G{@H~7KLO%o(0p`syVmK&)3>=TB6$M;%Pn@BY$KakmvPd?jxfw zQ}|}d#^za$7hSAnd{;?;^{_V(wlRu~c|M0w)4T=rd zUO;R=++2Lg>E3~>aK$c5m{dr&dg>XUNZAma9StjfAeb@FNj@4;RWu*`DG@C?@Rg@K z!+(2(-LOG8?o+y0XJ^KAv)WU@CqyYyHEg$M%yP4gtE}Gb7&EGe*udrKgh?gE zC}1(s@$N=u^IovRE#VE|5YjEJqSAKKKXHXRl`;hh+_nW&-j|;y&pX#@tW@uZE*W}X zWxe#fA8l@VDSC71(3c`2^iFH=_t^N?N6$ZtZe5dmU+({b>@Rmk`n}N9F{cG=!iLEf z@?H4gt7%`t`Dy^qArfnNN;|~i?Cf)Y_ zJn$2k_5gHI{Eihkd-9yeq5Ksfu(H(Wuy0fS;u1#L6DJNIQXi0UU0P{Y9opg&HJn4q zCOykwRxI1X-V&T<5OVo=P6;kE$V191tFkV-KmDI1tbYUUCQe<9@!N0${WdNwqa&ZT z)wFuPXZ_@@^*L4*U1lbBAlA*@ zLi>j2@u+60<@>*4H|L5$T%}>7=YK=kn`QsN*uY!(V4|X@`DPRZ`)in8KO3m3 zAduB6Vu!93aNHuG=ds^rGDX8|7i<)yiqi9q?8Iyr@{LOs{qVZSVv9x&EJhlZ-=)c6G1eA>I<@t)wL|Yw;9vB|uWq5x?GL2#(lULhTF`Q_2xc5oE)7Im ztlSg1!0Yawv9Tq|8sB~!Yfh}6ahScWFS!`1LJx%LWiBAJdNjEAQUG~@A0-IW_AH?4 z=cyl#U?=Pug}O^&vgfaQ*bW#~W9-HYw!P|E8oG0>|EcZq9FOYf*Poyne~MK3iOnL& z^vc+;B`KWL3X&P^i|Y<#CJHib=Nn2b$HwBnwHK*p?%_}hPgt5^X7|mvg4*Twu~v;R zgSRgO@PTuL9Zu-l@7AAwiIs(j!nWRxvssC~Yx0?>lx45y9xK)d!tCaUajQTUwN5#b z%5zP1Ib>Phl*;PlgIs${OnbHcI>6sPEa^}IsVRhUIta5^zgl0FK()lceY=ucf6lwz z5m+4uYHBHTb9v~Or$Oo2^awKRDjMcwf~(eS@6JIWqfR(iG7F?<5_h|Z+yR^4i(lTy z(q_jAeeW;bFQ{kyluol#q@li8dF<~{>TIS%4$}TBH!0gI*i5Lb%CwCvcjogVn(>09auXid3wCoqZ}m2yGNXY%;=29B)zi?muAD%{fz3?g*znJLUu_!F zLT1F)hA9OrZRbTneW26~eD!8c1J{*^J<%x_Ab2I6o|j!KyJQ?m0bX)0hZMkk2EcnagalZfNu_5GCvlfBV%5aNA>AgoA|q?S*Rp@PH{BW+ow8x(=Oc@mk)4 zc%o1jX62b3BNk|$etBH}N{}i?kDko3(NcUQlXEt&#&~>0#~5Cb$#Un9(oN_x^D+Um z+>7^1@hv}}z8e_Zz zU7}f@(WmfPHiv=Ub_ekK%dK~bv8ppGpfl8t_d74&1nBRU_lwT;N2^y=`is%WICodp zuLB@9%oCCnLGg{it6|G?R9!P#ppo;1*?R~IwG=o|{SWxcOn8Q^==7ZXfv&RaPR;7) z0s)VZV1Z28sOMq)&q}`v!(rrSYM*9Zyy_nk0GbVuX=>O?crfNjGbmKdNEamYw&LbP zm;l}0nT1LASsb6<;RQKUrG|~nONMlOBUe>OA69`YPguiGOFN+!U%sgl&obxgO=49W zxp-&O$*w%tZhu#M1&Lli8?_k)0}l2NHb&nH`quy9Pf4fh#)rF{y(iJ8{p3ygAG2=Et!w|kkoEgAALDT6dtgca<2~-qLTUCfIQ9zT zbxf%q2hw{;orIdzsCj{uZk=Gtz6qTOX*FdW5hqEp*V)F22c%a?@zoYE5_H&k628`SVZ3^TyzMl)MUqfPL(T%&&56y=xuCOZ40 zYg`qF=%PYABVScM;q0sv#Ce%~#(%Va)&yp6yJ*5R70pXK81LOaMK3!+e6S~5!x*)~ z=nUE79GiK?8cm-4K^USXb9$}#Nd0f;+NUZv1_>t-m3!x%IRZo(f zRUvPVQc{g=+|eAXv8vPZz-!!4o^m@OBAd=uQ8CD{W67quD@=}m^@DGjiL2`U*%}qu zY?kaTIxk9s!}mFZ5BN@y+9(TXWXj4~1-lM-v$xNL*!z(`m4j>39;Ox6-VD z4OZg4UFFT7z0cc%&u^vm0}0di>74o)8XRR}qh#;JcYXNHWkOe%-TDQe$F+)+i`@xg z|G6joD}Tr9_oEZw_?DfzLx{cE6O-;YCPvxugUK?h;kj}Is^T-+JzB16??WD6M{-Ee zDpR^F_-g%NRL!245d4XmA#_8Y{{cg_ffZ8Nrs0%s`Z=zwYB(lrA}o8mSNWN!$dzU*B$Mh@yL6{dTuB?h zyV9BmEjM|YzKV3@iu@i7+)dwobFO(wxRDV)^BuvRA$)cZAw@}yIE+lsbp`IjZwlie zd%5?r!i~g*krq=B99?fnhW)!SvMOiFbP+BiX6N_cZ;Ke42!|(+<30%X_x(9<0ZNnk zKP2ixITofR*=HJbRRo~3#lW6`dW^h;zYBFM8$h-GFp83El$`sclH7TTzBw0|Rgq31 ziDC6j1|p!A#yw}(f}Ns5qW(8I@Phz*=S$6Om#KIyuEnYcNNkQuy(8lgiG+lI^>;v(T)Wl8|qZV6Ov6%vys1$mCNP@O? z?((#@9jw5=+l{nEb7};%C;$GTfF1xs{s=es$1}RDBwH2%HPo3j1O_SyW&}f2ozlXm z`cpkMn)P+c1<|ADwfv--cM=_th?3Z=ytW&@WS?X&Oqor!?&M=F5ef}k;>KA$nAe($ zcPal_(*HYoHks2zW)G=*YSQmHS0U(W=;!jKvDCvbic71w6@Lc?A`gSD_u&*0=wjoL z=}J8prT{b7?Q)Y;Ga+XyOQFqzawDM=UK|v_!qd{wf3wT{PaRe5x8`aN3VyTjbbNa% z8n$!I5Ph^hOkef+4SS!$%OL%7f7mnqzo713US1c0Vf9_NxEH&9?-oijKzT>t(W1$>+A+C$^NwKPS zGD${Dm12jzTs_|`tusCdX0=(WYPZ*&ec2|c=hoFde3iui)@W`@*TcAan2ZcEAvx~2 z7(m=!l$F2{wn)A`+dR&%I{t&&0%+`5~f2``Kze6ze*!+qPmQ)kSRBB^2M|44-lpjEY zIovh%wnbN)9%>?V;qcKqa(1^hRp5|1S&RLX@S&--*s5}=o$SsZEvvAgB?|k_r*k|x zK9Y%%Uw~pJyc&(e9MrgfiyLa*P;V@BT{&TZr29&hUD*@eE9BQ48TBHMA3f#@;fWkj z!ru&B0cF2%JLv~0>w66Bm7UrMc|sRDdfBa4yFr;PpR6@|+nz_qht&=U8i3a(76sZ% zK3DP)jCN3Y3)|5VCiG41{Dd`AZHZ5Z#l(B>l(gWyFVEZsi4JZ|O)l9Pm~vV}VtU^z zyBP3Wc>ravWpCUIPTYpYu#`_+4|G5VqacV?wcz6*&T9SXH!p0U1)ZQ%tA}Jg?cAlV zi6oWD`4mDRt9Xi0J9!O03VNNY*CYwpx`wLjci{K$-BW?vR$hxb z1@(P>TGPzxFI3exTWH)GBaS~{mWEnCv@U8NpnNvr&WX`yx}EUiS0|dNHtb`(CvWqE zNA3K115=mQ6zLOYY$PFTX8ad5r6*(FXXjO}baStD-E#@ac60r5?DRG}HlAdx)qnG< zDx86)bjO?OI-d!Ym%ciwYH#(j!qK%Vm9SfG+L&rV5`tNIPRv-b@p|iiDC=*id{OFU z)w}1V8y~7Zc!e_^kV>%G0wt}IJ>fF8ma{V8ZQNUJ8YA*D*wU*y{$Pab#{H>Cf~Hl3NeD+rN+T zNl?!yhs4ll%MZ#rQ3iSXV=5WBO1LH(N_5LeSQ8XWh`gXTknK%G!Do6JG#;^%-^`&6 zHa2-IGQ#miog}}mzoe3VSBF0~uVD5<`eagWrJN#+*pn~dg>q@AL9xu#lx9`?N3p7y zyaIu#_MtHdB@vA%hg3mq9N*i)z$b&7ixAt2Z`^SB=|S%!?a(m)5{e7wHt+cF+qcpf zX?t{Sub$pgQ2+YVvJkwqZuIM=y8U)HU_-`S1g!mz<#MQ))JoVWrV8XK1Vw94Uh>pt zW85BX{1r(dpA#*@=D+!L>T2|omPFlCzsY}{;P$Qf7xd+TSkn-9Gqxi|v8y8{)@i-% z@1#63>@`nW7rge+)#@~nPer5e_!^kMiRs!yL+OSdo85=c4^u2i5j#60LeB2 zP<4gn5J6cuVg6Uhz;RIG4@n{km#Nw>TqZad|L;D4_%%VNc7XHFOwAO)EjmrS54;z} zI;W>@+{0QO)%F7@xBB56@A{-!D)#5*X`KCqKYo5qJCBdcttQKY*&ML{b2%h5i*O(9 zbyFGpq0IAPMX^!3M5~{bV>+?~baDefBq@Kb^u%h`LIEym15Wrq*3?S}=s0?fM%5ez zH=t}ADKqK8>`Rc9k#U3wtgg+u?_zJX3sNKhx7K(R(rjjHFMty0b7=R)@vx@m@NWA3 z7`2oCw)_vt0HI$A6^&&?mo7>_QAZ(x8xWHA0}4l_w5{ysU4X0!-yXst;d}!$ zAF8){i;~y3NAqLH481))VcXTwATve60$jBJmQI->b>xMX!p@!s@vr2@%2>t*(3fi0 zL+DFQDzCHjstF@3>?a)596zeW_tRN)Dj4{gFE0=Kdq6R6c!A@t0B`Ug=H+`y z6CNp4H!5L{nZG@7vN_J4y`^Ia6uz$SD6imbH$a0O)Y?vzq^Gz-H?Th0!SFsBl7v{Oe;Qzi(r8Bex9e~f002CcMOY5L!LK!a^M*fS;woVx& z>O5EHx-nUv<8^hcdAvI>_H~fVQXJ*Kg@+jNjfqK7^gQzm zE>)3balHmKDNiDV=wklnItQTN8t= z7R#lOmifkFMr+E1c>QMx=bQ+|E4a4A?Ey>Zs!_s3=!t;^B`4`;7T;`UfX?7mqM?>$ zkKZVZGU`>~Tb=#Nahb>S>8}spjmbTNA9_vDlqqnt`;_@km1=VDTG6{0!Ooj5JmbQw zpl;#_eH2X#sV0M}VRzWa_3vV3Ldb9Z;IS+dZDNsih^)U1-jfqglR~dM40D`w{bRJ5 zKN3}=P;RQ?U}j+1O{{W=M!x#kbo>X=71zi&+f49ojDkodw8In)ZlDqhfGu^3A+aFR zB4(TqV}&I7)4r5#_JjJDwN@%EVzT0-%-Oy5zCm{zK&R|+{Iy(R%A zefy80yHrj606ngzz|}ac)9Y${pjb>6o4=VXJtBE|pI)Z?OHKKRaw&|47wSvAouqnueqP53)2A=AS*Z zJ=yKgRaO|+9}I=1Vq7oaim`ZJ*BHLVxeW}QZvh_o1H(G{?QhgdJ!n?2vF+t<5YB7! zDYXQCWs3==kmrJSF7c;ZcxThwd)-M!w&22wX`Aab`lN-`uG>T|-VVeF(}%PacWK=s z-pAEAMRYc`^&YX5e(f2ci|^uoUxu1|RWjc03uvw7y6=XrO8?)F{m~TnV#puOVKO5u z0wP>aMBg?bjd8TaXk8lMZN8?o-jBu(@xr#hHFg01Fw~9uyd^*cEpdfMCHk`so>z?4 zjUwPLqCaN3CsBiQFOMR*?T!CO13rKT?o$ul`$q%ly$Q6|<)LDiq?R=5AY5Ukiv!tT zUY?DDH3{?sjoyr~2`MrghT~1*p1f9yz4~Jf^PL$N62{w8N+kk|O`)&fg+C=(v|fUt z_kq&oW*ziO<5%X5`)_}F!dxcBewp@Vg0?dSox1gYrhUQSwoO@%(etV?CVmApDb0`8 zI68z7_VHg=r-7~q(#EstB!lJUXTHWg4sPyMRg_M&VPe%MjoC|KMFFn&WTHr?D(XJ& zNsir^_K#|I0C)QBrbwk22 z3*fF|*9@Kq(#>&Iqc%^2Gz@1O?PfmxWAke8+pHWM#Je*SS+qGf*(qBw?>&WN8Tt4t z75f^6cgaqfk%}i~=a+{=QH)+B0=ELnB?1zW#rup$chZglyu~tAbm(u}J_ay2@GCM; zT_Y&=M>iG9YAUYb6WKKczM zUH|jo>Q5kcq}$P6Pj}aLW$e*%q(3dw1I17xD$fdTSNnUft-ysN^#P&|6WwZA*ly$0OPG(fgIwhn)7!%5~n5nYdHhOL`)yf%X zt#jUnwVOpQDTKFz$dvODb7g#f4BNFjOuX#1(% z#QUKF?dt*CM%Kv~YfMh3JZ_7q3J+Jz(AM%-Hr!~BoJp(DUF~dfyxSxqO5zs#7O!YD%xNNn7#GlAB z@(|8-0uCYdqe)#;`gDGmuj~x$2?HWBW{6J!BWL8XQo~hM@N~<2)Hy^rrtxVei&%h{ z&A^R>1IFd9SbL;0f9>Ljof$|~bi&f|yvd(7kGI)^@8RoL>c9L(H6kxgPxBL6$_%~s z|50-mn!UlI{tgZ)oH-HP$jxBVmn*{rI;F}KX4l66sYe5rBe|3JDS8~p_=W#ZNN@u8 zk2zOKV2)$zkS7O1G?{BqZ{hs1#R8vWcVb*$v#s5<3TSPqesR8l4iLrAJI}iJ1 z>)oUolj-}Kemg4XZBe>?8x0|T`y3bjA66ovQw*=pCG$)^Zw%P0AL zR|9=1G$dROUb9CaZwr5)_&m@y)2Sr$+?5Qo^yw`9s_P4bw|Qsiapjy2?|^YBk8LV1 zhS^V&!iw;OjD&``k(%m_W;h9G{p4`Trc-s}j3eh8M^>r@$M#r1uitsjIl_MoB zyiT|{-qifX8huxrm=ka?XMgw}ZQ6GLu01mnFeCKRPN-2z#hD-83WGA@No~#?`96?I zwEFuUv=}f{=lYMcGQ3WEM>q$c_X4WDRA7pTPv3PVx-@{-W`40Byd3YANP4ND6L@CQ7w*V2!!XUVO*&BV3_R>rHzJ0QgtR$87m>kL4H#U`L z@5s(h^fIO**7i3#sIp2ww zf=^qFX??&3CP}|E_Z@q3=5E<*mQo%Rj(!&HImg@V)iPo9!J3q>e^L!!eWv@_n zTs_<_eo-9Dc%U1F39R-P+v%~vRn7oHxtFmA+8mRg2fJW7Kzo0t*6AMN@=mQxWN1a^Ra&Gm$lCQiM^l};9X)Lz++q&ZM35yN?69^|m`Ybopy zT%uLKqeYDHvo4I~fM&7;dV01$Alu!Faz%AK!dWKqpP09jG7j_+DM;pQqw0y$Cw|>P zw~}hs#P3xk-MMl^;Z&xl5S{l}$nZHQ?wm5frYAf{l$MWBT+{d1oQtsgO4Zcle6I!t ztj@-IU75n+Jxz4^icku@S9j)CDgSO+s;e#J6qv3k6LL1V$BB0q*py%?W0tbMR1!!J zq9jMm&v2q0yjo=Cvc$YQ@LZ}X3V%91B)CRFLCq&)T>3Tjk0yatsY2Zj*_%t%+HGE| z(WN(1@U;8&k@#Y0`ahIO?n@N52%j*qh5{8%^N5OrZXSNSI?Lf7ywh@V+#NrRSt}ue zDzR)N0KT3yYZ+|Vp z5>nLqNt%^ZcW6+b={zs*Rj89SZB4I@o}a4~Zi3L&f0Vtxq|_Yme7N6#o-Y+Bn))Q! zSn$Q6Cq~-)MjlwFJ*fhgB`Z5gU$2$i44}41#h6!$#$z2hsoer1zZ7gM;G$6~ftSlC zV`Ut-X4i>lX4Pem7proNvD9P^3DGIZty-4h^1MWCIzRvm zKQyl!{V69+^Ya6j9Lqx5`ZFV8!;oLKJH=jWzw?N4l%rlJO1OuX89J%2f5!5tQq7hs zZrr)kjWK+!tuN(z2;ICynXQ%1KKf$x!iR-MIbY+wbYa81r}MAT&A)Axf}uajFT0sN zLzYN=?V#}y@qB@t-VKhMg%S6V-@=`TkP$#t&+7MC;H>~8G)}1|kYk_fPKCKwj_Fk0 z>717~&N8}e)Ky|Q4>Us(76RTCU5`|}(EzW!>%D;sbNEguqa#CCwU{tErlaa|d5 zh?Gw>btyRlhir(ipT5QYh1bahL&c5aogGO{0T{7<=G$IiCxAzZCb7+GZVfB^DT-{2 z)YU~>vRXhO_x3}R@gfpZn)2B#aPiTk*)`PAR5Gpl09^|m+AqewYk?i5n6&16aXdbR ziVM__w;}|l!RMa+?qY#c5J1`M;}icijEZXacjghZ*jTr%~xz7$( zvo#zP(`WPV{8%8y+m%_v3WpE4H3zYX{#lM6SPrG}4-4+ya!ncEW&9q%C=w&{4*O4g z>{-kby@;N6@#g&4!vB2*G7se`6Ux4i6QxrfhI`S1JM>ty^)U1Qa$$gOw^Y81PVJV+ zlbN5{nFl<+JRtAsOD3ysf|UMxeCc?7_WI&{m4&@rUkDfo_LjXV>&etEFB5+BC5ZYhI<9^pu(QvN!6TI3zJ2no!2^@a(DOP2rTV7-Ml*GEUEN z8js!zFi!Oepy{^I`q@f*y=gcE5t3zZc+zN;($;uRcNd+I;L*v4FPaun2;Rq_VY*k9 zVcBgHLPSDNBcxw{RW$6cmiqu6WSOV?s5X*7uA z36Ph4xA4DSj`i#`eS?n-!@+_pN;XBqL9kd~2wMbb;tzXIWRiqhEzAZ8H^T9D$nuBv zr

#1uOR^TN3;DPU$}#_O<361cd`?#{34jwC}7^41y*ld1luyVuGu`(*SndsUact zv7uJNLZfu=rE;9&HotTcjz3p}SF`uve(7UFCyU6>48?vzKEZ>DQYQU_pmfw~=L|i)_a{1}@n0(m)Yq}PTYKVTqDt-dz zxW(5bVKc4S^;I>rv`B@BEo23Ta#Ly3yzlV)We^A0mU}L$+W5C9CG%yPyK@(zk5X?} zztgz%W-(RF@-|pPWn-MZ_!;90>t<_^ZFRD-o2i0SAkNU!Kq;q<)|?MdtGq5>+^I(# z9w9nIjY$v@f)085q=Nlwu!MCiD}aV`Rs9~dK3FE>ZTj9=dtt>_@#;Apvgff}P}=;O-*GKc%jCrR^VsYaIX4qRq3&~gTDYsga8 z^6Uuf%yy=<0QWYuPnMPVr>fgJZI>6$Eq?qj@mk=Y9gml#e-Q*lQM%^lk#gy z^_DTUC7nI78W1Oa@k-}ID7PSFHhVB5u|}w;IYAr3*?6Kub%cs5Mdh`IP+E8gu*TsT z^o7%{(xf7NY9KsZ&|j)oVMPr(fP~P|Fq4}UgrrStsiKpngToXMp??HU1+<4u-O5!- z3Jm~MwJSv45?3(Uo9k*r4eA;Wa^*7v>YnZplQ-Dt_7=_Z2~s&J8;V_ZJoMLkXFRve zNhcYgZ&!!>IEGt&8%H&PcV#-rmz--_a3Z#Mh;p^oM*DaVGX@FQR2*!yH;b5^)*~E- znUcdPw&vU{z3rg|eUPeKgmC~TO;hH@vk{HYQR=;`)2z9~pYql@mPa4E>c)w3w@M|~ z_vM6selw13S`3su`9^DI(v0S9VG0%d^b=7ric{i?FZQ)0wnrh-J2pxPacqK}&bO4@ zZ&bVP1)&Da;T5c&CtE1maw)7I2A`QjlE_mW6M2V7%+3gePxZ{Z@Zs4K@MU2*S7FBY zZ5@#u6VM<+if%{BjggBjSt6%LJ(wJ3k}Yj zdYPt$q34>V*4WT^0pzp8WqA5oegxRRaILo7<6HaBlYaN-^N{|`8nVVT)ML9+xP+?^ znqVHIigrLps8((|6v}t8mEx}82DAQ07Eb|L(DMbGBV<8}h9i)+J8 zZBZbh<-Kfrl}GNJbaXnu-ww^(D6IZ_{!Dh(;k&V9ECztI$ZR2h4!eb_CL3@mHvGya zMyqH3-l<{<@H&Uf`!7Upy)Ku|ce^@v3(Jkcv;#Jxs&WW@FFjZv7#4XTv(FR`CM@gE zUjg`Or%kA$>(R&cSi?KiW*;XGVXixz@r^y%p5EMR!7avb2io62<~wy(RNibgNEUP& z%2m$D8%dEtI4Tlan84eM4QB7Bv3k#())AM(M7Ou#cYUlV`h!mX0Ks*2zDE%#+)Fr^ zsztH~@5lbAX~;i+1PJ#ylj-nqbv@555g6nn)K1kv5v? z-hse?LM>-Joy|M(Zp}bRz!zv7ltT_SlRtf#iDkL74RSa|vkQ!%r+=6kc2zZ~p0Z#j zzNzy{tJ7$=12!4Fj0U!*2`kyN4g;IW;5~0v-Kvp{@1l7%4yzht*y9M7FvRfK4;U#< zy)p6VVeN4Lxev;n6ytB3PZ(;}xc+gYquB&-h1g%MtGNN9* zC*E`whAS7dEfNLH3&Z?AOG3R}$eq;I%Y7bepd;@C^m$I|j#yyV*l!XNv#aAQRGd9< z?S6Y%$NfuEgm0nwCaJlAe{*Rx3hpKZlG{tkgbRYUa)GT4QiZ)(W^Z}f)LkbB#*RrD>FdR1mu-QIL zT!E=B{-~NRzw3d!Eyso*bp$Tp`UH3>SE0|NvQ80ulW&CI3Ij%8dj7wOWjsH zD`}ybo|OmA-X%AFHz37 zUZv|Lr3)Ovw=jyFOg!huodGzq%wwRbpTEtju_ShIGHt85UT3G3>WuI=2^2$b*5kEB z#ioFtuP2Xxgy(yr+}jWTL-c7q%N~sJDGf3&vw%FC)N;F*)IMDN&-UIFoAoLr*`#~N zx_UOd3o?@}Y{K_o_kk(`j^^Q?T{*8eq4tb50O+i8v^z!>h*+75@2Y1r3#(6H>yyL% zk#O)G{u(|XpkHMbzx5axt=tq`rO`Oq$S=NM>byzV`h3(b;C7FZkN7tqf!hE%NSLd4 zf6!gjHdEi8%s6S=cvUw}z1n0P))w{}9?`|A8!_S@q$y`y@=V0qg%Afv$u@bo2vk2l z-xmHgGrDpT@W)Sfa`l8IpC9ab@&h!*XfTLq7V{1DG35o+zPYvL{SWNca>ihUpr}%d6~uyl|ZPw9lz>Yg9hs6xFI5ls!+M z`o3@ZB5*@5Qqh7VK9vby**i;beb=0x`F0((e~k3 zW=+D@M+6=}ms@Bh@H818JNO&I09LQd5xZfLPoy)ur`~p7t>=j^Fe;O+(5K~GGx%d0 zTGZg?!A9h6zR-kd$@r23I|C9?`Ft7SNY_XFF?y0m+0l%HSKEsZnKrXPNMFH6zvBP0 zyP~oDsvYCf0fl+#YRn>#LP!R-yQ}zqS!(^T{|ZsATfm3DS)0v1BFy=j@1y6-Mt$ee zxPnrGCtA0GHC!KMTz{47Vf7jb5b8e}v4Ky02Z3l{52VnTkS|z>3`&4D=bB^n1RlI7 zU3~m=wrSCaZu#z!39hTlcI9X>~;ndBb)c_2$bZ<<@Kw+TI4%3`hh+TTsC zsSnad@Y>?60Ng5+ID3d77^CqfJe|9QxdM#>73t;nTGIW;U5cZ8Bz_1iAk~C>MQdce z`hwxOM!j8a_(iBMdS`3(;4{|cd(>`yE6NcU~tbjy7QCWDf)X3QZ8 z;`5$Ff%2_$gU0)}%^V*1C_(!pE;!Kv#Dq8RcJzQqk<}Km)HkLr>9!K>lA>0L?w{QY zbfAbDDo6vihBs)&$$)VypbNgQtd)f8f z#--?9tgW+sl}Nf&I*fc^P z40O)`^O&J2X(t^De|kNmAUt>%u_OSHuI=BabSnrYWM82jhS{!A4S|b~>qo;Gw3)-y zC4cS@z35oT62SH!wXu*KfF1n;9bTG$JUOTu7}W^rpJd@x5M)HuWYi&OO4CW6Yya~s zfO7Q2^xK$}Mvh|W@if`)v-hVCimW$>QjPa(2r;b6)6cMUc;Shm9s z(*1zGaQ~v@s@u5!P);f$`QdfKhms23ncf0DJcd{wSNmCz?oC;|#1ye{9rL-~P_HMf z(6L{{#aw~lLuJA=SMsN&yism3GJWUdkz8euoe&~vO@ppL_S*t0oECoPD197vCeYLz zFa#71(0Bo+>X~Piwp4%_Afo{NGz#~E3M=jVf*B!E=yFL6@c~|gUj^dHc)AUD0LmxT z6M9!6x1bHFxBxSM7A|g%h%9?gegWWS7*#K64crSI2VTP4F3SSGKe;vdH*!^qHy7*6 zALy+n6GL6#^KjvhQOp_ZoMvo+J>>4dhNWvJ=d#q=LsFnSVqY^}0}t%LSFU8OlOJ%zD@fdd7$_1wBDzA^WC z*d78Pk5KzoJf0J9fPMs0!0@k}lswkz8I^hOn|eyGv-dpKQ)-d)ienONUVniZO#0qb z%RROs9>6PnJ)Z4t7H3h$6SIf)*SogG9V; zK&$Z&XYb`Lj|+(E6`qU!?5YI(MF=wvhn{|u~As?JOr{Nzzr>v1P1c>Qu#nhrAeQ@nAyU0kE zEHUulh>ZK$3b6=N)kLH8P$K2+O+5fjM+;W&%XW?8Ax}%qze6=&A0h?FpB`Gf)#R+L zoHkFL7ddA*3bYN*DaR-;9)Bs%dy^MW%Dfhq*Hl^k36<>!cJ=g z>Hm8|KD35w9l@oCVn|j!G0=0RGA=JE4fM1%(|Zm>FN0I+DXfKd_{~Svmprz}y>G7X zNMIguYU=>!;E>cac=LH!o{yEQ{_12}(GbioPz4J?B+5qw{AcgXp>kABy0+3)n|{Ej zZ7-X8v2X-h4L9pgySEeW_*Ua^@hQw*U=*~lmJKrH;molXKx{DZ`_mFiIW%iW87j0} z_uN6l33!~v-z)(?zR)6g)LDM)`}}*9=p~1!$@DrLYtMyn3tP?z%Rtg5@ zl$EXY0B8b!!0lOz`&Q0ZQ^$b~Bfs>WXVrlxSyTWUVWXQ~mov8HB-sbUD5`{&Jh=F6 zYZ36!gZiC9-qx0lTGH`%elRg@M5W_e0h34nRMSI$QDU$AKp)X_;W2dkDm`!+B>R&# z6JFIAe}mr-@PvZGomp_cS$~Qf;H9W-&OiZTF`OOx1&4yk!NLivbc_?!vId{85}(6! zIh`FkOB_s2gd}H4Qg$WM5>CBwKV>@}=q+8}n%7>1qU}yR1raw4x$Y!=+X zlZW_#2Z^)@JbjU)4wM_I!1GD6fgbV$Xb-e*Bbd2JDOJ=HWw(zciAx`mK8gr9Xq~@{ zWC8;s{UcZU;mOlZ-t^&9Pu~fFC3b~>fd(E3)s@^l@TzwM@<~K}AkdaOI_P;Hc8kGD zo`+X8!$vg?&0DbfSe#!0n>8GL$3l39+-kIb1NSbTR)V4RJ6-JhYw=+3lfDYqw#R_{ z%M{)<`w!_ZJS+`oA$YpKKK<`27KFu$eCWLF@C1(qM2 zx2M#B%a3okxrR|w76&{9o+4ttQ0i)eQ;_+|{Uf{~M6HM(R}bZ#K8w^hr>$Aovi~!6 zWp7{kwkc^b!A`C$>NW38M^qj8RH2S^PO1TE2w#Ey<$grlF4S34${$cSuq~0%8|y{n z3a~>yzqbbj8VAPIn|w!si5ZsZb8Dc;FEAi=$b>iP0Egs6b`Y^NRPsLile*GIEURn1 z68j@x9mNwC!vyxH?Y_4Dy?{c=O_OCKQz($n*~UkBm^aqw9fx4bbkJ1h7V9_i@{`1T zr`2*4k~vXz)7`}CNgSfAK!OG-2)5+GVbnG0gn#RwXJvBGFf$4?N2Sf2RUAPOJ<#U zm7I8PQ150wZC#BWH5Y(IypiUIlh;1-5z&+vP<+=-xSkn#X}(jHs7DQI{HCXX=d!_A z(>Q96L+4;5D8Um1+ldU(QC5>xur6&0lno{8n2wYE#4L+{kH#PfAbpX1yD>8BTHJeI zbaWb|&j3c}>kN%GaFaIeCXWX4f&{RQFIK0@iiDL80jdMUn_SmoUEhTPL+%mx$R+F} zn)=0h&SyHifKE{+kU}rcmOdMr9usTLd(u(}RXOJHZMAtIJtU(mtTxbUh7S$;M!`>+ z$lokMte=?-n)>yv%<{Nb_7M32`2yuY4ZR~`KOP|tvROSr5;#$4+%VGfy^|>UEe>NO zu$w2Tcetqn0~6?s&aZE$IY@d8FDy>iTFB34Fb(78p?J3q45g*sL5k z7zV~RfV9O@e-2IDNuOba2$~cW0TviVe>bQHY>j^|DKl=csR)_5!RH$`i}0)2+hT*0 zhYm?M3Yko3IHFn*tAS$Izd=bW$G2S-6>6mpS2Z^2bg!X20K-%RPqjc>)qJPDkUq&2 zA83jt>j>Yfw$S7&T`x$#T@Zs6SX2H?#O)|tUF^Qk@v(|uzFSJW4Xh%2#;Bq9(ug{;+$Vn|MG^Bt{PY4^dYg6=nBzVHku#q(kX$K|l#<1f{!Ex?2g! zK~!401VJRFyHf9qZZ`m16qhJ9_u!Gx@4eCIda`>Z!d)m zWoqMzs_e#do*qZ4nUQg0u84h8TBX0b=rJNN5`vz49p8V^YtlHM{f+VR#l3^y|Lve7 z#PyTpm!Tv!C?YSyc`|n*ossR-&Mj^CNlKC*F^94?8Trmf@DNP%__ zTjCbE>pV&gW+PNYCi3cq^V1^`qg7*>6k&ub;6^eGDarb*4uUcO8go=`9HqCMrq1Fz_dl6{NiG7DnFTk9&0h zXdTAcqp!HVe=BA5?eYJEoG|D^Q(k`oUQKmTHZ~gr#0s(U*Y{Y|OPITqMM)Ebn-+2C ziJ9ld{e0EWr9nr+bfrFCYvy0gqP-p-G^X3e5E^^6

tWHu666pF2OveX-Xc#M*=9 za|o&44-vrLSfagSwE zn8!4Cm(3YRuOB>%AFJB%ug~=-p#$pvOXt~* z4|afw#%*WN%)WoKkgfR6+@lBWw?(md?+aggf@o@lUwYhdC|RzY@dV?$k<25^r0nlM z^%FbKs#h#CpGWTZ9Xx`zY6bz!rfUK6he1QHh;b1{uPv`1-dLFdl=8rUQyZdw#$Z&N zjszFTL-~NX^@4hlW40e)ngctu{AM2S6*8rz1sitiL#IO_Vq{JMd%#k9%Vcr z!RfgB%d75aj_WBIdKIXo$$Q)z6vO~^?&dN8Kt({cVXJO}s!qJK!qDh;gk@xbq}Q&j z&7jCvifsVlQ1QFXDP}7bQvlgWzS%s9V=rBzaWYlB)4vt|mbHQDWx@RH&;a3w@`g#< z0(7kHhot@sAQ4nM+L{^rf&L)f)_?8B_=6=qz*{FT&3!lCaEicZt8RD7nb8UJ*T0Ru z!PR3khv^6E?k@HpZ+TTbI9U}kDI|3>B7T`i+Hl>CB%TV8X9;VjWxK%yyQujx>uneF zoNmiozMzl!i_7m$J*roec^M~)17*m+o0n7H9P};XH3L%)UpxnH9}<&9|1rBgw9i|t z?iV|b%EsU3U-b)-yRV<{BY4q=4zF|eTbujgHd(XC4|7NA*^X@&2wJ&3OQHM$YOE|T zV65p2l%VndX$0AF>WgM#mh6Vj@-X|v8afbi%0y3=Vne@pj`wk#fTpaMmSU^6!1v{L zoKcCSU^3~n7q5C_!vtw{a3wIRQArUy+vM#}7c;he8*!6R1O>1*K$PH#Mb;4GJDm8# z*{T1O0eqO7wVx|N`L!b?`}2p54SlEhNCC;MUPFhzU~XDa)1!$hZ=b5PQ7>9Ieejm4 zvpTlE9gAI~RzuxWJsKoq>p%i3mo2L@?(X4WWLI2gnOyxhRa;d(3rJgo+x6e#0MsEq zOz3%P^S#|)>YIospmC+Id3(G(Ls-oW6VRJZ$4&U)ByIegZL;$)3Ww5k4rCnhY_soK zj}eo*vim_}Cp39J7jxn62FoV&t$YUa*HP-3FMDhBD}3Y$H+L(lHn0Bi5; zre%;P#2thpTi;P9%zS%^OEnYQWvb(=TIBLOB0E-@ujQ_E)n=;BCf}5d`x23CY{1?R z0#EDaf1RGsKsDFBlb@`F-!C3O50xdjnwID1Mm5#v>iOi9^zkn)PP2PY0N_OGjpgPIEbe}!tSm6Y`tCQ! z?0JmK{ic1SsZCK25x;(<_+4bV{9aNxk`v;UZ;w@4q%};jw!uM4GODNydP2zYIflp2 zLS2ikanS0Irf$#sU5QA&^K(hZ#u5~4h!{}!9BqZ@TQ1kRociv5clV4Aq<`R+vy{1C z*AkCjQ<-WU6&90sb;-Y)n@mkO?fhh|oBpCMMYlq?;F?4vz$A)mZvcID@P-Pmmhc*fS~m{^WF81~w}S&H$N194q+GvWD*Dc& z+O%Ahi#fJMS~K+z)7x+T(wlF^Vs8p;TIRrpjWI@zW0iQl`^fKPWd9d@RpC!vD@sH6 z35!#Jg92R}{H9&H(APk3E4x-A97153OglSYUCZWt;5mpiw@AQbW?%;8zOwz5{ZxXx zchvM!@MV1d)}JoSU+O`5(|!%+pF*#}7e0iG%u?5;K+?b|#IGM){&2yiQZQYwUy##! zroM{5P%zDQ>`Of8=e(dHaRT_*oM~XY`K%b2mfbJmymw6~$+lh$Xr+r@j!adu9*h`- zjQh6WgB%MG!ZNMrxJmq_d8wYJ51#?s!+?MhS3QgK0fFD)G&tMfw-oyxPCTm)n*@!p z;hBJXD(MX(;CbI;T<;kjGEfR|YQD#;R~M!1nI`z^7{PKL^tj3Bg1JS@r;Zz<_}p&xs=#If*~%yfveMo2 z{^(GupxZuh$E%-XKeO$LV_hH3kDaVdgYmM1R)iX~Y~C40C_Xp~#Q%Dq%vIws#aAY< z(`nyO_j925^JapC6v)_A3gJp3ny>a0{SSaf+o3WVtUC=tM=BB2ioJCVqI!GRq?7UA zym=$ZqcERjw$$u%nl`yzr-FJ|0!eT}qr~;FoN62De<%s9xqCP+#wv>r1M9lY$TxR> z0zvv_p+Yr+Xl$1AZmpN>wTMqVg9KsVQ})m`OAK|2vg|lsMiuYR@RKd4s?-B@RSy1K z60hTh5e(|3(KswC9(Q+swmBdA2ukw%v;gcAaRWYYR?3mRw!+xG_%P}T&M**Wk2QIF z^m`cXF$w-4;B~8Zt2&x?Q#R$@y#@{{Kj0tzjq1-`{fSoVjI@pK>l(;sv0x_A>w8~r zVpoDJ+u4sV?MXiet{%r%hX#nD{5PgIeZS^kCi?9go+Ohos?13+=NH6(lvgx@`ml5H z(a{f6Qp|HG-3BLUF*58T8+ePVR!>23f#kk3$u(x*fNy@N2CRYK9aB@jqLLO)#t=oS zf+v~t5QnOZ`2#K%gAsa3#>*ZhIOF`9ItRF`5i|*qcB|>$0#KF=q8!80 zLJSf)4S_z!&CvBb<0L3SJp=;vYx_pe+Nt_n#{&b3pw0+#JHYa8<-3L$c`m#ewUl+Z z#*}%Y$d4k~+b!>FoQA{))&fBbMPs;zD&BLennOq4O}nHf>BT=&y2a&oE-oca zhm+5vKp(m4)#Xu37079F`B{pti{BZpFi?B@nKihmg+s38rEhzEO88-xypFghnY+Kt zM&4215aiNNX)NB1E5!U2E^bobz}W^LhoALzcV}i`ClXZFtv-5LI;UOTfK2bzy0)W&2l2 zQzw5G7Wp=T6NsSDGbX6!mLUnV?5x?UcWnvyJ*HO`b0*EP$|D9kCH`R6t_~r8PsVG} zkvLU5HJ^l6Gz9_$&0)8+!0hMur$!&{w2d3f|D7VG#ZJHmz2ifzC*-;@pFAhW9)A@w z?ZAYBEf3)`w^?W2%Z;Ct7Kw(b<6YTQs%~0iK=T012u9hNZB~gKBF4;;^7&k^{3ETA6}eR3O!vT7CJc|%CpaxGw4NGXL$u%VTPtF|}&IkXaFTX%cs0&s_Q%$?t<@98&bSt`A|fj|BDAU{~!thl%|Ja?OM4FfUF z8o{AMbHv|hooHNen_t@F@?0-X(&didX4y!*ww$pKzH!Y-+=Lxh$k$C5rYss2I0OVr zTpKX>=X@&GQ_haqdgwfyEks+E3uMAP;9>H<<#^j z(sW*Y?a$}z97Vu$g6{}q1nivmsOmFxoB{$wG8((ks$Ea9V9}SSwR0Vu-*2S5aRG0p zA0#%Ymbo>qQy0338{dA zL4(7aqhza(tc3pKanp62D{bn^BH7I8J|kX856Aic+yg0)K#Y$g`fIyHme6M3I$!#B zODYBYlJ>cY%%E7yLs!j<$`;gsN5rt-U5R973{UUKXXCDG#RdrO2wi&G9PfByY@Owc zo~umy>|N`4GiVT57pnuQI`Pa6+szGrmnT+fz!>9n+y6@6=uyvgJfk6oxrcYW2?7L; zAN!feR9yvBzQl+6N1HAmTY1vUlqZ~@+O5TFm-A7eF%mpzxpgQ$^ky8}e1O7cG;gHT z;b5KdCle^J5#b@fbdh{n$>g83rWg6wK{#fw$a}r1Sf0#JyJcUUcX3sxg&BGr{IA6? zwN>P(<3|FSpxWt{&@~&V;tU_r^1O0Y?jfm_Is9%kCluRoRm)`oE;<$gXO3&$y$G+g zHUy&ON;w+i@*SJ{{ug{+r6tm5^yc;e3WUPb(lf~pP)YFsE$z*W0t<8%G zAbBMGcm@OB*Mjsa^FJ~a#CVvkvZ-?L`Te5ghxb6VnFQ4ifGcpO7-*YWi5FZCscYVQ zTL$cn3zXAE_1yX&-M&jJ4>kf#6gq4mhG~b*c6A_g_ox1d96OYfWEj9iUUi?0Mmg(f za%Pe>%m?aO_ujWF^nP5-hMaB6?&V6%QGQ=@_p!#Lw-XgbXGm0_xCB0+5Gbh*JV_soVGC&eU$#mew_I8})suc|vF4PD*(Y(UH1)!n@mV*R~N$cs2dj^O% zi`}&koIcjhl}%bvmjq+O+30tMpMlbYYgYtY!S@3N!qOjxR_SSLMr$Q{aL^X?c(>bA zz2YDL9H##j?L1&DTcM^dEtBg~*dnf4>w7ZS0y1OZ-;+Qu|0KoFcN`{zw9pfbQ6ab5TC z_J)#xmC`SCxf<0QXF%t*B*H=h;-NUr20WG22e@%lSF6(7?3(B6R{W>7$CF755J3w3 z#?E*7?Wxb};7$?-NM02k=qw!lGQ$-C&NC_8W>4?&fNEUMS~9e#L85B$V7#}^ujWpHN%AfkLF{!|ToV8w zcF<>xTetc#d-m~)8oB@59m7Xp>e>e@ZJZ7Wae5r3J zJQP?m?E}BY7u~de#w1_5-2*_B&CtSp=&X#XnA;ZwD$4yGQm)y!M6(8Ugnei*X_;0@ z(@J~R`v!N7&ut52Ne0bt%9ARJFkY*Kw{Ei@#)5W*w(gP@w)mxlSSy&dR)e;Wa#a-x zl6ar-u&40Pg}*ml!2|yM*J8(VIf%sVVe03dG44(GJCy~K2`rx1p958(oed*~I#6tF zMW(rIaTKHz+=4Q&FhG@%X!C#BoW$xY#IfLS*|NYHJY37o{{5co<#|&(mZ0!3EOinn z$_IiK)~3dYX;LSRKm>_@T)-orvXgN}?j%#a=e^TbB_h-bUeyS6b9w_y@U^$(jzggT zc8iZrZ{7InG;yW>gZA1(p67ywYj-uE0|xBq-r^>H^q)~iK~nUH*Dpohnib2R_AWzUSI}@F zvNp@x6=F#_bnx^yiML4G2$hBLdlM5|v+9I-;=uhcEk9o~m-QMaluN9Vx9Q9gQeWY9 zKR^OuOwkg+878Hge+E)Zs9mIp+0?S#5!jS$6UnnGqGt+ZB9E`jCQGys@B%4@ptF`{ zmoIn0Dh}Gj$;^~tBhOxz=4|i!Ie)bPGr3lohHU&jc784}_Tk$+> z!(beUwZyX}ZYURMJetw|)}v7%0<$!U{gbyIr=E4PXXm684$y9vG>t{<3Mgc6xREmN z%6hEWgJ}wnK`v_H;*RSUso5jcrJqc?TB#*&23;7S4|HHPl45Oe+Mt%oBNd8c_ZXhf zO&DgN7qy6*r11t<$r<*4ynk_8Fj{67|3y8Y5AkbzvCM3_J*vaXWidp!EcgcvI__qy8ox1d4+Y;Jk?~~x z%;{+TCNU3;9-4ijh9Zx%l@HmsIcYdl9ZHqG`d}PQHm;rmlho6 zt@i`%OswpU5#;IA(lfmrAKNk*jlQ$vdI^^{F_v#%4DyaQ z@~$>-_-^y{ZlCxRdk-WhSNN>H-1c1&4m)P%SE)k-yxMYxt_vH3IINh7Ml8xaSG+EO zL8dLRb#>Yy(5*;MbO!DVRL;S4hluJ-~Y zDcP1NXTftXK!vKdjaRh#)%HC-W{i=PLOE1EY4UvI#m75`u~M@{1T?4wJLISbC+`}z zM&b=mqAM-$#2dC;+!uJ>6k{PBUgo;$-fHf{_eMPzHeB|7_6@(^f~0tyfx6!*!t=;* z{-bvvNpma;LLf=JTd48k?5Hb>_Q?+5tY}(z4r({cdrOV!#cn#aFE>zl_v?TQFaZrR7%zAO#|cPHhVs>!m-;`9>-1q+j6|pKkmroO zkjf|{gnnSKAnNxjJ8gFh*i3`^M8rwNd;k+tVfAl)QbIQaL4(J-beS1teDvtHv6=Q! zD^mQ3?FoW`@5$gt)q9a?F(?SB$kvmR=1LEihWcHeWgtCz6z0Q>3Vree(89|7z%f<# zcB6JaEd1W*nzE-b@ctO)ePG0FDE%pG4UO+bZpC{LcE@&|?5$$UwsyfKwLC%L-2(WN z((C%qWa)fVi)0rIX?cRV3jiDd^P=Jj9J)hUvV;dHMa(>weMvb~=Hp(VQu3?*C3`3_ z`&;1CmjQ};QE8U4pQUKQgCO$=R5+=vXDQew10RLMMPwO$KfL6ThaN;67D>M|?N;B; zPN=c=nA*Pm&Czkllu(M<1xM$CpHQ0(|=&l30YeKLzJcxag=nVliCW^ zZcjA*yGN#MjQ{SCFlwF$mDDa`K{Gz?3VS|a)BF!TfDhL{P4wESxJ75buG z5-H++2)Ph?$}G2Jm49Fp{Ro}|j}tXS!R>EVYY3s1a-A!xQ}g%Wk0kgBi&Emvkw1<% z1(bOAw@P=pGs*?krWM2s$uO{ov;iPj5eq!v`w6x^g*44lhUQ`kdrx7o0HOaUcMh^I z^X$NUK?01X3GeRD)afbS0_YgR~J0tZk?fTNi=61cln z*0>TcYOu3m8)wP7GF{A;h$hF0h#;63)r-n)pC!&tEtPrk>w@OF61}8*vyZ4j<9Gsx zY`n+ca;>p!`PTGAtsoM@1Q{9ySTwdC@h(nD5^*nliE$SUQ(9d4;H2evr#}iTTacj! zw{)}I8)v8SV#-(Y^9c`wH;KYvGX}}9l%8S(cOVw{{gilZABg9_0!e4=Uz@H-%FZ&i zY&n}%4OKt4a^9xi%Z048HY`LG*tY?#b|s8j?%NITdmQ0IY`NC0 zqOp$et!oO;MZ@E!Qke*uCI60ED;9!(C-6?Z8_Q{DlyO-_P8RtMTd*jnBW6~HXmZN2 z;lAfx1HjxqofATtq&j6Z^^G415t%b2Yv4T&VAGCiHcfPzjt-kR2%&kC`6HUX;eNbc2*vu;aZ} zpq^nS#VMHBB1snc@A#|on#+A;ek5nFX6a9hM6kr&==7t!bv#cMn0-y zKxP$S)U*#GLn|$OfLvbCobNK_)`a(tpLQNf{9AYuU%%co2<0F6Ui_*KE|r40FymFr zx-n?000~O4B)dfJCS5~AfmV?uB0fikj*po!X5$Ei-yoL4n2+6@=dRxSe^6D!S;1#9;E|vrKIWQ|vRq*lkjIzb*;_&F z$qbT&DKXOce;g}#@~zN$9lJ@0E5wYH;@5aX!NG8k2A0x8$3iZhz$z+%jO!~3j~^DP z=J}=_h<_r06YQvrG6Q~sg|=4QPw-9(xNHvY`x_ELL z+k1Wu#Ozv96Xh0Vl7BlZL6~ez-G&}4$`7_qo618zT%wKK%?SLhD%1KME_!)4YHl_B zC&gI<1M4Tiz#RT|?YN7lLe3c?h3=LOMVr?F^bskJ^=nLK@Aw#{2&x40gZr~JJA`H5 zF>u|)vDAR$O-`K*kAlD%iCrEwnbrkhb8~yWt<+rD`B+LsK!o^*dYyrnvxxzLN+rt! zYdnoFxM6SMB{3MEcY{JC!J28q@Mji8K2zP3=bXthaxrAYfG%*P3|UOFsbk9CZW8~Y5P1n}ofiyHD9&wi2v2#$+54X|?+ zV6$}4j-)<7Q`z0A);5{=maa8|g&uZ1rFMO$#^4OMK!f(W{PC91t^ARY(iLae$~d=T zikbiC&A}d1vB%HC5umh!7C9O7ew+wlU1joG_qPxtN}K{SsAvZe5K~b!s{6?iUuS+t zf!|a{OXJlxUR2Q;gI5#FjK*e(@&-OFHQz~&L=Yw=uuvTp$`a=7hy1&n42+D#XBz{0 zFat5DE8m``-s1}o(A!!GZS6zT90 z8S%hQoVytfnYsVeK9Vq@##7>>VZ5C{aCu-L=VdN;4e12ipu^_^T_Qrd$p^9@r$B*& zlAv-OlzFuz)Bszh2ga;&UmnLm?Ryw5>k_rI*@OWX#?UZYvHG)MY z0|g9mGke{9){Vvq%L%YDrXNuF%ER1O)SfUzQ~)97=Iot=wrutWwx>vwgq5HZ7aRsWCgkoi@C90XOU2ar!m!wn z>62l@3&WnUX*uz4rEL|1>lMb8m^v*+*Y_d~_)aa))xPA{%<&0D$i^Fh^4}k&GP(T5q+l?}0R3Ucd z*WA-#x1Yrk7qt}J18^S8pi|mHWz!Lc=Nnp05s$!Y%fkn+?E=VVRKIBCn=`YphAvTD z$3=mJ0J)O4HM1kR%-`i2UjCTUp+`+5)TzbGQ$z0=>t4R?vatW{*WXDyLje~hK_A#6 z8@)u~X8T=!cQSy%G!P(6%zFNg&;fT3Xb4ZV&g^%av^CH6o8 zR^ZCg_P7=viIOlX`lyBTnoD$2PkR$iok;tARUbL=k%@z?A}+t*Pg&-~{(EXXOd+{F z28#q2NCbwVt^MiQd#XIchH8_M^EA0N?pOQP=b(-F7ub6mOoK|Y(Dlv%W7|SufK?cV z5}}%Rf$svx7yL!j(ct$!jez|us(6+9fEJI1+gP+9f)OlDFdPhWM+Mtz)`zyf@Y4)G-}x@;WE*y>8ck6nkW5q2yD4T zA`r+e0=Y|%!YT~T-a5imLLumyp^>kar(eU#*>dhG1Gl<9WF6tHg}Sda6zlSVagcoygEQZXj#bpEL2fm%h=6Jz7KAPIXuAVvJ`LxTxONEEaQq{QwZNZ za}msZjgTqr@VnSYT<+cm>baYjtpmknFr(0DR6FDXxD+H=(~W)6RA1|?&jjpLXBn{6 z&rnF_@dVXy!nEG&coQsuD*L$JCU&eSDM~R3C62|UstoLv>p1X_j)tj!+{iA16W5km z34VDoezVvdP(;QU``yE#Th1U9qOgvUlO*yXM$F&u>*{#n9-zj+?J4>E*m)idZ79~S zxi$Kl9}96D-@3o1AWu}{%_ZTbsY8f`U|`B9q<*AZ28&Al2aX&dmq2uJ0GYVx@jMzd zbznFMGU5-X7NY_~Zh0a@sJFqY1^^<2;c?;}=o#_2VH-asq({+~Wb0Ua7NyYf9@v3J zGbVUI%(*v{h__g2-MJA?=*f@m{f$^WSLsyY^~R|xL~lsa0F-i8DHk_W>tgoMVUlRM zC;rI?J_lzotakzQjY$B!9r34cagM#m>EGfv)jSniY%mcah;>)v`jSDmUS70D@UN2^ zxFP^;@`@bFpP|2bIBXX#2doH}D=g`MM!&|;e+l8Z5k-I|w4WN)I@A8lr;G=<9<<5d z(W!G~lw+Z;%Vxt`2ki=0S&T8({a|SDS0HMBJH42te4WwD5DIvc)GpkbAEGU=LMR>d zu(!S;)pOwZ?_31LV&+BAffzC!xvyc z;!f0ccniLTyt+htb##lNJ=^f34}tY)H~<>M(*VIXeBViO;w~ z4rCgayw^83YN~()=07^;eHI#OT_OURc=6r@m3-y>A9|HT8xUa6N(T3!6IkDf>3SQg zXlB5WMu}%(DkPzB=wuunZdRc9-~FQiun0l05bA_(Zj^Wm=28!O{8x1`O&Cw}zqdER zAqD!$XP_hLUjADs`+KqZ3qR4&{T^UE^X~XoBLd)tae4i0O}VseD24b%bvEka*{4|`IA^6n&j?CJv=aFYkA}famE_Itw&)MB zBGDLN_sh^cg0ao<1G}3+f|}5Ozfo5%hw4h7!uVh-oMtLK=u`JNo`wZ{7uCC{FvcZF z5+Mh?r=1C#3P-|yG^sTxYrS5CZP4%-uPoQ2#H!)`!$-`M4lIN%TqzAUS%ZN?{d3Tu z9A3MxcC)Gx0lSjzoe@5qSrQ?t%b(um<#u3JdAw!S<=Jr_r}}i#hJm~|YpQr!90WHN zr{Q>`O*Ao*E#LJ#g(48zk^?{;La9?F*Trpxqw*>6W(nzFrU+TPZYdqpkti`S8jvl6 z$9jt`zB&L5_*>gvBYPPXht-u)2gTA?9Kq8arvYMb8=QuJK$u_>d5Q!wJEf}O5hI66 z_}@yns>tVaoLR5cvmN0i((S~Azdsai?JKfRrGc&uA zP;umzQs^8d^VxBk$3-_f7MyBJ^f0L^PPYQ(-~+|tsyqmZGSTAQDS25GJn@EWb%51L zDokC=zMnr1(#;4ES+fNYH@Pek;-NhzXrp--=#<8f59nlIC*Gc!wAy8Zzb4P09}K_g26*OOz}nlg=5c8+qR^?d{EoV8U;X6_0_+ z5pFDd5);E|_v_jQdIA2YEm<<3u66lNX$t5B6a<5^IQsXm({-o+P7lzqN@jZ?97l#Z z?Tq%o1eOtA#lp=58nggqz)cnR)hnzu&EuA-?)h$56{pSF8gsz_K$hZkFu+$$T@h5h z9a71X!LPI(lk-J>aZQJn5!L2aynH{XomPWuZ2yuol$-w`iv0DfXyXFSlx zjh%jGJcK=8l**&{1mRn87#XsZc(x~={j>8z`!T4LXgJo59q;yX5jG{<*U!0=qG!<% zI^*9^eo-fWvL50-mnnVw9CR1v8zwlPgMIK#5eza>sOBN_1@c4O5ByF_0s~O``xOy9 zQ7(r}pfU9qw7;uTZ4Xt##9^NZ@!ojsTeCHOioJb>rRw=C9J7V`P#hM8+3y}5j&AH@ z;$)HxUh7kc6S%s($jeAw4g+oopoVxaG>7HGp*C=+vVW3eaK8UTS+&{6>mXzO0mJgJ zD{;s{u$-*xH)8GQzdIvXjSC~2ciL|Q)2~}>T7{UZK2Z0|rd9|>_9aNpa$kukL)RHE zs;d3#mf8k)^vRm{dmRG8h}!gkWU?+FkE_t>3K);aV3X^)!kClei_JXcz00$MYxW)i zT{uE7*MmS4d;ZDdR#rb29`?UwK5;OGdfvH&$>Qci^M#=Ww8$jazkZ2ZK z&KH7^(k~ddI7^No-Bh(zdg4;@!gC;*ml;T=t(UNs$_Swo6-ni3_#t)%x_k?!-Y;=XsQ!rC10+(;(pxRGees#X{_k0-^iYNL_Jf%6$^mpH{s_fams;y(M#J}sH+fCi>9Zcg6(Q1v8pefnk(DT1JZD( z4Z}t#(JC6igkV{>(%wM;%jXiAJcYk2L%|8?j%pj?cjV14Oe(Zt` zblN*yz+C3){gTJ}cuD%JMMG-vf;+&JEXyS6sX^#a(S*WhJ<;%%e{zEKChr&px`et3 zqUKjKU!+~hMcA)y-j{|=RilQH=6Yh`#)$ucQ@z6M$r`R#LVxuwL*ja)p$46YYr8A= zr|HC|&nO7wQ>sn8R17okP3RX;3^Ya$lX^|Us*$I%L;IO?+)|Y(DkfBBqDBfwWhW*&fB0C10-MZg4(6Elqx* zropqX-ZXEl`ta|CrTu}g^uKnk$*js(dQ(-32tIqy;F<8QBZqY_{2s6shK(B#x*u%@ zz#F0KQG54y4?7uMTfVvWF?)Pr@soErlXwKBa#>#l)|hEC|MWy|9nJZtXDOFSMJ7Dg zOSbNchl}t<1EN_b>Py4+PYkW$QEo3D=h-(BV%^Z?Pz&#y`?_%Wb>j)M_~9qs-^4Zy zG;`TK<@kV&GX%#gAk^Ur*t#l?!V8kepvi~Uvh90F5{z*?hHZm25d; z1?@|WMZ#2OWvbsVCX(Y_7`_bw<$Z!ZX_{v6A$a$upi8IrZ}k*GUmoMo7|2+FjG_KE z$SYLK$M+yu8jcw}_AYcYQtWCJgUDMfWK$B#V6OjU$Wgs?&ZphLeWkbRG>sYDt1?x6 z&1I-VLBe6opCKf`er1xl!c^6jF+ig_`Sn|iP#s=okgJf=@mq?17JjI0 z>^r7n#7JGjYWnzob3I^)-X0T&1xs>V9I56|f*>RD`Dui+_%b8mvTo)hTx!wjo2tn_ zhM^X*ovnsb?5FRQQWIpvUIWVSzic53v(knzc&O1-dOpwosbUIzc@?8-FK(3Bo*v}k zGNN)CWcc>8jT1X*4xl9q|E}D*H=}qQOIBv^%3%8318&j6k;v|1yR*Z;v~}LGv98NK z5_H@(s#h+I?YkWzgu_5$K-_v@ML$^LmA2nvJxurYe8N8V2nar>yX)AIRZk-+LTcvx z$k8xxfXDjP$HlGECfo#o3^QfK>10CJ;tiK>>t^GA1_4bfF<^IdxI9V9}db32Vvsxes>9JKh)XMU_4A`$UD~}Y4D6Bc*=KBm{f|7C zq49+?=!dv&zb+3~z&ml&{256^;7pE+;7E;`vS-;qc)tVY6;(aUoL=cd+=9S&;bnVj z)+PA445PXb21B3{3n)o{{t<7eTQ7|LxqKs5493Yj3-6ecA)pO9$`hI`a9%y$#ZQtV z!1CaHTj9=xO58f8;`w(jzsGh26L+ico|_f}9wD@S7Wo^@zZ2NU!rdh3R{EWq4oDc{ zqgjE)An&EBM3g4`Y9 z`Q>dbYY<9^&?vY?-0?I$*<9@SFaI@HhL0?Lt)-}j^RL{FT_Oh7+Vz*2; zXmXYcY3l5gg2s=dS#Pdt#~CbHeum+gUeF9g9fxZy$226mFklfA;ExGrzc12g60^ey znU3F~Y6D8~8rhZ6W%zw4$SXOuR?k5JL)!p{7oZH4v9NM|dbBfuZQ#>abRkH_65bvo z+tgPnFTOJ--er-VNaJ^+DsJ4BOV3#50ZTgi4yJMWz}N2c^R|FF&VOKE-uy|u6K`-2 z=<$i6VSA0`>qTf?I?oHE{qQg>zdVVhM&;5I5custdKUnOFlGn;ovw4M{T(T!Cj1Tq ze5kMtaN9+;T$YnC3961--CBY&ay&O!jx6tMt#1@fr$t0(+=7|!5#2}jgCCJ`{_7sK zU_=1wi*1}`|379A4C<*7L8%FOxu=7B05X^Xv=(JhBdBRwXGZYq0WpI2OqH$a+17&} z1k#a=-n)Xxvn{lx-Z9Q6Z&5Bz|G%yS(9SK?6JMjca;nlVYK(yN{me~v#()ea2)5J9 z#HW8cU&|AQXQ90W%KzN!BMBqynebot0K%+51ZR>LZhlFf(Qr@moe~hbi7&YL-O*@w z`4o(!%11gjC!lRG?*gMe+X=nr2DC2(rRM!9V|nr)k~rlf4JZD^*I&dtqe9ShmZ{VP zZK%1axsy#ZKspSn!Gp4(((^W$_~JxTPCs{gz zP8hAt$qIRk!T>t)AjH&NP_(VX(5&6FWNQkRvQL=TxIN0h4w6KgwGiN^nlj1=;vB&a z9qI|JNKfx5xEK7d&>4iV-++ghKNvrtZ8^CG zX#49E@&JH#qkqfs6pdhpEFlFum35E^Q(x+&#w=aDiD* z5=D97^Ny$Qo^%mw!zYiq{@XxN;`Rt4_Jm)%ay%?5GOf%Id}}DMb~3F$2Nm=MkY4h; zdkuaR36p$-wE#3QT}3ssp+Kf}3};T1g^4oJgce4k{b4*MIEfq(wqv?jxkh8~PK2@8fWNNo|=`aKqD!*gGC(<#yBoZu{4kPg8D8~cJ9LAJ({qlC`q z^b;x(;Szuk2VN>H;Gm{(kRePNS5?5X2+IL|Z~&9y{x{7$lyIt|8=Zg$EbTFB=H{2x z;kdh?5q%BCThu<7+Y`qMA4n|NRg^#)rUmAm_)XpNo0iL9 z<8~oQ&bc&GR5L-G9c^#3S{q;^qFTLRXNRaodb$D%Ei?Cc0nIFZb1x5JCQ--g(X%t) z-G;GMU@Wht^{bs*vDZn;=-3li3A~r2HOi%a4vn=TVD0Zemz8Aa2rhRK5)n$5ASd12-<^Q+p zqcIcdpBJ!2N6>%qljGZ<#D!ySR6rtvh3jx<88kgfFk3Jm$t zIF3z|?Hu(N8aQNon0a}dp3B6(MwuuzcDdJUH-8t_;DNUBb2yNjir@Uq{rTTX&+tBO zS&+1OIA+*s=LMGsVDZ=m3r9rvvl7R?lLVD?JfJ=Xo+9}MV_hnlQi$J-$b2czx+Q|? z63NtFh^YW)v|Mqt#);-2YAwqBcLXx8kIMLQ;xm{dQwDY!iwm9jp$lx#gpkmBj_R%; zrdA z7T^Vy=;nfxdK^2$ThC7dgax6b<>pTyF`#4e9`Doixy}ec%t1B$fM=LNg*%aVxnTv` zC2t$Uu8KDg)gAcxtyf*D^<+REvF`hJh{hXCsBf7>9_n@KG7` z!-Qcu+r=k^JzhWv7_O9lxHVbJLrM^}iB)B%Pnak+tAjQ|@RL zf*d1CVTI9k4bRVS6DS+fT7wYC43fi_GIDeX_h{B7XOu%DNW^sm`hp*!a-Vqq`6TX+ z?q+XMmhWD6EY-Kvc2tWWoYhWVE?eO{mf6v>0lM?~MhJ+tm?CsFBTG`)dZvJyI~W9t z=U*l-@GGFoRX`X*#(EePZ6BS84bGD8$JX$e1gNFH!vXu{Dq^aa={Zdwaxh-)ApCSC zi6IIbfZ_Z2AO8O1zq}w_f9A_WTAB=>mZe#8NN&+^T?cs9^v&td^R0&M@I;O#5az6Z zhA1*rVkG69UqL$K_w|z~d8>Ai+uRV(@d4n_qQtpJ2lsm){(=h0;{@P7`}-sJ z{Xz}9M1D^q*LxtVB1#kT;8Ptf~7d>TZ29q_-3Xe)C%!@v*i zY^=Bt3<$2&#swrNw)uFh@fZj?@OUgc>59@7zj|EOkP;%+ajf^5Taw~ed zKFSSKa{#5p51KlAk9yLbfR7aD4x@AgwHX62-Mn_UhdqKw3?v>rT#zy-fE;sk3ge;O zt-MMz1YQ2^g!}S&kf?876t?*3fdiRY|F_=*As?3Z*B}*84B+^ddNHbAqyKW)UL8Ph zK4rT@x(5(7A2JwJa+awCUE!doh1SUTK+}iA1QGw>el!w!1!5sWW}qU55t$}bRJYQD z?sIsLrtLnI```S{0&&$9L7wfIyPX3NuvdMs05=};F21vZ9-UiLc>#M{q4{`CZI2~a zLjysX*Tw09=Vn<~sn3b)p2oG*JUL+V&#Xs!@n(-ty8p+X;@EBS)u%8UhEf;$2j-a0 zTLxrY^EUYOG^#0M%AmL+kSM;=*P11JdcO4Ji5ebIk9~tnMvgQB2M2oMVIX6T0CM%| z2PO#zq-uhK@`;=dQjW#iB~*YOaFTL$=O$N5gP%VG%wZ@Z)=&yntN8>Xc#a68gn`~2 zt;rirx4hP0#8I#988xc12s)VM_rbEi?le;T^(_@4o&PKAJK(8o|Nl9Ttg=NB$KET- z)=~BjA$w#+i0pL~S%r)U$q1FQHzA`GvMM7XE0q<==Ks0rdA{H8@Bez8mpnb4bME`T zuIn@3pZ8n$+zNrlIZrOio(nE3<@Rf*$c2U&k+KG0E#mI6tDG!!1K!lFNto_+ttEse zpBU}v9q-Q}ZX%O>s?99u;2o;DUIj~#RXo4RHFwb4uDOrfr0WKdd{g*?^Ly=d+fp8i z)FRM-p(M7lOS}2Rs=~N}*zsdDPPI81P~Ik9z%Oc>_|8mNzILf$m3*;b6+p_KLNik; zc7w?w1R3HaXw6jTkNs*qgXq=@H6T;?cdhm?m|)O?DlD!H3XqG>3r;#i?Jf?xZ%jRz zFB^pJV=ZX8RUjHhh32Z@uVFNl(g%bSG6M6|zaL!b;c4+r$EC6Zei7yrUaT%#XBi12 zHQ|~_XbBX@e0u#9`bUq$n`4Ac8l`79*_E+U)9D9R!#51)GFst!?8-!SNY|3%%)4fD zpY}jwa#hrKcHK(8EHnBu59Ap6=%0RSBPFQ`#cNs_J(wsFvzx1L4XBF?R_m_V9KzN0tMhJ8AD`Xbm>P=fq*B9t zLATLfc}Kgu(w7@57jS@1{fd6FEWLB&x<3ac9csmHZMhZqm{CNjrK)lFtZo+W0GI`F z4W(VR^@ZK0#y9uphGx3b2s?zpo|-9TDUnS)D}2uTNSaV~CGwI(6xs}nBP}L#r7loK zQNb`fnE~~+m!B!lq4^AYkqC);nHGP*C&eksCd9NmNw<{c0eb?L0X@y?`zE%IB}|rS zf2C7IdM1y9(iCOjYulNgdk?!qBD?Kk#XTsW2pyxXwFQ7D{p0N8@c@se`#4hje2%2P zYBML?Ox?8d^)wDjDwJCz2}og#UAlV`yTA9Jelr|%47!bjLlXD#_Oa%hgwq#LMHp=O zAYFA-B1b4Oo@|GsNyUIOhm9in5Zf4t%|5UFC{N-W_x)_87=O=e zX2}%9qaI|s#hI15QTV3;bua%CERZBVUjuoQLIyL5;vHe%^ZDcUpDQA(lLyt>6NRmxjlZ+3}0XIhD-m z47oxin{I8X@3i_4`*4*ZcdaerTs~+?x)j zL^PWsMxP5#1;+GjVXN&MT&CO$X+YFqVS!Hh>PvD`M>61xUJhQA3X)OLqv%8P+C&ah zk<>)tFHS6aTTv*;Fu$LRmZ9aJ7edqH^$eR_d&1VUc>^BKJ=tH7x(dKwjkPV=wvkJpJ-i z?A;%A3q9@P)ZNGH{uU~zB97jAiIS_y@@qooIOV&C>0_W0Hn>1<@&ayts`X*6aulu& zRr`al(6e-SX>=HA0FkpzsD}H5`KyClqksA#>%m>4i^(;vKs?B5y}cAj{Emx{=+^J@ zfc3@rqHk|GCQMK<$MFGsq|>BC1{LnZ7VJ1xJZ@ooU2M%;)-^DW8UN2OhIDXqZ6vDa zm&i}yj-I_V`EniCb1rT}cRn87!fCb5f2_K&!|a^*yfJV`5g|0U>gmgme*Jio^Va)f zy*>~hxuy}-V&&9Ni91pr7q)OQWA`E@@y*1^4uM*^Wj^{TkO3Wjxg~Wxrclar%j5fX z%Zh1vuI-xfBifh*G;hBodNv84LfFQv9bAk-Qe zuvn{dA?b{>p}`9ix(M=9dieJGaU$CQ&drJ_J9Sdh9fNc=*V^G$6L8ZfzmL!jRcTp{ z^=9kt`~6)|jfn|`*U3?X-9|mXOP!4xl)u#=#cPQ#XkeTASi8e~LOw(1qX3(L6b_e5 zJJ!mVGk=-Ryvn9MI;xje*kV+~ZLG{rBggjDu@|P*$^bU_1w%&9FqILvD9W`_5JSi> zCJ^-q{RoZAMt}bNp8y&#-H6f~a+coE@#8jEk+VeUfS}zu*~(R2MO%+1WPCei8Otnp z@`hqD((S(8FMIU^&jp1~aa=`ewBM5XjV56TOJpYqx~z_fn!1h^^OqxKx{5iFQgMvN;!|5 z;3Lk6G2(RJt1a`#%Qa#UWj;~s8hW82ynlWB;20M^3XG>anJr`(iHsi`X0#GJYmZV0Rv;ie^Pz@m&&NAd9c&JcG$`ZNgsMa}!3((3N z(v{>)jz>Q%>(rrM(|QY_WJfn`o=)--o}$kNy_vvt)+M5Gze0JN)8j?L*LR_f5OX|v z+$F?8d>q`P4mLACTB_W9whJG0O_1jfeuRUvBb`2;p7Re{sDUz`J{&EpfwfZ=?Z;$R zziYD$!KcpL38&8rP7UxLHcMS4k-QpVBheNrStAddJ zO2nYJwSC2`mGtxa`^^rI@PoGI1^~W@CA>OCV{nQL**ManFHA$@qTR z>Ra{q0V{90?`7x|4;$S*d8W7C$L)gD+2R=)lA8OV5`;|=!pWJ`rp|?I@w&?=)H)Bo zj`}y0s7c3p=!nyrt$mjH`Zi70E^(aqMy<#CORrz^rwW$S1l)|&p3fv_M7GHIE>BF8 zb61SJw;nrKKZS{+dTJsZC8N^tR|I1Jyc57fIU-YLRw4^wC^6^1|2aDpR1h@;#!Mc_`#_?Q@ zSbRwz-+YOddYLeEq%zwh+(d)Ua*W>cN}DYBN>L7MxWw%eDO!@pF@WyW^{d09OO{m- zszt|7z9apWR zphAzc^b>v6rJ#yAit_q_NB#UAEs5UR+93ANygeDxU_i#D3^Y|`w*@fig7AUHm3;BB z;#IjG;?$Asq0U92q#e0BShlmP1gZ`#CLc%um@92Vjzw8hKCxsODr^6NNsJbgutw=N z)O>t>01tkA565F(_Pu31-3fjC)c}X;g1(MY$pvpElr}depW_w2J!d>5soIaEzI_vg z@I}u1LM;;oRs5BOM}axQPrRIgX7$h;QmeA#4boq|A&TIp6XSecIuOa_on1LR9JNiw8!FhbpUuk+Wp}KDu8COMND~Ea3MOFTX06 z&?LppRntS{BUYN&%;yvc#9&|F`CgNn5~eg!^%-^fa?6h}`b3;5iMSiN!Sg3QdyDl5 zJOX?nRD{s?za(Hg&{sNVqPTH)8P_zn*L9d?bpJL1RcS&=>0qq>$#Oo4VVKS{!(+ZH zZ;5^0EvhyPq5&e$alYJ~O_Z-MG&T*y1LD?O;jSUM3&3C{-m8o04{xkVA}^vkGnBt-d45^7(|jIAYhLdR^$> zCLhnZ*AkpzM;(cWd={=l2suXp0)b&PpL-I*%kTKHu}uClh>hZ)Jc6$_BiK@*h)-U+ zV>I~(%IxcC*BX4s;rfd+z&sCkHO3ieOS`B(@rw=a!+@5f&ux!A_6`&D_2h_?Wx%NTq1mTATEtI1l$ zzvVX!KE#N`uGCedLJOY>3UrVefzU`~@kNv7BhlwMU|eT;$aYI<(rkTW>aQ)KWJTqv z<9Da^J(fBzdEtlh>9Qd~sS9Wid8k!1J;q!dnhsTQLORvx6$X>N`ix$ zlZJ!)+UW^k@80-brhfoFxQV{{5e12YrsWv1cXyEA zU2UJdwrYvboPumN?N&wJMUhMSo$I!~?W_ zbip!)WFrRm*rqF`$E18(E0KW^@)%Mq`Q zN^o;scl~K|(K|(OfCljO(4T>4@r1Hw`Fxgf>607X+WM@zkBN25t{g5>GL+1>-ZgFU zEz796+1&+`0k=_C@{0`&JkW*VjR)GAW8Qm0t?0vZr@!cSQA}@*Xo(kp`J;9`uN>C4 zj))UR)YjGnBxvFew;Y+p5=Y42jxtywr7{u7%8n5*3v&WAvMYl`)!3k3+!62S$twqt zFzCgdpZM)Gv22~s8BH>urJ((gw1ncSJ@kE>IeH7?TsNz{1x14D{F0V9;$6WA4cv{T zPr&k_y%!MJ>if(}ZCcZo_825?MvmnLRJj9DzeV(`NQ@AoJ1|9BDajJOCCFndkyf-eO=R>PLwuj6dX8odY4`Mq4;|9b7 zrCg5eO|HxYeapE31=`#5Y)!eDf&EAj7p940X<}ucB1Ae7#~4v%tCyZJsQxoNcfm-kKOv+YNoNR(*PsU*o zjoj10t2KgvkkpvTdl79B(2b;+tWXVLWE08MM)88HB%K@7Ij6L9@%5d)zrI3}vLk_$ z{FaC6Ej<0ARf`VWDY?ulPMk7@{-y&s2l0+_1 zXd*uKR5YTQ`$z^5<{%Pw6;uKV%zLsT2MZ;Tsg6>k_MJLrwd1?1n<5m-)Zov5XvU3@ z7D|D3yBBHWshwqO>;?k3JdXjYwcwR+j|e(bkmf#YH*jjG$OtvKqLo*mfV9PX#u;@X z;&3GN@AAT+o-)#V|MX(b*?;{LfY1NyeV0)(-gwtO|A_FML0JURbtI~|IULT&|Lv@b zqo~~{O5dOw8D^6i&%%IzDpVC=JQ2P)I+8mcOO1a2kbt9lvB-Su6{iNyW9Be(g{uwJ z!M4aDEzy33EahVpv*~MO^*#l0IPI`XS~z=J_~aD#ux042KZGC;LZMM)zNvfAAH!WB zfrBVu{;optSB;zvl3{7DNzv19IPfVbdCaA)MqGrHG`TpkJ}xyO;OfvT zaOkv-AEQ9-2&%=zQD>2v44fx%;4ebmCVBVSJD#)CDGwU9g?gXd zvo!4VO2E<*H!Pztn|@luwKS>HAD{nvh)#gIk;G+jSu9Ect(}3#?2EUtZn@j+GcH=2 zqaB7g{|M@#s$(0|GzU{a3h8I@S%Q%%AT|=;+Yo*>i}lQPo;ZyjYO+MO{Y}JPp<4Jz zI5c4MPeiahZ>5%6e&~bK5Gp+YD*nYg0m6Yi)bIsPFYk9_`q_`ja#O;_Rlpi^hH{Yn zUZM!xDGh$&>3~f_%6$LH1AdbLY_QsOOOoG+i=5-xqgQD?NZ7c^f|v3LTABSfrd4;_ zKrxd``@`W;#*csjma`%XY2t78l>6MI|8z;^sF3`gCov1It(4rf3fQ#E=PipYp;ZLK zO-X5}hGmE83(!Nyg*8d!St(3>cI!TQ5Mei;K?=*aDTq$n-{?+~6YINujD~1qy=$_D zk~;DXXrO&iNy@O?xt1?xEf|W;52Gdn;}b<@GUClaIYI7*B0a8(iNt=cYX0=X ze+oeUgOW)n(?2!3(ID?Am6lPB#^4&!aw zQ}+=|Bpg2jZr}{lbEGZr)_~uYmN(@%ObrI`uhBA7oJe=WEq=itNEuYp_t`a|7e2!5 z*S6LoVSG z{@_dsGHFt$^Ns!RrDho-4K4tCd%zUDt$RoJ^?|oQJn~K z{O}c8Lld9T5VVCS{E{{`IxOpv93y4O7&YglyqtFP2{e;K|7flX#f4!+bGOv4^Z5K| zEzRn;9tn$GPWr2)Y=e zed_O=AV?B){_Die)S7>Pu`|gT8kgVp{4f;v9!z^HI@9k6kJ*q()(B7Q^jqi!j?=g& zweZ)M=2VP9w(JPQ)-Bz&09|qiK_OnUa8^EHeS&5tSks2)HK`6{2sE6 zV}%~M@l$I37?dU}9Ird4$W)C3>W?x|Mxq?uYyk!f8&Vx$^5cHoh#mS9<#6XpZ7v); z#Z=^oXDRp>*nD#7Da&TD>vlM(SPqvHh3xzyN|SKQoI48?C&P|FAJRj8N{rF|eMS^8 zJ3mb#^M6k$>LeeuRgrx(W>SMSR1rNEKr#2($gT0G(8T7qL#iL7LwEH99!C)8>hkM7 zu201}OQ}Qp-y$1XF*++ZwNfEw?_R0x14Pmbm!DLCwtN}rr#zK zwa3s)pv;GRYV~)y<4*xpfss+Yc$cA*1CPXZ{P_d&^MvZRR)`7^D}qZQj=VSE)`Tza z6uWCK=PS}I|A*aEk$M?F^d=z?eXoTVnGgz?K*~R>fs_$@9{LDTmrq;4Zj0$lN>KA$ zKBMQBow+DrSc}K(KgSvw;$ET}VqSMcG)K~?(D2xlK}EIZ1Ev$5{JuY)tK5V<6#Mg2 zRDl1k*F;VXb#?hc12^QcBt;-h_1gd;knj1K>5~Y{WX|rR+0XpD zk!*6;C)>h=h{%~7(GBX3RWz}VtS7nU^VGBb!5Y3AO!c}L%`4BkJQ;(uVQrM~4KFqx6vzIF#e~@1 zyU#@3y6ZhRQKsZxcaICIm+OE8RR&z1h|i+gwTIO1SG&{BbR_eqP`$b=!(ebi)CSG$ zJAqHjZ+NucXGs~PsbTv+u|k0R9@otDo;Ep`Ihn z0(I}~1uT!ymDM84m8fEPg+(_D28<~c*_Hpvv{ca96-{GZu8d~;AV z@x6l!6f}H3SE^KdMe2u?Y*FI~XX1>wT5~u03c&>nZ@(=k@HVTT0~^b>e5;#_sI$ZS~gvN znLzJuvMUch78izY-B<5Y;^F1sQ zjQs0IA!EJ=z6AR=;Zs+8j!ygUSG~ySODq?r^kLgO3F=AJaHHc~3eUPCyQq!TlZLEV z%!a?vJsJnJbtB!A)KZGT~G{u3{G}D@h*At zy*O%H)H~g7E0!s1DJGJQ6hILR>b03PMK9d?H3dmdBkP25_@IOjj_mHSP?iw%wAv%{ zq#j8Q-n@;aLnam?^!tK}f=RlFfQN#nOh;zoIVK!XS6c=8+|IonWs4SWH-d0(>xcLD zjZ&z;`;6iX92a&mbT_vceNqpdHJs1c&b%7f*Jz*97UbKreJk5 zxu8WjP(Ao9#y4~iQdN~2AO^Va)^sOV4BOlVOAkd5>G}oY0L*{X4(b?10YKvW2$kmlb*o zEBLb%nn_kyrsqa3?VqZ-#`t0{aHT*Ye2`mWM50qR;JD+U(DjZ@dQ0>(qxEA)gp!aa znZRZRB%@{xPzUWu;;ovxE)L-p=Aa+tn>)s%le4!4Ia;?TET#YA{jETS;wJL02e}t0 z6O&!P{F@mZF3FCPRX<12%l#dKJEx%UJ1d2hI(;;P8Zc3>M;l*~XIaRBZr|Tv{-5A> zpNhxuD1&&1$$H2>zJ7s6${^e1TWUHBoiRfep{sAmku)RR^2SBXeBgb7zcsN5ebk-z zOiheE#W@?L-#R$5sOCP?^O$_NI#N&1Al3h@eEOfSuED%5{WWo`xi5EX5@LV#lmnzE zoC6k`cuZadIplM)d+4_E+2yYX7(^Ue93|y}7qsQ51%2_2DGIpS9!TweJ}~`06|RbX zrgQEien(>6*4jTV`5T(UJpuiqpe++OUnF)BJ6{VvQZ)hB=0mk=Uq9*@_wsdF1hS`l zyMNE<+4mf|eY7uStdxCuF8AMdS*i>m6DHRjL|mDCK25b}P9?x#AR#H9&4^3NQWMcw zK+jl9nF{hD9e01voHl%pcQf&J3NOLYQ>5(UX~Nm=eTX%Wm&F&819cM49v%~wwx6?I z4;r5^eN~Gu@p}|ePf&C+^0C)***IWwvQU?mq#KBE}sqD;A!pT-5 zvCM)0zeT*vdh3?!k%IFmE(qDhHA2@pHIS~TZ#3*poiExfg33u>yng;B4B24C$TUD; z{%>>$v!8dHlZ{X>On*9j2`IL3=w5>zRJV70%N;-A+`>bj-{BO@U6@PKR0s7c3>E(3 zX|D6s0`oy(hPM|d_)828m~?83-a6qGj(aP+mv z`5GLPX3-ApJf7v_HZdyY{42q7YAP;N;PStwCV@luiSC5YDIdl}AiaMbBYecQLG;;$ z5>GfJzo}DCD>Zp6jbZWlq4b-AfF}AGzjZoETqA{9*2>>^PJ}Ks4s`22ht|u%BSlkf z%$MW(+Z|siSlQ^Bm*73o=RQJkoftl>m!yN{sY7O8aXJjaBk5sxGV;7usy5yGsdXp5 zJ$ez|`KJvk6T@YPW0!DKywsF~6~&FHy=~$40bdbP^jWtfFj;W^&3pp%I8LLP1CG{A zQx^(f^tKEHuC8elIF9B4KLf>orC6Y*`)bThs$fFvfK32dZ>S+SzRMuZ;$i06=4r7T zzyE7mN)&x!CO11kk10SmdF7IsHh>*dseCDk?}O=RBd+Uf`q936KBwU^(hp zK>;Ah{hJl!lZ(q|rIBy;=?oPATJ8{70 zQm4b}J#YYARN4cjABrT#bWAkddO_tZNXke}nNqtl^MYI_gIEy|kNsC|-(EteM)h2( z?&MBPelroYg=Q1^oHF`?5o!Sc+v=BEDRLyTOTKa;uyVv!ZYZV{7tN>iKChU797ut^Sz^Mqk(szZgXr$Yf_>*K0iGGm<-@|`j7R{YXtX3SICB~0^%GU;{Iio$?&MG>&#klh`ID=10)$A)pQ&7D{k1>QXu_>U{syA-f%=P^hUJp<&VV8|NCP0necH zv&|CYkH4u~T!8N~LT#?#gD#y8>6=)>v)7`3R!I7eAoV2~{>&3jDELdZiG}gv^_@?q z&2}mOg8YC_OWsxKYo6b=A)X716H86_Q3+a*vb(bayEraJ_!IY7_ARiDrN~46^J&A% z24Ism?_KC20@Hut?IBFIm=RT_$CVfT1iEDZ5XS3H}-sX)=RS4oaP=H+O zk^?cMyAF;?=HeO&9v%mgnxcXMlNvlncDEP`E>4AKTw49~d^$Zh69a$#`y7wp z&yF7>ut-fw2uj8ClOkzL2OOz|U*4G*8g3l83;hDv-~W8d8}7C51=vUOTWrEjOblX2 zI-1X^ojUs003*u+_$G{q^L_cdP)gZ|ntSnF>JDBdS;QC09vv07&uSI*xhgO6?0d)~ zsRfq)*+R=0{4K43<$MpdJ$BtjS@$=mw(6E@Rlsma!qz?IqaiDweOwS{8Qe#|*-np} zUp|OGVcbp~Zk!LYBXt zlQ~nj+7-uB?R^gq@8h$74;4@))i07NI^G|5L4X=JRs(w}O=sbB=A6%RHJ`{&|6RnX z)mLN=4m*|=0z=X2mMI#lM-gum*Ob(s^a7*E!LScRK{?73^Oq+!em(K(iPgto?v=ik zC&bDsqFmWT0;=Rc%LU+!ETMDic@(*xS~}*;4weuo)I&?nG)BNsV4~XjfJ_b9-*%{k zO)Y_6^DJ*JGADd_#4X}#22v7mV103b2n1WQbso6CI1G=qUq`mj;(cHD^Kf)o@P^9> zSC&S0S!8Qmgn)Aiht5#OMZ4}S5{sp@#mT8~L5pT?h>GW8%a5%I1*-{c;rj$z#OQRr zSe{e-F-TP9R((80lpP9X|LJfecH-bw6NPRN9*>#c948-9(c)%&{Eel2!@ z%@PPErfGtfKfSy`P`k$7C) z1<>>>(q4Fe5}eM46Uj!noz3n8zVCmZQ#?+BxZzJ)Bl+;x-7V*rcPneC+%sCXVL&0r zu`ef8+KVqu+$rZqfiy63>_q@@2u3sAC9<6#hU9OsJOl~+t@MR#elEjr7S7zfFN$eAz_%H z$s9rDwZg&6F^r*_*BPavLihExmCTb@*Fmo^9N2kHH*rK6&Gk3F-vny(6QCtn5FJWO zi+=m52gnM0p^!%>@Hy?O+eNc#p5X~UY!=*og zc}wH|fqV(*wm&ZJ4?4bJ+XP}~O>=J_=a0|AktquhW_?>^KR;C3@uYvOf}Wc*{iv?Y z9S4JoNWazDVUt8&b&fblyQDg1uaE@p%k?(Y2G?Bu*hX6NfBIV-6Tzs-{(`e};uj5{ zU8UD?w&A>s7OKJA<<1XI%k}nMUmB!&jn0DnWxQ<1{wji98}Se z2{2sS=0Leqd;Ffec;UfItlY5D>(=} zPcu!6)aE{uKu$+=JbnQbX))yJD=O7j-bxlSCh+PasatSz!I_lPgvRyW z*VyWscK@XJdFO@gYM;Ln@kehhf>WkuveP*wWPf+?iF#cwXkCs_aPmF6^fXRLw=eUq z%ESsoMsY909VU{>OPP`UjE9Nt-=EF&XxFAwL#6B$k;S(b zruajl9?W(K^6vQdVor4D8q>(aaf^aWz0VA89V;mPO!k4OWR5TPUN{+j&Rso8PKU)X z5}Kn;Bf+~{3L_yKUx|>ybZVid>4=cQ9$d2Kff*PyFqR8jNRDcPKWfnl-fv?vK3G$~3 zd6ChZ4G_c*th5)pkKO??dmW#}(eDoE?-unnb?PNwRU={d*(r2i5*mbR9iz_qD-uQ? z%kL7Y>dW}QMYZsMk75R`n5SIe-!(*T%;_d?*UG4;2;Eg-_CpIpx2|zxGA7JZkFSF! zyxgHD{|0H?;r@@uIl~ZgLEH1Jwg_D7pA(Y=p}7e-3S!kjOtcs=VEcv@^`7c+2JUTs zvp@6JN9>2kvVxl02Mt2)1S5Y%%?F(EbeuO(E3`=T4@Y>y1x4L+lbQvkmS=vaM^lmy zY@GlxLjPaN@H)}f3=|QmOjD*b)7Y!ZZg_JzMRUkq)O&ibe>l%gNXBD2lIlj61ljC) z*dgyo0yjQ@}FwwKd|NjL+h4AFKKV(&A%BV*cBL z9R5DWIw8qov6Qv8r#=@ky&KR)htQ7w`@*F|lzPd>4Y&@JO9V)aIg96q%X7hODMz1@ z7$0@)`7)jSApitJa^+;V56_b7P2A&%pF^d&zs&7}gB(UMxGMs+$gqUnjp6o7bNmUiC$8^Z`0E zaOG{-{?eZwJzfxRTp~#f2G;(IIf_wXo`|7c-y0wE!_&CvVqIgI{58rrT8c=7U%4%V zQVi()vM}~tm(lIUvq!n^@EpM^U2M)^CuQT~GN7eZpv*qX@Fe(~Opk@b`l6PFTNfp4qzRd+jd6J>Ob0eP&IR=y$I}PO1ol|?khC#urQXQ1n zK9OFyee}9QOpl$%iG&Dd>pMq}(2jVIIC1L?N?e~*+}}~2U`vrZUo78RxF2aXTJ1It zCH+B3oqnfyCmRqWCGC-2)$Ai9hnpM)o{nJ6(hJdSdbz|OOi?>=pa{kq?<%m(D7hfv zHa7ZZ3<4C(FrbE$^W0T!ssmDi2w0rK&zm1-n^o_sd=(SzNaqI`#e>b|iJ$+z}6ypgx7+c2qZ^t$9qToW9jP{-lN zae7qvRFwEsPXeG6cq37GEEDc28`$^cF(}b~1cJU_lrHUcl|js2a|0;h_dURBdVBcV*G~zt`*?Ge@nW>OVzOYYKmz3TsafbZS0^cQW9M?LuI>-?P)-g5c zrI0E*nFpLMz!di%tDi7cN0NU!FTHPnRkMi||9v)*6% z!703)qsPt78eBho(~0UFF>r0(aw-2KhPGOVAo7T2)33`nSuKBXKfIxrpW>~AMJr;_ zvvi@!Mix@@5U1|3vjz0PKa`gRZKxu<2^oqPi!&*f%t~OWq-}Hveq{?G`p_k*3w_`;oVTF?H9h=;pg-yUXc?5Wv`qkPlA(Ji|Dx8 zZw1vc5c?`z*f(223G)-;3H*Ne%Agt^Zm6(Oav9pV(w_5(G7!2IJ0I(1y79fAa}+wb z)~nqT!T|{;a1qFDO5q3l{>r`C<7^`&P|}QABm?%;Laaz3VEB0{bqOtbkNaP)X*+5% z^N0#VISY>V1fr^pI}*7C9DknlKVdAsUhfzCWhJy?)>nY*+?5Di4z#fO8hSqkqk%>P z3vK285?uA?ZGpPE96PSGmFxm}J8AL$+dcBzUFK}194&-sOGkzh-RAQGrO7c~IWXZXQWq7f*4a&}cC zk6ZDkEj_JXmGcF@GT&`>0CN2-eE5S(*2L*?I^Tk28r4 zeoN30`gOKE?Omml3f%S{4YVYc#jE2_6P!s2cSO00()I#&{ra0zK6mDg@{$^E zr%--%ynfldX-nOL|Lre>0sGkakP?xQpnU}d& z(xv9>?OOcbKR)tPJ|-P7G3?=W#OX-Q&`Ja}!nCeuP^JDERL#Z^h47%+V=>|%#QNLT zOhSztHWGvEdi8|SXUv6wv-+D>md+U-uZ6nR-} zf7_8=KkYpbq0)PMO5J*WWyCE10{gY*cf>z)Y*x8E&d9%9ZVB|ed*;)!ufkw)=%L~zzpB=wXXnWgrQmB@ly)#dFFs%DluEE=%(&L_B1`E>iw`8^=N zirgTWPq^q5%H6~p5+Kide}AsUO~RD;u_CSYs81PT=&=yK&1Czh294)Drd9Xx9nyYz z$dpIEKQFrHpZ{PviDTh&H3e`C{r1$B{nh3U8n#hEwP-Ia`UgG!O?1M^h@Mdwg(zk5 zKsL%%zi7N202SER`yS0e#&$nfje2x8*xr44-b(4XmA-n_eBk8`_8y^MJkmGjCWeo= z=L!gPoFwl0{X*|)^vN30_0kSUS8Xd^0*`?{G2(c{}slVFEe@vDokd||+Jo%<0`M_RYJLAWU zY>hN6yF@@|ym`pz_8v^VylZ*)*}b06aBw6cTz{uMc>Qp%p5(G}a^3M97O%SwW5aRB zOQn|Vo{H|Qo?zh{(Dbzo6BjGL+np}4F8z&mOY`Hh2;sb#IitsSrl7>F$GAqO|zL4~Nk2X16hXjZVUyM-lQz z3PtbN$!)Ys*`D9t+l{Kf%lHt8^E7 z*43mxseSp|a&H}8@qhn3mW&Oqh`udNcGvX4a2|MxLtgd{UQQBMJ~;f0@DG39u3zLsqD4-H=7cvydQ;0LKzfB*TT!p~UTAnUGqZZlZ}+5$ zjOQbW0B+9M9s@;;;(K31AU1vAynF&&Y&+?=m{Y2VA2YV`uKAyNjZ3rRH-j9sg zAPR`jN`Q(oBIwU>!N|8C=)+^|r-DVnl=BOjC|FnQTWVvwamDINZ_VYlLS#zq4T=#WFt^nZ9G(n9nbOb8-%DEq@rqvrxy*b?FGMZN zps6`qDP}nvwtV~hFYqtNf%$DFsHlEXx>&zUN zSr@*jB6WBas_22->gLxN>0YY z?VjFCOOEB>Y7#q3Cij zT%>1p+w-kZB4%Q!Is`YzK>Z*h|k{QXk41MAu6M<_AY5sVbNQ=1WB& z5QF)f;%RLKD}M+KN8KJMch#N)fZ(X#C;%46JQWg^@X+>MK0To7OyAJoKzSd4R?MKw z_0vFy!`=#k@6LC1o$ajb4PKFj z$H7QH?KE|Q^-4jDuL%%h$pb$veU2ZO>?&xY7YNb07T3<6Y??)p3Fua^9DTqt7`VGO zcmV_2)ZRcpDxeF+RM0@Zy`w86M_;l%Xc9RwM5m zZ(bGG%Ca0s7de`|bIgBiA@NEmO@v+x6V3HonaqXmdtx+6Q6Gw4iH1Qx(GA!%-aA?r z_Ei*Fga8R-!ybq?&aOdCntt*;nILU}+MSNLnq83};)1+L`+?T)yom#O$Xl z9r(Edw|w2duip_s@H~-oi*XyGi zuN}#Vo|=lkxF()`Hce#iT30O;lJ_QS?PHwWayMz-NQ?&#q-zn(4~lDDtuhS+rjZ7@ z?(|ZT*97E}nBqs9)6#>LpG^2ovdSB5hod*gw$@zXK3vL|#JDBX4dv3Xi=Lt{f-TOi zGOn+lP~p4trec-uv_{Zy+NX0SCC^98yO{?X5Bw4K3r+m(>P#U;M`Oeo_NEdK4L;N% zS~zLa^7y(^p~?iN%fD~MK8C~?e}VO$e_y2hYL{3oJy$<1&5fWKDZce)oj*{uzrJeL zh3l*9&(w^1S-z{#I+&vrW3VPTTkDv_AI+h~VO0^x`%HLBOhFWU2%YQ5JEmU8oN%S` zI#45>{gPYavGFzH+nMa}$09!O5_ROio8}yI=v3o=Xuz3hNyE_!L`rkBEvb8rz-a4Q zqOyZ28lc=pD4`1cz_zMDAtn z-JuZ_))>;~RvUVHqlsEUU zQm;@ag5puXkCyY?Uei;#`rVz?9?wfVmL$>P6XAFla6FoZi6swzI?Cj)tyM@2pY5M; zwLUlT^&)k}pI7d8mkSwY0!w!ZJlgu+yW`hC&DR-+jHEK|4T22j z^Q05IYC2(?XL>Xsbw#3&Ju28bdvY{)RgwQbc?Q4YvHi^-o{Elb=Ojq{hoiWy$;K_i zdToT!4kI8XroJ8`_v1;fS->6T1mcG3FW%{7)x$sc(u2@F;KtZf)hdb9PeMsYaytHk znY&_5${@>eAwGUUt*#2qta0K_ zEK!NShb-sD_|&_iw?mQ7%bTbH|x=sP(p4Cz2AtYb_1}vaNMZaW=%0JAObD z|GpL93-r$tgq#cpr8hrOD3Fy;3pZ}C6_eT55r-4k5%cg`(Y{I&F;bq$IVCpot}AI( z$V@FfAV*X&T?NOhSxACz-z82{!sBBTVRyWApP(wibn|Q5EF{3)KZ8MEWOHZbBpIJ$ zR}_b477uCuOYmv+WFdF%Mz&p65G5)6ep-MbYe8}Q{Z6E7ml+hGTRw1BbC#WUp}ftT zdX=Wjxh0IGR(@VnoW^0R(s}Ux=gYKK*YOhnxUiat+jk_>b-m^d|Aha&;iI8xx0Lmz zW=}B|CkpBNv0}&7shera!JYMd=C@S_d5!Gr5%-`*hJ-A;>{&A%|NR&u@$Qf;L&0+H zd=B9buTLZKbH(2Fof8ArXfnNblnM-Y`Q-D71s|vTL6T!G+4_jSoAbO#aC#~qxBh1j zH-ozbikh#R=(1@n2RP;?KC25E>v4Ux-PZA_KTb}tAYtFXF=zr+FtXQfbfM=+oWj37 zmd>wA{biG;;m^Tl)Jm#NTz==_leV`$Cqsp;jZ1Xw84)-ul8`f%RoU;)ku}{zJGT0h!&(jO8 zM5uo5VtsIb^?3|k#Z0Q0m}}RMs80?3>ijc1VWJT#xiLqo`MUb$tRi%zPg;lB(jA6( z{;JK5B9{)`m|~V8F=h84I@EEbr@^tFD@;jj@UFc_Mt$*v9%UMv+|7j9k)hHo<$F(> z6kE+*O51as+;bm1nO)1aIiH|H%SBr5^e2ZTrcX0O&cEz|iV9ia%(v%P`x2s#YW*H_ z5w+${v%3E?Mb5CMr&4PuhKqKV{BrPD#}+g3Y(5jKLNghe3YxdW;*n$8AM9vaavtz~ zTMPKzr&79h_dY34@fUQ+BgT74S`&AUbMU75c~vy)`|U5V*Q&kDp7+OmduLcUvB%G5N`1Ho} zy;Q;68LgpM#f-D8a?}qPgB8QL>Z(Z^m5Lvp6f7=LnLPVd?9Arz*y9|6X(zmkzG(Ia z6>(+xGY+1$mN9WJb*#OayLmT2rmJhc*3AC<&E+yBbjVWPS)`JJga-7X`yv_sJQ2>S zho_QL6IYyn#nmK{;p$}F$Ct`p+k?}Ag&u+xNs5ZEnKDLSAA3Q`dV(L{gNI(Zyr{dD z(mbtWY#O88_tbecxUTA8PdA@q$FPiryw-9+f^r=32e!}=O79b{T4vRCgHK%dP1;6y zgzr9px=z7EZHWuYdn0PBU$vQ1;`_) - .. dropdown:: Enhancements - * **Upgrade to using Python 3.10.4** (`#270 `_) - * Enhance the Release Notes by adding dropdown menus(`#292 `_) - * **Updated Analysis tools to handle TC-RMW functionality** (`#308 `_) - .. dropdown:: Internal - * Add 'License.txt' to the METcalcpy repo (`#279 `_) - * Update cloud python to 3.10(`#170 `_) - * Update cloud python to 3.8(`#169 `_) - * Changed Project to Cycle assignment in github(`#301 `_) - * Partial completion of logging for STIGS(`#46 `_) + * Change second person references to third (`#315 `_) + * Enhanced documentation for Difficulty index (`#332 `_) .. dropdown:: Bugfixes - * **Remaining reference to ARIMA in utils.py compute_std_err_from_median_variance_inflation_factor()** (`#254 `_) - * **Replace frame.append method to pandas.concat in agg_stat.py** (`#296 `_) - * **Fixed Ratio Derived curve not generating** (`#302 `_) - * **Fixed PSTD_ROC_AUC calculation** (`#306 `_) + * Add missing reliability statistics (`#330 `_) + +METcalcpy Version 3.0.0-beta1 release notes (20230915) +------------------------------------------------------ + + .. dropdown:: New Functionality + + .. dropdown:: Enhancements + + .. dropdown:: Internal + + .. dropdown:: Bugfixes + + * Remove reset_index from various calculations (`#322 `_) + METcalcpy Upgrade Instructions ============================== diff --git a/docs/index.rst b/docs/index.rst index de2a64eb..ab455bf2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,14 +1,14 @@ -########################### +=========================== METcalcpy version |version| -########################### +=========================== Developed by the `Developmental Testbed Center `_, Boulder, CO .. image:: _static/METplus_banner_photo_web.png -**History** - +History +------- The Model Evaluation Tools (MET) were developed by the Developmental Testbed Center (DTC) and released in January 2008. The goal of the tools was to @@ -37,7 +37,8 @@ diagnostics capability for NOAA's UFS and a component of NCAR's SIMA modeling frameworks. It is being actively developed by NCAR, ESRL, EMC and is open to community contributions. -**METplus Concept** +METplus Concept +--------------- METplus is the overarching, or umbrella, repository and hence framework for the Unified Forecast System verification capability. It is intended to be @@ -76,7 +77,8 @@ was developed because CESM is comprised of a number of different components that are developed and managed independently. Each component also may have additional "external" dependencies that need to be maintained independently. -**Acronyms** +Acronyms +-------- * **MET** - Model Evaluation Tools * **DTC** - Developmental Testbed Center @@ -93,7 +95,8 @@ additional "external" dependencies that need to be maintained independently. * **GSD** - Global Systems Division -**Authors** +Authors +------- Many authors, listed below in alphabetical order, have contributed to the documentation of METplus. To cite this documentation in publications, please refer to the METcalcpy User's Guide :ref:`Citation Instructions`. @@ -121,7 +124,8 @@ To cite this documentation in publications, please refer to the METcalcpy User's -**Indices** +Indices +======= * :ref:`genindex` * :ref:`modindex` diff --git a/docs/version b/docs/version index 8eef5147..bcaa9617 100644 --- a/docs/version +++ b/docs/version @@ -1 +1 @@ -__version__="2.1.0" +__version__="3.0.0-beta3" diff --git a/internal/scripts/installation/modulefiles/2.1.0_wcoss2 b/internal/scripts/installation/modulefiles/3.0.0_wcoss2 similarity index 83% rename from internal/scripts/installation/modulefiles/2.1.0_wcoss2 rename to internal/scripts/installation/modulefiles/3.0.0_wcoss2 index 73c909ba..1655a07b 100644 --- a/internal/scripts/installation/modulefiles/2.1.0_wcoss2 +++ b/internal/scripts/installation/modulefiles/3.0.0_wcoss2 @@ -3,7 +3,7 @@ ## METcalcpy ## proc ModulesHelp { } { - puts stderr "Sets up the paths and environment variables to use the METcalcpy-2.1.0. + puts stderr "Sets up the paths and environment variables to use the METcalcpy-3.0.0. *** For help see the official MET webpage at http://www.dtcenter.org/met/users ***" } @@ -12,4 +12,4 @@ module load intel module use /apps/dev/modulefiles/ module load ve/evs/2.0 -prepend-path PYTHONPATH /apps/sw_review/emc/METcalcpy/2.1.0 +prepend-path PYTHONPATH /apps/sw_review/emc/METcalcpy/3.0.0 diff --git a/metcalcpy/util/pstd_statistics.py b/metcalcpy/util/pstd_statistics.py index 8d9f96da..6a890d7a 100644 --- a/metcalcpy/util/pstd_statistics.py +++ b/metcalcpy/util/pstd_statistics.py @@ -41,16 +41,13 @@ def calculate_pstd_brier(input_data, columns_names): t_table = df_pct_perm['n_i'].sum() o_bar_table = df_pct_perm['oy_i'].sum() / t_table o_bar = input_data[0, get_column_index_by_name(columns_names, 'o_bar')] - - t_table.reset_index(inplace=True, drop=True) - reliability = calc_reliability(t_table, df_pct_perm) resolution = calc_resolution(t_table, df_pct_perm, o_bar) uncertainty = calc_uncertainty(o_bar_table) brier = reliability - resolution + uncertainty result = round_half_up(brier, PRECISION) - except (TypeError, ZeroDivisionError, Warning, ValueError): + except (TypeError, ZeroDivisionError, Warning, ValueError, AttributeError): result = None warnings.filterwarnings('ignore') return result @@ -75,8 +72,6 @@ def calculate_pstd_bss_smpl(input_data, columns_names): t_table = df_pct_perm['n_i'].sum() o_bar_table = df_pct_perm['oy_i'].sum() / t_table o_bar = input_data[0, get_column_index_by_name(columns_names, 'o_bar')] - - t_table.reset_index(inplace=True, drop=True) reliability = calc_reliability(t_table, df_pct_perm) resolution = calc_resolution(t_table, df_pct_perm, o_bar) uncertainty = calc_uncertainty(o_bar_table) @@ -161,7 +156,6 @@ def calculate_pstd_resolution(input_data, columns_names): df_pct_perm = _calc_common_stats(columns_names, input_data) o_bar = input_data[0, get_column_index_by_name(columns_names, 'o_bar')] t_table = df_pct_perm['n_i'].sum() - t_table.reset_index(inplace=True, drop=True) resolution = calc_resolution(t_table, df_pct_perm, o_bar) result = round_half_up(resolution, PRECISION) except (TypeError, ZeroDivisionError, Warning, ValueError): diff --git a/metcalcpy/util/sl1l2_statistics.py b/metcalcpy/util/sl1l2_statistics.py index 9324a0dd..12508b45 100644 --- a/metcalcpy/util/sl1l2_statistics.py +++ b/metcalcpy/util/sl1l2_statistics.py @@ -524,10 +524,13 @@ def calculate_bcmse(input_data, columns_names, aggregation=False): """ warnings.filterwarnings('error') try: + mse = calculate_mse(input_data, columns_names, aggregation) me = calculate_me(input_data, columns_names, aggregation) result = mse - me ** 2 result = round_half_up(result, PRECISION) + if result < 0: + return 0. except (TypeError, Warning): result = None warnings.filterwarnings('ignore') diff --git a/metcalcpy/util/utils.py b/metcalcpy/util/utils.py index c8b99616..5fb9b7c1 100644 --- a/metcalcpy/util/utils.py +++ b/metcalcpy/util/utils.py @@ -691,7 +691,14 @@ def equalize_axis_data(fix_vals_keys, fix_vals_permuted, params, input_data, axi for fcst_var, fcst_var_stats in fcst_var_val.items(): series_data_for_ee = pd.DataFrame() - for fcst_var_stat in fcst_var_stats: + fcst_var_stats_current = fcst_var_stats + # if the data comes from agg_stat workflow it doesn't contain statistics values. + # They will be calculated later. In this case The code should not loop over all + # requested statistics but instead should do it only ones to avoid data multiplication + if 'stat_name' not in input_data.keys(): + fcst_var_stats_current = [fcst_var_stats[0]] + + for fcst_var_stat in fcst_var_stats_current: # for each series for the specified axis if len(params['series_val_' + axis]) == 0: series_data_for_ee = input_data diff --git a/test/test_sl1l2.py b/test/test_sl1l2.py new file mode 100644 index 00000000..2cbce584 --- /dev/null +++ b/test/test_sl1l2.py @@ -0,0 +1,22 @@ +import numpy as np +import pytest + +from metcalcpy.util import sl1l2_statistics as sl1l2 + +def test_calculate_bcmse(): + # Test that negative BCMSE values are no longer returned. + input_data_list = [] + + # These data produce negative BCMSE values. Test that the modified code no longer returns negative values + # for the BCMSE. + input_data_list.append(np.array([[4.37978400e+01, 4.70115800e+01, 1.91825108e+03, 2.21008843e+03, 2.05900571e+03, 1.00000000e+00]])) + input_data_list.append(np.array([[8.66233900e+01, 4.83037900e+01, 7.50361146e+03, 2.33325660e+03, 4.18423840e+03, 1.00000000e+00]])) + input_data_list.append(np.array([[3.68089000e+01, 1.64253370e+02, 1.35489535e+03, 2.69791703e+04, 6.04598647e+03, 1.00000000e+00]])) + columns_names = np.array(['fbar', 'obar', 'ffbar', 'oobar', 'fobar', 'total'], dtype='= 0. + + +