From 380c8f643f43b1af4a23e54c537e69d04a517c6b Mon Sep 17 00:00:00 2001 From: Ezhovnd Date: Mon, 25 May 2026 07:21:19 +0000 Subject: [PATCH] Upload files to "Ezhovnd" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Лабораторная работа №1 --- Ezhovnd/benchmark_chart.png | Bin 0 -> 117868 bytes Ezhovnd/phonebook.py | 367 ++++++++++++++++++++++++++++++++++++ Ezhovnd/report.md | 142 ++++++++++++++ Ezhovnd/results.csv | 91 +++++++++ 4 files changed, 600 insertions(+) create mode 100644 Ezhovnd/benchmark_chart.png create mode 100644 Ezhovnd/phonebook.py create mode 100644 Ezhovnd/report.md create mode 100644 Ezhovnd/results.csv diff --git a/Ezhovnd/benchmark_chart.png b/Ezhovnd/benchmark_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..f16f57b64e963c2d4105f442a6e09494de28e9e5 GIT binary patch literal 117868 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 z zQ&5rW@x-?BD9{$BP^l6sI9|e*r?Bz?Nb@V8x%Wdgu{3_Z zvliDB?mCwV3Uw}q_F;x`PPSK5xC+wC6=(6qp?*hB5fm0yf>nyp`t@uZh28IFl$_<& zKIu9^;iT)|Kj3=Rvi9Ts?f~l+L8;-+_tv8WjVy3z-d6GWlt4%C<3$R`Xv7=zl>Rdh zo7v~7_}?}iE||iVvHq+teSNAiAr)?YReMJRn_g%c3)O{C^8*nLytAWWG0Y55%ZGhQ z1Rs$PU?&zYVwLspH{qg^7%5Hxnns5TglZHaWP`2osJG3UU*szjki*yPccmg1prfaU zM-UKiO}tkMV&<1FB_j2IeJC1SmI7sVB)o%K5^^@?>z?)tMXJ=Ix(GyK520*%-}ltK zSxb2cWKDFo-JRR%+blD%EKVV*(%!}^{%9cLT z4(VuLf}1*6s&<`kr=r|>P?@uP`BO2?qZc>|4EF82fyHa_c%#N|963z#!`whK#$e&I z=MMZ>JEKvtr$~=J+sypwoXiwSRYlpE5AKNdU8+y^`wqM|aZD9aErYSmV9ex%bbs5a zf_ZFpn#ooOu#ln;r%e!>BBWld^34HIu|@aSZLL?QuKXd#t*=>~ z_HEbD*{|@qMbgj$Ld>rKq&W_|UOKRXqhs_yEvQiAiNx&2~|u;o*tw z72Y8T)-5mV7A}u&K4`(GDY=$u!+>{0%Qww&kym#q)3s6&ILhMry&f><>0QdD&TK;mpq8b!RRnsDK} zXx8#zlxA91%5u`Wn0gtfgYrz3C7StgLNl_5+Q(e>Bo$59%!(dfUD)2S{1dm<8pD2f z+pC9kKToNfW4U_447sU8Q|Tj4L3WzgY{vRc2_Hv zcKbSeyJ^f@5-f3&bL^g|>Z4_5scH_xwLIdO(Zca)LGe>`Uu9P$y`L{uC?u#^!UFaU z&5i3CRRGRHVN!r5wFg``?2Rv`;6MhW{=?(jf**m+ry4{jQ7B6@L?ah$qe%VTNWF+d z?niFJ7(f9+($X1a8vSM|&1*4Rq=$S+!{FfvldV)-KmeN7fA029+jEA?bH0AnLbrtf zAYkO>Pfv2Jj5+J;5t1=nFG9!;1VY)8)_zQTZVpnPRm67N7aOWo5EPFTq@Qaays+NW-=a!RN12DDtAg!2R!mYN*&UZQ(6h zUhG4RLG!i6517A~KX;BE@bvMf`qZfwVBkWRMnK;e056;&-6+zA6;1$*8ARz!gy&g4Eiy3}nWD%V%+e41Ms53!O_yY69{;v|FtQz|# zI<(xrUg;a%-e^1w+IPMu^PT2KQX;$A*T|`}hcUB8$(E`zx6$?J7nP_yw(p5HG{#=R zT>ZZN>$Pvp;M~YC%9ei8CN8#WJGz{*)8x~4OD1^C`ozO9>uS!`ddg--%vd5*U$N%I zs)~Zb``y?Qku8-LCkEyv50#RT-5By5mDx-4)8=si#alI{Xsfb99<&pM0PJT}n&NA+ zeSJ#C_Lt({=^P$=qc;_Op0>5MwNsDq;Ea4UxjPLyL{MN6E=QTv0yvfC63OGbN?HNk zZ)!2AEpjOXsgZ!S++tW@=K_0)Kw~23e(qO-93IiN^r7~h)EY3_U^`^J^?eoKYIvl=!|2Eb&QLDkK-Ym*%k%&3mcwiyL%YMf{LT>n$-&K@(F5WY^@oyU_*!aZi_SIr9V_>KLoGGx}Ek?8HsF!RXMm z`sc42qRvmpz$#Q(dc=Z2l-z(x1E`nz6aa4-JnF`jW-vGx&DZuKAz@)r&|%V#=hqrJ zQ$9i*402R6QBJjmt5@nS5!&>MsVN0GYT7e1LU_;U+gV+5R&_J`?uk@w75?Qo%(3dz zr_-ai8pjh0?@7+Sd!o$magK5y*HrFj{X{jQStDM<=yDZg+@*t!(qoZ87XmXY7j9Gl zQmUq>=R>b-L$l@njRI)t+4c15dqg>`GJ*sL+a z?~!4JQQ>>*U)FUiws}GsmIx?te8(lEA0%!$^J6#K0(BV5Bxj{nK<<58mUp53H^Y+W zr`?JEB|2lwYK6s*Jsu%*cJ;5aHoy@B`Q6^6;{L&9WHsDMw5%$qX`_}lslqxM*pTF* zB{jFa0w-LbxoQ-Pw?ect98Ld$Mpb_Mu4v2b zB@_SL`1-Lz=?}0Ou8wQlUpapS#21R{Ul+^U3Q*pL;!2o+9QWCADGZ@;QFoujm^x4k zHk2IW^z=RXm60wRQ}&}b8ZU#vqnaWS60>4%p5SlQumqm_yVv$j#!TS@T>QEF(V|$>F!BZ?sltjly zC?s(j)Dn;sfVdR;=g#+Y+^57&gb1F(v=_Vk%F_(oK%(jB^2qZD55KM)Q3i0IhpvZ( z+#7))V2$@iWqTxwZliRwGE)`FKmUXTT(5%$B?x&4`qt)aGdD(br66iWqwP#Vc_(>@ z|KG>XIL_Zwi3}+sv^O1q$%OOI{|(Qn**xm?Dnhp>FA0_uyJ7QbvGbM0@>NI5b##Ix zf#B~Jr)MsQK+Q&d*@`oshq9ZpQ8aK~33M&uu;(FZ%$*Lqj|+7oD1la8ol3tOkfFW_ zCcW*uA6GWvZQSv{lDXt`6BQKzj;SVS`}JJ@*RNmJNMLNNbWDF|V`%=FKc(ijumv4c zX=y{`&_YxIgfdGQbl4M=jhbg^_rSBbP+U5QIv$ZH$hHbg8MD+sH-JZmgHCXRZy(S< zxVRwT@4GI8XGtwF5NAQ?)vT4FAns{@-O&OVr2yy>HB=fZQd%OZo!5Y{)|qy`Y7TqM zr+{jXK0j6m#DLfQ$QGzZCz#w--Z5=9I^TGch{w@MlWgy8Zq_nvowIUB?7P~Judg(l zxtA}uv#aimR6O@HqRh%Z-eItuyI+r|J>ls^MP5VAe{8E)c1jW{5Eh9ZS#+*N{Mu5J)JcjInBJS_t@?@=epkGE@~MR?ihQlBz*D4SB*a|_I%rGBE#Lo6RR@%`*s|f{bjM% zvj?-vqC{UE?lJsWyES7-?bY`VhcNrou2ec}h#c(KXZINOjmq^b+uD0kZlOz->)czi z1sIKKYQ?slwRH`G)*e;P;pw~li>{54CP3E6Fpaylp(fL6>7YrkL+9;w*eioD1SNcq3APwY3 z)#~V9j&6kX?=E-lX@0rzVz61|^XQ0owXf~h56MOm=EAzk>1Nq`IW%d+%oMRc0i;n#@+LiY8xy2uC+xwPn zYkj#{-gC#+&11<+izQWg8|Dz{HDNVo-_EB$-sxX7VbVRPz-wLrf%&2=TbgT)H#mxG z4_;0H(ELZle{j%JZ|2?oG3++&UGfK?S+vr9tbe?aT_TIV*NKw>w6`i zLSspqo)>7mXmu?qN2ot+4aM1WzuXNSiLBW@0OInjA*y*W z4r-%$x;(lEe9M7rlA2Em02C2X(bd(>2LEnvpAId|h`~I3RKKTrNj6$Qr5VRdtlXq< zaTC>s;ydSdva1sB_l#tIHMyi}>SkpeB4J@{*q%C)QB!|u()7pSs*MKFP5@AmLGz{w zp*ji0V5@uHM}lP%T6_Rq9b!)*8m~f3(Gggb(iG&f#hTq@-blNK5v5#5TM&yL^-1?v zO$5cfKdH=IDYR#$eg84i%UR=p{2WvnhU-3v!1V>YYqJ06#%{DeK13KP*3NB`>L%ygsuP$!+#XiO-!OPTsT~L4VlZs(1m!| zkM{Z4&Rvds5^u`vJ_kj$F3IhP5^Ug`{6WZjVIPXu+Bs zK4ZW%REdg15)YqJMd+oAq1Ep}M=Bs9^1Y{$I|*`|oez)wJR!P_uj}l!uNs~3g&ksp z0c`=N9K-ensvnIhIiovmX44=z?-qL;P8<;d2te*qekbG*9}3d>sdCY58{FUm$j50r zDy^=|)a{33w3#)t?$60kV-`pSo4}Z*) z58Qfy?OZNAJ82U% zS4J(u$B_m>u_;_)kS~4Dpt1Z%wi(kP)#)>f@q^Q4$7iXgktrGp4Ds$}ha11)Ibuw(&u{*sJ{| z5O^M)x|ws?`qS5C{SQ91n&D4%3cY-?lKQm9J%*jS?EI@eBpVrK<>4!?QU9_`vJDzh1)0TR5RXedS}aVI$&mj>v!mPY0qa)*XaUXbdEQWOfAo zX$@Q-{c{cKIG)X%JCWK>UhhIy{k~wqf+pgJ2qcF~ho)6~VlfPxa=cq1AyrpUxCJC8 z5HN`j(e0$KY-SM=6Zg7Z!VW0>S^vFmeCyUlqaGy94?>xio?c6z2lGKdQ1F&~+1kaz zZ?9gMz+Ap3;&^n;iAgFyhAs<>Gkjq8)w192ByuBOycg3f6-NxU7iHA5MNnVzo&j%CNP_b8PHxySL zk>HgFWkJiI}r_uI`p)fC=UTIDvoOlwwW0;4?yW`$S)W+OB=NL zp})rjRa4v(0=${KxBJ>7JNs2KwvXmlNGV2Dwfd;HPVF;2ei$zYkKSv?%Q0isp@7i^ z<0`496cU2`hgnnc^B5ia5P7KhZ-qLJXrY+`PLzTUwh+Hnv3Lfv|18Dz@zR;iNvW2Q zd}1sB@e*!HT67xIN%<^@BMof}*$|#C-gco?Q0X0S9yGZ6(1>^mv?Ym#j+5lV~ALOb%VgQ=Dg56@#UAk zh=O3(+OvnSFJ@r^<^2;)gGY2aS{H6r3H+7@(3lt|2v{{5EYZDasj9A0prnA{9@K%L zZ%Dlhz^qXGP>S-{sHBbG7u-nxvH;zSk@l#NB2p%){PJTGQ;D%)=uN$&tYIaz&mJMT zmuJRROq3F+uw?rp81AJ`ljJ#2Zom3diYKu=VbOAsyZH4dM{(;a2c|Qd!Wf3H&Old| zYqk<{lRH@C9bNXy0>x&_e`sD650dYa#)Z@aHocy9CdHs&Ag$xpvWC*DCm!Ir1-tb( zk;JGEBS7|e#f>j+4#A}RL+Ss6y*Cfbac$eiugaXv!;&aVSPirc4Wd;Ui-l+u6}2)H zl_5hknCD7liiBt$NF*A_Sco)GG%eA9LIaK8ew^2R*Bzec`@P%uegFNQt?k{OXT9sb z?`t^E^VpC5*pK~C;pEnk!X~n}5e|eic}cpVija)hTB2#{GbzgD_2JrgaHw{bJNars zd!w>3iee)Q|Ay5y$c!Kkt5&Rd|Mu-4qecbgI^(@MF6`ce2uwixe;7Aa*|g!qY&VtL z>PRXtklMfw$|oQW>aYk$w!I)7Ri2Yy-M&l7W9WGH&aQnYVEY{!GRefsy(yN8CnPBV zq$*LHcV<)ZKG-j>tae5&?0fj|F#Y-z+2#Or!k5xR>2JFD97QAALICrFwcNob)AG?MLncGX4dDR zJegsD90yN&&4aa0sP`p1(gvpH2d}^C^(fN^?H7rng7Fp$UEOVhgMr{GNt#pva0zet zRO4w0F&pAB@|#7Z&XmRwQEAw^C8T3$qBnv07xX9twSs&rCeM_UDS;td=k0Id6Kb-zOK^iRLn9o} zuxw}FxzEr#Pvu+Gl0vZ*O5DaZ>P(+Los^vb4I$tpr_-`R5hC*F(SDQ_`2>>s`;dD6 zGvJ;mT1w!ZpV3S|7|%U9J#oBCROg|abR;@;f42Jin@gx}ltIVw0?{cH5~*o`dVBph zl9mpfIu*HNA$`QJ+hOb07qm1L#5YKZbMi9mQQ&38je5v#3$dm+f1CEXtpRAWUHjg6 z1NKapPD*nU?iF&$yXl-D-2#p|l#l{}gcW6a*h48{?BGvTUdSV;vNK&>Lj+~g5P48RArFcZ60MIy>AF+(%WZ>$ z0?)elx&+G0_UTE$L!{?2Z!|{eg9A+jM>7G2il?^z!*PoI8H3-h>v$R3l@t}~%{r_% zjiSXLe;5E(;Ye>3X0Mrxdi3B{p@%Y}$HceZ;~vx|S;j1zb0|_EG!MPyfbM2|V8QV* z7K&QSu`cOZW)bMAz$NQIcxjw1!O0EaOAlyXa5uTKt)@}X7#D=LAW}x)ZejNArb1MQ zv&ku!D9RlKtNrn1a3<3V!X7ziq|fsU{Sc2-+#U{-h^^iLkfvn`4?w_Cw=kWko%3xqm`<@er|Og-BiRlk2u?lA$3>oKdZR`y*^hy1zdAve7WLBsMA0)`1;p@q%U`G ze(z3Y^H3nK{L#HQZ|`thiL@QmD<)SO{?CqSk7Vg7qikM(wVwBByb+@vCrKyIgebLa`zXdet2;t;;~;(2OCnBREs()ogi7v#=zJptlh*r4V2!H zf{!{1aoYZI$pr@ic?3wd{=-MjZbu_d{+%x1=}0UDYiE zD%B$mD|(!9uIwA7n6P?}biwlXUbbhaO?vATNw)CIy1Vb;&tDCS&L0?q z%Eva6f1!e_=`xqv*%(MfBVxZZkR-*!x3>m#{z@E|L_;7=Wd}`@mN@s4iOS_Hr~iJq z)Kmw}xk?i!zAET=d*kP;Aqx5S#OPorsJbH~Tobja(!ZNmOZ9<&wLiYO5ZLX`Lc6A` znhWuQoko_ zHHscQ-RH3BV9%k6AJ@_?6nn<5@_rc8)qnD?IPl4hf#?}I*5Psp1cumk(T_nNI7@L( zscBL(7pb{ExeqwD`0@z>opCoIvwkI=SlnF&J`?4*Oix|_T(~o5u%~(Kq`ly!J>r(C zGQMbeFjlynw=e@Um;_{(gkyKk=F3H;dn(m@H@iM~JMbkOi}p$$i_!f(eI&o%#UC)* zr^|Wh_rTc$Zr;2Ks?%-RIZ{G;xLU5#P=q!WH}z%Q1M_Pu-@8cB&Do_=+ zKX!?7!90YVJ$tr=IgWm9NtXhLi=DWJTe%vlMfWAI+P=t%%)fqK8fs`RbEj|OnNd=rtGrg{$KwnD}9b)AeruYR1}a^bV_w4DLj9`DJ7>N2C-V93kqwR~MG~ z>a0$ve!eWd^FW8}O=TCJI9vX!lNA2>&2Dki%AQ=6l>y7KUcR4M;MOoay&^JgZo~_A z0eA1<1sF>?ud6xcU-XC={=Hj{ZI{3)AKM?5#Los2+>&{GhW7HkX+i##IX5+E zoM{DRcTw~wa^E9v*=P;aXAKs)Ioi3@S`}$V6?NJ@96|+NNuvJk)%D88HH*&Vfb>?R zT-Bc7HeLU9H`P(ZPL1AXXt zIR7D~hs3ROT&)=ikT?f0(?_IG2VYp4*Azk=>&r5fSOrG}^q}?-?j>I>kGsuo zo%5KZTM3zSRUiI(OnErz@vV2}x$V0^;BOJ!0&7ALksGe0c(?DRd}}9e$&uLG z9qHw$E@kNs`*JL7eECQEatZ#+2ja_3c1UnrlzWU}s}N&vb(*18P;$K~i~CR$z!wEK z6?{1tok38gOCnlA_2hroR~$3O1jW@P$?Z|$g3s^bKR*EElNCN6?CHB|iI#iSTLpaj zTk0&sN@FS3!zQZKe4B1~{>tRICI9w=e*M^$Z6y#CICe~+mCh~kLdfm%eFxuqb_h3@ zCe8ZI5HaybkS0^U(%fM^|tMSKy2*K%=q2 zAM*NWB}da()h<@EM)7n&jNr#(+kPDJ9*y*CJ|XAHpiB-G7E}!NspMW3uMO56C4ewg zgh@b0HDzCa>H@S~whRZiK597AFTRI(*bK0lN;0W3^Qe~~2fep4d3!n#0-uwBC!O4t zscdP1E@Pl3zneANrpZH{c z7d#D;nm#%@Bf=ZIq$43BA~PQ15gYRq5GKygbUUN&VX109iIW@KA%Q}HhpSNVgk6S$ z*mi#Riv++w(afbqbPj+~nv5gjGg>mjoHS&#u0eE`fK=A^ulcils4tt|4F%Yvr%x|l z-GtUR60T5lIJnl+?!7pVg}M$D#Fm^DK6W~g2%K+ze!ZpY%}7Y!lu!W9f)-^3`7Qii10B#D@S$g-K1iSj z7%X_aS3>qN`40B`aaArr?N)i7EFvZS;wLj!8qyV-FHYFNQTseTEFLwT0CK5nF;)EkQL{anDp{(K)j3jZuJp;!+cu$~W@ ztw0m=27Q9kW36}ALcD`>3EfR7liSxr@-sr8bcY;uKylVzX}463e1!F=o@z%;0pl>Cqwl|w=7sBeL3&gQgm~Ut!2U3?;Y9N zFncN};&CZR)`D>FA=pf~BI+b%J$Tfho_hKwCU8s1{>U(?>bm}W}_)%gg!N%AXScpvuH5rZU~ZNu7b@V8VPJ$cw}60 zH~kD$EH}DBaLt;5K?0!=2Syj2SDrEo`m^-)=cA=wF}$wAs>K}Tq$BdM07(k1I!(?g zRMR%q|C@gms5aw;Js?W{Byr~_8 z-A=Kft$6>Pg4|Q;G$VSsx`x_RiKd~33giyhZLt`{hFa{jbbWNBqPeshcsi7B3lxJY zI+{_MT!EF)Kl>FXiUgijUom9UTtI3Y^Y@ffVfB6Wb>%!Xg%_7g7l-7b>skRk`;@mR zc2e+MHG|8*y@fn5n}~(6CKB#tIC&zfn?RSYt?UV16KEiBnD~t-L!CVbxu&dP0^(Kt z;|i<%n^$5N1L0F8(mE8mc3+0iJO(Q}*nJ7@#3lRlMSXOBo96pR=Q>y?{ zA!;4WgAe(x2g48VMVHfWt_d)|K|R>Zq$8*EA-p3GwaPDDLML|{5K2#Ueeac5ehUe_ zF_p(Hh6kg%^cx9^x_KevIzB1t$~rVZ9k@q)sLtw+t|^B}ejx&lNX5W*OlB8F65;cZ zrR@EoF+#CJ@>C!n9$50?jUPT8q)hvb|8$##e|XA+EIfxzJh>TgZM!B(6Btfmz$vPs z_TYxjWlwJ%&y3rww`D`+L4ULzo1U~sbJT*hv%X(mW}dP?X?{vr`mnJ#CAb5ukE>_| zT_Pk+X!+6e!KmVN!qPfZ2yaRD;EHGVQkPkXZm;ME0uUy6Wx#6|(OC>xb ztG*qOb+cN1D85l9MXg_)ixq4}y3k76o%5gUb2#qW!j=--`4uZamc`}OkxRR{AAE{Ag6Jk#9n4R;iin{T$V zJObZUYxd)JeaJi8WE%I>KCTQArWH{F3K#Fpnd2I^q4UbLOHmdHEh_c^?A%>|M8}C> z>+a#$!{G*CL|V$^(QdUL8620oj>bP_&O?i*xayL{)+BpfYW94j66eyg-;R9;!8~IW zfk!L(onrE2Wu7U@@5bjo3{>_0(itH5?Dwq9>#JTwKDF;9L(4lOlZi1>plgLgo6{Y0 z0ox&0N2N19w;w?nFx07+{0mtoK$sFKBYQW12q&bJdye5Y@hl`;lsl%S64|j8_-d2} zhkqp_vthmjLlf-s{sZR2<;mi)cI`n+8DtY3{z4?Cyqv+r+qMFwEfS7>C$twdT5{ei zZaI{X&m9st>8s^}f8P!J_$pz%%iQOmENmkcaua4hQYdLr85XhB#!7q7(V}uKoP;sY zGSN$z{8uXkMLk!7)8#Vc9nD0v_PY?wOYZNNYo@v-Ps-uCTM6t=i~xbG0REa2x3=tZj>zoAEFV`?YJ2 zoqbuRy2XN$Yd&v!xqR&4KmFKt#PtTt_yu`z{Fh@XGTDJTka1HmMF7UOck!oU4E1xt zV+6fhktDSQBlTs=!o4;oF=8=YIka&Q$wMcqn3#ZCm}}OJ>T;RK5Ne|6*>8V|o7}bp zjk<=YY)^15H)1{O=y(LEhek&+>G*Dqe?9inlo&~#8ktycw;CgS=Vspk?jYz7dCsCUuVruB z2-e`0XV)8yhX*6mm7BYey;P6B#{?0Mo#KLLF}#_iZBftz9*Tr+&x_~o+n&%&(ctc$Y;n&wOdo{zxnEol6lYZAMRM7m(A8ra>mvMaZ@XDeOdq4AFb zu`aZ#FXfv%alN$J>l6mAyVP)2Mzwtu5s41BMCF32=U+}?>X#j=kVk|_>*51 zg5yZ;FGgLZ*i*nc7|ZIX27OT!IB;9cV@_K-snfjI3ZfL#Lr)8CZj7QC*!rXcT#tT@ zHyiR+lU$Qb|47P$&d(z(0g8uyIP{hyvdOenak)`2?4m-@Q?0ti)c-ldewP-X+inwk;JHFmnTmrgJ)4npN_xmtG9HE+fOe zv~CL;Z+mWmm}-PR%lK~>wR(~|74-mP6gO=WYoTe6s`>_1eh4Hn z=ta0_V!tjFEqAG>#(sUS9qfGIQn^1Q<*(J|KQW(hc>lE<8(KbUuX_IY(S^UWt18mr zLhCT%W>SX?VT&LEldx_FMi^udSpYq$?uVN-)ai(L*bz?@zr;2 zb;7&J!XA@0IkvZl@NC9mc*w9e9Bb1j6XKI@1qJR~-^Ay-8oxwUIu^qNw3@14@MMus zAf!%4-|i~C9Qf+XnJE#ujkk(|ZIw(b6Posnc5(Rf2TssF8Q1Q7ba5z_%#ELTe!!q} zXVqmcs$ZBPgK}@-_}2K?z5lIWMHspgC@ZG=AZNYjH6IoxcyFX9Fh)=B=9$>q)M=S2 zQ~CNv3`(V;w`$?l0d-09s0FchCF#q2M&I13V1K`Ek$a}p5r5Mo*M=As7rRQb3X6sG z$Gp+Pr|3JQHmiQQZ>7e_2iI)qwK0PDs5Y(`NzJ&A?p)lYfJHkVHM(C_MERVeH zv&~VM4JzovLNa8z{S@mi?OCh;ErK~P4RaDl>1UvYLUF5m%V)IHY`HcPv5jx|1Nf8c z{grT<7qBWJg6IcRsKUTC0Ma2V1|XuNyUzp2JCRpoo;NLGH`tAB#@CD#`I`CcYkJbx zgj3Yw%P${dj!BWo#SVP#Ts1vqY7n951(U7?&@Cv}HKTI?{Xza)A|EJ8Aja^0O$3Qf zGe~roF^V`^g&fYkRU{13_X$4th`_@N0LJ_w)ya3)tR-a3b4XGLj@x!MzoNq=DVT`Pk0LQl@V+?=f}7! zs3>t)t9UF|!tTmo2<|FJ)nFq@8$ibRPI4=}Og(CwRp1-~iou_(Yj9r8r`8!#Hk>{! zLxno9GT~pHA1LxpY(D!B9DowwL*@3uiM#;8>5jFU-rH9l5HdBFog+L)8C9Wc$Lq=~Hv zrZr8>;!abck7?8Rw%SKm_O-Hpr&$5$2(E6x+e`U8tRR6O8kz{wKuj;rnc1-7%)SvQ zK=tdU@3X+ru*stPWE%yBRS*)XvN9AIak&})M%!U8D8QEp8U-I3+}qGTS==a$$c&f z$0;l$l!p34y(eqhDT#2SD02{VTI$3cjtd2j5o!Q(lz_mxa18%a4h9|3wo{r;h{dE0 znklnpC#(eLDQz!MMpK0#D?@G}3daSU!QF|%FR{j#^iCqBCDYA7@{d*=@Hc_@k6lzA zI2!bGM|^s7Qwd8MbTlKg$sXmAX5GiUAV>!dz&C{*X&BxtQkxJIOGH+v?!BB^u{Dob z{SGmmBJbTOcs7@k681Ta3qCxD2r?2hekh_V^;SXV7eK5u$VjNjLZDABF4u%-^LYq* z?I9I|CgOJQx1wm4Ejxmmh6AXc$U{w@NJ6^S15mS=rXZ}xF<3@MJp{K9vSDjty!i>d zrr{p20N8c5V^Y&Kn%JmMjiKb`VBuPmg^o7eYI6Og|8MFRHMr8kpC_~`0ULfLxpb=9 z9R+@Vc*<4hMDMoH!H5HXH;h}HFp2~4BE+0Bn}C-$FRwH(L|C!EJ*@X@=Nt=FO?MzC zvW<~n3FD3Da79?3xBB`@bb67K2ED0&JtxiesYcg%1$xRuza&B$G$y9VE(s8oylRP6 zg<$N2bVUDa9Y|**nX0r;T&KxA$;6skq zp*phyS`n)3poZ~sZ6!(z_k053O{3-V;r?JpBY<+>B*k0}>bPB!%n|8}%Z5ZJG$wu5 z-FEQm+lXIut=LhmPqZ9I<(<7O)1c5XCn2lQyZJORToCVX+n0M!ZU6G|R1c~sqo7NCPQWcJ=Gi_-a?FYv z8oZ(wnch50BDG)w)o`XYN5caCd|)rOqubd{9q(E<^juW^`tAJvtG>@YXR_KY-zoD- zf1E>Imo6&Wpr!t~l$)=v-9&+DPMW~J+A z%akbXIygfcO1~QT^~TSD?Vejtd)3Boj>G5uAznQD+51lXX*R(x`qr9RK9nxVJqKbD zGC-EuI>idmk74=Uu*zC}T3oSpsiiU9(5?P$=Y;P0w{+WoUCGGo3uB&2x}%6U?oLiz~tpl$%|N_m?vfB7c`^rRM=N(j@E543dNW5y`=Zb z;#hzWCfNel)yWd5U2ZR~C~W-}D4A~czuS6p>7FlPR|I4uyrQPiZQs_QNHyCB&2aN+ zX~;Tf&i9Y#8oalS7@>l0moY-5FiTDEE~IS=$u{gg66-6Fm298_g>?1~uZULC$P(Y~a|)H+q(th`JlL_Yh%Fsr0Q0Mn8Bl>q@FLT=;O!4>k0K3j0Ik`>MYF_HcGD^}SJ~!67xIFP zE6_Gu1}lPuJ`&g> zb1ZI^D*v^-rp7ppS=-J%6b0YYbJTi<`tZ%9KL#Rs#h?BHNFjZgDR24Cb{LZjdia}= zF;reAl>B%&4>(2DLjiQ!H0&2=>tdYrF#Qyga!&gX9){kG`G<53Yh?k=o-tG{{Gt&! z(fA_>oyxQ3y-zep=-{^ZGY4D!QB zlK8i;mg!gzvymT(q*a8$+w|pV8o3mZ6COaV5wud^AByXI3S<6fyx!!^sncnW9*mXO z-|0GP1px|-7=d*ZI^Whw4H|d1vgGzC9@2{vk}MKw>3-s?d01Dg_yh)hFl$%&uYFEZ z>t7jQcTk&myT1_nwW9U^0vAc&RW>N`TKaUd279&qEZLz>_rhQmJ$QD3=84+6c#v{5 zBQd#A%7W?;LM5MzeBdt->jW3ba*^Yz+ZC6p%^Pi%xR|7kL|Kp~8_Em(C(H6WioGNl zM6t~jRtgXrN0GB6)CkHOp%}1tMn}|9bi33*y!`sRoSvTWW*ASTvzjk(w$-IXxZC&{ z1|uHl)KYTuKcLc%mwrdjkntb=6xVq%!L7vU*1Hubh)P*K?LU;VLU(Td0`+skdK?zz zFpa#45kHL8*dhw+$i0GsL} zH?ECDu}&}dyT z(A16x5aseo4M}{yA(PrQCLak>ybOOf{RKGCm56C^u4vBt?ahDj^m9&Haw1y5j7`6` zHOL@LP1{k!?$v&2&SPhEgwsubzi->GId}$7pHcc=YG&D!V6iy)_Qz;Xw}9y%&14oc z<)#uYEsQP=ry>QRDiKj};wR8Q-t3`=RGrrnoT-))wah$K5fIRzj zbVjZ3q-(Z@=kC96yk3-8mYx&5@aBC*1;#66_3dmyqM30OHIU^X#Ji-n3;Hx&snn~99!MSX(mkR)d0`gjZRi~%-3|xT>k?!K97v8V(kn{;w6yUfp5yE+V_r zbRV!ok=1@$Yn(7A8v*C?75W+b`ztX%5B;>MF{-x*v_p=BAW3Ej211p87*o!9<4;}z z!wU-T1(=9b4fL)y-o^r1lc7H<1f4VWNCsmuj%jUWI{MLlNEPIAYn<59sL`uJ3K3}B+C#`b z?;aWI_S-iNfAaeG?%jj^SM5e!Ct_LuGatz%D+rSVMk7wcNv^mTV{@o`4b3m`3k!>m zepWf+wwRh^o?Lm z3vFZ4@eTu-{7FQ!)%pNgvpBZ*8s&C0p-lUtuZqa&KIpH=P7XYhEKdJRNHco4BAub4 zsz7P=nG_lwSt(pVoo>s4*U23IG2`tDRNv^CS%yXvp~#6*ns-GhO}D~F*J@cElvr~9 z-1rc4f^l@#wgjz>JRyh`vldo1TkFT{P@l)*4di`btEqm>^xTI6P(SI_ONg!*83c6o z--tlgMcAGK6brca-}ydLKX`-+Yo7xIwa@C-{1X(FCA$NXlJ<5^OH11Pu2fROtZ3S^u5ZC0c$bl&RWpWi&}@F<5(0P9|=!MrpzGrv@V`L z#}r}Tw#iEDrRjLZmw)4{hv-4NE{*D8Ylh#dac>vSF^%nh-L6ps!WbgMMnC0}hFa@r zVQ$Kf;=&&l;y>+(@}nhuv33YDN>kOJ5?t!Z0!cwqc>zf=rJ3|0=|F%TI#d3A%H@Xx zMj-BHZqmH6{0}DXZcmYj5v$k!{HZ!Ej2~kK>T-USBYQ+4=qNR5{XmX*5UWl`HCQLG z5HmJ2D@8sxOn6MODjHW9!5nA>s-n?MRkTec2Ae{u4pG>yl%@E?xC$k$HxAFHFBCq= z64sX{7bi?^`C6G(Ugu3zzA=_kNXgnF&NVJ)^^{+gCHP7`^)tx*A@U`tl!1<%{15fy zF%bzn?wE+=Kk^*J>kK9F6t5u>RIH#O;U!(v(?N19K@o9*pxDFpM645tNCbl9Q>+|^ zN;O-9<6+t}_ zNURMWFb0UKjcg0I>-r#fk=A&#mhNQQ{sKvzk~Tmm@Kf^SMNOiWtX9=T)mdJiQVUu4 z`49m)0QmWE?PKZTBc9% z>OTQdhC+Jos}(Ozf=fwd)mM|d&{)TBJeLZlI0$-dFQpmoYU+UNcI zA^zut`DHfWB4o=daBOSqG#R zbVZ3q44-23X*WJ*kB{5C3s9>1(}~UV%o3!ai}}X_rQ;v zFOFBiwu=G`HU4K3yy`8Rr213Ccn?xeqa?_*{TObSMwgy9kfK1^f|+ z00OZx-VtB>sa^P#MJK4MQ9NK;{th0(P$KBl#D@M=<0Lz8SmR{zY2hcBe9k}=`oU|s zov`-841e#t1XOZsd!{IMzV&mSc}URR`5zDK#yd+=Jo%1^RveFbjfS9su4fJ( zF8bFF_97&Xly815;W1qxjRYq9`2_z(jFS;*`ol4&{r25E7;Grv4|Sljvc{8=n)q^F zMo%$2#h#R^vjS~ zxo^L%Dm>o){G|{D>p2J;N$<7Wiiu89@fDPactZ=8=Cmf&*D<_@b|D&d|B=lK8?8jZ_H=6&FYM7IStlR3au#A_D=iG(TXMevxC>(WgKyHPpKWR=sY zd~QUn057HkE5O8bto5lqueFwyetWmCV0yR$D^eUGtZ0e8gxuCg!x*A(S2l+R2Hy3$ z;^El-ygu-7pw2=_i0HFS4xX(8XK=X;soodm z<|31Ya-Z6z2C2iXI8~(2ZRJDuog0PUX(Ig2*o~Ez5H!p~Gor(dI`ZwK5f3QbQtKs+ zbGczWVDFZ8(tlW^b9VPdDo9~7&db?wpM<-Fw-JoHwwcC)pwEqFz*LjFtB;Ync__^o zr1n9wm!=XH=6$sU!CZ*{9o9Z7sOTxqOysQD@IP9ZlC)iDjBQ-X0=@@8LCJN?`QTHw>DP~49-(`->l zXY}>mN#i;hY{?ezQj8Gkzi#!{qs+CPtgW*WUAIubW<81~&hWXefc`ZLjwWTx6y*Ng z{*nknLCSS^_f|0@;n~EOCcAVS*QxMy`|4z*gTGH8l#OJ*io&f=AoQbQXhd*0F4o6K z7%zyZvZL=KbBDHkrHeGKc3pcpn_`aoJXRthZ@D2bY$J;yOzQBA|3gBa_fvo#jiTKA zb#EmDlyMphirqMkhX+6WP3Hp|bBJIor^prF+bD9iKRC=WUuo1ZnJ1!gP<8W{x8o|& z9vEjlK##Xe03%K%$KTcPrE5h)q1P9D=M#~v!!oCfVoslAj0T5pP5!z==fW0YkYhOf zGPZ@UptX@tDCUpFeU8V0Ev#nCs%}q>ePW2(n8TZH$t|sY6LfrA!%R|fV4H|U?E8ha zY=80}SHOC*qL0G@r*Mog>NB4&BtE$$I228M&^^d;ete7DMa{g)#+Yb<=TJs-hQj)I zENsthCBfCPrCkJ^zwV#z0h50Sd6AA#5@M7*`d6vlvi#-c3(Zw~w5Js`peHmGW0lIW zmYr@YFWJqixST-ke_I95)}eJLqtWfcGCbRRbbz7RN7(5`8xWl)@l|&uonOpRFN68+ z3$oKihyS?uGOpFnU9fId*S-7udaC#(Gu~7V1{j%(q25DdJ zD$adJ9(p7PWV4%K;$8+9R)vjoVIBuhCv}><;aeLAJEo`^))|7^1$acFAiWxnn ztP&0rp&;eV(q$DK-mHK(G|g06h8a2-R{#w>?SC=_lH& zbw4(V{k>i!bmpk`>G=JQ>sv`-w#B?11h>&HZ11tR%G-#38hebpsE1NgNoqiWdrJZ- zGVq)6cxt?~tnB@g&Wl76Gi^KhZeMmaJRG?1iSV7DB9KxpK1d>XF{^EoP6Y(vG3~`$ zzGR|oiJ>0BDjPU3xsT_0^Y=!PJ?j;G@0QY{QR6W!lBixK=o`RLa7EG zRFs|Gpve5bT%k6riF`h|m5&ib@$oT20_Mja@gli9x&Uz_MzH*7#xU7ZXfiXX1D>o$ zeX8-~D(1P@AE7bVG^CCc;OI$tjl0_4PFK~t5*Xkk2rGtB7-1E+=b%_-D?137^0u)k z_ehYu0;ISYTaksyN@xHQr}4#sfzu!+&!o9Vm=SYxVGr2ch>EL*|M7632N}w@p%YS_ z49dY?ezg8W-1^Y%a5C(eanH84jb)mLOW#@dYHJ&EI9>==2iH`L$Hgr z?0KQqNXCfnzX8Yu&9-@hi*xLIn*9{9Xw=iXV2O5$s!-ssP{Ln4)j?(b4r2JOAqU#& z@Clg0T%dyD3$!{)TFW8nXY)v2%$@Wk;)>1`(RNGyRoF9GlveZ92g*^00&pTf1^Yp~ zFO%h=`H#L8Jte_FhBRMe!m5{l(sjZvm8N)8*9in>f74_c9HjJb5(N3pgn1Pg?xeaL z4?(aRNj>|aE2Vccyn(Bi|A1={X-d7P_IM6&lOT8_EFh!Iq3~xNS9$!{F}M@Vfm(rj zBMD>=6QyYny!2M_NNuOAN=29yh22EW;-EPyPr@+xyJSnLzYc)!P6#|3F#u^BhLz#$ ziPuMiXa+*HziXL z?P{!X;8%)xF`Y({&M6@YjPeySY`%-1NZ>*CyvS)Jq7c|>&hO`>oGSUkZbSM=?*n`l z&IBiZ7^-mSnnx8>D8Ts1=ZUoXJF{5bt(PRu)e^XV3Vbz%23QABxS&G}^%k{gf1*+E zily<_rOCnyYWnS`Po{>N21kfL59u@|@LVJN(nUkjG2)_=`}*{}+^>%u+Q@>s`W z(dar;s&U|V@x5n+Bry}BeA{(!+q549%k$Ld(U@si0$(B9a5BEJJl3fgF|D=x-<1EZ zL&EQxNJTG!$Q!uddiw4TcPJNV~DL1s+t$dFQ&&fJ_lkgls$9kN>$*EJaj87VlZp@^^P zOaLgs(cen9V^YGM7f~OlKAHA=Z;IIv;z7y*Rpw_%kwBnV@<|wT?pty;i*J~doZoSD@i zuLaPs7VSOzb?oF`w^IJBT}{k8Q4z!>)A0uq>(M;x9{S?gG74SqNMl1 zKR>Ru`Il*mi^_Rr4N|-Miv3EF25`MRY17~?w(s|cBFYv0EWFNDJoSRKpQ>KN^Km%k z#vEnbtiT5_J?n{K63r_rdR*ck(W^+Nh&S}&%2CQA)r)Z$3KLhwDJ5nc2@K`vO( zbOFkQ2v|U;duq{$Z97|)E8T<%FNJHEF`zO*3XKk32T3^HU(3@afQxzdapAoOv9QH^&5HBn|c#E3ez<%%zcpG&@Z_O?;WKPD+}X11}G& zyv7KFAf$ZLt(O1u&$l?~%o*No1-7?dp;(VE83zO>4Q1X+C&z!Xao-%vEfKP|+jNBZ zM!7RgfIbbkx;yfRigmiRLAyZe)N_!;KH_koB@mh<`lz5c*ystXJ5b&-Cn2`bgVdXt zQ)9Gj*(Ee#8b=LX^JlP#q!7wLs>D}yN|tHm8T z*tu`oj$Mf_Ge00RDG@@ueyn1WL@Y!SIcNacIus1}Gre7Lv`P|Z$zWmlqjT2@T)wqr{<2mwu(lb zy}R|h>VG-+_A;kXy~~I8ua4NOv*fDb(sBEPu3b1^bN9C0^xpGyl63t?v@~hcWKlGdJli$U z@?~h!Be6imw0qkQ!SeO8S=SofCk853jwi2{4%8_&E9+E^zL|l?;-wUTj8Rh8+tvL1Y1Ck(JO(s`6Akqtbp`HLFbv#BHu@N(2>s)$sIeXsO{QqwLzB`j zUjx~<2aR--xIQVf)B~Ufy%n7;rR=y^UVMne3jeelZ&JIHBSyS#Xm!tm9`p2}Fg+7E z=~LWPv`N-Kadf-j-uS>h6Vn8;FaVk6!Pa9kMdf>q5ZIk{T@fzyp4e{W-D7%P=743Cc-h~%9RD$4X@Ix z4_Gx$>D)u+8HU9l*?ZVyUHDFy{ph@xR66(9!9gK=-Nde*@paH?f#=lH*uiG`ae5Op zJM~Jx*Y@pM^)sjRn3uJM2EM|xxD15qd<%;+cr1q>uJITz@_pfhLJqo#ZL$$w?I*h0 z?Nc5=BqaPtWt~D^YH!t^OboXc3?*H_jMP9yO0%~R#7Q{XTz0nkQRN!C()xg9dL0wN zBJ}!8@?3su_kqt;Jg!~NlzIt4&edbSuji^)4ICn&C!_SnqZxi(cV?;UWi=P&6@}2K zVobW(L-QNq7-K-v6D!F;5QRyJJFLadLcC$3)3$N`SI^WG)+`nch*p5q5% zviTp_&3>RKen45|2TIrvjDM;z6>W0$$KAgVq|rU($~HpZ*w{EUG}NxT8ND|5qMm#7 zrCV5zL}$&!%ta@Q#OpggQyXwoY%o&(V^@6gcAPqAnV3Ir<@2!~cQ0p1mCACQin8+# zqkO-rCYuJgx|;=M8^p+gK4}Sgt>aS@dU39W>^g4VQ0L-suDSzs=L=cP6~6I1*%MXIK5=Y_pL?{CaZxTmN+8`%(;YbokZ` z`%-)IJi)~D&+C-EGZ#zMm@Fgx+ya?DMm?C3#CblM<SpXH-rk zgI3?Dt`-IE8Wz41usN{28lNhe>&JwY(ysm_XWGafW(&`eh=3>k<8 zot1Q7T;cYtH36q-0hq|Vj9W1X3u&@s>**=hbYZM!r*=!Ly1VK34VyyofJZC#!(oc% z?ju$nifW8ezZH_!*+!jjl9mJ-2v4pIi32-1MF3x zJruRbQ_G&5x`;YtX8K`|iP`%l=&;O=?o&Q`z@9&`*zU#%4obR!nQ70*p31>|!mRA< z-3i@yKE&>H!R{PsN>{nG>f<9rpQAWC33Y->h8;|SKJh)q@aDqy=$P`t^Yk6$UG_2GiB8)4 zIE3end55QSr?{dh#0B%;1S#@~y?GKN7mmg{zyWq=R`B)3GIyo{4~T@*>YkO`%YOp{ zLF07Hou9xR#M00I$;-Gg=4=U^q@NB`q{R9enrc-?ix-_jm%U?uuaW+p6$*(?Sq9F5C?g~j>n1#XLOZmi5E<5Y0q zl*^C@>8++{r&ATJ$A_+Bbx*6F^Jqjc5&bQV=`AZ@th}ZG6{HvB?t&>WtkK%Dc&rt^=V*Rfs@lLX2Js& zc%G6;_%m88F;6vT`&47QmF^zwpi%C+r~9Bj8w+Roj2kzOorONcpwbjMOw$^?CuqUZ zw6-hfVIz%lq)>ux(h>S(Er+qBBlIhBqH@qv%2Gob`&8*xHwh-h&jC4NMDSSYppflu zV&Bq*`1B>ir`sim{7ai2(bO4*P8u}1s=5h-(ic->CyJXdoi^EF=nk;h6u;$ll?7H< zJS+SvCDd=6$`eHH!GQ}}syO#M>>%~^A}^?3%B8p)ca z86L)YQO}p%vmT2-{ROL6M`XNskz&znt8LpeU;0?Df3;+?m2lT(IV{=y@9(`Am;OeB zXh-P7gLcK2hMK4xS?=qLR9~gRJ&p`{f|!*5w&Lv8FZ=LZXy(XS)9i5;Yo`pdpP?Hx zIb>OoV_jaXtDpaw@zY1G*PNShV0XnSzvYSrr3Y8%Wo-59%;^nXnU$Zu>_d3&#pTN| zw&OwH%$uf;7UN4Mm7h4PV%%^&@gM)*CPOEKO7MG{dG)LPFl<}~q*GRqNeS6AkXeLSm9V#qco;616udn(aUrHMWZGTuKG4ssVlSNzs zGGt@pi=@VwIPr;WWhKV5G?!R4Pp3O*lD0QTD=XZSM(7WpaS*E48FaCByNwDf;Nw{o z6CJX|cE-31xbo;sDGf}OSTS1ZhE~?iZB}?oaGp6FxGd*{pP!O`E?Q{)-kn}^e-Qa; zSK}=yBKfxZo@!bR_wI6x7}t0giy6LdN1}4H4~Nb^?$qP>s=UFeX5)L>G5~!wR&=T;qfnTn^?uHUgx{4pZm!?$4!OiB^#d@ zpD}k=Ilg=+?A@;U2YvonWrU3mjNxgM=m;Z<{WC7$&5RZ}M2#CiKES9oTK4<_wg~(J-$bp=cawa8Db;tfquEBeC-G7k=y{h$(=x_wP!LNX%DXc;nev z8c?I3fx5n5Bg*bI6`g#x32!!HaNw8xod9y>+S<{Pku=mM1H)gX6N2zRkSix)xN37; z&I^nxC`=YhIwmgPANNh6WXt02bl*EEHN1g&BVvQ`<^Fd&KGcw7l z#Rc91eG&%*jG*WacV5W@$ZqRKZk;r_re{l4PXyDi6&t{LOc4S9Hr0{=HQ{eJ#KTQN z65org7T^21Cd%D{O1U)J9>dLpF*IOJffeLP@-)Dp`%-6}$-;x(PM9768`M*3lOqDl z^!Rr^_(|k@+JeC*WE)#BLD`Sm=l&% zv;_yF3!Es8EiEI-S#8kx87=iuExFl;Jq+1u5hh(vaN3MU*3wyvvK9)D2mcwc?7<)S zQOt1kl@28*V17(n^$+OcVS?^*A^XYCW1n`?eCC}_`3Ir*d5X>|Xz(~K%R&3thw z#Sr-Xpj*`r+2GL7Sw7U>M)sf>bmfBC=QKyM3|K8REDT@-Ll5b^cXa#ecP&arPgj`x z_!jF-Tsaibd?H(Lw8ozxFOVOvIl~&`2v$NQBV{$PU)AS_CfI5$d%FW{YPZ|vyGvT~ z)vqo^vdvYUiH&$plhytGBgw9`p{_EA4vmU!orgX{=5Impm_{klK-fhNH>RUfQUB4= zJq(@7-@lLN+EOPYnFX8wEnb0@n$|8E8-DWn*gjDZH6Tw44GuP#KmV}i#<^z-tU~Ut zRbS$WxiiY_?Jq9*{>Tst52UGQ+`b$+ODZ3tIHynFMW;&>jpTK9j-^DY?BMvPE8^b4 zOd}hQsRsUE6*mi-B2~0G?{2~r%>LdmWA!nfyKvH--qp$^c{J-j=rRTEtnz&hum2We ziSDP?)PIM6QK*{M=1};G)qAyk^V)47b7+R@@~1L1k=CjqH>Vh(_6(*85YZ9~qU&0O zwB9h`>$q3!9Xc4|*d)&UX^qJ5t@#aH++fPfIbw$#dfMy`n=I>}i$Mw(tcML5Gteg! zx%tSbisu*hSYJMob6IB=OZCCSgb&zb^d?SY0CJwSEOQ~T4Jbq}mFJW+^T&;nB!T6~ zFIzX2<5|#=EuG*`hX8_w-IsXe7FeHCEgy(0qzIGT#WD+=|1CD7Hzfk6o@p23YaQEX zZSv`Rf;f3k%CiwFVgc;z?}_PraT?poS_WWh>JDTOZ&?Px@~itr3UZIkl=ze(1u26W zS}Ol(qu;=Rx`Aq89K$2x5NG_ByMB`$lGs`E<~df+gZpbt!4?clZZe;=#Pc5i+ZXZM zVfTi0sg{&$mlbJfA~zq06-11b+Km%9Il9cAv1m+WSlHL~7Wk?~_r-t6U$*NcaobxN zLVBP!7i_rEHp8y(QN;mk156ZN*AsV+@wRW@YkC}Ac0)rDGS2-KJgB^+V)T(tP2ycV zg>i{x7*!HOhJVHz#Gib~wQD9wp^CflqnZW>PH9>3;z6z0ib+c6{EOLg2qq@y zDogK(5{RHw#bYpDUB5#!`X8D>XA{6%^zjZ}B1!*(i|$UFx^+41YcOvOBN8&{Xu5Sp zNZ)OcNE=i;?)_Q8K^nw;^eIm{AqH?L zAgN7mf~1y=8`ci405in`>pZ@2?E8VZHau6;Br%isY<5Q zg3XS<4+mculH3lyIHf}(v>q%5O##AuCN}yoEHZu;^tth#n{JDX8CcSe8WA*~+7FmN)SfCkANMJGBeWX>+ zMj$RaD9OCba?3|mLVt<*vJM~DVt6)+91ONYIHVpy{}w;o+Gyn->y5`>ar7a)b5Dxn`R-fP8d(D2kEy zWkKUR^}MZCFNyw9ovK)cSuP$`3m+0~7M;F;MIA6opo#;=(mQx(M~ejSfMTltUpqQU zEdU6lX~3)QqZBc_8JH{gs#;Y1+nwXG4=!ImFT3j*Ps7UdMe*<6 zolLDfIx6c!^~dI$*BoEOth;pLOz-TDiHG#!2Q6*9{<-k>j;(k7#02x8fG!7pvi9y}Qp;fRrlqz8a;1YJi>vy1 zzZIe-5Y{^kH(*ZLOrN7iUR3J`fJWBO01J>e;XT0CGvr1=^DuQD{y6oiritgt02#sq zUB6F~8(S0qPMV1aqU!QNb__i`e%Bz*O8eh=KR>QIQG?%S$u7oL89%z68S ze_#u!>P~8+?r-cB%I#}iKL;c_2R$=~!4F>k*YzJU(yicaMa{gx@{AFuQ{?k%cjJL2 zeS8_wnwQH~E{e51GRyJXhN%wMHHU{6z>o57$bliNzG_`t9hq^kSY=&jgdD( z4f86`d>DU+{3y?e`}p~~vdV+y!k6k@?01Ld?m|o5oER##P#tVw=N@xk9X@`1lz#5b z>t#oDvaz5FixTl>&V@=9RG)p;gU9W3Yg~Zs&)+D5vLxvnm&Wqn*cIQn7T-v= z!h!lnH z9`eMDg&i1)L(vC9)9JQ1hO2&oFCPx-tA6yG zi`CYZsLhZn_Ck)=*46m$pl=cQuh^!o&#~B8hEtBp9&F$P>A)~F4`$_k6CDCng^$qw zP4buf9X*!ZINkcT17|UC^ScNdbm`P5C@#(n-w}}*3DT9u9w4_YYB|rz3M1zL2F$qI zYgJo8xZcI)+W_72B4zvg-IK%2lrNbnkJJy1h%k0>afy?h5+J;qFyYm-t-U~Vb~WN6 zS7YC)(0Jj(lb7b5&98FS)z#e_rt2;IhBWpKuam8w=@<(C8Q@p{hM70<`U0ha*n$bM zF4s@&YwRjs8>L?+yY<%NG{zw?+1{^?HvCC|p zijc?R-F@@7tNYr@MyUJ!@Twz=;Q`S{7@WcfP)NAy+g7d-{e*xOpco%0jPYqK7_Ba` z`|%pJXruZqP6s^hun%vl&lMv;942ouaE#DEfr3>A+lRW-6zWJIFyooVs?4XR&LW>x^IMxP!#?yPy2eJXxTj+y5^s<(RJEqgtjfoAITptD5|f}Q*7RK7 za~`!jpfBSEs47*YSFrvGy>#haaL(h?6KNP$1}e1Gp!F0X#qyZ|>g~`HJKWJIPz%%OXW6xm8(If-w$S319?#r=y!n-%T67oQZYF*k+mC=t$kW+ za?QW8Epf(`1ppD~8&lGcZ)t8A++(hO2FjS>pfy+C+uz>>)x`DL3zzHD_|QS5u9}%p z3C(J8kHun;skByUag^Tz+uNS-?Qp;CfQ1^5b80O`gV3;USuwCyeES!4P?I^iCbXE& zn3}9s-;Cj!WAsTJG1$@%8np8Aa?kpn1cey{qTSa8U zraZs8v?b+#vG?Y2Ii_v=aMrA4&syOoS+cbdEf^FMLQ0EWi#95>+s7nrXcUUlBFfUH zv=9=qwB58P(V|7#*Y|r|S9i+HJkK+~_xH#9$NPNd`Fv)Yad+L0-ab+}ce1KUb+8FWPIhY|5-xTkF^yuSP z=9{fJ8`{v%MUz*S8Rm*^5nQhsea0Cel(Q36%u0Hm!r_@iF^T2!QU&{yink)xCU)-*Y?bJ?y#RX`}40YI1g*| z*&p>19~2}y#!-BXqq3WUq2a}A*MuvN4;wVAlTgRdtrWL+1L!;3?=CLrpM|#w+e(@B zR}`xEKHhy~>IJ=7Y!%Cr()gKKDh+GZ$I!4A7*!DGSC~odpxRm9*J0)hK6jV_9*rHD z>PYi%s-wmPl%rIcPiJ7lWuJDpxNYlEL-u{ygE7a~@cmwaWeAXKT4;8oQ z*=@7g`Oizte>5i+#KARow2;tRw^irHK6Ve-;or$7r>gDbS=G092?ZsFz;q#oH&=+t zmBZG!#0yQ|E+JqlGGW3Zx1R?DJ*{WUjRg$>FDIc)+g2rFb3nwUFJK#L!my8}{|e~S zX*}RkdAF*hRuBO28TJ7KdUFk!=1p6)T zm(1Hon{_9*k6{`0R=lhAx{KDi=?*jDIrekHL%m7&#_ezF3L2Em>(O?@qc(^kI}k|* z1IUEYyx+;|rhp~=LD{Q!+|)&qNbNDarkt-NbtStS#%t=R?X5lx6O@%`hEKhhr_Dr`=T6=?MMBzjexo+rUBjIUCfMT zz!wBTbwA!w-i174s1fj+`u|&Q8Wa8hEjK{&|BtrZ3!dokc?vl`8|C&JN3^0AV^lqx9Eq{9y)<0Og5#ePW87JeH`Yd>cH$v;b9;#%LcO(We=r1O9Vg z{b{a4HbYzo)Z^|*yZv3DY09^MX^SJidkLsK&}4i6lNUFbJfygDURT7NZrcGY-gqB~ zzreXg7c;uvt-$qEj&SA>K0bghGI#SZD!%v>RuQ08!dy5IE{WlWNgXk_?`tui3wH1Z z5ma`1vv|$UCZ^+q9w(u~v_~WTSbw7Eo^Bg9xC-6(4eArwKhWGK|FG~5EAoX!w+XS{DIi;Utq%@!&{8u%s$J|z_7XF_)ZXJMJV4M zbQk~h1Qd8kr3N*@JZct$JEp-LNC(yTP7G1z@_L?NhO|dRm_N&Zt=}zqG(9i_(Oq}G zA}leExvJv7kkd9WgP#9wfZU64Kl;XCWD%yu(iK2-ddJWeeDudrP3ib6YH;M!u5MH4 zWn)W(;H<-p`$1wLv<8lJF}WcKy_h2}fpGOwzn3U%0+=2LTe3|0A{ zM`!tH#7*$o7xf2i1HZh${^|Y;cy%&UPwu>~`+;8k{{WFTeu(3Y`2{lXoTM@HE4q|P zY!~)xnM|CAnKcVuri|@aERzON#W6%sAW_MVdzXx0e277n8}v2uTaizoyf-#WXjYY zm$mE-hIpUpQBBpuGIBfjZ#QGK?SGk7QBU9bOCB=6 z1omw|MVZf-vVBJnER7|Du<{~WBt3{kTNok{A0yEuA`yu*@eXEopDy*>YIB&a_9^x> zcCOJ`JY%jw#WUs_!oM6>q==;L{NIg{h?3-U^xn30_{(iGfb-hgT2rCEs%T!oupwFl z0U%6s{U1m}M`|{Y_@%Esa`L_-Gp_4_O7J@BUwRf|g8yC3ZqPp6;_AQJa%~Rij^J54 zGw55Nw+u_Y$0q;ZXgshf=luDvkQ(Z5ANL^ovQw-smhTWhOizCqpf12Wq)6w8qu4Z^!=n5|}ax<{dn8p?-BfTd| zM!&R13*+Nw-^XDIB#TkXejcL!{hqBuAKt9Tke&7Ho!r&8`q+yO_>~ayQ!5KWBh&Bq zm`-6U?apNF)wPu}>RR?sbf<05JPVk`>@n^fh~Z|+$;svPd%V!2>qRFzJ#YW!0VA~I z_fQ*(&IV2jr3C)M6hIx7;fJ-ySO06SMUMJkSUvBzbQ=ZmIH=vmSj>2?CvCMLuG3Bs zMC2id=PQlp6${Kp!<_To>uIb8<)=MVe7sYL5r*^5mTqFZC)kjc|KrGs&+eWJqe{jY zskDD)3qQC>oL>KZvINkAYT#oL!2lrB>Hv?+-|5RI0O{hU>kPPX`6svliR7o#BOs9! z4d)#nJ&_Ol&&9>zrOnaNvff*J^MS+|(B>8otv-G-X8pd{NAtI|{gbWHQ&# z&~QR*=);EI47dXxDn0FgcN$Qt1NwoVdeQ;j>^?`sZbr(&47)q|tBNz(8^1JVaL{Xv zVF)PsZ)G)U7yG Xdd+B!NqULm2NG3!rr*v@M53wF0SAQ7UjbAw?|q^+H5exg)k zIU99V|K+4!2iWGe?JsZT$R4^FoP(g^;~ZqD_$d1m*q&-)1az9yb)BE>f>hNykqhS1 zX3mI#dRr80?tfso17fPv?){aw@wm_6f2_GNg<<8aO7bL9B9t05>lx#n43OnHCprXR z6lv9AkPvNIaSIAYwKD>f3~FM@bOb*H)a?sYTc)`kv)k*v`t+Xx-*D()G9YI!ii-zM zO@V(D91npb$?C(}`Bj!<^{2F_xi$0(0(p=U5*ytAug!QcvwE;v3I(o_Yq@)FWEcMXXyn|Wv3 zy&HvcUeZRX$NLS2NI=lGc$V(>uV?rRhP>+RZvL)6*80p)o;%sBY%>x_l@<$@GmxN+ ztBtT#$z&STKR(`Xyu3}6actdI?Zdeipf1UkSs;>79fNszF8XcsT~%tG-*U}={ncCE z9j#xRp`IHb8;>a-h4?->HMkD2zac(lXnxGsYt}UXm#cX(b-eU}KPzD!?KE-mf=bb? zpwotdq}zrG9l1WYw)E5U6}^@Y5#CC zu~|XvWe{D*%--fhHrkt7)ncIB4cM7@S|2PtNOmus9x`r9>8k)s}(>pFH|h zUu9`GHIp3sy_?Nz{eF(n*v6h=JTi?vR*>bl57(7ABN{Ye_%=R{>sihbA8~eKU37B` zH(qRvqm&jmOX}ntS6ngi=E`Twg%4&#cY%P_?63ZpiU&Y1l{XI4a9=mNtG;#pE zrL>_r?}OCDpl@DS8QvVQEJL9!=q5Kq*E+1cy_6+9|s+ z&ccJAmB_&lNx-^^hJ%G9K)ZXtQBVRe;wF>Wx=Yd~c@qz7+u6nS7ZlFsPC znwX_AaG2XOOvOE0_ZK~PGONmtGTZH5)u(z|S2qsQc0uUCk<&}?E6992??}6;!pw{EWWfW<}gMX(V=lHJ9S7ZLORN|K1Z7EJFl zz?}#oGb!u@D-#>0t6sYe!MGCnaDh1zl5HHLvi8#K_Z5-(!iSwt4Hhyed~!-N-Yyo5 z^6_zbU=h5HpE<`J?;M7u!O4b44TNSh#!SOGsB)B+vo$%CE#MlB=I2XJWH7u|b&Q)A4%Xn&QF5Wz}^WyP`f6JBMAPpr){4AsYIc>KbB=hiR%{u?#E3Lm%9~A7);f=avv_McblcPTzP6<-~75c9`(v{gAb zU-P$8#O1n8TdOHqgst&Fy>AIeA3L5E>`ydfPtT*|>4rS((C6nT1><~;#osetO)sW8 zvulL>6re|$Hp$LF9a|*nRp7m@;%(O)M5{!ktz`93)rwmR=eATi$>hBQz1_>kfQ$3T zyds=i=4lx6KK16>@IA>R$R)sx%W$7R(W%6qEa&6n=Q*&g2hq@eooSMNP`4>2Gs4F# zo#W_3AA!fZunt>>IMZ}I`R77EC-N^v*3z>4A^dP0VMtq@>}aLw%a(?(m2GvkO{rT* z?;*#NamOGKsP`on1lo-eBWvh1LU9m7SCvM-igc5ek&%&agH(eK9D>&Jn7^d4Wm)H> zO9Lm#Ve|f<2n@ii|Hc~oN0>)R;$KvD^=&8t(!k&j1Gi^YK9erHBY_Y6f?$*UI8Oz8 zyPSr6yA~r`SW%G<1iLu7b18THQ0PdD78&L61563hnf=;q0EANN215O;J0(b0-1OBu z6xnlgbRKORDYkwyv~t&ud^+o^qpqgrJACRYJ-i~CVS28l>xIM!-$x@wXQ4^nQgX^b z;qym}5G~Trc@6v}LLNgtUe= zXu_6@qby?Ac%6>oZx)aY{%$=7ygTH_(NBpXX$y_2icWTbstEZGxxqBy4)!0Z*Gp^U zFq0!!tY)+UpKU3;ArP|Sq}FjGi~nV1my0dA|IqP%V7TLfDXQz*hWj-JSc1Q|o@_Z# z+M$%3O~j(q!T`%jM;i}(xVy8t^~YNn3HU=)-rV-8cOzrl)!CTpdCA3(9aBHTGi<+! zQ7hM3+vnVs*DhPr9z80*bSkzlpD-pnK{*uoIcylZM8Y>%*9dfpyU-<0X~Lnr!c~b= z8NU9itdvct6jyl@XM}!~1ZuvcMpO*O280_P!NO;lLHr7h%N`i6le~s43#6;R!$1Mv z_3bIK?40vEh~R`aha}$Mh0EmV_U7^x+xhWyM?kgB^NbKuG+-(^rT*de2ilT$+c!4} zT(w_uInyZ1|5|QzNjU%7T0t?(8Vl`<-Zo=8>fEf&n}ft!WD}jer~dFhDl2h(KVvJw z2q7_7`zs~RO%>k>`Q&e+xMkk`w{+A7T+&guH)^v`k-L2BVMCbtP}FdYWon4_5i9cl~GZpb~X`@pd86Hv>466#F14C4=wZ?l1SR`Fx_2wffa-FDRtdjZkmvn?52 z0f;XU|#ti0t4*z5QIFu{Zu*X+WzR{;p4xMfp4B*`jU%Y;O&e}>1VtTSMA|pxS z*P`0bf8sr&&aF5|Tk#N6Tk@DFA%n^a(wk&1=(l~Th|7x%8aMIEal_lpH4Uf={m@JN z$=~$G33H~dKA#Tbp4(_Zq#i|pI0t=)RLi|XbzEX?BP`=kjs^N;*67Pnw?)&poWg`i zr9=B@443THVP6$xJ#>=nW+XEX4OO|kU?r8HusoQ6PdnOj%=Re?eS6kcpi^LMy2XV* zfF822_Q)R|s&GnC*I?}W9($XkiR|73FLQx#fJo*V8bNSn0H0|pNmT5i@WzsARZ~-Q|6SK}_rba#ZD^iGs8%fBbl-)J>mA;Vm4?=++Q&h( zxSKx8G+K4|?=v+W6vD_|oM^l?k1<)H*$N@j$Nz?$!_deM_HR{#O9wfDEwTJYA}aHI z+Xj7@P>h!`*2-xS5MDa=@Q#Jp?@(cH;f#0>Bl;WU_yK47KbBP2HsE**06wa&b95!u zqM;2H+3Jo$b2F{0Vgp>Kt}c^_Z*sb3*Q}4t$*)k({7lor#dd0qkmlCQi6Tt9#m?mVZU4XnV)i<-f= z4)G)@B?a1Q+qbS~4wa$*2D0M!>=2gTgMA9;jXSGM&)E8VNy2Hno#iq=X)OB_51}%) zLC0y*lC8kosSK?}8(;3aTKKHB?y6O%2?GgI3s@uDnjQi>R&q@Bls59D2ruyIv=y4) zJD+b(4?)2o)07?paH<6LeuflR%NNayL9*L4D}&A(&|H~N({9TPMpWW2cmiOC*Ya*FYsrz|38KEVwzrp8dD@yMY)8NviY9Ey6p-pC z)u-B>H+i0Uwg)q9Spo0LUiFaX%m$Wam{wx`s_eh|4;5Y~G zPQeZ#11|rQK?lB^AbUZt{)yqq^Xc$0LeZ1| zQjEQ9Vk06V-nV#KhZ_DwO@MQ^er`TC6?78i^^7~=6ZmH+GhUeBQ;a~?(4wVti%% z+}EehiOeB4zezu$A$p-U98P*0fR~WLR_@WSR}Hw8)#GwtbFhwZT{Mte&|tf-msKX| zcO~o!qT*efyc(|MP;m+ZbQe*AgdpRUhc+4Q+{}hHAf5k z+?>rQdIqe*VwFAorD5o28{&$X)+M-Jq&F3{+&iY0TR^-dm)8F?=z4tK5A+3PfMHT$ z_)rH^sM3gRW7;?UzZWGXC2;1Z-TL)P#(Z31epnEE{*h?Xy*EeD;bqyy9Zi%)h z*r(<1GSgL1Xz4F4;m`pGTkrxDKgo5p{y^cZ?W+*K!hogSDji%vQ%ufrkXC0hB2b20 zaALy$3SpBi71hn;DpUfiKr#}bTAiK%`Dj|8FEfOteRSEa;MyPF9a_}80a?0TR%Wn8 zUEPpi*5XUsB@NPNIE|NDqpHvrMzaal54!Ya zspV&P6mJ;W)+Yqmz@{K(3V4>LfTl@U#!^Ls=U*aFh9Rxu1fkr!6$1z7SMkzx>+hXC41TZ)-B0{>-f_I0y*l>9K zGNUt1@+!-1y*wX3UwKgZv%7x>koO;9wk?*p#WO=*b-+6<1C5vuPyv0MoY5sW9L+Pf zsFOHrXw}CseRl%5h2^YDX6ZJq$+oZFdN+%#CAU?hF(WJGOu`H?Je-A~9za(~kBkAW zQ%h{sPob^x(!O0W(y-$poQ_JDEy9Wc$w)aw}hA2~kD3>mO z5TbBmyL@xWRBhA8{meqideN;G=?;`MnW7^D=t7r!u+s~L5CUdAg70RQuTUds>aXJU zrThSV4B1A59a&<<$c(l!my@5&ANV0kNoTdZzAREZ63+;#g9;7ByOeQG)V|PQ`_x(p z&eQK?7k0?y!hM%gAIMe~wljqG=1Ao?K9?aUQ^@KJFp-Idq3JYbEIVh4yo4LuZx{fi z-QAf;QWUJnwMa>FD<**FEJYP!T8;EaHCpAfE{@NItp z%q7aut~t%y0ErvpCG}iF73PY5Bw0k%%)lJG?{fqXnhw&Vy$=F-4A6T4gg$X)zW(l; zp$#ju3EpeX$NEO1V=Ru*3AW$zob76-f`38tR5PwpszO_uLMf2%OqdqcVskFTqe(Xm zjr9lQy!Mlzsl(=i?$jnzm2D!s&9u(Pi`c$-z7p`WavBJR=*yTy)4Zc!rCQ7bZti-trnqCY~?{HgVl7evtOy%-JA0GO;#tjCIcJSSk zvZ?ywWs*s6{H|w%Vqq2xV~7VFWpc$cjw&oUvkx}4H{iXy)~y{eu*u13(S9a%Cc{&EvL|_eW$EbHiTb#M%9@6je-c8gOA1clpNS5AjE83VWW5^$Nq(vnyhq_@Pt z@`7}QD<72a(if=r^=AtSpsRq#@%zWhrPc8d(A@6`uH;W=oTp8{!bmN(rJWG#acJWf00|S&{jKL zw*#F8nKKw=M;z7B-EN+|xZe8RBTFf#j+z5&E3)EL-oCkfW2Ee)fV`E77AYwUFXoG@ z8YIeTd)_nJ?rCCpcZcr2hPxi`{H|VZDT+J4*HTS;UrpP}ir1c*p`|8E>h)^u=WJXb z;BIdBUO)P)|Er55lhw93*_Ssr{%Eupw6lG?r}(!)HdhOi-ntG?wLh^#P1C~4F)tF9 zG}kUaRO&ZLbwia-tVPO&s=(cLahoghHMP80n_ZvOwC(jBk^YSN0`#9dQylD9ou3$l z6->dYIHgZ;^f5t#%FdvEczYdJ+qxp0kd8!mKZ+_un|0bbtHnCMIWtl-%pa_own9Ps z4H(LD>~R<>)*L#j_PA~wGvWkp(b*M6a%z;*SV-xJ#)*8Y_xFn~2Aa3bEj`vcjbE@# zS2sSdC9OFIXD`r(=dlqsO$X8MNLfwNJFA@?S^9mk+NkXMhf}oIFSRKsX_R=)*ZUx} zugi_{BGj~F%+uv$v_nS97Efw05TQ&ep%HZDf3T8 zBfF^V%G)8U88~6E*PyNY{Gtgcq4ph7m0LirLbIqUsL*;>_~>WXsD{0J_UOR{pAJ}# zK27cB%*mh=7~}0y45Ts;GE(O&(#A#@z2b0YOHQ%ib8+!1PZ z{}?^%g10vl(Fyr{0A6e{5MuoJZlo!$wAp|M;YdN zTk+bE!R>qB)#Y$7e+ME`9n3!019x0kpen%ezOy~D44bt&S~MDj0`f*K`){gCzdzj= z8XOe#{`cWisjQ@=m*}?oY$+@PYU7~G-3mKVnthX*67HgNnn?=Z%h;!-wwmqbGq@PjCNTR9Y3K4mlvYtn_j%RLS??i^7Mu;juZB0`^!)SEZw{Y%ZAQ#8=a8fpt1AC})laua!A+HzO$-tC z716J3;QriBi9Yt}4HKLAuhv0pb7{6l>NhEBhT<@T1+fn1)T^B9-@bgAio;kla>u0h zK3DLo!kcA9FU!@wTY(BN4fLZ6?(V*YiD!aAmO?x0Bp@lQj|_J*<3mOINw`P>anUJP z7B8%fjm#a>!C&xJuHgy>#}7}33JNa`MCr5E&F;IS?nH}N^d=_tCRffp`^hay9}<+n zweHQLCGFGroiwr{H@kM~1+YP;1r_R7DQ-jW zTtB_w#=PjqH@tO27lvND_ztM|{Q&uxBNm^<^f@CLf4i}a_ns7^Do>_g=_Jh`67^}2 z911vURUgIT013NV<}-wjREb-X+01+<+N@H-6~bj zc5BqTX=n!PYSUC_E&TDyIlA9C&`LK?+d-S# z%5gUa98gKfXG{eh44;(sPbzL~;cOIGfAe(ni9#Kzy1QrY(oS~5|6z<_|3yz&O8`zV z6|i95p*C+Xr_FvP7dZw2h2FPs&u-(|w|NjsR3fM$W1JI6zKbYCo8iVgAw=H^)#WTX zIc@ZVWU{>7;!b|IJMxyVbywX6H6nsEi>cVd^McqI@auoRswyZr*sylbSNyyxH%1+u z$$JRE&o>Lrp|JrmTU3Pe#)7eiqew0zJ-y_Fp!_==NnTnj)H=e73odX1n6Dp0@knm9 z=me$7$iAhnTWeId8Qg9au~Lax?5u~$j|-n95u zp1NO`>(s4S}hdQ(LUEf0X)d&ulDWx>p*xyZ>M)8A3k&H)GwEDL%p#D zp?Qo}QrEV)2p5m{rWI(4DcqC%Qu2o>LSV8AW_%uZ+z3Guu`l?nl5vB7+cdJAh+2#Bvrxb>icgkzCzM%^WV0p=i9#? zXWmC<=|Aq3^1`i3Ky8RmN#5ngxdI&~-*AdaVaue$j|^ndQGW_~2o5NPaiDuI1D`1q zp)_-pqq}h`G55ZDdgugy^a}YI1~<=8oXr;QD9)OWTJ90xBV|BvMaE5i5nuG1{z*?|G; zHM;B29D@1J-+s+E;xQr3oHM9Bq#rIm@^9?vBUjPwf3>4av|EjN$$A;3IT=#?UN*K> z`LS`4Uwjs%O%REGk+SAm$E3kiBjc-eM`pC0R9e2DQ}eaa@3Ppg>vjJLf^vxB;;csj zLBLcQAZf$;(hb^tDO{Yr4Sc zTIbIjv2;Iu`m|M-3viU^(hE^Xn<*#X=&4Mm$;^^m(Yh~_W_=?6lP;U&5OABdm3V%5wVMUU(~R0!2(H(vdu(-bCb0EwvDW^P@iUm>8DYy zhynP#nEcuK0aa8!(~+6vng_lTMf$k;fs+_sD7XODG@(cfiYc_Mdi3KwX_^NO8ZSS$ zl?vK{Vpn{Q_2IuovFmqt9HW70uD$&aZ|y3f9%CV;zK#=wFq2=)Kx)TfCz5KacmP}R z(xWd2V1);c8*!$8;avRPxu3(KE;qMo?ls*Z7`CWnJ&2TUFHe%#uxkB2rC@!XJd0OP zbb5=HR_8yp!Hil`Kb1pK2-xgz0Lb!1`suUSDj3SjnwM-yiL^It%v&KS=XXZfN(rFj``7_(DT2z;VP2N53?Jfic+d4W)T!DVlv>nr zGj+M??m?c`&K^>Y&qysw9(MgW;|!TGoSr6uBP|#o2eQS8Cd*RvjAarB8o*vW9qMJh z&Umf7d;tZa*r6K`u9LF^s5=K%bkdz*)bA>%RO}r~?{62ev^&(7-82~u6{M~%S_dEG z*!8}au|h@SjgkdWlT0*=U>&t_1Fl+X22&NXSw%%9(E{8ogPN?rk~=6`W_v@Qqf8Aj zbqEPgfA3+HPf6$`Z3eGHuyt-+@v=MlkFGj7a%9XN$4_cenH(4ta<--U(pRyWvt(xZ zWk{NoT>cu~JpLz57gnzd5AA4drbHwU1ONeTlc%s#w=kCHF{!Q~6Ze?ul^yPOgE%8c{L$(!1+d^G)&*(>-EzjD&*6)X(qbbg5%!B*g1lKU9SWvA~; zffyq$TXXf_fgo>TyT+X~tuU*4g$W5t$nkN)AREI>zydZ(1~_YA2XA*1 zp~EyP!6AIf?{wm}IwB)$+cgz4zHDUS^+^6`%^us@_p7Pt2nXUqP%||h#_?_SOw$oa zgkqT5VX9=%XoWuBuH*g@Tqpc!$V=oGa;Cqx!4SSV%+~3u4ljBNvzHk>u zZ(H%bNBAM^0~)MZkzwD0GKsu>aE0kG@k@pW!mP9X{h`0 zzyvh#Munc@F}CPB_WUO&Llq8WzH~%UJNjucanPr@D!J!RV9Wa0t)Y`OXmXj#sI*wC zouFO++YIgb)u$eQ=*;zi*wAPVX?{q3c~>G&wuXeWgX=(<=m_}e2-L->IE5X@o;x>$ zT;?nkX7FfltY+CE_;}XlsK!hDMLOk{%bzxkJD`=YvZn?&M z9sK_2#3r~3V5?GcmK7*rR7&HVlD1k`>I&@%S>aKJ4KX)~NRn%wrh=K??=1&P=<3SQ zGLY>hVbCgh<*OB%UB9Gw1yBMG4s_x#69<%{Yf(>c@on&c!``9&UcLHP(uk=m&mn5& z3zbuKUXd+U`TqN0!^7>#K6M$eRY2;!0!S6Pq8ZH;pun0^__@)JjjoPPCe&q;HjSpF znIg*RnSd{Ey+bi0hb7~>+~`T|4Zsp6c`iQWPg)}Ich|aMf*DGIz~I;z)>o$^yf2t| zFP@9cZg5J;*dJ{B@EwnjuR0SzQ9ig^>x+_{xg%AV7ADQ@RWN}Ssj(IfiT-7tCvf67 zRO#ezKeXX;sgsD$HLr`;Tr8TzOH@t?YdfpH=rvPXqF`nZ+YCbHregvH%mmhpKP{3r z9Sd#f`-sjmpgMQ1T)A?Z+pVX+%5pw212SH;Xp4QWvwiDs0tRUU#tG7n*=_Gui8C80 zqez1$zV!s#Yd?c@Mv{5PR*Z*pt&UHglia+P?ZR^5R9W(WwTW z^*M9qE)gL+T!zv0{FI7VTR}&7iETjJo-OX7Rdz=LorAyYj`bSkXlEDu=8@Ib<@@o} z)S00Qr>C!TjflajUF?z5?YkOuEUI5WhcBNYyYjg`!+Gq7sm;^atsQkJYd+j6XDh_> zR@!P9+}0JG5G+%*Z+5q=%DY1_6gr|?U_3-eHDH2F+YoB(y}^}&eV?%`z?RzlIx>1=9dv*iiI2MIJ!0> zFdL%kr!-2xMAcxcf@A!(h^~H6DCce8{*aJCT-nVn4gHU^x;MrpV}g*h(ZhzEyB;pX zb{fxoYFVYyI7IX#3S5@9baoWt%Wr_ztelE!1xolq>|Ety=X?C?Or>Bg#bMAAZ3DFg zf*M!q1E;yjA%3uzj7g?ZWUfCo-yJ}hdM5X59%H-j*47TOT)LV-KOc=q`_H+V1F?j$wj4ei~K#%%KT83Kmg_szOzf z+dD?v!^1DFrJL=m&2*q8O-foRrYL)run3GJ{09~an`Z_lsUJ5=#L%Zg)lX4qI^ zBl?D~wbNyqb#eniEE+IW!FX2A3C6X{4hhCAO<~>tDt%GLrVD8fqkSRnOjeYcFY#Og zfq^SDC985KwGW5~4I(LbKS&6KAi#rv_SJ(g#ohc&>|3&!31pO5Bv|}Jp?G98JPl%kb$8cva0C%WVEyB1tf*4}8sT4! z6po9rCPDF|MvW?=(F-yIB=@}@dle!KLSaBH6>5mX{!5gYp}PC`?$t-dMh6EeV~f9j zEe8oT6%AN=NNyp&VrFKhv}Z$Zm7Tg$q0Aaw!SS(UoK`_}> zg6c=pMUp_raq+bzF;yQEFQR1G?S}6M?1#IZiM!2G4;f26nO+{-D*K}^987S^vL9rc zMb6|}TC0%Yb(bHpR25 z2)TcdxRP?Vu~T=5frOv9h5Do`q@%nyS;o;>u-~xRj@?38LY_GW!~p>EVc&S!3CXIMAsA(^lT&Z)SdyStmNY<>Ho zG4fA|*21=1Ia=1KOyI2raa%_;Bzbl*34W zW0lon)mkIwFDj9(%L1G`@DpPeQg2NYP6FT*!}l0YO+mP(rJSMMx1 zv94w3spg`CpA?LJ>#ynt!IVsQe^}ku7p-5<8bu4Y2e;jbDCHUoNH#}nTNVANx%~0+ zKn?ZnsD0p$)ae|hwU;qTW=}0PvJMd$s*J@`7rC^{jU!?7&eP2wDq{zF_p-LLNO8xD zGjik@$)@I^KOAkfRI=d;1kD}a_Ra$vAIu6-m@%z&whAaGI`bG@n6sw(l zKus_9aIYhd8Fdh>g`Ma&_Ocj{q`#0j@uI-;{7m|fDrbAKZ_^qP%H1V~scig(S~|A= zV8IOLPV;_+CeIh0%&j`VIjC-61a^y+!{P(cZH2+h*KaUYHiG{X%Cw+h94c3rWY4dV*7>ya8z-2+f@v&brMgx8g4W`u7syh@As8b$RFYGI zc`8N5^NEF9u?N9;q>eFc{do_Wl}84jE>`tm8IcYaCp2o%tsh<;JJET8cgTs3i+z$T z_*h>M`ZPjEhzfa+p+f%2JQ3#lm<35ja|LS&u%i=%$o>@Ao|>8p5uWAiawxk3AO^T~ zxGE3mK_o2f$))Vso7H1Phc%&i$uL3^;B;O08?EaebjI{bTSOH zScc&m#)EcU*0$1eTh}c71C4tQGGQl2FnaxW5$l>?^&fuA`r3>*C3l?c;-) zD`K|xPFYyj!(^P-sZnCpUk={08DA;8gXF7y>^afeh?5B#5!K{m&Zwq#DBY0Ah)}QS zzw=qfzEH+c4A%;gq(wRGBPV zG)-A1-{t}J&!cB;EdgBlUSt2&Y06g6V3;Qkm6=!<2XInf>gx4e#I^k$tpm zYgjO7JfNR}AsYy((;ZEjO(&R$KP|Z8(TM=ul@}Jo7sOaycCE0?u9y|PxJV3W9c399 zn#Zjjx$ag&g-NZ&zExH^h7&r*q^*>ZQ(Sy(AX9r6c>jHb+8ynftsrCWN-PWlAx96$ z*PLtL$$|sl6}BgezEu{0JXyZjne-i_xjuG zledGz8LAPV&a++jPREyQWDUiTdE3d|WV(?9_fzMef4+;yH5<5ZGL6GePAXe6H1^@j zhI2YctRLk2Ug7&rL*BF2?WiEvZgS`M`hP(dLk7V(${=WJ4ynkl{dPrM_IjFGnYN@B zH)p9@)72WkeR)-_Z(iO$Yu}uoZ~5*0=MK#qSJsP_w%$lH zf2-m#OUy0cmaqMw1Hs!o%?>Jc3|+JJYHIXJ*$#z}hXE_Atam**4#HaL@nk!RfQ-~z zY2p7!6Pp;k@X3pl{DQ)teVlrMe&s1|Yn8~wTx)Vj|78#En;_~}YcFWl)*~(3$~?uk z*T#L3ea;*kP903{+4pHsN(}tMkS<+5+XM#iZkw0%fe)g}*knpq@YjWgg6;L=oP>6? z9`rh9p_J_n^xa8^-_j`GKk4hbjR&&7{$alOJ3`fp+H!vf>0jw&BLDd@20tRMmSx@a zt$bK|@ajA9st-c`)#n2GcLakkYLKlFzSjAz&88(0&(niM!4BK_)n;FqDRQ2=i(M48 z2HoraMX+^KPTD7i4dy|%c8XJu46Ivn>8*aoIVWJ;Pek%UU#4uC`7P`6!QK-e)5JE) z5CFBC-<2!=BG)hQ0@-&M8ocb0=e9ze&2w9!F{vmnBtMr1bGQG zElNwpJ+Nvzvbv!nD0giAh$|N_S~M0#Dv*Nma^qfqyAp-CJNAq2#rn0aj$bxw+m+#& z_9xsj&PSViKdq~Bj;!EQ`B2{B{V8d}f;wIZ97QR_Gf@ipdo5Ru?T|nC;yFeNHj%{O=Po+Lzq4YkC=+$!V7BaT{%WMA8M1dGvf2$gOHGUGM!CXs&-@wZ&L!wQZmRe4UL4pW)$54;WLqo|XqxSsI0K@DXTJ%Bdh8RIc0nw-qIc2WujI5`ZI z)Y%a*{&@V1KOS~}EG_iSR9H&e{Kw!1mqCo-kxLe9lX4ck^Dck?&US_`o?4E#?97w# z9qqhgoYfEqJvogt{=X+V?EJM@>-3f*F4)h~7^1R^q+yhN+wCiuGLzAj2mdc5J2+hU z#JI$|eBMI>pl;(P1~g%io5p0a%kOU8qRvdW!G|FOiRAyokUPKWKMPeB2Io25buzmc zO&x|wWH~Wl1Pz$?Fo6(48Wf%YSNi3#;h%PBo0;7M6uI428{Q<8_<&(>V#mr}DQwy_ z>3^s~WJ)?VtiDsl4`Nlf_1@ilRckkstRRF=V2op*oWB@mD-G%@0!u{jw8%cR)71}k z4-+oIe6^kAkHKe?%y|1rFh>6PugRk|!S-(yhc7zIPFiuDB_0#U$V}82-wn><%XBZg zMJTG{8b|SCfd@uvv2h9A&B-q3dy$JAgQ4=uRx+4jlM}1mNzm7&ZX-pY17mHAmmQv} zxCCBqwd-;WpYaz*oNe7V_xS!djdvV{jn7?Hk<0XAY-e!Yo-!R+3+)gH5IXyppFZ0E zOLIXV!On8JeMBwK<+-a`VzQ$WhW?a59Me9OrepY%7E6SF>9VBDGp9ZpWlFcf;-QaZbg|{W6{*F1`^$ z9SYmtyxH%~)h4-tOL%2{=U52tvuK1^-|oqy8?98y?!bzAd&Ve_r%o9|R(_^uX-`$W z|3{BRB0pyT>Re59yW#9j9t~_Xwu5)~P661BAyeQ#M^r9wTZWk0=~dhP6S^DL(xu4X zCgy+u8?oKlt&k(P1F$8iPkFB2|5FXlb8wi&vV0iOo0o{#^{ko7n2FfV>@1C05FeWu zc^d`+=kA%_;xY_;EZic5#PN=ut^@~a<>)Q`HO3(!gFOAvh$EP|@3I*^vs@Z~A7l9Q z3L)0@!j=uQGoU)m+jc3M=wGfGKP}6d`3H`x?jI`t>k6>l$2>&rR-~cevtuE#PK(L{ zK>LKOJ!cuaWHB|bv#RQL%84rVuxl-t#c({BxfNTm+x7GW*u#V}d(epJ#B&BqW*}C) zz(jCi&v%}k9+nHsBV;^6+2ukP#3U=T%SDBPXLm5I$lrWK$v6jHe8gSqO&L-T6QGHY z01J5sA$qJsd6!zKYVV_%ZiZKi|#b& z!k1*hwr9Yjt@i| z+HSSzo6kHN!PnX{fWzOe-Pa+au={_^r#GSf@F*pL)|det!FJnqD(&)v1^K%FZz4=j zyZHY)7HGo;W|G?n_?BBcp;P1bIOBjm_W!`9zum7-{So1*fvz8vt3e%^5Acu)B z)<@@qL+aggIb3SZ3+|9p*V3B!`bN9z&Ye3QJ7Q-b`KnPvvzg{D+aFzO zZi)Qj2?@%Xn)3cfGScJ4u-s%JX0U*KMW3;^Y{@zFRv$`Y*}{_}5%wK~p0NbPac-1Z zQ7y!5YaqY#s4b4?-f80J)BNN7#&Hd@lltuR(G45Y);s9<`CbWoYaL%kaZ7~;44&k> zw`8o+X!9XQm|~R^0HKiq)Ny1&iL3kYs#n%G2*31evjF3ePhD|)M@6o^mU>2E(s!Bo z&7+#;E4~+9IdM^Oq3JHy8<#FSh;nue(%ZJtV7>Okc@}S`@6EpNBc*LncEH&4a+cN@ zAD2H=g2lJ}>92qL{%{vJ&t)&#+6z5YZJPOdPnqe>{qen^@XVpghYeR+3hW+LB^Biy zT4J%u#^%w=SPu_%L-V0gg&Z+4FL`e{>#gX(p}~59#eM^%QStfn-ydipPI|C<=q1k3 zvGWw6r}fx5mh1!}Qw%fCl?9VA`PHkn-@ku{T1m>#8=4`gkiconI69{fpYf1AL&Bzg z9_+K%bv{DDSH>xBU-6tzbIiCtD$hQPhYh5`o08J+OP4MUu}}{gd_^!})0#DZV6go9 zCGr1|==w4-vB*;{s9(e;iE zWC{zST}l=*83RZ`3Q_M|Wuh8A`wr^$z|o^d&5)G5U^rSaxbRxm#IJqkt&U@^M{#>n zTiD_^{5#H`>lHS8L4VIbxb@dnOwG(T!ow=+eY^b?LD=x!4-e0{vC?smiAgAyA4tZY zWjfXsQp%}B!gEZRtgV?R4Xw1XvGJWuT|T`bl|dTWtB+cydiCHYjksRa$3G(g~gZG z(sd2vbiI*V)+ENW#;~7G^0aw6_OCHL6{(KeGVs4zK=H?ptt&-We!?h4D&zL=X z9YrrfgHv2t8B$$s3SJ8L;}>w*$N{B}#QqWz5@5Et;pvl~4Gie5oXOyT#4`uY&7phu z0JnXYMB&Mvq`16eICEsiooEB-YwIaGEF2>2>h zD#Rx#G%j)CxIWxIHT{};XP&}Cm@`@T&#AfvR?D7??oNnyng4Fsbk)Z*4`fHEkl!%q zrNPih1;admxcS5rhr-9+!$^0_mYbhH@1f!FAHV;;Ve8gQxaw)jWP%4LM3RCZJ#u7* ztgL2STpUf039zlmi_P9;PofmEcp$F}cr{TtEB)v6ym9a6$l192`EkhjX0@|0y$ZW_ z?J~zRn*}lw5Xu{z#5g%~^&hdQ8Ann_#sOUhXJqHIqv{B-- zXTPqkEEq2|S0|mA$6$kAm92!A$M7;k>$(i}(c{JifxJXq zS2&z-v7L5Jh-Oc?ZM;vI7m&_)mk2>XgGDZ z%lsYM_*X8yv;sKeoZ3ceKiKCqIe8n5`819mJa~U{^4;)oDePpsW`^FnwE*nsAj@I~*r)?tc^@}%eq_f|8 znZ)TYTC`}ayuAD>G$}zgaE&|7DT2&Rdi}Mf`ZMQBNJ#hY(?_K!M4LO}YY{kvr#XOq zgja!7@Ub46s(H|SPkL}4>M!m`!EN5pTPreJQ>J0pz39Ej>`5c&utxXVK!zHkuCAU4 zD}qJV^|ynTiist;>=`m%@l{MaNh^ngUZs=E^!^-Tys4-(SwRYD9HN`h2aR>29 zjviO!_pu#2-76$a(QXNGzp(bzDOD^5^qJ1jqHsJb&)kmtDo;+fJQ4 z*_UWw{`nQ(zDa^VuYBuA&>!QmfH5segO+`+Tx)e=GZ@AaSUqaCaF%-Gtq@9{uHd3b z8cq-v4k6tv_;P8`Anlx~8*$(=r}V7YwGG(zREo8u&ELbj*B4C93e@s+xWQWwu$)@Ajmo<2J`;t;PG| zOI7V}B_t?1T1}WRfyiIMmEO?7#RFD5ae9Dw32U@Ur zvEz|dMb^VZ0i?1+tpL^YHgfHSUHNpV*wnEE^((IPDL!zWkN08$ZE+hWV2cZ%ibr8u z{9^2$AwJSni6pDt9h8@sH)bzY2!2-iZ{_UUZE)D>V;xwW7AQ?!a%vhB1jYu{jZzDP zU%`e&Lqi-dBVyj~y)m+`Eiv12{0u4!(&-WxH7F=(jf%=eJWF(h0xF)8$~3b3zWatz z6Ok@=Xlp+%f(Hpm%$rYCCCg(kDt&uIVCj>0 z{taK>ItXn%<&>u>GMk5o=pWFCrDH6&U z6dJla+e>jc96e&J!OjQ-rJE3x=)-Z4JnqS+MGn??+-OI=-MBvTx`~QfbkpB|rl_bQ zJ(@dr?m&!p9rk`N<_&ouP1aU&4LQD`OTXL&LjU77!rvMHCaZu9HFN|q37MIGOg(M3P+bO()#oI5vRh?Y&7&%>sHNaL_Am z)!V+hH0S<<2Wbi&O{$BRERl)Mcf$%z-_cZj$us0=?`MgLzK_NBI+VMHhKBkzdz=h; z1!5}a`=}9o<%-YwJe_Se9$wtk+i23bK73`U`a_0{^Q}C%pnsO^g8pS`_tUhFNl!-w zNBJB$Qvd%psEiFArP*5G! zDJKYw|IMh#mnd(-%Nbn9Z?yL4(T7kGIxgx-i3GbsOn8w{k*Xk&efCWjy2CaIwJ%gUB<`MJec>?xY}cAer- zL+@X6;ld~~E|9e-yRgy=Wtjm4*KU4|jg6V5Gx)UlX`hvx)bxq}^WbfR7xd?o6rl6( z%jDgy4(ECqE_<%H;)sz*i1p;jlj|}wX6IUkKYRY1q$+Eals0VJ_9s^4=!p|=Lkme& z^_q3-z#6|O7+Z~JldyAv;X5-_l@Z@szDV5-Qh9XN1c*8RPXI<|FN$c~KsHNI6; zT!cMCpPgw_RdmWAO?};kcmfg<2d+Pk|?nF7{O_V=hT(8)W)} zn(n-`=6Cd0QlC-Ju6*G7@IERFApuDHiiL&KRUeWz*i2-?iIZe?YIw$%$q5R}_m*zFT}?xS z$JMJ>ai?l=$_AmJip)9a2wOALp{sf)Xu8gSO`Du34%BxModxF??1cZ%0w(~g+>G0h z+Tr1@@Xs!evA`T3y;dGLkO8#L>~6<<-~rA1e;m~p5f)wyT*CVjSd;|=o72GPe){0S z0$?m;pP69@s_B3ZJp1h{aIuW@!Gi}uLk{<2|w?fMswlgye19p)>yK}eY-d@(##pTJuZ*mrR zs>GAGZ`T5M*MOQ0eSLjgyu6@ch!WrtY29xZFIoibwk!jlkOCasSOMJdId9%PkOE+y zTeC6w_%^TolP66Ao^iDd*gyj<`UURT4Jats0PL)(9X62Skppe?0`1=bX3p1Nug6bs zZf*v4Lbm`Ts{4IYo6XlN!Jrm5=;$Jl?ZC@78i6qix=#Vr`~aPD>&+vYF%4KP%(A(;5OS3^N(YJ=7y1EcZgt$!PK09PG*g9aLax6jJj)kFZBtH67ypM#tPI`#{6OariJ z)MsaJ&o&fc25y9V-CSLC8k$5Dx-`j zZgJc;{XPqd&@DMN)Irben)d node['name']: + if node['right'] is None: + node['right'] = new_node + break + node = node['right'] + else: + node['phone'] = phone # обновить + break + return root + +def bst_find(root, name): + """Найти телефон. Возвращает телефон или None.""" + while root is not None: + if name < root['name']: + root = root['left'] + elif name > root['name']: + root = root['right'] + else: + return root['phone'] + return None + +def _bst_min_node(node): + """Найти узел с минимальным ключом в поддереве.""" + while node['left'] is not None: + node = node['left'] + return node + +def bst_delete(root, name): + """Удалить узел (итеративно). Возвращает новый корень.""" + parent = None + node = root + is_left = False + # Найти узел и его родителя + while node is not None and node['name'] != name: + parent = node + if name < node['name']: + node = node['left'] + is_left = True + else: + node = node['right'] + is_left = False + if node is None: + return root # не нашли + + # Удалить найденный узел + if node['left'] is None: + replacement = node['right'] + elif node['right'] is None: + replacement = node['left'] + else: + # Два потомка: найти in-order successor + succ_parent = node + succ = node['right'] + while succ['left'] is not None: + succ_parent = succ + succ = succ['left'] + node['name'] = succ['name'] + node['phone'] = succ['phone'] + # Удалить successor + if succ_parent is node: + succ_parent['right'] = succ['right'] + else: + succ_parent['left'] = succ['right'] + return root + + if parent is None: + return replacement + if is_left: + parent['left'] = replacement + else: + parent['right'] = replacement + return root + +def bst_list_all(root): + """Центрированный обход (итеративно) — возвращает записи в порядке ключей.""" + result = [] + stack = [] + node = root + while stack or node is not None: + while node is not None: + stack.append(node) + node = node['left'] + node = stack.pop() + result.append((node['name'], node['phone'])) + node = node['right'] + return result + + +# ============================================================ +# ГЕНЕРАЦИЯ ТЕСТОВЫХ ДАННЫХ +# ============================================================ + +def generate_records(n=10000, seed=42): + rng = random.Random(seed) + records = [] + for i in range(n): + name = f"User_{i:05d}" + phone = f"+7{rng.randint(9000000000, 9999999999)}" + records.append((name, phone)) + return records + + +# ============================================================ +# БЕНЧМАРК +# ============================================================ + +REPEATS = 5 + +def bench_insert(structure_type, records): + times = [] + for _ in range(REPEATS): + if structure_type == 'LinkedList': + head = None + start = time.perf_counter() + for name, phone in records: + head = ll_insert(head, name, phone) + times.append(time.perf_counter() - start) + + elif structure_type == 'HashTable': + buckets = ht_new() + start = time.perf_counter() + for name, phone in records: + ht_insert(buckets, name, phone) + times.append(time.perf_counter() - start) + + elif structure_type == 'BST': + root = None + start = time.perf_counter() + for name, phone in records: + root = bst_insert(root, name, phone) + times.append(time.perf_counter() - start) + + return times + +def bench_find(structure, structure_type, search_names): + times = [] + for _ in range(REPEATS): + start = time.perf_counter() + if structure_type == 'LinkedList': + for name in search_names: + ll_find(structure, name) + elif structure_type == 'HashTable': + for name in search_names: + ht_find(structure, name) + elif structure_type == 'BST': + for name in search_names: + bst_find(structure, name) + times.append(time.perf_counter() - start) + return times + +def bench_delete(structure, structure_type, delete_names): + times = [] + for _ in range(REPEATS): + if structure_type == 'LinkedList': + s = structure # head + start = time.perf_counter() + for name in delete_names: + s = ll_delete(s, name) + times.append(time.perf_counter() - start) + + elif structure_type == 'HashTable': + start = time.perf_counter() + for name in delete_names: + ht_delete(structure, name) + times.append(time.perf_counter() - start) + + elif structure_type == 'BST': + s = structure # root + start = time.perf_counter() + for name in delete_names: + s = bst_delete(s, name) + times.append(time.perf_counter() - start) + + return times + + +def build_structure(structure_type, records): + if structure_type == 'LinkedList': + head = None + for name, phone in records: + head = ll_insert(head, name, phone) + return head + elif structure_type == 'HashTable': + buckets = ht_new() + for name, phone in records: + ht_insert(buckets, name, phone) + return buckets + elif structure_type == 'BST': + root = None + for name, phone in records: + root = bst_insert(root, name, phone) + return root + + +def run_all_benchmarks(n=10000): + rng = random.Random(99) + records_shuffled = generate_records(n) + random.Random(7).shuffle(records_shuffled) + records_sorted = sorted(generate_records(n), key=lambda x: x[0]) + + all_names = [r[0] for r in generate_records(n)] + search_names = rng.choices(all_names, k=100) + [f"None_{i}" for i in range(10)] + delete_names = rng.choices(all_names, k=50) + + structures = ['LinkedList', 'HashTable', 'BST'] + modes = [('shuffled', records_shuffled), ('sorted', records_sorted)] + + rows = [["Structure", "Mode", "Operation", "Run", "Time_sec"]] + + for struct in structures: + for mode_name, records in modes: + print(f" [{struct}] [{mode_name}] insert...", flush=True) + ins_times = bench_insert(struct, records) + for i, t in enumerate(ins_times): + rows.append([struct, mode_name, 'insert', i + 1, round(t, 6)]) + + # Построить структуру один раз для find/delete + print(f" [{struct}] [{mode_name}] building structure for find/delete...", flush=True) + s = build_structure(struct, records) + + print(f" [{struct}] [{mode_name}] find...", flush=True) + find_times = bench_find(s, struct, search_names) + for i, t in enumerate(find_times): + rows.append([struct, mode_name, 'find', i + 1, round(t, 6)]) + + print(f" [{struct}] [{mode_name}] delete...", flush=True) + del_times = bench_delete(s, struct, delete_names) + for i, t in enumerate(del_times): + rows.append([struct, mode_name, 'delete', i + 1, round(t, 6)]) + + return rows + + +if __name__ == '__main__': + import sys + N = int(sys.argv[1]) if len(sys.argv) > 1 else 10000 + print(f"Running benchmarks with N={N}, {REPEATS} repeats each...") + rows = run_all_benchmarks(N) + + out_path = '/home/claude/docs/data/results.csv' + import os; os.makedirs('/home/claude/docs/data', exist_ok=True) + with open(out_path, 'w', newline='', encoding='utf-8') as f: + csv.writer(f).writerows(rows) + print(f"Results saved to {out_path}") + print(f"Total rows: {len(rows) - 1}") diff --git a/Ezhovnd/report.md b/Ezhovnd/report.md new file mode 100644 index 0000000..31e97fe --- /dev/null +++ b/Ezhovnd/report.md @@ -0,0 +1,142 @@ +# Задание 1 — Структуры данных: телефонный справочник + +## Цель работы + +Реализовать три структуры данных «с нуля» в процедурной парадигме (без классов): +- **Связный список** (LinkedList) +- **Хеш-таблица** (HashTable) +- **Двоичное дерево поиска** (BST) + +Применить их для хранения записей телефонного справочника и экспериментально сравнить производительность. + +--- + +## Реализация + +Все структуры реализованы в файле `phonebook.py`. Узлы представлены Python-словарями. + +### 1. Связный список + +Узел: `{'name': str, 'phone': str, 'next': None | dict}` + +| Функция | Сложность | Описание | +|---|---|---| +| `ll_insert(head, name, phone)` | O(n) | Поиск по списку + вставка в начало | +| `ll_find(head, name)` | O(n) | Линейный поиск | +| `ll_delete(head, name)` | O(n) | Поиск предшественника + удаление | +| `ll_list_all(head)` | O(n log n) | Сборка + сортировка | + +**Особенность:** вставка проверяет дубликаты, проходя весь список — O(n). При вставке в начало без проверки было бы O(1), но появились бы дубли. + +### 2. Хеш-таблица + +Хранится как список из 1024 бакетов, каждый — голова связного списка. Хеш-функция — полиномиальная (база 31). + +| Функция | Средняя сложность | Описание | +|---|---|---| +| `ht_insert` | O(1) | Хеш → вызов ll_insert в бакете | +| `ht_find` | O(1) | Хеш → вызов ll_find | +| `ht_delete` | O(1) | Хеш → вызов ll_delete | +| `ht_list_all` | O(n log n) | Обход всех бакетов + сортировка | + +### 3. Двоичное дерево поиска (BST) + +Узел: `{'name': str, 'phone': str, 'left': None | dict, 'right': None | dict}` + +Все операции реализованы **итеративно** — чтобы избежать `RecursionError` при вырожденном дереве (10 000 уровней на отсортированных данных). + +| Функция | Средняя / Худший случай | +|---|---| +| `bst_insert` | O(log n) / O(n) | +| `bst_find` | O(log n) / O(n) | +| `bst_delete` | O(log n) / O(n) | +| `bst_list_all` | O(n) всегда (in-order стек) | + +--- + +## Экспериментальная часть + +### Условия эксперимента + +- **N = 10 000** записей в справочнике (имена вида `User_00000 … User_09999`) +- Два режима входных данных: **случайный** (shuffled) и **отсортированный** (sorted) +- **5 повторов** каждого замера; в CSV сохранены все замеры + среднее +- Поиск: 100 существующих + 10 отсутствующих имён (110 вызовов) +- Удаление: 50 случайных существующих имён + +### Результаты (среднее из 5 повторов, секунды) + +| Структура | Режим | Вставка 10 000 | Поиск 110 | Удаление 50 | +|---|---|---:|---:|---:| +| LinkedList | shuffled | **2.951** | 0.03205 | 0.02936 | +| LinkedList | sorted | 1.945 | 0.02199 | 0.02032 | +| HashTable | shuffled | 0.02342 | 0.000182 | 0.000133 | +| HashTable | sorted | **0.01845** | 0.000179 | 0.000130 | +| BST | shuffled | 0.02152 | **0.000143** | **0.000077** | +| BST | sorted | **4.640** | 0.04080 | 0.02649 | + +### График + +![Benchmark Chart](data/benchmark_chart.png) + +*(логарифмическая шкала Y; заштрихованные столбцы — отсортированный режим)* + +--- + +## Анализ результатов + +### Вставка + +**Связный список** работает медленнее всех: при каждой вставке нужно пройти весь список (~5000 шагов в среднем), чтобы проверить дубликаты. 10 000 вставок → ~50 млн шагов. Это объясняет 2–3 секунды. + +Интересно, что на **отсортированных** данных связный список чуть **быстрее**: вставляемые имена идут по алфавиту, поэтому при проверке дубликатов мы чаще «натыкаемся» на нужный узел ближе к началу (список хранит элементы в порядке вставки — в начале самые свежие, то есть самые «поздние» по алфавиту). Это случайный эффект раскладки в памяти. + +**Хеш-таблица** практически **не чувствительна к порядку** (~0.02 сек в обоих режимах). Хеш-функция равномерно распределяет ключи по бакетам — порядок обхода записей не меняет время доступа. + +**BST на случайных данных** (~0.02 сек) — сопоставим с хеш-таблицей. Случайные ключи строят сбалансированное дерево высотой ~log₂(10000) ≈ 13, поиск пути к каждому узлу быстрый. + +**BST на отсортированных данных** — катастрофа: **4.6 сек**. Каждый новый ключ больше предыдущего, поэтому дерево вырождается в правый «связный список» глубиной 10 000. Вставка i-го элемента требует i шагов → суммарно O(n²). Это и есть теоретически предсказанная деградация BST. (Дополнительно: рекурсивная реализация упала бы с `RecursionError` — потому в финальном коде используется итеративная версия.) + +### Поиск + +**Связный список** — самый медленный (0.03 сек на 110 запросов). Линейный поиск O(n): в среднем 5000 шагов на каждый запрос. + +**Хеш-таблица** — почти мгновенно (0.00018 сек). O(1) в среднем: вычислить хеш → проверить 1–2 узла в бакете. + +**BST (случайные данные)** — самый быстрый среди неотсортированных режимов (0.000143 сек): O(log n) ≈ 13 шагов. + +**BST (отсортированные данные)** деградирует до O(n) поиска (0.04 сек ≈ уровень связного списка). + +### Удаление + +Картина аналогична поиску: удаление требует сначала найти элемент. + +- **LinkedList**: ~0.02–0.03 сек на 50 удалений — O(n) каждое. +- **HashTable**: ~0.00013 сек — O(1). +- **BST (shuffled)**: **0.000077 сек** — самый быстрый (O(log n), плюс операция замены на successor тоже быстрая в сбалансированном дереве). +- **BST (sorted)**: 0.026 сек — вырожденное дерево, O(n) удаление. + +--- + +## Выводы: какую структуру выбирать? + +| Задача | Рекомендация | Почему | +|---|---|---| +| **Частые поиски / обновления** без нужды в порядке | **Хеш-таблица** | O(1) поиск, нечувствительность к порядку данных | +| **Данные в отсортированном порядке** (range-запросы, list_all) | **Сбалансированный BST** (AVL, красно-чёрное дерево) | In-order обход = O(n), поиск O(log n) | +| **BST из коробки** (наша реализация) | Только для **случайных** данных! | Деградирует до O(n²) на отсортированных | +| **Связный список** | Почти никогда для справочника | O(n) поиск и вставка — медленнее на порядки | +| **Связный список уместен** | Очень маленький справочник (<100 записей) или LIFO/FIFO-очередь | Простота реализации, O(1) вставка в начало/конец | + +**Главный вывод:** для телефонного справочника с 10 000+ записей хеш-таблица — лучший выбор при произвольном доступе. BST побеждает, когда нужен отсортированный вывод и данные приходят в случайном порядке (или используется самобалансирующийся BST). Простой связный список — проигрышная стратегия при любом n > нескольких сотен. + +--- + +## Файлы + +| Файл | Описание | +|---|---| +| `phonebook.py` | Исходный код: структуры данных + бенчмарк | +| `docs/data/results.csv` | Сырые замеры (90 строк, 5 повторов × 3 структуры × 2 режима × 3 операции) | +| `docs/data/benchmark_chart.png` | График сравнения (логарифмическая шкала) | +| `docs/report.md` | Этот отчёт | diff --git a/Ezhovnd/results.csv b/Ezhovnd/results.csv new file mode 100644 index 0000000..23e53e3 --- /dev/null +++ b/Ezhovnd/results.csv @@ -0,0 +1,91 @@ +Structure,Mode,Operation,Run,Time_sec +LinkedList,shuffled,insert,1,2.818623 +LinkedList,shuffled,insert,2,2.776622 +LinkedList,shuffled,insert,3,2.932603 +LinkedList,shuffled,insert,4,3.150283 +LinkedList,shuffled,insert,5,3.077142 +LinkedList,shuffled,find,1,0.032263 +LinkedList,shuffled,find,2,0.0328 +LinkedList,shuffled,find,3,0.03149 +LinkedList,shuffled,find,4,0.031703 +LinkedList,shuffled,find,5,0.031978 +LinkedList,shuffled,delete,1,0.017758 +LinkedList,shuffled,delete,2,0.032563 +LinkedList,shuffled,delete,3,0.032256 +LinkedList,shuffled,delete,4,0.032048 +LinkedList,shuffled,delete,5,0.032178 +LinkedList,sorted,insert,1,1.833796 +LinkedList,sorted,insert,2,1.836535 +LinkedList,sorted,insert,3,2.088518 +LinkedList,sorted,insert,4,1.868659 +LinkedList,sorted,insert,5,2.096095 +LinkedList,sorted,find,1,0.021973 +LinkedList,sorted,find,2,0.021922 +LinkedList,sorted,find,3,0.022304 +LinkedList,sorted,find,4,0.02182 +LinkedList,sorted,find,5,0.021948 +LinkedList,sorted,delete,1,0.008794 +LinkedList,sorted,delete,2,0.021849 +LinkedList,sorted,delete,3,0.021325 +LinkedList,sorted,delete,4,0.021476 +LinkedList,sorted,delete,5,0.028157 +HashTable,shuffled,insert,1,0.022874 +HashTable,shuffled,insert,2,0.021475 +HashTable,shuffled,insert,3,0.019544 +HashTable,shuffled,insert,4,0.023367 +HashTable,shuffled,insert,5,0.029821 +HashTable,shuffled,find,1,0.000252 +HashTable,shuffled,find,2,0.000152 +HashTable,shuffled,find,3,0.000143 +HashTable,shuffled,find,4,0.000216 +HashTable,shuffled,find,5,0.000147 +HashTable,shuffled,delete,1,0.000208 +HashTable,shuffled,delete,2,0.000132 +HashTable,shuffled,delete,3,0.000112 +HashTable,shuffled,delete,4,0.000106 +HashTable,shuffled,delete,5,0.000106 +HashTable,sorted,insert,1,0.020814 +HashTable,sorted,insert,2,0.017296 +HashTable,sorted,insert,3,0.016897 +HashTable,sorted,insert,4,0.016796 +HashTable,sorted,insert,5,0.020424 +HashTable,sorted,find,1,0.000285 +HashTable,sorted,find,2,0.000152 +HashTable,sorted,find,3,0.00015 +HashTable,sorted,find,4,0.00015 +HashTable,sorted,find,5,0.000157 +HashTable,sorted,delete,1,0.000182 +HashTable,sorted,delete,2,0.000156 +HashTable,sorted,delete,3,0.000104 +HashTable,sorted,delete,4,0.000103 +HashTable,sorted,delete,5,0.000103 +BST,shuffled,insert,1,0.024171 +BST,shuffled,insert,2,0.021608 +BST,shuffled,insert,3,0.025746 +BST,shuffled,insert,4,0.017484 +BST,shuffled,insert,5,0.018589 +BST,shuffled,find,1,0.000218 +BST,shuffled,find,2,0.000122 +BST,shuffled,find,3,0.000139 +BST,shuffled,find,4,0.000117 +BST,shuffled,find,5,0.000121 +BST,shuffled,delete,1,0.000108 +BST,shuffled,delete,2,7.3e-05 +BST,shuffled,delete,3,6.8e-05 +BST,shuffled,delete,4,6.8e-05 +BST,shuffled,delete,5,6.8e-05 +BST,sorted,insert,1,4.498011 +BST,sorted,insert,2,4.60869 +BST,sorted,insert,3,4.558911 +BST,sorted,insert,4,4.703444 +BST,sorted,insert,5,4.830993 +BST,sorted,find,1,0.04103 +BST,sorted,find,2,0.039717 +BST,sorted,find,3,0.040988 +BST,sorted,find,4,0.0401 +BST,sorted,find,5,0.042171 +BST,sorted,delete,1,0.026369 +BST,sorted,delete,2,0.025809 +BST,sorted,delete,3,0.027687 +BST,sorted,delete,4,0.025919 +BST,sorted,delete,5,0.026676