From cf4816052fafad2f2016e4eb063d0cd7e5d4366f Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Tue, 23 May 2023 11:01:41 +0200 Subject: [PATCH] :sparkles: --- bachelor-project-nikolaj.pdf | Bin 237192 -> 239218 bytes bachelor-project-nikolaj.tex | 48 ++++++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/bachelor-project-nikolaj.pdf b/bachelor-project-nikolaj.pdf index 69a505d53763183f6b021056fdf96b0cc54fa4bd..e7aa9628676259a1cea60b555f04f84f8d568080 100644 GIT binary patch delta 25740 zcmY(pQ(z_xtSvgVZQHhO+qP|fQ`@#}+qUg?YTNDo@7^!_Jm)D`$;wK?d*C0Y;r|8$ zB?ET=m^nF^`1zq-T%FB~?4Uh2ceH0>aXa98PpK}zq*KcQhK!KFrWos42_1AV`!^fz z@J&MOT>qX$qzgsWG+KN%cl#l)#1$GyBa0~?NLHq9qqJCmSY(39LaUYaXZwf_B))um zKYi+f?x@$Bt0$^(@t8jSsE#K4#b~mU41Ssbh*-ZkCMm5G#blgjg&gMZc3P`=4?09X zVC*=Urp00<1HkZLrnOCZmfBdVRtc;Q3FtuBQ}V0Sr+)$AX1eNz`Se4`Zkt+>dle3% zJ(+z?)3JgfN34vr43pPtr|up;9+Oso9$=yR zhN@O;{b=`_{C|#*%Z}?9gey&y+@C(ze-;3&Xq+kYC-xE4mPb)}_E!It1XtZX+>j*gh82;h1N(hVGfxn43_G0Dska_cHa&7|csvf~8{-@Hvt2dU-Y8w)8 zQ_^GHttNPZ%!Wy5s@wH{O@Qu#;iyNEgCr2je2SV85XmN}@92o(sKrQi*5Qx=;-oT2 zR@H(BV~THBg|3TUiCsxl<5sxWCh&o_uBsbG!^oGC+DK*fSIzWqTe9Y8Bg{LT`XgsiaMg2hUezf0m-}&#%V>B5LZK&q*?-j=eeT+E0`-*}N9zvRsTR>}y5{0r9 zBM3dr#+Zkwc~Xyy8Jf|?FFwaVHmPdl8iH65yz9Qvw6Z0--OdptKi_@{uH)!VdQw?T zkO$h0kHNB~Tx|TF@bz_K|{Jkluz6w3uC#M*hO6(I>1hASfk`;gMwD&qYeIgi){L&YlzogU`g;0>uA2w*=Me|T@TM7ulMT4y z;lRa_l#qpWa=6WT>&td)bgkyV2CgH-z`Ug}s%XFsMR<-oB;&5-YgANe(S=wRfxe1P zpD7yO7|L)pC&Ltr9Ut8Rwl*q*Jf7?wqIgFQ1=8b{bC)Tu50u%!b=cqu#Ug}Jhx?_@ z5uqXPCweuCCqNkIykueYikEe1i!>Kn^r(EaaxdN!ZY_UdJ|_rHa%eyPkw+%rb~>o~ z`}88&-H%?tWV@{kus0@CDER6fA%^}sp9m9Z`{lQ}3JwO88t69w%mwt3t{%1F<+qw! zwA@DmN4lo7mRq}{P3I*_X~+kU|7`FaX}bx_E20&7{*^iYay=%Nl$*)orr2+jD`B1+ z&8^+S^)`spU`y+n&uaG>K2Cl3vVVF|^+M37y)?C|v|1qo?1p9xd@H?DYqP!#5$wewurHb zXpscI9v_eAP8A^a(&m228}$)^J(Ez(oV`J-ve_{o_BL6>NRy42Fp+F2-L&qKQ9O+) z2xT21U64sFz@KBv!{bf*|FMwUL@P=y3F-^RYlaRcRCMnGvPc_MO(F_aFoJT!WwK=A zK##U)y^G^~PYTeUbTOT*(Wb^|e>+=?gr<>d5?W0Yn=Q(?Qba(TOQ5MZy95;tLC|}4 zN@dgSCYOzY<8W+`H5-K>H5a47K&=|7R4B4u3gjvqMAzz~22qW4$d#D(I2kKwdJ72F zy-jvJ3Z||B8E@XUR*Yfh)aR&N+wwFn5c=}U)ALmF^Aj!Y+A^Qe)zZ;5{m|mZhrEB% z@TFvbtIYny-W{ZvR7We|#+_~D#ThQ@A$r)DK{>Xax%0q*sd8^Qpw&ksNC(aKBTc;p zr?ZKijcpn#{auF)b2Ye5KK~2%fZ8(rh2;4`oj6(u@YM*Qxy^hKpU#x!4o7M*btK`B zhe~|)4^9xunAx0A*++i#xx%WF+%#SNeOxDt9czoy`)l@Z#wI;ymh%Kr)umG&L zGUtfhUU$y5Vp%0CqtN^Cth5d9MVmC%`4j%!Sdl(MqBzUkzhgz)@!{L~xY#*1Zk%oA zN%tuS&@Ml;m_K-HUX6bU@zsrxyjvGtB!disK*=)qZ&WNLXy-3!WKFKger|jCKB<-~ z-x)2tT@S;vVPF~1n}l=?I;CUYzN=^0%dF9xRGg*2OmSz*ldOjK1AS)c2&IiS-Z~%S zE3nV9mip93MJu$t%Zz5HSVE+perX|egm^eMz~J~KJu8bOL>wM5B%9u~!%&>UWQ)d| zNdY7&KDdYaDu!%tY{hPmH7H#o*PF$=tn$RUvO+&jiI4WiN_EKh!mQ?%-oxtt6UZaO zJoG8s8;$Z}PW>Ff=8fWYg6_?8k?EDA*7#m-^K#x$i-q>Eoa?MQpQqC`dFwW5tIXdI zuxu-_#=G!!l!@;>vR8;Q70LQsC3IP%vM#F%^|m;=L2-M54Q6d*@ualAuJ!UxvmyB- zZS#V;s{s*;Ivns9m18DR`rf^6Yh?@vOP~68*SYhK5(8mI_s~9NBkD+XH}Vg1ByX;X zYg+7Qs9jEwJVOZN&C3hBwmSUbNxwo4pnAV`r$`uxh*+F<-MvM+8Mc**CDXaaw1`To z*-F^LR(@r(q$juY&pCkj?+&Emht$B-+4c?mdW|(jmH$Ped~;UWSspb;fUq_sor*oS z9|LXJqvRQqS0^&l2ecj+U)x>##(A??4UK=)E>l$p`n0O(5Vg3Z|!QztXy>Gw>>kOBCt&$t0C zP9M%4vs>;Fx~_r2eM*f@TO5mGh}F7l+n82?2I<4aVSeO654inRT7EM}8^O4{q|VYd zsHk}|AtJLTiGM}EV&}H`OaEz%s)l$|(e(8{F=>9RJHAHIS-d=JN)U5itQcsxMF{2B)1!{PGE>K!)r!&;{l_T##0Y_At zofqpI2jtR4-El0tu41uxfM_UfuDqLop^|b+2|b1K2K|Ns@@MBgBKEh5E$O~2+CJ3m zmuK~Uh&m2<&|IJG0wb6*F;7l7O7Z8LNJm{Itrr{V3%;6ow06+Ur{;+yT&jtpD zt{4e?aJ~7hv%N>&?vXM#`s1p{$L(YJtGT847_osxRn8D=kZwMZa;li`_*5T>%%j^b zgjti_3C~~6DknY8Ot$hHf8=I3<@|c@fdEe|*mpOZX7LwYC@%4*F2gsDu2u3J`ze=e z+antAd_Nlg9_@m7I$m88E3-b!9CKYh*!RYgtU!DBBK35JSxfSLU2*n?v~5%y5S-YU zGTM&2drtlNdvNw1N{-usX|d;|rucohmtN;lIn;j?GyF+0r)t#tHmA2L2!5Xo6c()( z(wyLcIRPw;Z0!G+V7KVZ#FDoCFTpOY22}hVAcRE3xw8xC!Q!`7=;8=-i$y zW0X%41#I8jU}MPv3%Bn!)CyQvE;5Y9`4ui*ci^{XiOfQb&Fbxkh+EnZ9zI3r>C8PP zjhY2e=+!2=L5_$j+{V7rs3cYDL|-}!~x7z@F3rv8;s(<`H#rz=%?jmaRJx|q@Fz^D{MA7T8?l}-2IHk*S>Y9md4Rmzso`^^It93%lUmxH z9HKV)=Ya%XnjPChu`!>Yc8rUbiQ}R%#^XDL%b8(Wlu$W{L{pXPen5Q;I07`@{DV$x zehq|7J&&@wPP7&FMsjp4{)~BU!@#XzgqDbzorN0Py=QT-!btDAA&$2Q2Dn`;TcHX*ekR|EljDWg0h| zFK9)ww~yG`$WnXc2W;Q<(#mhJW&Crs`Bv8+sx%1~f>rmTNuv!pEl91#RoP;NmaqIzmcn0pP5P55CZ3MtWWleffH%Aw1A1KP^eg6n@;M{sM$fC z#7PyP6X{q_x-7sh4@Vk7#j|1|srpbzVl3YN#8MWP4WCR%_n((kQvofuK1 zDm?c++~&djI03hI+Ag`}QtIqusvKYO#TE~Y&zg26D|FyVbQa?G#<~M+>MlJ#*hNdz!P#W)nl4)w1_lL0`i`hwcbOj#-uEP{}|q-^;|VT8(I0w~3iupB>dob<4^M(CDae}9BhIzJba-YS66s*En_ zIvhT|Bp5hhSyDV+&@4*(B^e(aTykf1xna@`8~Y6=GIefb)evWh4IUb+HYYj&d)p?| zyKbk9aEFE3))kz@>GLo2D~ZvPo*!`IG2lCi`f3@R9DRdYxzG{T8Og0r4%5se(8tbu z44J@KF6@6VXE$f|aUmykL!||X!8Lmv2wGGqcVZYodAZ9Jl zIOpw3g?j!)xx>u;8d-T0argbD1Zd<*V%CR9LpL3<1AbPP$zcE2!U)_0QYlK%Yf~p z7(3Q9;eLOEkdy#4$(Hu+#%IRTsftqioR})KR2b;$Tq5g_MKi7p^|?KwsB=Y@7eBJ6 zF?8tTasgE0XinS|<3uFPml@?vek-f?hDb7MP~4Qr4^j12MDlnP#7WG*v-No}_bpnX z4eLTAdKELE3dHAnv`@ij07%J#N(4sl3Wb>RK|#l@58@~GToF;r0y{?td~`3)(&~RF zPAr1JgE1>;U6H_kb`_L`_{1Z0&k39DT&moUY7Umb&OI^b$_SfGwpjHV^+Fbv1Q1!I z<2M?-Q$veHi#x#YAfBcFc*(}jYG6Y-E`Ku(~&xBmKj; zkgvowY&F6b8MEwB0KqdkCI2S7#?G?X?}cf^r5;DYWHWMJ2 zTM}M{2IHaB)fcD zEJiwbAFf@<2DvsIedOVX3_Q+iNxGJqm0d=!x~_va#&}dKiX_#aN#;mJq&MwcF8!Wj zT?EKy?uB2Ft=3bk-C<1g~0&v(>J#bXl@Y!XoL z{+aEcSdn9r3XoGpNf}X3B>KCd6SV~gYOknY@rqOrNShxh<@X|4HV{u*S1SZIbwlUE zkcl)XX(7rs453L{W1&tPyAVy9WoT*r`xQ%^1*npZ=D*V{gqGlK^GT+Yqf;2Huz2%n<)-ZYKc?E`*(+~`(s;bUd&l!Afx6H%(N6Eag_6}!IOViz^k{HWq;G148 zqWja|Z^)p9;H-3lW2TOtU~9iogl|StSLsty)Wr0PWk&&pfCskGip4bIh{|Wj zHBV8l%aP6sk6{}2{mZ*nwi&|9SJx{V>Js`vd>@PpOlD(xb9+_wk7<26@kK~YwOVhk zQ~i3>F9j@*e$h}WOY&l%?Djzoo32KoE}%Fbyuq*6S>{y0Gbabf-0q0pE*457&FOZe zHi_OS^OPe4+LpgdOIAK#q2YRAWxy`@!~U_(FW!*h>G(-}pAv1>WU?QXPeajM(`>9eDACp%sh`Rb9Tw`6+duOF4S!J=ttP3Pn}MLzq%XS1btQR z@|bM!+NJZ{#zSmN0q{-`TnjKsQ^ERgH(+LEWBtFo!H%{}+!i}x@2kccg66>|5N1@N zph|ul*o*p8yx!P35f%2+e4hdQgjal`EyQ@qNUc#6aoFP*C(Gi4+d>pIz&pY`f~by) z!NFj%pW*n?>hXJN>fxqGuUWfk(%Y+pUcAnTORLE{FD-4#!J?!aph8Vq@|2}~((*Mc z&9&q|lrEz{QMJ?&1OBC(+<3f|)-`+LtdaJ91MG6CrngZ(z`H)6x5;^fxRMlM(H_Us zueT53^??0;!BWSF;t%BEi1GH`RYP;>WC-4B9q5Hl7v3WPetv&L62Tm(E#;Hh z+Te5S4pY+1z{z7DfNPd*hA=GF&Po^g+}HP|ZR@`1{tPdtGR)b5NvZ{AYQ*Y3YByZf zxzhr*r9ObJ4!Ny9h!-aOgfK5YAj?#^cEUT0dCt1JFs|kWWHlEX3~jBeP6cc5toCsc z|0#bUJxTML+gy`My_;GHvdSO$wi6qAO>PG{X>6p(Hxrcr(9(>mMC~Q5KImeaKN55^ zjHPZ5Pcpw2UR&S59L*_F5Xhm9GOq`cPqJSy$4zn_Uo44A=^~6YN3@F)HeY3_M}dQ2 zS0TT~argB&m^X|S%%1JIcpU`IiqgABq8cpIH#I$x04?7E(8#*k95l8x0K=&p(}u&-t_FkQhU=TB zvavM{=zfkht&34~yc#xy`Acuy?VP#}>PV5~NIcH;|QFpz1K zLp(guUW(P$#o{e%_%ic1EXD-VidhZ6)WV%(*JKLgK2LOU@jxq2%b2_K(iZkvK7|d2 zoGU>NFq|N0ks_<$j7ZTm<786O4&_7!IulMCv^hUe)W6T3g8SfD#seiKAGA`)iHek( zDLZDr<0Zr5;M(e1yZ;8?YEEtijhh%!7kxKpXf6YABiCsZ~LaRVQ1iicx{)^`EEW$%#<`j=J5w6uV^eamZJs#?@)Vj)@q9NZ0I* zB9F{Rv&7NW1dgf|oCZI6T3hW_>vz%9DsJ=+Jxx7eZ>wnP+*-~EMqO}vL&5l4dOd3h zxHy|znlOLid_r|stOyT+W{xZMY&=)hLJz^}`!JB->fB6YC{(+p)I+G!;ZvmfuqRbywhr?Sd$BtWPkSH=BPOiUXI z60uO&vZIJwI&kI{rMWH10o-63YKGpe`scGkJk2E7B@p{%3z=L8N>A#=B)sSzLYCzk z-QJPU->l-S6N}+NgMTn{sAlH#Na+(LlNHv+?W#(v5Ar7^&%5{F4%w_`gOn39sMQF3 z_;*i`@gt_QW0ou7CTsX*EAt)!HNnYDe&uLWDKX?WS9UzJDvQJmw0qVOO7702rc(~c z8cnmf&-k%OC_`#ZU&R%d=&U(o)hc;q>gg>A>;_&ZtyP3pa1>2$7E0PvkD}K_`9-6G z*Y>UE{Wd{t7 z^b@j7&=~HsdvapiZ6&z=X->0#UtZ!^8EIS_-Om0=NgcZze$A8VFE-8jzgw>t{0&<; z$%Mzxc-L!na7xJKO zSP0Jv-JMg<_=$@hOVHSW1c4YcoSFDYhxanpJL_a!4=t@a>dOfro$~UUF?0wJ6@zOs=%P&v7f>3o~U}0%_KiDG+_&RyoMG zVF8RkoLc<-Nj2M}I*)F79zJ3d@(2(1DSOK+G9o`cOAj6*KF%nBy9vD3q!N{b%{M3B zChJ>$&$oH)S{hM?-|{_t1Fc{6^&l7MMxiN2LbgD3+t)EkvrJp^hTqAcR0TA5fkBal zyaYTPS2@tTn)zv-I%CfI({ryux04$pO>aW@zLwj^fDe8mJ~JAE*b_NLwM_dKdP2FR zHC$qCW)vm{Lx?B_GA!$I`Qh?m>-P9kIrT@GKhIs#y6>a9pbDzD_0f1{0fuc{%%RH< zl_HPrRc8}c|JcLsY2%s(9(3EpOeb!GLo_PGNWH&d8Apu&Rp9N{#YzAi4mNxv_4AMc zcpux^TSO3odteccN3`+kX6y;*%nL*M#j+3Q42=hnwH#QWKgKp<33hheVw!ITEJg(% ztrS^Aa<*VB&be*aKQKB3zc0*^0W zLw$OUr(A6uM8LYQ047ex|3}%~!J3N2;keqZn@8|ezlAWw6k8y-w1>H(8z*W#dWyHh zd79s2po&Ch!}m!d6kIS~!$c5MM%_zZu`o*x6(~wnqe>;iaPtQ5w|VpJ_WpS)#@EL( zn^qRCzc??f)+*fO>Izm|UV6XQx6x>Z*SZ9F@?J%+Vhi0X;_@D0@t5!!O>7L!k|EGc zAc`|KA08d-Ea5y)C1DdU>W`L@T?8BZtE)9qXD&w3aFzF|fibWX-W|-vr4cCH&Hz&a zh%{*sWJ*n+W$VD&Lk@#JL~rYVfe(wT_u~oMAs~HOMnC1b2`Ngt-DO%gaDaY-_uB#K zs4B@%+zi~8k&|7pnrX$%W|X(@Qovfx4N`nsX`p-YGDRaA`4-f^H4B|%IQaP}u9mDXxy+qPMkS)xRp3i_JHbjB7I~;3$t5=qv+wtqIBJWQVgkc^br!@I0 zj*Dv^&+LFFHeY`GdR8MSFno6=ClH8WU~9pPdqDyWE3izIZ4ghforUKm$Q!O4z&tiLB6R$3JYDpE;p29 zKn5b+Me4p!svJp-w5u;dM$)NW6jvXr<9JShDSo$|uEM#QbY5EacIF~S)4~0GIjOf# zu9R55dy_>Rq1;1<-JKkar2+tFuox^1WP%04(os$LO ziNCdvj~%4h!vQDn$nJfj?*J}mp8ZuAV)9B*44bFko~5BJ_DTn>yvpQ6o3(Frmrlhu zsE1-Q-Rf4mT1ji{r2%C0!f{p#qt4-Ecu#Z2lbQxrrm8nY8wLz0r5h05m}POS8@wWt zQ+z)IyY0lf0;6{4QarcC^+*jT&?@lttGAGrWx63!*|Jwv(h%QgS4yn0hl0t-wFT2l zCo_qSm|hQ3da+fY!ow2o!?VbNNSJ!iw=*rN=B}yD`h?bt;gN-bp$99H1Dn1wF<+5} zHC%*u00(NReEQpyfdx3YV_;{Y6{Bgpr79tvS;0q%*ipf=j3`}0t9@>nE7x>+7&z3k zV)io(;fCvy&vqB!2ABU%H-G1;UGb*|gk7;c`7`*~EvI&arY+AJ8`#UKXw4UTE%o#q zbzf@3)oAmrIj_%a`n1SoYD16i^ADU4mjtt0KDVR8$bD6vR0E1rTY3}<+(JJ8)ax{j z8C4?j%QIgryvya3oLm5^I7fR)eCC#6)>KyP#bNg5x5=OIhOIjAp8i4bpcHJEso@w| zS=3Ec@(@9KOdd7=`4mJp)rOd+{lb`XJxX2MuEx`!JkC^aS2Hz8#ox0Oh^9xX*?M6V zsk-0hu3xbOHUfkSejdq>!%&G-D>-ZI2K=INZ(Phu;R@Qw6}Ew>$2iE?P#iPmEU8rX zb6k3NyMp?xsDljgk{Iwb;F#J0@EzCRz4u5#YK>aytCZTK7`I$Yt(q$k9k(~XR?%)u zM#72yA+}1D7DbR6z zB%Ms_?{D+<Wo(3+9TC7N=Go7%3&SV41P0;WL?Jzg6o5EBmLJ+qa7hXbvT0S*GqX%?+q2+u zk3`qNw@hcuJA1TQ-02BS+U)npXrijyPbqZ+{fYecpBEf~2hG;XGi^T^A1ZsjNLg>E zo6Vb(#Ro&36%%Jn)DJ_vS%bX%Yn?>h*6bu*kXk3xz)Hs2riNI0~TY1U59=` z?{6y%qpxTZ(PmvY0sxX}Ct|Z;MQFo)i7Uo1mK?!BiUmLdh~9#k27crMAoRu*KHGq9 z{4p8PN4!IgK-tfXNTO%SFyR$mMUmTZL`1D0U=mce@Rxro06wG-);{W4TN^K4p24>u z)25}BMEOwsk6a=JikyE6iqG~DP%$^m?rx4a{df8>m*e-a$m_jLm4n+R%!Fh{Avo3c zj2xw5V9Ajk0zkYeu;-C^>LKb$F}bu^iprutWR;|5Cr}fJkNe#RfUR+*M?zaaVNqfJsX;`;o6g%3QBy+ersq=Tt0VUO5Ov(T!}1182()qq^$Ug-PWmCjSH`WTh*u+ z2=&~f`HP&Sbe?|MmcI7bAM@=!YjyF#{mPPf2A5gv0N^v<^DjM13Z2dp?LV|F_cXwJ zVLSi*6~$hM=t)cm&oL;YI&tbkLK3UCQqOfXDC1{1u%a{WnD&1b<|l}l)_+_)^$uvm zy(x2t(!Tx7e_^X;BAg0N%aACf*R<)0wb}LMC~`UTTur zT6WUHw-aw&Ie>(o01GmE{XJ0?7Q9b<1Nh)pX z-M%|pV1|N5#1XM&y8-kZ3H$b$JF_bpR&svF2Rz>UdbRrSca~fn1NfYTJ-WGJ`8)6m z;u<=Sj@R%B^?@Ld^X%jdX$=0{EzjNEeZCF(@$80@WAtm38$sbE)k*TPqC+v zEnbYAiqS~e*mzhpBfHz7j!+wYrUs6m!&If&038nkWGGJYR3af zCdCv5r8w$$>NlzV^*4rE$hMGF=K?J-#wBty$_fl<k(#B!Z?*e_AK8Ac@b(QcQ{nRfTU(*aLbG5ykb zHOT)piR;SMJxaLi`>YiCuw1HZnX;aI3X$@Fb8Lgodgn-G1 z?D}IOEa~jvR?$x}2ieaPNkC1}&f#{)dT5u%CWOmN`3pK%1x9UUGv-@kv<3@qBM*L( zJPlPZEQim}Pq>Tau}*EPxNmSL(13`P%}p=w=#E^l$M{q{0m&_%AH5VZ-Gi+$fTqhz z`3Apm(p)C^R?39bfYC2MS}XXnZ%|VjLwswTmd(!rhtJB_pekD)UfYcZY22R8)n@af zEo1m*4n1gDxo@r8v-NXUQcWq=AzoGwVIZBi*Fdfi#6p41K|CmI*t*cQE+YKer^osb zPnf!ZUraIv{U1*P(R=)(Ad{UQ!2ccMdgDPNt$-ASD{T@V1PLG%7s!Yha{CpDzhfIM zSh5lvPbqEOcw;a68q3&8sw_DY^y^>XaA=ez_~2H0D@U=U)wy*gyA!q1W;d1X?NlLW zcD~DRD|INlw&^MK-}}N<#&(}=SXW=I;HgeODLhFvjEy1VA7AiSp+2xD6oWdBb zVqqbSa@<_3=s2Kz>))J@!py9$HquxwrYQKak3*huW924GPmGU2E3r;iReJW~_VvHG z+AbxLQjFd-Qh9noJ2Rby9vbP!kd8!*&mn2iY&e?xan;{L=LnNinRlIaCO%Ds^Iic2 zWQhtAFldos;ds$#tB`b1Au%R9q^uz3VL{|fYG5i;>Ue;7wAF#6^9k}W^;MbBRlOst z?uZq=(A5~IKnwVQPzho00{AezEYAF@5-3DUz&_zZ6Qo|G@BDUxd7!~Kbvd`NKuVk} zxux}!%7Jch7mcehOM&%7M!9w)bmi(TIA>ZB3lNUhSc$7$meACd3I5+)#gHIM*p*Q zyGsb~vh-r7r01nX1;V2;i!fSMEiEYimtjr}V|wwl(1&VPe#YNH{{`Uh`}_X2nj1x) zEzsMs^xSktAh7!gm@l8i)B5(m%#IB9*!XeB+V)z*)oIZMm!285dp0|BxG>Udfq1pU z{#?8~C73QUeWjVe3;)l^FR8WA3A-NzGXP|gLB-`c#z>PJg{tXDSA~tqk%nO-PqPD>#tu9F z4y#axa{5G<5d|^jGG&C{v;L1=Hr#hqC)^jCsG4m7h4%<|a0&9DqT@B#Hx`H2$Swp~ zerf|{7Jw)PT1`?&;i>Iaw%s*M5(L#^%Ge~FPPQC1Fb#cB*nt)lbz&c*O4?@Cu0taV z-qH=mLU+$7Qw}8pPG>q24XHjIZa*R`*(j<{>(%gY#Mr#UgGNn)|62RvQNPH&af)Lp zjn>Visg8}g@f*89e6hm6@H`2RYPzM2F~pcMh#I!}4o;YRV41oU-^0P_xaD>%^a!WG z!AxbX0>|SvMQ=;4>+6=FN^K1}Q-vTtqmR4u0-yYUQ-9HB*+C@Y|>S=k8`1=5*ADti$(i8r^v62{m}x)4n@= zTxo}rSSeb-|Bvp2f@Q!XiKP|2BaTUoC_^(ZfE(LD7}=c z!3>dX8IB%c6sUVbz1>PxeL2f~tbLZh|Gvw6$<+j^uffM=ns6qN{Jo_`>Jl6-O6#2W z7|<^!u>UtVca$LHX(<& zwc37_X0-SphA#@sMhJwa5!8J^*gD6y5lI6pz*k&L?A! zXsK|yaX}`5KcFd}<+Db;I_dS*>NnEaG8m?RH%3s94RWkYawhWxC`>#x{?~IEY7jCI z7Iv02B61KMz%LsR5^{~9)h2S%?hJRSu&xE?kCX2=C+=r$Vr|pz zYn!(p|1rG<8(VxXJ_ysCV?s)tQ(1@ihM|VD_jO-?pXd6Q+mO!=RFUWs*iG zXGwW4`PHahNy6DUHidL^R?M!j&I*@Ws4`Kb(b$3?D(dl_6n)~uV0(-3dNF)Yn$DRc z=Qws~$CPLe!YiL|9O5`%FzMDBS~xx|y#R7ph}@xwiqT6aeuAYLs3adR8EbqQ7#eTb z8IiX`m&o(uj8as>C9qUb#T0VyahKJ}Q~WGvh)nnvcM`E@?)V~|X!#t6?BXd#2Au3i zCYXB&au{jrLMS7GmP7~ry2IkIcA3|+C&s%Z^}H=H7l!9)D6u3@U~;F+_5@es(|&=D4E!TnB`dp1ThHUTVsj9+<%b?-S&&1z;@jvJ49&rODU>LwkS`0FzlSb4d@z!v+RT6@Jgo48o;g{X)=&y>H+ zV~2fu-s!16U~aN%+RONBfuSJj>t31SP7V0^!%XRE_&=@#v8LTqg0KOmtcMs8#a@3R zwMvusB^HDKGBvx)!O7`dfi|X;G|+^T5pBWz`aLshsS*xg&EU=GhIpx|1}Y%_SW4k! z=N|=H;T~602}ki^2xb2{a@C&5aV4aNd}L8FFcpNHDx?>%pUXSdh8N9lWqWzdIlF#V z9)&PmfB!dCh?tmCRj36Rg$k2)MP6k60~r$?m!xm_IB6QC!2VK$WlitBuKPGDmZ??2 z15ZgF9!TqQY`lk;0xKa#X-(`6yEtAAySP|QD>(48L(o%sea5iB&ND0Lj*53Ut^9Ce zb!wUC$?ZkW+r#4>!IzTjo03C8Qt!Im1;5&6%dk2W7UH_PDf&2MHc0D#OGA(j1SW|G6&Jwr|BQ$PCWoN^Mudm|NK8c~q-21ppd=kDwa8{AX$m*@ zix3@{2^P!0J&aGwP|e1YIsaQ)@F|w-sH9D8HIb zpa3+2X-1jte24v^>Di zU=sZQ78rZlJ@J3&+NA+O1nk%cF~Wx2dO;hwXHr87=+O`rr^3To>9sBJ|B-`@VHHMQ zjOzU+H1E+YCiI)Vk1#npJ?>Rq4E(k7)-MPVr#5mta|k8TtxuUWA%dK^mc5zk()RK9 zFMpQUA$l7dI;i62>nk`f*6W>mu}(Wx8BiyzCptK`UC{ka%F0_oRti;GfPG} znc-94-)7HPrG*;U9R15u!UsLzc4;QtL_`y z0W&kF{b%6@a4>WHKN?MrHiRasMpv%c2A-;@nQjpachjn7!x(Z5TkCp5)YI-(Bn_~P zR%`Z7$!ljlDg>x#{p+sevZZkZCY-gsv6SpM7Vp=uive6B!5o3+-j!_|E7Rqu~&>}5Tk7Tb`+q^_`|W^9rAaNG2oiogUMh-1rLq_1bdR_#ZV~ZacqFTx%gR+ zczTydNXUpt$h)LYFdykOE=dheNsUm^dyVg65|O}?8~tAUfZatzhjZ>aIc2S24bR|Z z3SLokY^F(}&e=5vVQe&He8S`3P#-Yw4lz$JX|sV`{ewkG1BUa%=h(~QDB(bolBsXr z?m&|6;-gWi5+r?n<-PIo`3%6(n8c(nuJEAWsL!Jf@hF5lT_mQ%&vv_5m3l2so9}tx zoCdf54Ppn0@&z6;{qs|#>my9G;~Px#EqygC6oNC%@EZX%PB`2^s4+={(z>NBEIT?* z7?&AN>)e%oiUwXB4^}p zLU-i6(Uv!nta^L;9d1Bpn1_a2-^x&dMCP@pPS15mZq{}6_2IQ)U9$e(YwnuPPFGW0 z;T+y4)Cw*(FW2AVE8WVuJPK10+ZnIcaVcEh= zo*{&vBQU|?b){X0hZz2A{kL6v_%Lfo4h>u{RelaPkRXB(F;DbJlsiSgf;b3Qh!QUx z=b|pC2lWDmg-nt>boDNFJXVD!nnz3X?k#+w_k{ha-F-=P*jdRgk>w!vEz_}N(7=r` zB~;#%#q!B29|yq4fni%>PV20Vt=iaBSXo|7Owr+<6z-4Z31?zm$^sYC7ZZUuDOyKm)wvYW-1LW zxE;IFe!U~_++V01!VQh30}8@}Z#u;ae z{eai~@(|4lgG~3%)=cuQMS^}hU;wxF2tPNbKY*J{JXJ}*NPYBEIlJ_30{M`o8;-o`?&{|XlkJtsd`;$R%F4>Z zV#ikv7i<9$zfls{XK_D+=wSBv>VQ@));e0tFrw?guxsJ=*rp^^iDU=}2~kjpGznFW zv^0&Sv)E^Y+6*zP<>TXGW24n~b$klFJiBy> zdKGb!vRVa~$E|R-$B^oO4ObJWm;m1o%ESPghkcM8N;is<6KUqX{zxn0fL3xS!IACJ zNq}^_VbTHy54**E2GUwI4dCSC6a~|ZYS2lpz;=Ijf*Jpr%bD0fG$V(2`bZEELm@cZ$YiT4HCO%qoL^?^L~xI|$KEEzh2U@D{HEZTkDs`m(x);SG~j z+VDCehs$)$H!f0dyv1;a?7cB*+p_t=u(mstIOy3?D%~(>+URTTJIR) zQNVv-L!r}^hUBKT4~2pcmN_OXk#;M96)r}W2*#pt0{H@p-XCF+(HT7RDYf@WN>r0x z!PSTyD{A7-x#L6&N)|K5oZJxy{Vi2rsA*g$3D1$@-8aaX#6&A z`ml=me#vjm=~e>y$!&TGk#sWqfNX)EoB!{UGwN1p4wqdJgfET~;iGNWljgbn4$X)B zRkMEH^@Prt;O;l|a1lABo)CmLRg!}_+|f#CrC{h(erGVAdf`puGmfiy z#zWMYB<;l#e`$(KvhBLk%@yC=ZodWOnU&yh0y*hZ;id!LaDc1@?6Ygou^Ka2`88HL zplls}+}(Lrl^666-jizR(t(%w0!S|hD{IB*r)D#r<=u!wm_a};0t2<#Rtf^X6bQP} z!TVX}Ge4h?EJ24Ix8M74SPw_972LXHi?bD+PA?u34OhfHG5oPVN;`2LWVps^lUrr1 z&|wPxW9v^MY?xm{itK9W_Q+V74IO3V3y|vxmHef1SnQLn zSm4%uCdZ4Jb#S(%e5Jg??Thwn1-%2P#m90gIlnY6Y1kK(clbeug$KE92tnd0_jx|{ z9L50qfH!sDITt8CWKuP{J)9ipXjNs>IM zU^Fb9U|}wrjtpie^Vo=x1dxTbd=8bcV@>DfP;%tq4(7Atw5wwGv-(%sMoj-8AUXFg zJS2bE>1^B==iq^*e$}63Ndx%jkJYAM2P@TGg|6bR5&S|fzmAp)yr`~0hG6z9>ZY-O zC=!gelZ!)fF-y%L`-tSxxfGU+>dC%kf+`>y*MHyamd)PE%yan7A2i%;z|0k8)WqIB z7i@58M%);@2I3EZFzr8<(zV(45&TR-@`P)n1d>_s>x-8L*7sua71zlcD!h4}EuV!Q zhF!8*D*OA}Vo3TGLmhSJm*7;GOA@uRbJvhn@^r>XA!7g$=ipC~AUl{}#RbY}H!XBa zYJeO4=-Sx4_!gQkpfc&r9T|8%_xpq@<6qvh5t2j7B+DyK-6DB-!Xfh}bTe~$hGtv2 zHLD&$;Tuh)gg-!*T-e%i3nvYZGkaA!XZ&bhsz$CqdccSbLyUD1W`7aCytK%_Gr*dO zuQC1}U4B7TSzvWU3w*l#H1e^DDfD*J!@H??9ImyHzreW-1ZnpjyvJ^tw50urdlc`6 zpPvb3eW$W3vtg?AE5v7fl~fS$?Yg1y!|R}cZRFw(k;mR7g9Yz&t?{_-x!gZDaYT7L z#{K~ag;Y);)|)1xYxQX+xt3X@ZfL#kC~grh0z=SV>P#OQ?g&FrmOPJ;8lD@x?gXuL zXKTAJ2-eGLL0V&lePeBFd+v4}c7J1QSN8j{7E$2N?l(SI8$ww`yX~4aQkVZYiDmOd z7hB@gSkgUJSo%@triyB4L;jwdM!cW=GNw#T#1Rb;7)NA8Ug?AskMx7@Z~lzyT*Bg+ zE-mdGT?wZ(qYH~(jAJVOD5~2RbhOGeP28S9RPU0B1AS^WbqkP_HKNibXGTO!ln%8Q zz;e0IlGo0ilGunNp9cvBvAa`^voshk>;JZ~`A)9aielvBh|hC0KnBBvYjZbj1JAZM z7+Qt$e0^o#!>f)<9z$Mgpq~o(*P5js%Q=xp^}%!o5oPK) z=g4SF8>AHNfac(llFaW>;gNpv4PMo~NlShFr6JBZ}f%cU?pK)q^z zw0(@K1;-l0xWmTJGDZ{Q4087jeB2Yu5S{VdabxT^C3|DDGp}T1UhK9}ggg;b{}vDa z0DbS0`>?3OkQOGg|7eNepf0c3tlYNLxWcaxw`D?Kn=Q-wA^eKtgk-^YuvwNvkG@A~ z?aohgt83E4( z3fr%ze0ebDKKKwjgZGv{Fw%}eCH1W~pfb>N{%Jj;Kq!`?uj2i9ygX^&dVD09`ibl8 z_a_33_qk$s{oRS0#&*}@6$8w>CsXXk-;1+;H8Fs0)zc|^JCB-$3&avMa}B(DjHmj; z{7;iqkkzhm%-;m4A<$!wkffu4BI+5x(8zUoCIq%?c&AeuZzLin`}}y#^YQ8;5Mb_^ z7mqCjH4Q7F-j8sj5@(c-uQY3{WO*<3XCJaqs)#m6*nz<4lo~=lj0Xj z+>hh}c0mT^ps1;Qo1G!DYlL(J*UgApJ<^^6WYyBvRXT;$Px4vq?Q^RdkMbrP@hhsz zvsN6KmsfO8_9&)^RGOb0f9mq z-oM;P-A%g2nu5xm;OshN&wR~gmv9Mww!j!!o}C!|2oKYqy281V28DA%QUpk! zU#_(C|7x@eqbLqraR}u~+3`ZQ2k!!hj_D>Y37}fMLl!n~eLI5nMl=suBsi z2h&eiYI}mT3Lgk71fSvRbIC*Lp&ZAsXRwx?z!=yGM}kU6I@nRHj_R}a=yuN_pEOO-2!2W6V^-uUh6=IZ$- zTE}s3+}=vvyL~5`DwDN{qGLR{(oWz}CJoo(Re20-RM}<{^1H5eOJ_E6L?^Z{*nwLJ zG2mS$^UfNW9C4~eEUeIZ7|m1rWBJE=7VXZP3uf8CaoO13d}{k4VQ*#CHwnr+f*~j_ z67{ot;ePG+oh7aK6Hs-_Ij8bc_X*zTWzZS`O?c^fm%ivN15$FPzq}xHXHPX~x@vwd zKg=7yVvXIa#b6|b1$*$EI*^hvB!#dhg5sYf2;NW-h1NM8Mz4vQ`|Hx0ZPX^h6+m?~ z)^b0RZIGZVv9LAuz7*Srlqr+0udAlFp+I3{wT_T-9+86Y4LT6C388Mw#_Kq?lg9Q8 zc_)*FU8+M$NGLABqx0X}noaB95gufzd)U=(o~@xLxvYAf7~tQXlzD~nS14lMaCM@1 z%!yvuV8Kfz#KpXyADAJF!{dPM;}RG zyfbX1BaI*nTL2I1wWRAx%aKq1+>EWghQSwnwYE_m^O15^EAQM;zlmPnQ%T&3D$MNG z>ph%buTcr=J*i1x`3q(G0##$JMv9G_S>EgC^5}mHNf0THHQrdQ<3P5o5xDXJlvPVp z5?MWa1I)8_Ee+z`b&kkwSd;6`BkF?Hb^oW25TNmCl2ysPJ&D zFLwj0piQ%v<*!q3GP@XNe5WD)RMf#9Lwi&2oVoZ8_*`*I@-CB!?l_8Q1)9hGB7)WO zfA)t9CAWd1l2B^zsxipQ=P4GfbJJNWbaYHml(ldY3?Jcl!^(z(~2i(HA zB-aj|+6Y;7ZHOLJG|^r;Ql2>`a%e*6nM&_`K>5sc&CdKzD*AGwuTx;-ENax{v(>&8 zPQONGKf2vr;x{T8Dk+c5RWlqcrhDmgisVI=1aDsMAt2)$;7>_@c)FEuvIG{!UVQqN zxqy?9+h?M&!uTBsDui9>FRg_)8k#{6w!w;Uva&!)afzji_=sNKDZ92j&xP}!Z-vRs zptKslw(MJWOs4zwM$RavA@7S*Lr_PD?vYior#I9=_qE|*&{{?;o~v_D2DB@Ifd zNLHvYTfYs>>rs~p$g)tW9_Rb|k$5fAavG5=BU)QRt@&dF?pmWpE#zCBCdtf$EkNWdZ4Jls1CdVoJ6MjP*6Np0x2vO=W%VKX^R z5e(Vu#61MFuqhJD{a1P(31S}$(+QGC^n{k7Rl2mmjzVm`JVV4NS{~pAsp2^Mfm$eH z00A79?k|Cn_ZGV?piE}O!lmz`z6+Nhu@Lj0QC~zaH5qYSfW==G*ArGMgQ^@51|@Mx zed5-q7r_eLA|v6!xs9?m=Mpbevk+jU z+$_*$M^=)LrWh^af}4RP6rKr$O3Wc$L*d4A- zJL)^LYS}8>0GXb}zrDYDUWR!6dq3Sg{TAY-8Kw#VE1FHKkrhp0I=|3kWJ4VxLyVGC z1g=Qx#S6W6sCh|X!+P7YOOd=o9Sh;D=Wgff)lm=1s9&rmOd=}t9CATT4sfyaKd2wOypBZwk%!6+X$)aUS4 zR3N!MyAWl}Vw2^QB&*Hyt^pl46?-&yC*>o{m*U z9$Cr%PzHQ^C1TCFnbJ@qpC)KL3PYN_sPL zY(91<@+62`5eh*Kk}nMev_k3L*`K}((bF8KQ=dAWipk+trK$qE+L!cv!L%WG3xuh|oA zI`w9dChnHEi+@KSC?>%47P+(WE+1q5`K~=nrdF)OgwFu_;u*YwL;TJ4#4BdJf0eBQ zzRDi}`8sRBbivqveCOitP8lr2Ze}vOu^+6%`2j-cBO<1@=LK>^JBQRaBaZMJ2_Rl3`!A6_d(ugc_hA!V( zkKbf`el8Pq=0{jvYvPVGtGxd^Ih~%Ja&JF*@OU}ecxEGjVMJwDihejG#IQgwQ^gbG zVMMChlKb2F*lLUI>N_sN>#Io6%T&x9Ocm8uL)@v1ThqvX+WybDr=~L zk5SrqY}gF}__%ZIkXqd87YVll&mC>DFYe32eyRNuvu_+mVca~1D|hm zb{KLiZ{aA;kULxoaSK8EuipZUTWyG~TTZFoQyYS&?a1{7DxR$7y!xt^%}Z{rks?Y( zS!QsVBL}y}Gf{;3IB)}I8Z%4kDcx2{=4`+mFrYbVTz78q?*@(a_fUL+1?Nz1s)wYD zr}aV*Xq~I5J64ZVc&sM}Q71*9j zDikVXAn5AuPiYajc-=F8#}7c0p{h%rcZ^+Du|jH>cT9sdip^J83w z$V%1II=F?H*Y7g;t24GXW2Bb!Kv;sDp_c_rbsQX`Gi7fgDfZUnIk&N(UK8w;BQGS8uKbXsgMJSQLH+nNr z^ymnZN1pM5faA4ZyrD}Q({!~tJ14+>CFIkGmU>=SD>tHW3dzYte*J^A;Gqcu)zvJe zghXO}_F2L#Rc6yTE?VpSqAxt78L2%Lp;{H#~fLramviE^p-Pj2cFELO`_3H0YcAq1Ib$mrR2|< z+WG9}>n$2A4GldW&gUvUy&qwC+lXu8G5zdATx0hSa^sSsa#DpE=NY29oj;7X>lX%z1tN4CH*S}BWJwxhtS2QX-3P9U$ ze>c4(aB7;=$*m7D)bke{{Del6CnUZJG0pKwl?MH;(6w>uj|0+e8%FMulZ>9pmkBN+;eBIg8#;qmw(|@FVSTJn=1PT9mF+JP=joa-^OcGcgjbESceuLOI zUcK*Pp^?7eM?kAVQT#$u{ojRL|AC+UE#>;KLg>&u|AR(Rzr%9Du(SLR6>R~1hn0qf zVQ2dv)iQG+Eb~9@!+&sTip=K@0q^7Iw3EC|Auiv%MUrxlYk64RYEbD zbmAliOH82P+vXzikiLm}vnb|o`PJ~ zsNgM)SISApsT-=sm;qQXNW!;Qam+wWSjg4g6J*cUMFqu}&+Eh~jp?}s*_@d4<6HWp zkHKk>!^ZW;8W5~ClCfWILL5AnbX~Zyp>d(VuNlH zOpVCkCo>QLAZr#Hokl+RbZqem66iwcoJI^3zE1MKLzB-cGTtE}|AhDu0yk$CxY|w} z6fW4)&lvf!GZ7-yA*$qCEurZuQzzuW6j4zEY#1A0d}ATz;E)a-)EDwUq=+=J1u8H| z<{M(MP=i5Vxh$s;x1h9XemEP*vKGSeOffOM{!D6=1ZApds+2{^1@fx|RwnW|LGKfV z#bs;JBs@f<$%LXUd||rQGyB8PNXr=Ms#3xrjpKez040kQTazHdUt^>alOM96A^-lB zt$@+TdvT^aN)VLG@tbR9&4@b9vgJUy#ub~BcQoILG1WPGgbSPu=T^h2s`iwf@1p(@iq(JO7l28*aOUkdOdJ}&v@^@WDF)z;%01Rhv0y>buw{qg)HT~9QM5FwoO`DXhg zC6R$R>nwXUZr4L;-IJ1e-T&Qqognc>Tc$Ms1%=L1JYwv#CfY)zhQ%2lEwXOAnjB=l z@HVZr;5?l$%(}NaS1DF@pfPluuNwE9(^ZRqgU@;2z^5BYhunWsw}s4q;hFjY_1b6% z1e`gD(`6@Et+JZljI+=Ax&(Ql|X6|L}e9toig;?oT8{3)q2=XGqAGm*;CE8Pv-omjTdNXRI zJ;c$kQn?jlOxr$b&~dq~XGnwTB#5RWKUCCF)wtcRy!2#0SIiFjfv-ZX?G@&1TNGyX zYmCBJ(t3%pZ*^v~j)m+B=bLIVxJ`Mtdv+eB3i7kfM%@C-Ea>jqNgwwXi~pt=11!)_-u0Is2ntKRw1-;ahw`=l8fw@Ec%R z{ixfAPiv2@L>=u*6-P!|xwMuU&t#)wXKLO2IO4pqkd)t5a^-oP zBeik!L z#byU)%6$1TqskqsI%NOK!+<|)ZeiL>_M~+fFsQ)+Uo69*v#>gT)e{hhxm7 zg;^1iY#ReD6n7}@3Cc%X&R~O@7=(ukhli4Od|-e+I1S`ChR@ z&hyw0D-wuE^;J2>Wy}UAn7RpCKBb9ou&R@BJ2?A_6&@`jC9t@}QEJcG9H?Th1sBB- zwj0H7BK9bQ_m!Pu;xoroOnxF}K|0dE<0gdBL-AQTrVk(wA`O3w3fUI;%t{8?Az~RI z%Ga%E%KD7$3I!uphFur(B>~P)5?u>hRL5r*eTFO~ZpV!12P1}%=&?k0qBU~&pR9;H z_>B6aHkk~i>0eI*QS`&Z7;EaV%7Cmsf#zI)o&a~B*VBg?b^+0ckX8Ouyw>xSZpd)~EFeyLt^4sK-!?nZI1j3q;)j@IWTpRy$9WwjE0{97sah-@3i&l6f zyjt{uAlh1BL&k3TuQX6lS!l2*nYC5V$pe_!@ugV?e85$pM|TmKpA6se95{^rlf$TM zxIL#<5`wqEN7{b&S9^26s773G^?`%yO)%1iDyC=#lssZFjF>j-a3Wdjn!%n+WX#1c z4y?uw6Mu;x6{zX&d}jeoP=5#*KYFsnUE1H!)dnVH#%t-d`%@Srj|4^rAE?mRA(=1)m)K9sms z%O8xsVi&Hvcz+7U(s|;9BX~7cCa{K>Fozb%KuV#{Z5?%fq1-|Ld~UBuW0mualsc}m z3@myv9f238q=SUonnZ9&%gxdwKFU7@R0;aihCAgl`Xn+o!|ThX zf)@6pjP|0cCR6*Ol_7Yf)V~)|Yv^rxmo($$JUS~Vqvu@BS$olSFUzd&o)=Q-9``fq z(+`jNA|3wIS69(J)Tf)o&CTO=-)viPkxcv6rL>YX^$6am6@k%7vTw`_jqO$)rIW>Q zheQKs|YzMkj2IxPZ9 zUlW`ib+!=h%Do&0iC1O<`!XNZa=~e8Uf8dr*ysH(qanZ_MC&(hO-GaUa zwWt4glICPh%ZB|TX3lM9!Og+J&dO!RYR+l-&5X;Elbe@=-I9xijhl^wM@ZoRmjTwx zh9!mJWCQzV|J$f*rs0wwp{nuEbw$Zz|kWEqirtE82_mARa6;6gy$ux z3OzEttV|VyOkjag9%c+sY$uBm~g=fc;u)cblgV;DR<2GzZ93A0U|)myN9Dmo2aRRLnh6 z-K7<6Kx0WFAgV NUL-0iNo6Ud{{;`zv0DHD delta 23783 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 diff --git a/bachelor-project-nikolaj.tex b/bachelor-project-nikolaj.tex index e347cf7..e2173df 100644 --- a/bachelor-project-nikolaj.tex +++ b/bachelor-project-nikolaj.tex @@ -107,19 +107,33 @@ \end{figure} \subsubsection{The \texttt{meow\_base} codebase} - \begin{tcolorbox}[colback=lightgray!30!white] - Specific (but not too granular) implementation details of \texttt{meow\_base}. + + \texttt{meow\_base}\autocite{MeowBase} is an implementation of MEOW written in python. It is written to be modular, using base classes for each element in order to ease the implementation of additional handlers, monitors, etc. + + \begin{tcolorbox}[colback=blue!30!white] + How much should I include here? \end{tcolorbox} - The current implementation of MEOW, \texttt{meow\_base}\autocite{MeowBase}, \dots + \begin{tcolorbox}[colback=lightgray!30!white] + \begin{itemize} + \item The runner + \item Conductors + \item Recipes and handlers + \item File event monitor (Watchdog) + \item Events (important to clarify how file events work since I refer to it in the method section) + \item Testing + \end{itemize} + \end{tcolorbox} \subsubsection{The \texttt{socket} library} The \texttt{socket} library\autocite{SocketDoc}, included in the Python Standard Library, serves as an interface for the Berkeley sockets API. The Berkeley sockets API, originally developed for the Unix operating system, has become the standard for network communication across multiple platforms. It allows programs to create 'sockets', which are endpoints in a network communication path, for the purpose of sending and receiving data. - Many other libraries and modules focusing on transferring data exist for Python, some of which may be better in certain MEOW use-cases. The \texttt{ssl} library, in specific, allows for ssl-encrypted communication, which may be a requirement in workflows with sensitive data. However, implementing network triggers using the \texttt{socket} library will provide MEOW with a basic implementation of network events, which can later be expanded or improved with other features. + Many other libraries and modules focusing on transferring data exist for Python, some of which may be better in certain MEOW use-cases. The \texttt{ssl} library, in specific, allows for ssl-encrypted communication, which may be a requirement in workflows with sensitive data. However, implementing network triggers using the \texttt{socket} library will provide MEOW with a fundamental implementation of network events, which can later be expanded or improved with other features. - In my project, all sockets use the Transmission Control Protocol (TCP), which ensures safe data transfer by enforcing a stable connection between the sender and receiver. I make use of the following socket methods, which have the same names and functions in the \texttt{socket} library and the Berkeley sockets API: + In my project, all sockets use the Transmission Control Protocol (TCP), which ensures safe data transfer by enforcing a stable connection between the sender and receiver. + + I make use of the following socket methods, which have the same names and functions in the \texttt{socket} library and the Berkeley sockets API: \begin{tcolorbox}[colback=blue!30!white] Too granular? @@ -131,24 +145,34 @@ \item \texttt{listen()}: Puts the socket in a listening state, where it waits for a sender to request a TCP connection to the socket. \item \texttt{accept()}: Accepts the incoming TCP connection request, creating a connection. \item \texttt{recv()}: Receives data from the given socket. - \item \texttt{connect()}: Sends a TCP connection request to a listening socket. This is only used in testing the monitor. - \item \texttt{sendall()}: Sends data a socket. This is only used in testing the monitor. \item \texttt{close()}: Closes a connection to a given socket. \end{itemize} + During testing of the monitor, the following methods are used to send data to the running monitor: + + \begin{itemize} + \setlength{\itemsep}{-5pt} + \item \texttt{connect()}: Sends a TCP connection request to a listening socket. + \item \texttt{sendall()}: Sends data a socket. + \end{itemize} + \section{Method} To address the identified limitations of MEOW and to expand its capabilities, I will be incorporating network event triggers into the existing event-based scheduler, to supplement the current file-based event triggers. My method focuses on leveraging Python's socket library to enable the processing of network events. The following subsections detail the specific methodologies employed in expanding the codebase, the design of the network event trigger mechanism, and the integration of this mechanism into the existing MEOW system. \subsection{Design of the network event pattern} - A main concern with implementing a pattern for network events is to seamlessly integrate it with the existing codebase. Because of this, the design of the pattern has a heavy focus on behaving similarly to the file event pattern when interacting with the other elements of the scheduler. Ideally, this should preserve loose coupling of the patterns and recipes, so any pattern can be put in a rule with any recipe. While this might not be possible for every theoretical recipe and pattern, designing for it could greatly improve future compatibility. + In the implementation of a pattern for network events, a key consideration was to integrate it seamlessly with the existing MEOW codebase. This required designing the pattern to behave similarly to the file event pattern when interacting with other elements of the scheduler. A central principle in this design was maintaining the loose coupling between patterns and recipes, minimizing direct dependencies between separate components. While this might not be possible for every theoretical recipe and pattern, designing for it could greatly improve future compatibility. - Network event patterns are initialized with a triggering port, similar to the triggering path of the file event patterns. While this limits the amount of possible unique patterns to the amount of ports that can be opened on the machine, that amount is large enough that it will likely not be an issue. It would have been possible to have the patterns be triggered by part of the sent message, acting as a "header". However, this would complicate the process, since the monitor will otherwise be expecting to receive raw data. This was chosen in order for the implementation to be as simple as possible, so that any feature or improvement can be added later as its own pattern type. + Network event patterns are initialized with a triggering port, analogous to the triggering path used in file event patterns. This approach inherently limits the number of unique patterns to the number of ports that can be opened on the machine. However, given the large number of potential ports, this constraint is unlikely to present a practical issue. An alternative approach could have involved triggering patterns using a part of the sent message, essentially acting as a "header". However, this would complicate the process since the monitor is otherwise designed to receive raw data. To keep the implementation as straightforward as possible and to allow for future enhancements, I opted for simplicity over complexity in this initial design. - The network monitor, when started, opens sockets that start listening on the ports specified in the patterns it was initialized with. + Once the network monitor is started, it opens sockets that start listening on the each of the ports specified in the patterns it was initialized with. This is consistent with the behavior of the file event monitor, which monitors the triggering paths of the patterns it was initialized with. - \subsection{Integrating it into the existing codebase} - Data received by the network monitor is written to a temporary file, which serves two purposes. Firstly, writing the received data to a file while receiving it saves on memory, since the entire file doesn't have to be saved in memory at once. This is especially useful for large data transfers. Secondly, writing the received data to a file allows network events to reuse most of the infrastructure written for file events, passing the newly written temporary file as the "triggering path" of the event. This means that recipes taking the triggering path as their input can still be used with network events, preserving loose coupling. + \subsection{Integrating network events into the existing codebase} + The data received by the network monitor is written to a temporary file, a design choice that serves two purposes. + + Firstly, this method is a practical solution for managing memory usage during data transfer, particularly for large data sets. By writing received data directly to a file, we bypass the need to store the entire file in memory at once, effectively addressing potential memory limitations. + + Secondly, this approach allows the leveraging of existing infrastructure built for file events. The newly written temporary file is passed as the "triggering path" of the event, mirroring the behavior of file events. This approach allows network events to utilize the recipes initially designed for file events without modification, preserving the principle of loose coupling. This integration maintains the overall flexibility and efficiency of MEOW while extending its capabilities to handle network events. \subsection{Testing}