From 0d0617bffb29269aeb2a855876629890f62381f0 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Mon, 27 Mar 2023 02:28:04 +0300 Subject: [PATCH] add NET8 blog post --- .../2023-03-27-What-is-new-in-NET8/cover.jpg | Bin 0 -> 49406 bytes .../2023-03-27-What-is-new-in-NET8/post.md | 218 ++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/cover.jpg create mode 100644 docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md diff --git a/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/cover.jpg b/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa0f3694d4f4ce799c5fc64d93d6a987e93e5c9a GIT binary patch literal 49406 zcmdpeWmp``w&)-MlHl$HcY;IEB)A6~EVw%a_XKx>I|Lbg2=1;S1lPeW!QCN{*JST~ z?z#8A_r7nRf9I^}Z@O!`Yt{0#s;c4F?5`CNrmUolBnS=;1cC!TpkMQ#KoH_T014?4 z5)ukB04S)B9{?2x6&)2gaIkPOF)(ql$O-W92*|0(NXV#|Xla?aIl0Bf-@^T)KjOcJ z;8zz23kA*y;THlN6$l;+4gm}9R}Y8`AP^qz5kTcX01h4j@evX-%Hv;iAe09tK%j$9 zAd^GEzn*|kDcN02qQVRf;hSD2D`J@wN zLnwsWYM>D%lS1~;-EA1T*^N98olL!{24r?1-0?>T_zZ$_&%^LNPn1OuC8LWNkN$?HqHuL3+dT+*eVy8L~s$W?A(Gd+<&e*owSN zT(Yyfk`!iTiU6~UG*GSxI+`kubRqu~z(B=*TSF=7SX5%@w6 z2&OCf4#_WbDKP_I5qS*jP+KiF^*iroS@$(#MAwtEe&t7|UGkXr{S4RSDtYqup$h6NdfrzbUBASE+pQqP>KN;WZ@+AG&^=yG3j^1V03qH*6E%a5S6@PXnHSZOq zi$`K{fl$S2_edDkK&+)R(%UQeXkMdG`q~zyx)fZ_%n#>9p6cPv3eoEnFE;X?eSiN) zZ#Z(@Z8H3HbOA6haBXNwEg+&P??u=$(?@ZX4Z-v89oLd%nQgYW!&AL4%w~j=9p82Q z(G$L*P84geNuKa{y0#3=tQi^#bR93yU7nq*d5uY#o%*BVqXjSeTbaR^e{|^Ael@OV zF<&!Vxn2gY)GQN!T?@6;23Pwi<$Jw;7KkZDvsCqX{t}L(*7gM-Da>O=^ICN7XC^uA zp6>1^Bc=;CJ&)a`X>``_OVxu5B9JNP_S6gCujg5}n|d(^&t=@D6!xPjzXz)Cur2h< z+K{@XTa9h#m5(`%h&fWQIEgB|pL(7%nrC|?n}%(V2%Rb^JE4UPEsAB=+yS-#M;vXO z)=faPU^RCHbwa_MTdu99g1Yl z8IHA-R=V9UZ2MFf-!N|-_y+Em`<%K(AKv$3A!5G3KaHg}pTA~%N!lIb{pGTJzC&2| zq@*$d}Gnh^L(P%=g8yx8ks-!&+I?l#M_?z0?D5Bk4Gb~ib7iA z@{kE&(_byU6KgF6?PnLAHZ$WFDFhmkTYdeGG)u~dFJp$6h~BmTjUILV)CxKuvY}|jz3Qox!a9lxt-IEfS%IFwH0c{WWnw~gkFyg z3eT>#^9nb2cqYg1-8F9f0zpVIx_o~ulPI*ks$lp4+w zJJct3L|JR*mNLKX-!w;q`j{>(c^y2t;!MldK5?dmNAO;LhfT~{ulu>-N8)wiHhOqr zdCQ}-i2R>%A_*tIK%CdiJ1(Ku-9vYy%%}P_trfE(Mz>sHF7zJP^vfcTZj?H_S%kmO zYm1;iIrVKlv73kNkC=GhUTQ?%jhyCvyq$HQ&sBykom|7Zt@UQk4=$CMJm%>Nr@Z?x zKY;34r>bG3Ha)z=+1o`s4Fe-$Syn-rfki{sJX`yO+MnG(25bIunq-9{YMX zx9Z2+`XGRLANu)h!TXO#_D}B~FV9aG+OK}-cGH{M{Y+=uq_=n>HDvGM98=upbVA{E z{TIk~{9?1p*Xl;6w(%Ee*!R_8Om+sAnxNp4pFo3)m)z14@=lcf z#4^)$gz|3r%h!mM4DWRNX##_|!Fz5Wf1bm1yT7x^oVg7yDeZ4p&$iNUu&t&Gdo=$% zTK8%H!jIhIJ~N_dJ#r&hE4;d~RB(g4yPV}Gb;TF#WvuaB#?>x9#sZmgW}lqt{6b0S zmi|Yf;AO-nALV5~*fy37VbXDq{PcRNo7(Y45VAe|Wiwk;U{_=B=N2Z4c%QFw*2eo} zLFYp$S9`(Je%`Z9`Lh(y&w`wn_@HEj$t^y=?BEc3~RZZ(t6=m zCXRxFxyZLrg%~0VgfO^*59&tDnn6@R5}~TZ(&u+R2tj%x!Hk8438rG!?hzNCfBx?B z8y5RZ%-~<3#sz8gu7_T_FR*|dP!kF@ssTbfmegAhKf8&Qepv}apb!Y}wZtr$8QIaZ zejJFB^6Jqwe)$R=StQU8zR6h}Tmz*_gj!?C0^v1$2IJ#Zc{~y^I2JQB$O>w$rdFq? zyleRk^8+Gr^sBU&WJy3T1cfKPmf90!jN0Rsco3sXpj%PPUHx{YF@%az4NO%j9sX$` zeM~q1*-L*!_HCD+*$gjTLkYtQ96)gX;nN9FMr|V~$8@D^uMxBMH21ygnt-qflL}Kf zkXI`4!aHp;2B(sriFYAB;{R^n`fmQCzn}@KmIM{82k4RW&UgZZQFa}|@sPxToKO>f zw9IasW<$8G32z=r#Q8K@BzGuG41Gf^8vOf2?S{S8TZ%Gs=!iuy^+c%cWQ z9Htm835lU4HwZ;pDT8{gW<#q?xl!=2Y zwWllU^4glSK=1~nZb5dW$Oiox!q;!p|$o*4IoEz{Vy)3T#WEoSa02hQDIl~SnE29Njy4* z)ZZ7@fg%?vD-q)OKwfvq1LGn1sQeE|ljZWqEY8w&+0v0v1w~0=+=Nxum&3}fn^RWj zo*CEgOa{|M@_20;pL@+sCxil8=UDB8jBfGn*SFpjhIYUWG%M9!Vghnt0@nal*h3-a zxL&~GUUTD3$ZlCPXG82G0-)x19IxgZNayvDEL1HTjHlE2KA21=H#hyH2V7Gi_V^iTtSYsAzVrjou`1l%AoQjGH3q>3Y5sOBehFk~)Le9S~0^vPL z3@v+2iK+c0tQhnjzUY+-3JCNuRTP-?kOH$BV9xX3Cp`~y9t4!%a~^n1z+AUp8dSan z&T!SYG+kF={su766o4DRUN^+Z!ZGnUyns=$57o5=_=$*RT5KK;Ui_A+ zUh)e$aeoTXz2dO>(f5(|!mNdkSt0n zsTq2pVaF30T@)j_15yIPm$zp%U0j@kLDGf%GNpSu7|+ye8Cg-#uX&x)QL1nbVFRS`5rE9Zgul} zo{IFP4t3_0PTHRMQR6RSG$%^FY-ed_HTG}{_M7drd}g*BZ&Z@};&IXz)NrI24?RC% zl%Y?;k1Gn*yeO+{EpcH%Cf)zZIto40a9bs_C#un!Hz}TKZ2wlr`gx}u`t=>S^?8IX znG$QSz=d3>;Z4?ZA1e*vASFYjpJijycQ1XOx`PbXCi83K)+4*IlDE4$!(y>>>urW7 zS^GM&h#lb0I`sL2dnoX_55Fr0vwkK_mkR(qr?0(}((6>pANsO-YJdFg^1{k{5aP2}D4aS6tA37KU8nm-R;j7-#(OV?pWEB{ zkh@-h-+-QdKnZ+ZmbqYT6PMsGjTyS|(!+4?Jz(z7XyD-C&|2UkdftOxJ$n!MgWY>1 z4ebtAkc$rkN}UtBm8&QK!AVnjo+Su@ZcFs@Xvs65N9lJkN@L0NWU9j#WxdV z>8MO`{U4eF!u;bC(}CZD!96l>*DYU)1HWOs+Ng82BR(3qjTX}6@QczSAVW!GO)&{cZ# zJqQyM*=gH#J;+^MmwR{D^2FmM%4gPHnIFKNX9%;mGTl!~3o?Cd70oG#5Oa%6o4p%9 zfe=wZp4p~}>Z%gNbKb*d&*GSA>a7keKyZlgD11K8<(}}IJHMFgiJ6N zuBm?2&dU|+vK1^^cKvSkpmja|UdJO>HRNAK8bdBZCp+=<=@UAqAHL2qUz(yHzwyzP zPDGw|F6R6N8Z=Xt`qxpHtyu;=fMznxj}9kZ1~#GTRioDKn}m|Esdt0SNvL z=sy&mue3|XPc$RxOR1WEwj@AJ%j|wPR<5nkHQcIDxKS8869$6d39 z|Jf2v)XQw1^zYhJQLn=xn$=Otj~8PK;YNLxW!A)fmHBgzu5AwU7%CDI-=Xi$XZHr4 z9SYlSw(e>q(iJbqoanfA{7oT>&=J^eg3I|gr8pU;`ExasXw}u#b)9yk_jjwlEVc;7 z{KVDT&OdaROjVldRI7)kV&>*$ayH(1rmU+jcH@NaF<;YgGr#3P5nJN_09 z44DXwsP6Gy-MMsx5tobi(v42d&jZIGOpq>-q-koOMDn9>+C4<6Wp*Cy;;J?W^(_A? zj*;1zZq6HjHDNKCuJ(5acTlt2?J}8N52p=NH&WMSy3iYhj9=)!i$DbjZ7US}o`r3- zYa6|FzCbT8(b?sN%GK`RS>ZL?!)l&>2q55-AH=q2yfn0%C@ZoI_?xD5Gv8ddlg`V( z_M2iwKyK6{!}7q!&*uJ1N$EkI{V_R>%--A|;n)7SNH`rV&n z9(>J|*!!{;rtWoG?%bqbwe8%b3-C3c0!~!UQy0~897xHQlo1a{#uw*PojX^#EgA}2 zbX7N8NCn^B^r|uqI8)fw1aDdGpw7ZO7>OLPQ zlhZ9Lx!gR-ZwylQjh*xzg3&acgCQ!$Z!E5S_e3x2Mk0Y2t4GpWm7H~@n|0;2dg#{L zb}_43-?nAj%Fh0v)Jyf=cP=RFF4}feIg=!4%xIm9bLD5Ui_AJjB(6oGUiM1fygH6_ z)sAhKcupkYWr@?Q4Fn(YvY1P+kYR@*X>?H+l&b_5~ zsF}YJ*z>Dg>c6Gj^F5j)QK}oP%<8?x+ta8_AFLlNW$MVafwvXbFuFuGSAD}at>$M| zy%I&R6-UdFu5mcx5f|I++CWk-H9huH$lHc3?2b#dDb;4E%6a5CdHs2xHShF}RK?ET4%-?}BRTtJrt+6nN9C6Uhc0hBKk9 zrtL#KGTX}l8vQ5|eZy5lL$$XhgGtlrL4j)$>fd@}bSPmHo~@$hx4Lt4K~rv?_piN! zt{*qm_rdJ?zjzsYxM(el#*$PvE@<&iO}LEgX!kD6uznUm75F49apQC~o{@X8+2Sml zscYuCnf+Jfey=*x|CpD2NSR8zY`{6xcvF9v{S)UAq+|LTnDc)Mm+t(er zUqKD;#MN!Jah}j2znONe8@g0Eam{+N?)%A#7mq~8bI>nsXV41DUQtm|_|-#IeUigu zV`FA#*eJ?KH)ed-`oQ)i&*sv)Sx0sL-Tf`kyn`28+HgEyF=G>~xM@j>eMe=S)OTo8 zE=pu4u|)WF$&%l!_gAOB#TR0eEH}mx1!y)t%*A22VFS&2`(Cw5ukPgd%!>#y$VHfZ zPXu7H(g4*x-7ar!9tpYMb>{9Cn(pW+PP}SQ@ab%{P-C^-Wxcm9HFj#9xzr2)1$z1< zf4wi$D9wzS-tH#T}gQ*;rN-JUcJu9x%eb{pd= znUmFKo(~$I&Tcu|&ncmXTknU8x@g%T#I9dr)GMB~K{oce3C<&=x0_wktvW5+6>2SK zmzHmRhr`QCr%Fb3hT*~A{$!peD&glwG&rhe0xwu(ddD)T8+B=dDsGM7V1uTW&P49^C_2%2tZ?i-d7Ax-eknI}J=^pkSa59>)O-i@Yj%l;y z{f*b|VSU>La~4ELHfCAL$LHd5*)D6LE@<71$3<#cW>I{mUT-S1@z#4En$vKO{%KhR zw%^{h16G_63khk0x)|~-2hSO|EM0qT9%fA}5ZV<-TV~5z%gf#|PV%CK`Pkm~TRLCr zsOs#y?OF+fUA<;w4DW&$=eZuF%jz^lTxvIS;3a9Vi0=ziNN=k57KlZV5nZ(xdD|0_ z=>%-Lm3wSvVo)?U>mR3Exf(lPoUXGi?(yF(%`Hc^6ZvxfG`$)$o4akS)Bm$^oYYez zrD1dP3ncG!SANM9hRH`>u&=L?yLZ1t~evVqJu=+xJ`Dt50LE+vih&07UDf;IYn zfueqaNJaR6I?gkbplPi!qikDCCCm1J!-u~c8Y~km-q!QUo`cp*aCBUdPq3Tr`^tX? zU89|lZ18>YnQn7#n!k!2bns)Bo29-p+e0EVQOUK_MZ*Wk(gq9C%rDR5d-|l;6_rJSp&j<%!ZY?KgX2>dh>V--p!yYXBhOuL0egYQP)A3+0y>%-+g_PeR7?D1Impk(O*vq!8R3aHJCk{07`}d8)BJQadgUJHo{gK? z8b$w~3PJ>!W@^d~XfgAc2bWF7RfAL9!zZw`jhN-%zLl2;4s|Q2+w1wvhmp40eLXf4 z)yH?UJPy)6@OCZ#B-kIBbGCd+?;wBfv~%v+s`pu=bn=giBBeuHbt;_if7NMMvw%*R zY0Uu6s=B~d16r%4Jmvsb08fAvd%+DQ69hy<0$Vxq!3-L5kb_nrK5W)A0b9Ng?2Xhz z2KPsoq+A@ zyX3c?$@>UAwPZDBw4{*DT2Y;9AIYBIK_I1xGl*KA`FcLei?i zR^xP504-~4%<}RQ05M?^;ZVS|sA}3-UQ|fNTCpEC~=eUn}CK^uQ4=ATbLD!RJ5{+Sd< zERP|XsnD^nklg|DY25(;CCax$6qhR_-8u)K^z4~ zFg`Y*ng`*S;sDB-0_5{RQK_jFw6b!lsUCcF|L9{CzDAI#d-)(dR3<`MywbB(jw06h z{01-qmEN6ms)_B3AVxN|hPbxGn$iTRtxIO=p$+K=0}(n&bJ*Uu%&c0PPZkf(h~jYk z1Jv{ToYLf@U;MUH--p`Z|01qa!Uu;jDl;-FOZ-EFrTnl`9t$X5Ngep>qE1;*T-91q z)%2qvW#^Jg7Ih{UKfA(?YJB_n>B^gFQSEP95qtw1_H3DEJPFaUJEF1)Jp5J_Q#qw# z8o{5@w3sR;SBvtl^u$D*wmv(ze9EL6jg{)@>3x8n2Y9#$3kb)2ppJqSs2BckMD8kv zX9fiRHgKk1%~CvLoQK1tOg%wfJwrY*LxIW~M>Ab~iIGD#`mIBMQ4;@pCQj(0TI!@t z$l15Z7|~4gvh(as4cr|xX4~SLz#!WE{Etz}p&Jk+S>#i{K|kuB`bWP&owvTtUi;&= z6JA)gkBNXt@;kh*89l&Ssg29Ws&(b{9d+d9j7yidc8G%|OeY$qi>!y!UPXh>mWh@B zi*^b;QRGJey+&nt{uN-RKDsBJnykW>yGmh!@>GU+B23w;mPe|qg<^`b z&fFV?v@aM3lw^I89snI3A0MBbj*YWki$gAqI+dh2=Eo#mOS(vP z$`Nq!M0Y}Rk=SPSe^CE}y{oem{9D{cW$OMF9on7~{j4u62Nkr9#-|hU=$PcyLW_=- zb91G{!-MdUm=M7~!Drw-@CJARJU%aH1Finqe@gLF8_-UZ$b{4;J83mI`) zCS{fI1hqUdNm&6El{f~?$^a>hj!wX7hqRg1ZL08PzlIaW@q`%#Gh%UvCCKL*)Qn~Q zgWkU`P&0IzQ~ITW`Otq+{@`l(_~__QD#3uL4Vd9}mB?$3yF<`PYgQxVv{lBzaWz4C zP&^B3F>UNo@cX)(`9XU>!Jmhx*~5M>fK#zOZ5tfJ%dSUHh!{G1p5Sx)B0Z_>>IPc@ zlmR&&ucQ`S0@GnuH!A~YaT`tGr{Zx~TFYv`$$9PlUlRR`Lh>g(Mw2a4|Lk?gsz<;y z#^C|*!Yexf2@?`N=|+arGys4Z704;k#M}m*0Z31QP0h{#$tYrehvO?kLPCCiex`op zr;jyPR!aYj^-q<6M=OnbBM57N?C^xbGOHAa#mRFjx{ZEmf z0&j340Dz1DTs-=d2vky3Qc~1Efb=)~*?2fTGW_u2eHmUb5KcnSh}kX1@+2bxQXdGw zWsr`g5)XT@seee|zb+nyd3JpHXI({S1_cHD7ku~)K-<5};TQ;DmA`@A!GZn119A*G zzxyhnQey6h!J{5d0g}JPW&9`tpGE(=?!x?C0qOuSZLP=_I(hL z;E@ne9;2Z@`n`4f@R}%=S^nxHQzUF0N{&3-SL(=^cvQ-UCXUaj+0{P8#wSeR({a9h zEheE7ms43aPD4wtYV^*@*~LGwx@(L}Jh!G3g&V99@W%Mh<#_~A(4{G_%|Q4QCX1R+ z5yN@!S;f1h*4|vsCYK!0?lgyamaplRHvDHc0_mgSz$jM+Z+?NWIb~zx)B>|;rqXmT z1Zg0|X*ai5$5%cRc6+^rdSw{Xx@U1whD;3kYkC9m;;}pn;*P9Gk6&Xa_=GuJ*y6&N zX|LKd+NM>1uxt&n@aD(!hD+9!$p~JB`IgB|xnZB{_Oxm^K38A(Pis&LCgzl`X&@C3wS*%)2s8q3VGc2 zDv|c*e&2)^zw^;x5#gfRz;Z|p-dxDoe1nzKNNup!$&Uxs@T5xhiPk19Lqy2Q?HLvZ zMCPkM9CM(gZry4Ahgu~8DSR2t*T)@(_Y8l@bbv`xMg@B}M3_g2Cbd@}uq_sfptse% z=!#*JVBRpIb|^mUjGNWx)c~e?YDDB#^wKaadyU6qkpJS znY50c(W8kA6cuf@U4-#OpR(Rp9Xet?yE-_VDm5E>m6~+7qvb+$EgUh&>w~wD)+aEg zOh>LrX=N6~tynTdVcwWdL=x4A+j!jrW(4l-hXTy+p3vSm9$-w|5Cm z154(jR&W}1rX#rf+Be4IW_RKc#(V2`Gz^o5xCL>|ysGAp#lo+<`$4XMyl1&6D;1!N zS;U4p#Z5|OzPZG{xyRGS)SDXy3oA=5d!uaS*Z#<dYaVXvjiLx+59ofZxS!;IYaO zodZK)3-);aPjZ7KW&YIE+iDw$%Y2-idV|AOnHd_aqAOha|FkFs@PjGy5D|X+$^X{& zYb7kJA+}qxSX!h^AD^G@w>2tLAF?rsgtwAC&P(IM0I}u}NiZ&0DQSrdH#c$`-I&5WSh8-!os_-46_sTy~oOEZ$+MntNTNL~q{|Nh3%f4hnO zLLn-La$yD15jk1l*$-;bm#Yk_?H%YWE&0@&)9vpqjjKTY)X}Z~*zK)?X7sbp2r;Xp z{8TLWg50SX!VbphnA+})+N6`Ku{`r$Eb;N)Y{b;-tCabb6uQXO{_>Nn(Rm>v2N~kX zFENu6IH(Jmx{E{vp#y1e^x?!>YfNg{wbi`7#Dt0SaTm=?B6kVB#(eWyIwGc-$J1tD z(I3rLn;|YCSu2H)fQ|+4!#-F7uV$Mj)06_|!{dL~EWe8SWwHen+H&YdjPs#Jm7q?3 z8paVp@0Q3b8ihqg$mtRvWKmdbk0E!b7DeO9wYB5wtP~r-fA1QclYfXcXB-nmp3lQg zaK}zqtvkd)5AmEU>fVWF^0M)*Eix+eTQ#z`0qQZB z433g4pVWp2N!5p+Hc<$Vv>=4TVXWDSd8K1z?Ucr^oTDs^L!jY$c%2d5ofZ0=h{m)J z+3`;c{g^;02Y!l}ANlP@Nf`|&3wc~zCLv;xRE{CdHsq-+SCYs(qQ)`qrXdpHi(dvT zsgAX}Kg5l|Jp73%<>#Iy1jRyRl*J=s9AiT?kWgHl43gyI%uEulQ1i5A6Ukm?eHTsYiX;3b&KU-l` zMPDa5V8zob^SUX{jFcTID!od3o=-nqfdGC=>SJj0mYa?`7uS?_ZLMdh!=+miYLn9s z+=4-?Y-?&8`EzU^-)iiC$F#iK{lrygi8`p#)xbYIY3eL4_Jd&DtN|ewk7Y-Cy-jO| z_rQV~M~kWT_UC=vZ{O~U=}W$}H@%XYM!o60{qS*ImrPrTB8;2&vFKg1@f-)|iB&en zdyCzJfqCg8k>G_D$)nz?$&QiXw<@HS^kzy8zT~~%VL1|Lnr+ylxu-;gf28;QkXjx? zFC49S?$7p61W~>@5;w3M*KugA`Yzl33XFxg*k7ffCx9EffvDSAlIf~2&(EYaHRDY+ zs|xjsCDjEwzgSlWj6-Ll>j|?Q7nQ6~r6_}2AE{=$Aoh4rPZSda5kterox_wL1qsY2~^G?24I)(9TYi3>68 zK0VxJOfMaE@pDx|N^+BAcqB95?vVrc>Bv^v-6uXOPiU-7@*?PhHnb(9EyW}WjqmY8 zNR=IE;<6N2NSMC_F@MPZ*e9ccIaJzQ`N9TQhNpDiH8y(fR!lul63Nd*d*D2|(x*G6 zN;QwBGbc?U=Wt3S_r1l@R%bI<)@00*S_StFCr1N5R$yzJB-&$v$o72j8d58Tr>bj- z*>zYhvz2LCO_g#V#nPHFdS@mXsZ2E;>S(4ojzpY-J_QcDq_`;p^$D_*U7?Y?iS4*D zuXxoA)wx@`$TszE2}y+{{y`AUWCMQHptFqBchPT{GBZ5*pOXZezY(#f^FmW|Z1GBl zn3S=~euh!6FFCtRZ7Z>8?mEn|#8X6Ke@RHh%D;?FMxZ7XD>Zhr`}r-c4=FDEldq3v z2X<%_on$;~pWY7$LtGq}at2C7ScnaJ~abU1JVfUxQ5Fbp*GZ}_ zt};bq&}J}_LrDC4haT+v%LvNvr?~dG&DG*6f&CwPS~6uYZn*LYeaZ7wD*2!$RZ=)6 zi4@xmK^E)YWYv6AHGN4FHZYDb{CfD){*VlTmX#3Y!^?R9g9ASRWja!;NPZ!v&zyPA+CqIasM3aVhsEM}z?vY3$t@dbo}-d)^g4EzT|rDfAqEgj_QSKcAD@0gQ1#+LpxzZnfvfL zZbK(M=J!y>>q{cDlgrThaNSfYMl(Hy4adbvF}$%wyzUJA+G-Cki*Y8drQU2ZeU1S0 z;ATO7M*sO5Et2j*&3=uT+T#!Kt}Z~n>Sal#%+lz`>O9r|xp-u4v}m4dF8`tb4;(HvPcQ0U}i8yUBiRVKZ$<96Av^J7Y_ zYT}W_i!RW=D5t&At6uwL=IuKX;&Cgf_n3os_^GI^f%z|xicmPZdv!eOtIkSpgDDQ` z-RF!H9|!l*O6zj6F3d3kN?~VrLcL2dd%9X_I6pY4%t(w=y>rovGm;=`|z2H5zzKx2%2_%L{LX8=c)(NX8nmBk` zZ8;!ya*}~oRIgPh6RyWO%vRhuCFU##?PwRy%^Zr}%wI%g7WDqRSM} z=6Pwc6D%2MK1#vmqdIP8=pewdWlW2#wBzxWsi<$CzhQX{t4iahI~*F(Dph(OOJhbs zMow`oueGeaZOzR^`|?{}s}+NXn2i#WucLu!t%d(&SQlL)cFs|UWwMw{$D%`?iz*c? zeSFkJ-2XIdzb0&vvxGk<_OqbGRPB!F_Tvz$ ze(lGBEah%fql;)dZLh4+XZG*80{KkRPjy4DzB!n!jF{J>^Km+_B@b(E){3~eGS{Pg z_wcx_LBkMsE;%IaKF=lf5@9pyi-8rTOt|afs~4*}-$tD9&RJTP-pI-@(qjv6m>%>= zHHXrNxY`=Gd_~@U?f}N~uh+pZ2np_!PbDHh;c?_V$Mn|2UTJx`c2dB|lbV3xdlHjH z{sWf8a{sgT8I1Qewm&t0QZW{(BtwgO>A1#iCQu&E5!nSkb@)$OLR$?$*%~I_QrvfA zJQ|<3+>}L>@29A9i$M{%dUWpS;VQ1lFyaX#(13~@mW6I2z1@E`E|!>6?c{0=%BjP&(FQ6nJGLTHdS(T z(mcib12W>A{Tb621OBsd#OYkL8E&yyJ&~;nk-?6;ft}A_nMNHZ2*^5o{ z(L;42H#x94J)m1xoLf1oDV&{)EicgPf?52=)9%)DTCAO6ps`<+(sH)8CG`~Dy7-NfCb$9#SjcHa_AuS!-d zuP_#);>Ed@a8n88#3^$z-i6cd$&pT&UmUWlq6#G>S%_enc?Mmt86&c|5pO+5)1%NX zn&YuB#kZ7qgFK-OYumI(m8U;J^CdBxGb#J9LHgbn7@n}`C zEu#hbGF&kzAG;myaP`R7*W25$n`Cw}Fyr~{MZs%m?6w$=PDWPSgr#cG!c#TnspsFs z$aRo~kTJKS8?1D8Nz@nx_NO*jkGYV_7>8EFsRo9Mv12Etm8~L~2_^4fxP$Nf+E|_Vq3coNzO{e}3mLG^?Av~s ztB6q*2Uh9iV2+oBIX0-5g`PfAdn#x5Cl~wSJZ@$u)v9JDDLvoT9QZ#vc4jtl#q&#f zPUnSBe`bn&VHh(Ta9dZ`Jf3S(^onH7B%33po2-(@h{E)Q zNB&K<45wBuQVvAGHqscSPi5eEY;5caEQiq$DT<(BP0xrU#^N=%V*$#}z#yb}n^h*C zoae&xBeC00ujHXn%gr{@HXAV|;j`^ilPKZK-OocGxo?-t+j(Dl_1B0>9lPz(WRdG- zVosH+)zgVXn6IfxN0U*}HW6LSHtLguLoI7K-D$B^u?nN~2su@EYw*Vy`30%Vdfvp} zWJgNZpH==(zqR-g#D66vo$+RGKqoa1LOjQ#5u2vk(tSEFQ8fnq8LWfhAuRn00xv*cy}V0#Bi@$jt?f&|Dc2 zmujvz?|MlWk5L6t%#OAe5$hCEMRqAIMUbShO3NSyB<)Z%!qEb#LlPmCzGHrJbT5W1 ztTG0zB;s5$b4>wU==Ouqi+W{XEZp!~!DW*BF8q8fe}v9&P>v_LCqJdUw!~Gtt3HHa%I%^0N3;h|WFx}W;+GOJ0Vm@QcujuhlZDb5pGyvF zDK63OY;iRUMH9Ri9{kb60p;j-l&2;)=slKkqEA8`M&*%tO7r~u3vB>ijrE5(8AdLi z^rbaotHO{VL2hR;1dD33Ai>x)WwIXbvn$~yf?^ouI^mcuS+Cxak=@Z{a8nD9g~Eji zq}C*nD9$sOF_)NXf}o2ObL%W53H5w>G(7>|_f?@^f1~$oaF*99KmzyavZ5caG+>AV zKVb+;tv9=;Ca4OK{ z$5yuRIKr0>T3j|RNkS_Q&5ikHj?F%F4omMAA_XE67kvQh_lCMQMe(yDKxG6^r zcgWYCQRXIk88I`QB$(~$H8PxrzS){_dRh>GF#1#HiBreo^gz6u1doNBMM1FDOvoY{ z?)W}|b=bOMRGJXvx)fW5g!NHTLjD!zfzKg*dnOBjEPe9&E3NBziM5 z;~c;#$<6n;i@btfvMjAdxHw%*$FwF~25a}wc+UBz-kUK^tGSZ~?QT7s)X3&g2*7CVc6B@?>T zB%?`ky=3X`Qb^QPs?OBvd4#_}#4+^QZFWr(W2h@3eaz-}8~BZ0jX*jXZE(;i>SPH0 zvL@9IRErnSo`&7VK|77GELMPJ}4cn)eHg>y@o zt>)df(p%+1!YL-+$F40Saovqr!RO2+t3^a)MN=#LWW9skWqLM$P@Bwg1?7`e-nrWo zj{`Rd$`NnB@`Qc4!ue{27SHP4(q*7v##XoUDv7%w39D~xDOud)NJz(@(|8o+JEd;N z!)=4Cnsn(b8Fsqa^!e8eeZ)g*hPJwAjYmfZ2|+c^CfT;I4p`izUpX(jC!H_GR;A7P z2Fouj&y1Vs+bZlcYHm0dah5gthP8bN z4?+&hNH&>o*l+XZp8KyfM57KhPo!57@mLJ(ps2)eL?U&gjAbt!L=p5Y`_4)AP&AYA zNzKRJbTPcTQ|foL-!}S3T^owkFSWY4ZHzj`f`QrZ_!c*{xtWtk4ALv7bs&qgsT?UM zR~eF_kNp<6n$x70&McUv>0{_QX5U#Jrg_i`zms`C@uy^{+mIJqA!t!qSz zDEi4U(axSrl2*9&OmG-77qIEtzk)fqy|=r zR)>>k0g^++yf$NU7PZ9FwWMkghBY%YZ~4At%XJKt7wlr?L{NB7_XP#Yev>Tb_v5aL zJ9-q6%`JR1{bo~HJ#C!YeXM!z>BAUNjodCi21TrCzd#(ZN8H)UABC~T&B6ASmVu(I zEaWgovp||j2RVI?Pu4V10-`;+QsW1_&*$iLpXT+(AM6*53yxA$hD;OM5$_d-)b*JR z#Zi{!$q+|lonk7IE#gQGmGDMpfyc%yrYC3SpAFDbY<5s1j`tc}IhHTit!*<0rSXusAuz7QN$XXNqBMl!&chPF_^hJgdVWPJ2n#fS?ay>OT7>GNHa-kLBY!at3{{6a?SToYlOu#GD zQAp8^61&rJ+O6SPYrv&}xAyR?Zvvp>5)-vZ1Q-o(TD7}s> ztSzq5F|3*lS5jtq^1fI z*Rd=vs`Z+jB+yFcskvD(iouOS$t(kn6fySG8ISXP%$>QoU&+Y$jE{4RRyoGR8J^`y z)_f*)>>y?TsSrOnJ)vw1tD-ZlepSPtrp<6g-Gh;r0+EB-mZ3AX9KL7yk-TqL`AuYl)x6;DIqK2c$pKt zysO=3SviIbC6jit4DXu)-S381b;LJPXc65!*+nt#(Z4`$Gv<}bS6^0lE|KYCwt9Hf zYiO;DIl|S-^9TdV={jMH^IB=2QW)yFRa!!RpvdGfYpc{cFdTE9c!l-k05SEc_m~f* zlO%GrY9I00026(tF|`gYfyeXAVTV9`ym7Pu^E$KEwnF@`z&~D_aoYSwHi$kpLtE=< z1k2M)fR##P%g1Hvrj2vFwU<7UCp(pN$Y=NUHrj)5s&=xms+YXs;bsrE!JTr)FOfmY z(~v!V#A8txaZ6h?>06C_P82Hi`RO)^w|XVS%Qiba$wGSeg+=zEpG1WD=XP7_Mk@Xv zsM<|qzOIX1BD1dN^W zx&qlom>*k@A}IlSe3*}oR;>h6Lj3a$)vo05>VCYOJtb^01cT(P`1N=${tjRxh{Wf) zQ|Ft*3iA*Ftm3Q*Jv5!H%6lVe+x$7HfE5<%va6F|b99<$X3-BcWEGeHhqtc)t14?7 zMG;W}N$F5hMLMO9NJ)o?G}7Hj!x=&vj&P6`q(Mr$LAs^8ySvXJ?gnF=8Rz?E{`=qi zoc)}=_u6Z(wb$G0eOJ)Dq~RqH=deW$>4?JEzbYmtLr#88hN2r*?#Z*XigsVq)8=IW zQvyM;`k-NUOLqCn{jIyO<_qQs$iKgB_#k|C;v#2LhCd^x2udtiEm@X zl%f*Ra2#8xJ8wj2-j(vT_PQ7vD@dAbINmL>#=fOc=L^W9CA%EdPQY!zN4&PNBvC;P zYrHjTyqfn^GL6lSXCpo+t5-E-p`jb9W?)48dIX$WSY#d$Z+pK_gli$e}3h zpb+B>v%q@b@EpOUw{m|l=^SCCvwHD9_y!ltsU~=ywsIeyOg8vp?Hs`~i|8By510cF zVI2ur1@}t`P1aE}>F}E+-NnmZ=91`kOX>*=ARq`=j%0j#XJSGi zMN`puQ01k9IB1g+GVH+HAVG95{k7%(Rb{z?m}jk28`shVeWon$?)p@47isMXhVpZH zm%nt~$BW^fT6(S571q^X9`NF0Tp8y!>I8niSu2-6xtx~Fm}~1*z@VVe>w<_(DW^89 z+%q#bmogPYc{ObEZk7LYlUP@U5VF_a`=Cd|Ors`K!YxtmFH_TO#H;EOG&2bv#8y?{ zBxj{A$ryTSbE>TB8Hv4De?Nit(3cn^LCIO?W}Q&(;BJkrP92(qX~8m+S0aVH=0yL7 zu^Zdg+QZ!jv`v6I61jI7Lv9P zvf$Upwv&0>;ZCQ6^P{fK8)}<}8sVn!d!2WzZ0bLq;74=uvdBmWq?Bi zE?5nfLRh+H9G4-m>a+mj1G42ZgA`Njd&+pg;(}%-dwzGTU{J7hA34AjIbxSagjMLG z6tn!VC90^r)N8q$YqnHEj=Nc`w;~xE+Nq+z%}SaLEXEVyS*h@QFvwjV{CsP?DLDu_ zjv^MG-`DRvv?8KRgoDioLZI1LdNg2GNs++G!_ha`H+x+bT=n(M+2keRQ0^maJ$*0U z2ecd^^0;1lNin>-6U!sFx7undX%e+eheb^DJ!QP&R*3M{vFYD*&$Jxc_8O8b5uSG2 zC~?zes)x^rDDVw@u-A(%bX-cQ!S{e72dbG``H|P3Bgil}v4TtMqFFH?^dhmCB&g?R zrBr?HP!~9Oo5_8SAkA4fv$Z?ms5RX>)0``b7+Ja!zpg|JbD~N z=Ux)O+>)O8b{PE@xoo_0Dw=@>^Ci;@uy@`P$K|Fr*nTZ4oEB-x83&AC@DM7?6IZC0 z6~oDrdl^N6Wy3-fbJOHxMX7GKAB~$0MEh!ll%Cif#4V0SUe9U?xWVl0mX7p&I;fwy zvB~wLHD)ac&EK`;1J+oo1*h?Vr_7kTZBof<2p`^XeHu*;YWyU77MfKx65e}~Y*#RNrxz8BS-0m> zuCK6Zq(bd0cQ@(eAxT&DQC;VJ{%QO;3Luqu&Qw4n_>Dol@l8Y)Dv7Pb*gE-2N$p*U ztieYqE`|qWwNk)DTz|kIGMs=N^;EBm#0?(cn|rA4sfbSWtZl7@=qw!cO?71O-P9|z z5DQ^cAAob^6K0UK5%_!`Ez&wG>K5>8DVt#ekrD-usBv9nxaJ>AP*EtJ9w`wJX~gSGl5hVcdMG55cP=HW=s|hpUxxxNwsT~(fd>A z7W(&`JOlJ_A5H+bFjLa>DSjk}$x{BvI@>|Zp!BgGP9kM8wGoROrX>rqn;mhzMQ?2( zS|_sB=TXzy%4?yGBs1#nOYSEqg{KRayspr6{7=t@4|$z6+z*g?Nt{iKs>k6ZIo2ka zuBf9z8IzErJ~#{*pLWwD(Kgi+%6WI{VpaejGP+*?N| zREvlN%g7aNNNC>Ic)hT3ck|Rad>(?=-&9N|n{Ha@ix%GgQv znaSjyg~x27uqeyay9ay^s}Lt}+sf1-c}5;$UB&h3H1z@RqwK26_Tu15hbQys(F#Cq=( zdSmGXzcF}TRfpzWuhKyHahX9}1*EKmLy$UnBalRIG?BGwYpy6LyF*&S*K+461$s{a zkh*A|JeFkjC5LHFpCk`wF+oT8XGT->A5F%Jn#`DYS%M5h-$T`{}%mdAD0KP}@wzwY(k)Mc*lgXuZK z-blx0e2o(>eYs2VbDAD)G^y=UO?#)f-(DBpUW>%sOEY^aO7Utw0bF^COE*ykF9@3R zWN)7mH5e1T@U9UXM~!5D4xCxfnJM0 zD^)bL#DwUBr*blsN&aq_H(fJL7)=R5$TkL5h46zOzPqPG%Vm6HkO9o6=qs+={$TOn z=P;RZ8l0-tZfz{Vp1dhvlN%c1cuGOirt`M#*2bH}4s|TCS6lsN{$lUa#6~}KxkGlR zZZroJIQ}#bs$?3NGo%Q%;ia`zAqn2=$WGEm%e$Ehb0@Il*IFyOHZ)00icb}pBS$S` z48!=Uyr=QiJ(k5+wzRacEfJpeTr^xQm#oT%kleVPM!KVwFxzN7#t- zZ5P05r8QMT-f%SZbA;6xqPYn0C#$;mUCZ7}b;vJm1bbRMRZK=|si-0&F3|Ldn)cVp% zOtoNCltgte{LZV5j%`r^YU#kYo;aLT4`g~7&Qt=OPpj9_Sk4jVO9nef&${Zj^_m?T zEb&qYmig~S@f51O2)QvMN}&{4OS1;@%p&}g)t@s7OX&%~zRDRw8Y>s}X+{D%Ti_ih zAHdDYRbKiySDeNcwWkHjii72O_k*ASws{cGk{A9#w}(dpMtEgZd=Fu!uf@xEH#fB$ zF$1~T#clm-qY5aixQy-n__vkt-M1U=< z45k(^i%H#l8pP!*jqUT=g@PSrLRC%|ar5iPNcQ6y-p$TGglb+15|3o(F8;Ad#v zGqjFTCqg>$g|^RIMDF(8ZTcm``)d-mpIik@pVe|-Wv^Z)!Ncqp>9tyd+v%rh=;x4x zyalgfZs3l0OBAPy-s}s{=`&cy_-!kQ*Ijci&^6?2t?p%8fr036e%SlfBn{QcfgWML zXNP-=MUDWgbB9m_y-Lo&uP!&6CNsH*L;2^f`i0s4sm8|SgrqwG*1I|S?8xI#J7o!O z1yU5c0oWHCbf=GgA92|~btBSI(QISeZJGNK>kyMN&fEmb2*03Sk*3LjS3sYkvIH>p z_;Yic+uK^3Rb;IOGt}^)a%OU8?H+dFG_#R-nudqJiyEL@G>Z;ei$>A<@dzy`&j@4V zhK$nBfcr6tLB#TehDd-nRlq^u1v%rO2olZo{kN8lTZ4~YqSo|mE$y_>DY1!9%u@+c zt$bRT_W0CIqc6zl>Y_}6-nOvI-)PN)u_JIrsq7FTFAC-g2baT3A| zkLY8UE~8XKPi*jCSWl@|zFuu3i7VV@jF)U5+z%;CyPQi#_`cI7-SyTmfBT6`RRNFI zrtuP=cSa52_GOp+DPK=;-iG5*&h<5*Gjs$u1($Cc8-xYW0vT#mJ5`b{GJJC%Qc$H6 zw#Yf(tOpcuDVmxJoxcvDf|`0wMn<%q*X2EM z1gVO{=|(%7eAk$jgL4u%OT+Huu~J3tAHcf$4MaYhGjE={;O!&3mDH0?oFk-YEEBdf zt&q$JWp`LNU!W&h) z19wu7>J*lE{kP+n-C?0`D1FWVch)9;z3Qi8Trq>4y!^ys^^x)S zeUJUFL{=<$V0m>vij&Wg3ycA{uTFSN*ww2;BUE|P;PVXonjg(IHTz=2uznzxHt12=rn|TyN|PPQ2sifRQAhj$2eX_GW~Z;m%{{2nL2t(A&pl)dq&uGn&uFgIP70HzG}5bjpsYOr#b5B4 zS+@u<9O}wic{Nm=Z`PS^z_>HF)w13)orvruHXxuN#!5#sPjN3LLJO;9{WgBovv|BB zajFv&oObP2{p*Bu9`UKO_a|N+7bUTdl8Fr!HgFM@mE>B|xw$Ir*G(e@EiE7igxxGy z&Zb{)Z&^UfEWiq2kYv?duIWXl=JYRx)6$-lwe<`?!b-X z5;bP^ZkJpyKfAlrJ-wV4Xi8YXnJ!Ga*Y-@Ys>q7Hgq^S-O+BDfmQF#Xr;%oUCO$+y z(0{`hPhe?V>$u!7=h8jEsze012i{$}2Y?JfOu)#Fx96Qbtu8Vse{@x#k^Z2{W68Y& zvmgj{#_^OK^B^=Z+X8d^+hQVR1+!f^20mRL&%TYxzpgF`!MpYRRw| zKpi4L50k#$&KKm6v#n^}OncBsm7+{Ph}&Q>Ko<>NRiI3v9ZCxEOigPCIt4i6k;$=G zCgFW~_EfIg=wIGs4!iq;0%T-e&9(CF2Gt2oeZ~CbO>Lbj1*p<*xzsS}%fEtU7%cTa z;0wm5m7lV}kn_S!9O8!7=~GMQ3a`oZm)rVMrBmkxB~a8*GMYZDjqSKC5i#SVmt07E5o@jk9m&XUpE%eOLKF)sySO;27575z)0 z!i)b^s1&e}G>}=^9Y}la?RAZ?v2w7cDjMKzOP?b={?x@#4?gbja&x7>w;PR$_jKFj zK^xNOS}X}pzmx82Y%V>?Il?rpaCHOVL@d~JaW>RHNbFoatcagQZ1^;$Iq0NM6K2|_ zdQ4$FKo3a&}QvOCKhOE)EJw<^ZTtwZlo^N63)Ifzhq5z}X zkS)uYSxhc8RHD7p4MR6YS^eN-$pNorZHeXLquX;1`FwpoZmMj|qCSE30fB*0> z4*|0PsO7#LWF3joNSvM+wc<12;ikc2K6LmxFSD^=zZY5C?J?KmipNDph0$%@pS!yG zv}87XH)Dtv>G%Q+g*}#0Cg_6lEu3_^8_b$@)^@T?U(=!Zu2S)e;%CPg%<|COsCz%I zK3v6Y|8#;h0fG|>of2D-+3^2fLXe-KEgoc+6wSfr^=JdMymi0Nl;A<68WQ%t#7xT8!aGv@aer2e#_!@r2o8y{9fu>nEWlX4IV>Fhdy7>8Li@2VKZN4IUTu3w*To z()P^OJm6WW-?NRhZb9+S_<6fo`;(`%OvzbcZ)O!eGV=KfxJie>aWWpfc%Ne!sX0~b zip+fFH#$E9%bg&82FaQUkVWLZO#x`x*J@h2=?%=nDj&?tDs=VUFiKYEPl@74R%GY! z$w4t$SsEJXj>dbpnihEdeK$Yq#ccR{htCQ$2x=Hln4oy6MMUh9gcY#~QcQmFnB$1w zqUa7a1$I|!H5ilF?5!+pZH9yKwKc`Z~*;+3;_SYq$21Gp$q=ET%15I+^!B{bCDFo00{MA3V(Ml7R-tOo?s+fShTt;!<~kT{c1Pv) z+lk3n>ei(jJ?oliZv?t+J?=*1`GQ+2LiZCFIlThHyxKzz4c=gdB+Lk_q8g-%X!dMX zs3e*677piW84RxW`^(0^4-Y)?Ku*mc% z&{IJ{QcqB1u(ni~o}h>&-?bl^j&xNvsU)JS>ayZqG?cXpb0A2{*j3fmcqZiirv!fQ zUQ`;XTnQ%l4Lc{Tj`6;s%-FY{_xp^3)`b|V<`becJhhMfsn&)G&_GeR~s<6`e0GN3KL=6y*FwFyT390O&a z(Xv9n2sZD~GRPMJ;aH`7;m2?IN{ZphOdhtNHR;uQDlulNBn87_74;NGG71dB?gRy#Q~Rma7bT3RFY0V1$7z$8$gTK zC1se6ek&%niG|VEKxZj4p*h*gOWX3Cr-|q~uG59}8ry6%*5v>=7Fly$(ytT>f2``@ zaXwrB^VqxJ`&a*~Pb~CQKHUKO`TV*~7i*6ESWDr82QT>R*9{fEXs8=h{tfTaaaCR& zJFS(0B%02k>VeT%!f&2-F4a?6MAmH7XuzyXn}V}*grPHY%h?Toojhf!>-=;w;-aJD zy8oXR8^ZE2Hu&3xA}(9}R?SxqCHJDCz(2n&-81@zbflq6q+SS^>ymQJM!`_|fT$1O zF|D)Hka2zJ-h*gCLL4;;-}~$}+ZWn4GBDf^#{zj)O(;ALe9S2@(&4xcY3?BE z!}3hNA&Mm@C@9pAUKp!Hkac?@=_3ZO6+`18{%5~`rdN1V8Z6et^4QfS=z1yo!3D$~7go}Xl zK-!pHj19nmBf9cs{8P$749e~cLdyqUm9xYWmOpwcCF~^zB199F*$u|0 z!UQ52%!iMEy*ve91L+mkbg}JM`*RbwF{G{)97`uR?I#e1og*M53!ydiNI+(N-_WcT zSbt=qDG7G9Xv(?jDTS1|p8*rJH~7Du26G)c>GlNDll_B3zAbNiB#ar)%b~E2n09fXbeh zkU7$9IGv6=3i;>SOh`2!48A!g2!ENyAB}6E({e5J9%X1!F(#%NIb8lNR5=LaZg;tW ziU^|Y7R4y08G$*cZpGB_P)~!Ip8z5sx12&66(*q+r895qk8y6_#!`G8WbVQK1{K-r zS%*+hMa3VYDYbTWBCqu8TQ-o70~q`)*l^eD%>{J`ll)agdJ-YeyHn2*sBbb2bT>Go zD^GrCXO<0l?uMJYZ__cOp796Q&VRcB#8ZJQ*^JjuV(51u|B$x;JQ1nWf0wraJTF=E zf+%^v5hVcRJ^;wNcM$KVp)^_aE|sWv?0d?$sAwtVzW(q4Dim+Pnog~w0}S`M*JL+R z!RzrdW$pbCi`+5uFUa<#kOCxve11(LCtu_5qgj}nmOLJW=cSL7+aMo zRmZT1S{}nZVbSJLQy!n}9@8g5abkGCcg07nM_epHSeAmp@)yJReZo#jKmO)7A|m4K zsZo~wdyxCjc`2}XNi#}BF$F{@_PshCag> z!bvM4FLJ8$g*5+ehb8MP$~4P{HmY}d z_;y3#J+S_d7IDL1W6_CCgr2lM zye=!ld;!X<%x+WrSElRC1Ezz-1bkzZbH#j}$Q}!9T)Vz|hz=^NCsx!h>BZ`IqZ=OA z-KNupp{$c{;@OV{=h+H(Ppiq2_c1(pQz#c!j4cNYOJpByuZaOUm41eET$1eL8j&NG z7#y(sagF{FLkua&V1cH0)SY?inyMs~Pwe`uRCswi_`e__A7)iX5`ihPWm&g~3Ein% zRagHxOn*__uR!k!vVRS35d6d9U0Pk~0-5*O;7Lf{7$s zb(Rvw;<%+j5l^bRy`5{y@PsY(i_8bIv?vp%^Xq^S<}=AzB6seO3bxl4i`-uDSgCtl z^RXJq+8wr4WkEjsX15mmh&C2O!`)$;>WC&5C9ib$;i7j4Ikl8<$PSU5jDe3SMiN=< z_!2s&_pg?@^YFt`1~sU||Cs(4>je3uIiTBI~ky{(?J|~6-*8E<`pm2lT1cnCthS*-pOTJw=-V# z^NP_^%>%0!Snt9)GKET+Uh5e1<-5_dRM&D4u zJ2Ye5T{TcI0EU7b<+LzPITMl1MObn=IXDXw2Vt1KT>*oi*n+APXYXz}6H)B=F!P~d zZolO}9d_0P1w4Ud;@OvXZxZYy>kB)Hgta_%UaUA3z^Z>e{%H}{=T%l?rIlEp1~S4< z$pb~rxO0Rwxf_L_Y8lQEUNsO~l*H{#hj3~VZwb}iTnxyFWzM#5y+GzqmpGLfeqH53=PbShuq$!yNgh79I>I?YAb87J zbI12~Q_XTPkk^A^Y8d%+=5}`a2oEodUfjb_fh(_)DUwX3kBRE27m!d z36*?t@Tb#k^j!4vt(ENpIk2%8dnX84(jQ(9M(Z#sD|9v6x3<%)cp@<4@{XV1b$B@#m zmhXqJmMV_-&;tg=KwHv%HirA9XsOr_S(iYYFtGs=Dd%tk6oQ5;HJU>vVz@0kno-yTk zP>@h2Bp~5Q#fLxsytw@$iNXknpMk0#6=EKXxm{06Drh8%@(*em7t|mOWn80+?WjW% z06p|glFw20{$S020KTx5MUEJ&Omu1hgrk^PHys5nC?U_nsHLW_I!BZRDEn z+4&w4uJ@zP9|dlwNbj3hAk%u^7n}b8&`s77*SSc(-1e=h06YKS7b@g|B1||j~ zjV1UFs*cxvxtVr|^iu-C{2vU(?bn8xG#7M4L4yN?QaxOq5TujFdPx6oJye!p@DZ6Z z-V#$1Rn0j9#*s!8*_kku8ICuYcxLTlK0qj6O9*Fgm@{|=Y?grt=fpnnD=lWArSS@Y z?51lA6V)(8vF@zpFgzQf*fl4791!&!SnY>hX-mJikkIw%l-B=(?Qlzi?b9#F5?J21 zFW}N%0EF8&vP94Q2=rLdb62h$To_?j4uqcYH3KvmYtPqmNt!Qpt!oZ6IBD~aYt$mY zpsY<;Xy{u%g>yvR86NA(?p%0t;Bb)M}m_CB9@4nJgo`S6|2VjSVRpCi=3DzeZo-E zFGS9Qr_c0+VDgMbG8|s$(#UhqZIY^&$nlLmxu~zT++rvj9C$fTEI~U#+*NH4d=DrJ z7wmByulByCNdZt=>yvR}i`C#?9!3xbAp$m3d&R0vgH|JjBjEG{K)<)c&s8v~S z8o~2G;#3dn`?ikB+sdJKt5Nz9WFxYwku-0G=@%07A4*6Ja?r0$`>&3{uZ|M8kUrEf zK>Q(;<6ibmFFhl_3&GeAWZJv6{g(Wtn^80D`+g+n<=Y{QjJbQmJATjo` z?{Oiz*$~Pv3{`*%F74GH#BizhX910s4>T!es_z`(y0ym(*V~Ioal{~?+OetZOpX|U zKuc=?0=>1iVX#N~?+%x`=;Zl^Xkj$*jmRSJ&#rQ)&)%*kMG(+tB!4n81Z^gsdW2D~ zcsCJKLFTwfok1$H6<&wtN!Q6uCcsO$VA9CaG+4yPps}+9jhx;=Me|KMh)dhf0`^oPDD33%lGH#2fpZV%% zX5*{>Jp%K)GZhfDmyRfa4}VYm-Y@;`5&R2g0p`4f|78f{65U@p_A62@IQ9ZlfD7iE zUxrK@0KL&~E`b0pz9Q@A>ui09NA*2JIn z8g8BnqYE8t9y$&M`@*g&Q_%`v6%!367TvTAKKU1}EWj#6_kG34uqyjsCEd>$`Kwd# z=9<=Vvxv65r!CtP;B?&uB0~UJQu;&tSK=;i17$FW`mZ1#5m#AVpzE@*!i!MDcW2_? z;_#9Y{~$}h;}G!z+uvFCyVU)T*h^6i7|y{@lbxpL#m?ugxt5uss9)ZZOUOj*(_y~OEfNstw%&|XQ_zdIn? zyy=UPd~J($c&rTvnW9}2&|hYLwlW+JC#YAp8?V4=J5;|4K547dfUHwm)ow)E^yC@8 zbKaCRI?RD)Y`nhL7uz1f&c6Ddys~xvSM}0b?n(!}cEqSVFfpJIc z`dV}m_gBE@+nn^BDc18llu}}c%5O6$94g^`~lAW zCD95~;+V@R?>OOhE}Af_4czqMq>acaFJop(8IJto7i?xSh2kgsuR_K;+-Zr~TDz(o z9>@S;Q{O4I*-RN>E+gj`8M%)>on98oYUZwV&o#`nK@Lxn?zTG7hBZ+tX(v{l@I7s4 zj-2!@WxIPN4bBRsTzg5+l9i%{a9_jRefQC@a+nl=;vbZb$cP5~0%vYT8qZx#)pFiusGM%A$D29|u$ zJY|a(F1S!CTk~+j5f*ydlpy+1KGmU-AW~$F~Z|9*?{@DNEH4hv7jM zHw!leVIFU(B72`5Ygh+o36*nDv`98T^V=XlRYsu!+xIaOgfkW_R4ZC!zjlJY z0E1vdO=ly!-l=FUb2{e;cV}D2B)RgEy2Wd|V?|oev|?D-neWqX$y2%$kf;~fOl^Hg zMs8;)dYofnqokm8Z>@JCEF~bAD{3JFN}RsvnBTeoFovWK-p1cNx5i}XXNE)4M zDCO5W@R#HiBYLAwjese!NplZJq?`uk1kMpm9mMuRDQ$vJMNAU8GyDDQ-Y1;e=t}nt zZpBKMMCVY?a8aWhL>;B;nxta_?4f4R$-6eHVo(YO3af(V3Zf8X*A14x`u_ikURK=y$k~c#! ztP9o3-Yn?8LLpQwC*U_0z$`#@TbDqWNZGS%wqv=rmfvDIiDpPXOC3bp zCHknC({Q(Oo14#Sb5`Mg6|zsY7~!KJFkb$m@9>TiW|59FYw1c)E=9@Q6ltY#yJQm| zr;@nOe6+OY`_8FUyMQy1=Az+iwQ5$(l$oLe4-DTd!|0b8@BVtOoPuj#rtXd ztZ9_&k@hvP^XH3&wpr{sj-ragvvk(x3pCoKIwxNUDt|g*v;V*u$*Ze*YTgL53SE~r zB*O`|FPyw}l6?lz9`HzfmTuMcu#7aei&)EQ*)$H^r55U$G_qxjq(=Wz`AD+H8-ETbZZhzrDRv!n z!=)*Fz|pO%;$kmOo*ceN^e#g6Bc$kr;?wH@C- z%AhE&B#BLHk)80L{5w^eO#eKQBKEQJo{$lz5Jy|GzvP>najcuGV1b}_OcE?@l-QRYiSENp^xNXtd?D*Pe)K=M(#8ieiYw4|pqM?}V;ys%5(x zg3!z(M$TNdb&dl)7Fd8K`;G&=+ew{kq#?KmLHQJcU$qA2hIGDW@T84fb*peaQwpmB zlaO0=UA&`9!JmLVvA&ZS(?3wOpW*@yEpy)qmk;Ui1-GpI^nGx8V~xWQ8kYWFD5OdD zpRJ2?gv3W0Fuk9Xfa~bFKh=48%Q0qm2*fR30w&HAOoXd|#e#@@6Zz^jWWc}yOq}@X ztC)yb_n7!)H7$d;u3=!4Gs?Mz7w=uOLcZZ{o0p*j?1jW_=yGF6qkyhHb1mz@e!xbNeD@E5aye{hYZ=x^O z2hEV?d}#d_@Zl^T)F*~<@rH4wi;%>zs}Dog)|uFSX14`I?N|R5jPo~34*cai%g$C$ zu>aMImu=S{Z-N$Ak6P`d4p`+BcP`GuQQ9lM{ELQMR>{YZ{Y7{Em<0wGX4-}m&{?-= z6}o`1d0g}p#?23jhr_sL3TGzQ+PC&{vVe)}v26>@BPLZQ0b9K^7a3UUtReK$>WCL~ z(oVWqHJP!`4ySXnVl-A4$w8)O;3>n-H_ekyR1I)>*%IQ+mm=;&XVX6%MpUx13}tTW z>s3=(T+_3MjYV<5Bd5!=W32R?7@{c*^N#bFRfc#;gPPcNSF*hun)B+|nuL$bo7nmA zx96*wJJr~x0_}N8D-t>#vRvei%RWu6b~PFAu-Amy++J(n2ceIOu zKXbEcr*OAu2Y894UYkj{l>afi|05|?d-!eetBTHzMgRHL^~Xj2OInqrfu|b~-}YR! za|BFaqnSYlVJ;iUor>79EQtf~!!wE8Uc8UphVZz_{R=SGRI5Okk0R&}3hGF8Qy&-B zN!!_x@TG7^WIwi?Z>yN^FbC}Nf;LpfK`$W14(YN-o5F7w+{ zR*S_=NI7QjX)1$ZkR|>6smXbbme@|q*%Cqt&iV??JPGp(XGYi3}BBtu^v@A zv|A58!gl=>yV9Sf1l`{;r;mjqd)dF*8FZ+$S?+^F^fT5a7Dc3|REJL^?P5xgx!aa= z`VMcMe*uG!sNom$&us1>P>Cd>LOp!lLuOBd=vgV9dA0q`0he#)_l<2-bCJ&Y*O_~Y_X zq`7glIej(I7Kt#r6Hb=BTv$E~Jk&%St?by?qz!5gaiBNnSk~UxU!L9Dbr5fA#Z|6g zQci+P7K!VI(??L{bdA6y;wD?RT%xQUDi4qF*j-~$N+I4KS`24D0f@jX0AJae4+p(8 zEU@2d3tomNn#X-PM>t@P{@RjAaC^gSTjvB#dCG>G9MH5FbrllOj=)SAU^}tUllVB3 zI!SWw+eR9OaZ;DVC9`)`B;@8)PbDrJSKPS?0!o7#L)9FV!Y697)#H2$>?_IQNCv|s z_X{VSCd@5~%X!IaAi(fh4I`7YxC18XGcvAKc24IsW%``&E#o`j=84*1b$Fz%xY|Rx zHSV|qdPx=H5^L^ohSU)&>u#)O*|HyPqTYr!W>+|!>g6ES34X*p6-V1O^2kDRWprho zeH3+XuCJ}7y+~zr%#Q2sP7G6M= z#vYCv7Rr3HK@F9!4>cSLckIH|mH9*3s0$`kBeD|>a%+q;%rgo`A8o7fvPtI@v^DrE>S)fRaSAhT0dPG^_s+0KKpA4>Kg>y);>w(vl>{_1?o+OdN-I|!IHWB9L|!2UR& z0j^Qt;-5O4dtl#pp(TTM!`J?2x_@h-*)es^e!eTvG5kryn}bPGx2>hE@0NuAo!LxR z{eKUq3+p4Fj|3gM;uwV5t0v*9$6``=_!5^vxJ*4TTJY>f8|fSmcjnmkHd9?weH}U( zHmXxc)Nx=qEHDlh5CZU?l~pA1lXgDfIW(M;c~lv^~yEGOM4Xa!smvCgpC7u+%U+Qm|0lw@IRrTd@3vV zO7qhGM7;309pE=I1!({E?;IiQ*AD_*?GNxzi~jPGE@wp`-_Y84^}JbUfk@Ieo4Zv{ zQVA>XkI(YI#DQg&& zQM$u&B+e1Me$h5=4#>o0Wr0YnC}jw+%(rY)E*Y*M3`((2Ekcu1^H&(PmP;sb9t%H~ z3tnrXgd%rClrpN%wjTs`I73;oQ_OUz&NW>-W%B3`A)RTImngAxY1EXtkF929D%L@ z1ne}kyFIb}o^>6Sr83=o?r3pG)tZ;KkbHj>8m1n$T`JnIQkR{(%vbL)*cg(f^jIT^ zGN2%8zX|(H+c_~fD}Q-;TRD6L_OzI6>vN;7`p))qHEqIr5x>4c*Bx?HTAa?0`tK6= zk`ql%E%qkv7F2!2caH1`(ina2e>4{>70iO{*B33BqG#16={jZ^@M=ysAvXt+ zK3B)oI(XD0Z^3eIwW->~wI2;6)ug|@J7?&)e4>HT=HbP$ni6xHFRXCAqc*}=c~J_P z)KEo|C7X3QMSk<}<*09{956z@^Tme>C(Lygu&R=@m|QB}vh`zU4~ay<6S|vwksgqv zSK6F$&N1o0N(|Zz%fEf0gem5%iyG4l-5s3USSGG6O2ylTHYUNMwN+R9F;|(8XmK(X zZbU$`$1*=jdlZAkRXqx;&2H<%UCqgYNpj$iqg>wyaXdUxkxW0SS|F4v=@lnQJzmm3 z+NGQqR$A_VcQ~@$n{uc1{%$Eq>4286jb>rChPmiVie)b$zW7Kgy?ob7a16MXDaM!% zvo#5(j^BK|wa3|&w#fb3N~xt_P^{f9ta7=(4Q^x!CJrmu7wxB_>opqk_4SE(fCn3V z?@+Yj^iZAM{r13V3HNjQDk^j0_fDJW+S0wb!)#eay&2{0dyr?`(z{)q+j^!fss$0# zLZ$^B1%4y>xU*vYLM^b)T+%kCLC!Da0|S+(rnsZ@(T_|qll6L2Nhj5_A5_ftl1vaT zs?N~$H*%FE4Xf*w?ie!WoQ=3hZiY5!^Kke%7e!lU?MhWd3EC_MCX@+|20M;)vn6G` z*kMi1P>p#Z#nS6ib(mGi$vQ9AvYIc03m}ovX%lswm%_;vzfv`h`4hE@;a8QQ=W8WZ0Ta>QJDvbWjt1**wV4QuQ3+ z<|SlKG>%MuYCBovWh!I@NCTZ>1FD4;69Mtc#a`;yt|5I>Ef=ni;4KWy3ttDKoTeof z`4hLhj50Odzyj{Mue7YbsTaV#aVAj4o%laE%3;Meb|U|y1FWzSwDeDpICTH=$rNX) zJMBkRApJApv^b5@evUxAt${)eSWi-3^FNP!8f}D1E3%H+*kJ4#l}t=R28GPnv=E>tIEe~ ze?U)vwsDSd&F+YA6VuYJaB>R5P&dKg+pOyRreSjb>CC1EzvT`d8AWyZ3W!X{VjI2E zH4p}0-f(a^%pWtZcV;;Wd<{RitUNBhKJ}P~3m#iVA?n&R44KSfndh}H=WQ%IZK?w` z!xkKz_B!!azEFn1W1Lxcx76Yu@`7`B7~r6pvnH^W+S%2a1)9l2>`n0Vwyi_oqa5pI zSMz$c4hHMC@;$TVJzjfhOITG!;|XsNJ-v4M&_>Ym8c3=Vph@XaJ12q_@5P4U4NFUF z&bYXele02MTZ_XuO1S(sDgdRu07Fhh2HZB?m;;ZZ&18C@2#Acr?gDk#bbudT2w83Vk z3`Db;8g5Pow%XX`GwXau>P*t^N;{o&j-Yp0%ltkc89M#s+hf^<5~aoQ2?#~YS>QP5 zAb4zM3;4GyZJ0jng?KtssGXj96K=vUF88;#yAN6XJt79ZbLR*9W~LWFKyLVQ!{qb^ zNW+D*_w);Eh07Ou%q>XWW-0`|SYp~Zc*6122K;>c93kVV>=fd86h5s^lY?%##rfvA zx_4va6yn`fd*%(R=xjRTtBgY{Jd);{AD*e?u4rg<0KVv-65s`?9)Zx8r2a8KU(o6D z;v6tXvP4cZld!kyR zX^?5Z-Nl+r6;7u8FL;`-6q2pI3Xlz7X^c8)`$^`E^pS@4*>kSMuZcgNe!Jk}8{oRA z^*?8m{c{<+`M@taOk2bumAPRD^le<|DlR5Y0? z&<%kt{1*+9D!=mn`N#i~>31bmeva_lIRc>A9%5cWxOxTgDxlS_01EEHg^zHl(l9hF z-Gbw{?lL~f1$5f>^fzz)6%Yoj?P-Rw@-fH@DB!>TCK}OOUv)HYYaE>;01IvYx8E6? zTD1ynA}VTsG$HUAJE~w&=qWVm_L1z0tKHwfd)ECxnHF6^gtRqdtVBTgU1GY;{6k;6_cNp5r^+#=VbN3BRcnQK$%HorYdpQ&eHO0%rRA zD&XYrcW(D1qPx7%$bGU1Rlc`js0p0R* zy%je5UNc|u6_ogWwHwn^$7AZ|SKW@me^&>*E8(}i=0nAN_2eQJR#=o6V$xl=8&5I31p{B@xVzZ~V|&7uq~1T1i=kg&w?P$n8U^P! zeQmNJWrS=rvyJekaB_?6@4o9I{W$8$?f+BPae%Y6wxcL&T-1mWg0@yr#YL!5ql4C{ zEq06Bs!i0a9YR%&R8h30_G%S1BG;HycT7a&wZueer%0&xYbPtc&6%()cVxMkEMz(OBLT};~TwT;I{egIi^IxUZKQmMO zrANbz>O3n%G11uWEr_4=%cwF!4LmQG#tws$Cp{_)o4yabxCTW6XY zQqA&-TA3DL{+tJ(8zrgN@gMS6dj-g!`9HvfYx7s`$Msc*Pj5*t!DAB`HdnZH1mfC+ zR8L#D)>#x4i`PooWqFo(Wh@6b=pj#5Bu`SoM*PK-zwX0U=~YF2s~d^LMgNe7YH4m6 zxI&jAFQwNRC?{5Um$};%q;jw2eUW8(KaySbjk&x1L(Ro#e+f_ByYQ)K5nAdOlDV)q zZpWW0*52eQs?d-canb_l4{>l9IaOe^L#GLt|U0v;RC!EzlpA-(8q{bu9E1@fZL(mk*K zHHMRx@BAvWi9m_BfkLl$d3#BmiKUObt0K+Cv4D;BHX$$TI0l8n8N5V%E>&cj2U5SQ z*1~(cK&-kzuXkZu93S)F91rViILE6Pp0%Pa^4>XMilE~8(KO%`uwY5tJ56?Ba1g&T z_eA$pa1Wiq9ycXkG{%iW@9R|tXcyLPs7+V((#I;W%ir zGEgw?VrkBLK=#tdfl*<#u+$+!?s8pS9beYx!bmJLp~XVIy@3%OZL_8o+5Zx;rjy6Q z^7b;tb%||wgSjWNmR^grIgWa*31!!ReytU9qjcW|DO6oY+(O#Lk(&~cw^Ghezr(+K zm&%*1By14L;QE?Af`!mOzNPfiO}7s=-rLl!Or%R&erVz$%k)-@2`ozu2@1s0RfO_B zu%qW9bhh#NK}!ORy!k}KI&$u5qj&d1jUlNoKKkWHjd*W&wbxwtrEb#5uN$ZB%z5xC zZUrIg22}WLv@DuCKM%RaGb7(;Ua;;%Ct;KbvPi6DAwtiygwn8 zUuiw{4jt%%=)0hD7nfG?LCk^}^@g5lX_!U~*L%!bdGbmR*y5R40n?)SRev4+1PrwU zn@oLuv`EqP2=IO5kwo`JM6E8a~C>yZB;Y$i;S32*#!28)6e67S;<)L+>xG4Wzjc_PcVnt z;xN7A(XLmchnV`wY|FEErP{Twr1bNWEM>ST)mm{OYE)Nnd;-D6&QyNaNqRq-9bx-` zeY%|}yp!j^Gv#j|f;1I7o7&sOm`$l@GC$qGgcE1SQH6y{FICugvsPF}gAF=3r3!e* zllC(jA0rcVbJf>b_b4Z@W*yawEt;B|ddt8LJ&#Am#LJuAZ-q4YeD_6o({uy~ zPSi-!1MmEi)Y+p&q3+SfurPD3wC+iVFxWKzK#rRhKjWaAeys{DiTK&(cM1V`<~b(M z*c=j}Wo&GU^f6#zovM}8c{ouc^%+gFCxfw3zab7*d_Wy?;B5G{85klsJBryB#KP2A`Rw)$M@P4M^Z{@6YP5R;V3Kb*nP3mUxr_xtkg4 z{~&64EKKl!L12<*veIy#V($vCUXb2yBFnD;s;K|cw7@9!U^Hadk@GZ5o0QF~PaV@9 z_79Z_&(#~{7eb`suUF;P38<6VkEX~?zq0ue`*2FTN z%GWW-6fc1Ww4Zc|qAn&9FCyd^g;o1$?;&>b4#?5r3G+9eUuBdnDeQLMqU0Oi7c7S*jM%lym7y3Es=~g-rWF;NHml}t zW%cgrYKy(5Eg9KT%hN74%(9B8mWW;bSmD53emSA|skyCe+bXm`bQ5}ZU~Ik=Zc2o! z5^3n!vd?Z}S~h?^u5ckDoRSE(^M8u8QNSlh=bQ)vQhTb!GV0mr&}#~v?rEaTlg1kH zfk_f6QF2zq$q<;rSW001mkDrb^R)0vwjj#wgz8(xyT- z=mrBq*XB~q5L&*OaNmuAtY11x?|0XDns`xhF@OGr5t%$<=_#? z@RvxPTk6NHzDPsqn0i;sFXC*Ox!Kjybf}q_uBb)A-OhFkgfwooFpy1#m9R$gqm50U z`BVUYvTIv}s9Q!BNn1_>Q~m#ABx3G{J@8D_DT__jQa)}UsB|M^t>uZf{l z2tkGX^r&Gy6LHHNjDe)Y z<=EGx;bQi?LVB z#JrDoE0YbWV9`>vlXfieVL)i8wVO!JZ7P+DdKkIZ*ppYqNu?0d4>I9-@Fu_PiH%>C~oYo+=b(c;8n?C;WNQ8KjQl#5oP6Mhu=ZOAL2C+I5FYx|I;Fn z8CRWl8R@;!p|`Xh+`U3G7(UlD6U@_Np7j%Lg!O6zyR$sMWvWcSga`FV_Y*B;UW{!7 zWO?-y_4I1bt4yuIgYYs75X|q5C%jamYZ+1zgrC_Suu*w~pB*$09N+04YMfCW+yfmd z0|M1ZHGz)pO1s-QO1^XhKejol1Di9xs literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md b/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md new file mode 100644 index 0000000000..d042b2b0ec --- /dev/null +++ b/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md @@ -0,0 +1,218 @@ +# What’s New in .NET 8 🧐 ? Discover ALL .NET 8 Features⚡🚀 + +In this post, I'll briefly mention the new features of .NET 8 and the changes. + +## `dotnet publish` and `dotnet pack` Release Mode 🏭 + +With this new version, `dotnet publish` and `dotnet pack` commands will build and pack with the `Release` mode. Before it was producing in `Debug` mode. To be able to produce in Debug mode, you need to set this parameter `-p:PublishRelease` as false. + +``` +dotnet publish -> /app/bin/Release/net8.0/app.dll +dotnet publish -p:PublishRelease=false -> /app/bin/Debug/net8.0/app.dll +``` + +--- + + + +## `System.Text.Json` Serialization 🧱 + +[System.Text.Json](https://learn.microsoft.com/en-us/dotnet/api/system.text.json) replaced Newtonsoft.Json in the recent versions. We are also using `System.Text.Json` in the [ABP Framework](https://abp.io) now. There are several enhancements to object serialization and deserialization. + +The latest version of the [source generator](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation) now offers improved performance and reliability for Native AOT apps when used with ASP.NET Core. It also allows serializing types with [`required`](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/required-properties) and [`init`](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/init) properties already supported in reflection-based serialization. Additionally, there is now an option to customize the handling of members that are not present in the JSON payload, see https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/missing-members. Support for serializing properties from interface hierarchies. The [JsonNamingPolicy](https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonnamingpolicy?view=net-8.0&preserve-view=true#properties) feature has been expanded to include new naming policies for `snake_case` and `kebab-case` property name conversions. Finally, [JsonSerializerOptions.MakeReadOnly](https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.makereadonly#system-text-json-jsonserializeroptions-makereadonly) method allows for explicit control over when a `JsonSerializerOptions` instance is frozen, and you can check its status using the [IsReadOnly](https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.isreadonly#system-text-json-jsonserializeroptions-isreadonly) property. + +--- + + + +## Randomness + +### GetItems() 🧮 + +Two new methods: [Random.GetItems](https://learn.microsoft.com/en-us/dotnet/api/system.random.getitems) and [RandomNumberGenerator.GetItems](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator.getitems) have been introduced that enable developers to randomly select a set number of items from a given input set. The example below demonstrates the usage of the `System.Random.GetItems()` method using an instance obtained from the `Random.Shared` property to randomly insert 31 items into an array. + +``` +private static ReadOnlySpan countries = new[] +{ + new CountryPhoneCode("Turkey", "90"), + new CountryPhoneCode("China", "86"), + new CountryPhoneCode("Germany", "49"), + new CountryPhoneCode("Finland", "358"), + new CountryPhoneCode("Spain", "34") +}; + +var randomValues = Random.Shared.GetItems(countries, 2); +foreach (var x in randomValues) +{ + Console.WriteLine(x.Name + " -> " + x.CountryPhoneCode); +} + +/************** +- Output - +Germany -> 49 +Finland -> 358 +**************/ +``` + +--- + + + +### Shuffle() 🔀 + +If you need to randomize the order of a span in your program, you can take advantage of two new methods: [Random.Shuffle](https://learn.microsoft.com/en-us/dotnet/api/system.random.shuffle) and [RandomNumberGenerator.Shuffle](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator.shuffle#system-security-cryptography-randomnumbergenerator-shuffle-1(system-span((-0)). These methods are particularly handy when you want to minimize the impact of training bias in machine learning by varying the order in which training and testing data are presented. Using these methods, you can ensure that the first thing in your dataset is only sometimes used for training, and the last is only sometimes reserved for testing. + +``` +var trainingData = GetData(); +Random.Shared.Shuffle(trainingData); + +IDataView source = mlContext.Data.LoadFromEnumerable(trainingData); + +DataOperationsCatalog.TrainTestData splittedData = mlContext.Data.TrainTestSplit(source); +model = chain.Fit(splittedData.TrainSet); + +IDataView resultPredictions = model.Transform(split.TestSet); +``` + +--- + + + +## Performance Improvements 🚀 + +In .NET 8, various new types have been introduced to enhance application performance. + +- The [System.Collections.Frozen](https://learn.microsoft.com/en-us/dotnet/api/system.collections.frozen) namespace in .NET 8 includes the [FrozenDictionary](https://learn.microsoft.com/en-us/dotnet/api/system.collections.frozen.frozendictionary-2) and [FrozenSet](https://learn.microsoft.com/en-us/dotnet/api/system.collections.frozen.frozenset-1) collection types. These types are designed to prevent changes to keys and values once a collection is created, resulting in faster read operations such as `TryGetValue()`. They are particularly useful for collections populated on first use and then persisted for a long-lived service. + + ```csharp + private static readonly FrozenDictionary frozenData = LoadConfigurationData().ToFrozenDictionary(optimizeForReads: true); + ////// + if (frozenData.TryGetValue(key, out bool setting) && setting) + { + Process(); + } + ``` + +- [Buffers.IndexOfAnyValues](https://learn.microsoft.com/en-us/dotnet/api/system.buffers.indexofanyvalues-1) is a new type in .NET 8, designed to be passed to methods that search for the first occurrence of any value in a passed collection. The new overloads of methods like [String.IndexOfAny](https://learn.microsoft.com/en-us/dotnet/api/system.string.indexofany?view=net-8.0#system-string-indexofany(system-char())) and [MemoryExtensions.IndexOfAny](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.indexofany) accept an instance of the new type. When you create an instance of [Buffers.IndexOfAnyValues](https://learn.microsoft.com/en-us/dotnet/api/system.buffers.indexofanyvalues-1), all the necessary data for optimizing subsequent searches is derived at that time. + +- [Text.CompositeFormat](https://learn.microsoft.com/en-us/dotnet/api/system.text.compositeformat) is a new type in .NET 8 useful for optimizing format strings that aren't known at compile time (such as format strings loaded from a resource file). While some extra time is spent upfront to perform tasks like parsing the string, it saves the work from being done each time the format string is used. + + ```csharp + private static readonly CompositeFormat range = CompositeFormat.Parse(Load()); + ////////// + static string GetMessage(int min, int max) => + string.Format(CultureInfo.InvariantCulture, range, min, max); + ``` + +- In .NET 8, two new types are introduced to implement the fast [XxHash3](https://learn.microsoft.com/en-us/dotnet/api/system.io.hashing.xxhash3) and [XxHash128](https://learn.microsoft.com/en-us/dotnet/api/system.io.hashing.xxhash128) hash algorithms. + +--- + + + +## Improvements in `System.Numerics` and `System.Runtime.Intrinsics` 🔥 + +There are several enhancements made to the [System.Numerics](https://learn.microsoft.com/en-us/dotnet/api/system.numerics) and [System.Runtime.Intrinsics](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics) namespaces. These improvements include better hardware acceleration for [Vector256](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics.vector256-1), [Matrix3x2](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.matrix3x2), and [Matrix4x4](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.matrix4x4) in .NET 8. + +[Vector256](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics.vector256-1) was redesigned to utilize `2x Vector128` operations internally to achieve partial acceleration of certain functions on `Arm64` processors where `Vector128.IsHardwareAccelerated == true` but `Vector256.IsHardwareAccelerated == false`. The introduction of [Vector512](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics.vector512-1) is also included in .NET 8. + +Additionally, the `ConstExpected` attribute has been added to hardware intrinsic to alert users when a non-constant value might cause unexpected performance issues. + +Lastly, the [Lerp(TSelf, TSelf, TSelf)](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.ifloatingpointieee754-1.lerp#system-numerics-ifloatingpointieee754-1-lerp(-0-0-0)) API has been added to [IFloatingPointIeee754](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.ifloatingpointieee754-1), enabling the efficient and accurate linear interpolation of two values in `float`([Single](https://learn.microsoft.com/en-us/dotnet/api/system.single)), `double` ([Double](https://learn.microsoft.com/en-us/dotnet/api/system.double)), and [Half](https://learn.microsoft.com/en-us/dotnet/api/system.half). + +--- + + + +## New Data Validation Attributes 🛡️ + +The [DataAnnotations](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations) namespace, aimed specifically for validation in cloud-native services. The existing `DataAnnotations` validators are primarily used for validating user data, like form fields. However, the new attributes are meant to validate data, not entered by users, like [configuration options](https://learn.microsoft.com/en-us/dotnet/core/extensions/options#options-validation). Apart from the new attributes, the [RangeAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.rangeattribute) and [RequiredAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.requiredattribute) types also received new properties. + +| API | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [RequiredAttribute.DisallowAllDefaultValues](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.requiredattribute.disallowalldefaultvalues#system-componentmodel-dataannotations-requiredattribute-disallowalldefaultvalues) | The attribute forces that structs for inequality with their default values. | +| [RangeAttribute.MinimumIsExclusive](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.rangeattribute.minimumisexclusive#system-componentmodel-dataannotations-rangeattribute-minimumisexclusive) [RangeAttribute.MaximumIsExclusive](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.rangeattribute.maximumisexclusive#system-componentmodel-dataannotations-rangeattribute-maximumisexclusive) | Specifies whether the allowable range includes its boundaries or not. | +| [DataAnnotations.LengthAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.lengthattribute) | Specifies the lower and upper limits for strings or collections using the `Length` attribute. For instance, the `[Length(5, 100)]` attribute specifies that a collection must have at least 5 elements and at most 100 elements. | +| [DataAnnotations.Base64StringAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.base64stringattribute) | Validates a valid `Base64` format. | +| [DataAnnotations.AllowedValuesAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.allowedvaluesattribute), [DataAnnotations.DeniedValuesAttribute](https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.deniedvaluesattribute) | Specifies accepted allow lists or not allowed deny lists. For instance: `[AllowedValues("red", "green", "blue")]` or `[DeniedValues("yellow", "purple")]`. | + +--- + + + +## Function Pointers Introspection Support ↩️ + +[Function pointers](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/unsafe-code#function-pointers) were released with .NET 5. There was no support for reflection at that time. As a result, using `typeof` or reflection on a function pointer, such as `typeof(delegate*())` or `FieldInfo.FieldType`, respectively, would return an [IntPtr](https://learn.microsoft.com/en-us/dotnet/api/system.intptr). However, in .NET 8, a [System.Type](https://learn.microsoft.com/en-us/dotnet/api/system.type) object is returned instead, providing access to function pointer metadata, such as calling conventions, return type, and parameters. This functionality is implemented only in the `CoreCLR` runtime and [MetadataLoadContext](https://learn.microsoft.com/en-us/dotnet/api/system.reflection.metadataloadcontext). + +--- + + + +## Native AOT 🏭 + +The [publishing as native AOT](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/) was initially introduced in .NET 7, the option to publish an application as native AOT enables the creation of a self-contained version of the app that does not require a separate runtime, bundling everything into a single file. + +In .NET 8, the support for native AOT now encompasses the `x64` and `Arm64` architectures on macOS. Moreover, native AOT applications on Linux are now up to 50% smaller in size. Here's the table, illustrates the size of a minimal app published with native AOT, containing the entire .NET runtime: + +| Operating System | .NET 7 | .NET 8 | Output | +| --------------------------------------- | ------- | ------- | ------ | +| Linux x64 (with `-p:StripSymbols=true`) | 3.76 MB | 1.84 MB | %49 | +| Windows x64 | 2.85 MB | 1.77 MB | %62 | + +--- + + + +## Code Generation Improvements 📃 + +.NET 8 includes enhancements to code generation and just-in-time (*JIT*) compilation: + +- JIT throughput improvements +- Arm64 performance improvements +- Profile-guided optimization (PGO) improvements +- Support for AVX-512 ISA extensions +- SIMD improvements +- Cloud-native improvements +- Loop and general optimizations + +--- + + + +## .NET 8 Devops Improvements 📦 + +### NET Container Image Changes + +There are some changes with .NET 8 on image containers. First, [Debian 12](https://wiki.debian.org/DebianBookworm) is the **default Linux distribution** in the container images. + +Secondly, the images include a `non-root` user to make the images `non-root` capable. To run as `non-root`, add the line `USER app` at the end of your `Dockerfile`. + +Besides, the **default port has also changed** from `80` to `8080` and a **new environment variable** `ASPNETCORE_HTTP_PORTS` is available to change ports easily. + +Also, the format for the `ASPNETCORE_HTTP_PORTS` variable is easier compared to the format required by `ASPNETCORE_URLS`, and it accepts a list of ports. If you change the port back to `80` using one of these variables, it won’t be possible to run as `non-root`. + +Finally, .NET 8 is now supported on **Chiseled Ubuntu** images, available at the [Ubuntu/DotNet-deps Docker Hub](Ubuntu/DotNet-deps Docker Hub). Chiseled images are designed to have a smaller attack surface as they are stripped down to be ultra-compact, and do not include a package manager or shell. Chiseled images are non-root, making them ideal for developers looking for the benefits of appliance-style computing. These images are regularly published to the [.NET nightly artifact registry](https://mcr.microsoft.com/product/dotnet/nightly/aspnet/tags) for easy access. + +### Building Your .NET on Linux + +Previously, building .NET from source in earlier versions required creating a `source tarball` from the corresponding release commit in the [dotnet/installer repository](dotnet/installer repository). However, in .NET 8, this step is no longer necessary as the [dotnet/dotnet repository](https://github.com/dotnet/dotnet) allows building .NET directly on Linux using [dotnet/source-build](https://github.com/dotnet/source-build) to create runtimes, tools, and SDKs. Red Hat and Canonical also use this build for .NET. Building in a container is the easiest approach for most people since the `dotnet-buildtools/prereqs` container images have all the necessary dependencies. [The build instructions]() provide more information. + +### Minimum support baselines for Linux + +The support requirements for Linux have been updated for .NET 8, with changes to the minimum support baselines: + +1. All architectures will target Ubuntu 16.04 for building .NET, which is important for setting the minimum required version of `glibc` for .NET 8. Versions of Ubuntu earlier than 16.04, such as 14.04, will not even allow .NET 8 to start. +2. **Red Hat Enterprise Linux 7 is no longer supported** with .NET 8. Only supporting RHEL 8 and later. + +For further details, please refer to the [support for Red Hat Enterprise Linux Family](https://github.com/dotnet/core/blob/main/linux-support.md#red-hat-enterprise-linux-family-support) page. + +〰️〰️〰️ + +Become a pioneer and try the new features of .NET 8 now. +Adapt it to your project or start a new .NET 8 project. +[Claim your copy of .NET 8](https://dotnet.microsoft.com/next) today 🏎️ ! + +〰️〰️〰️ + +Happy Coding ⌨️ +