From ad127aa91f9d8ce0d7005bec3aecae2ff3fb3f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torma=20Krist=C3=B3f?= Date: Sat, 7 Dec 2019 16:48:22 +0100 Subject: [PATCH] minor modifications --- src/content/abstract.tex | 8 ++++++-- src/content/preparation.tex | 9 ++++++++- src/content/results.tex | 15 +++++++++++++++ src/figures/jmeter-for-otodik-rps.png | Bin 0 -> 34124 bytes 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/figures/jmeter-for-otodik-rps.png diff --git a/src/content/abstract.tex b/src/content/abstract.tex index 5ffe98f..dd40287 100644 --- a/src/content/abstract.tex +++ b/src/content/abstract.tex @@ -14,7 +14,9 @@ Fennáll viszont a probléma, hogy az egyes részek akkor is készen állnak ké A Knative ezeket a problémákat aldja meg. Lehetővé teszi az egyes részegységek nullára skálázását, valamint képesek szolgáltatások gyors skálázására a megjelenő konkurens kérésekkel arányosan. -A szakdolgozat keretein belül a Knative ezen funkciójának működését vizsgálom, összevetve viselkedését a Kubernetes rendszerben elérhető tradicionális megoldással, valamint ezen vizsg\'alattal kapcsolatos munkafolyamatokat automazi\'alom. +A szakdolgozat keretein belül a Knative ezen funkciójának működését vizsgálom. Ehhez kidolgoztam m\'er\'eseket, melyek betekint\'est ny\'ujtanak a rendszer belső műk\"od\'es\'ebe. Feladatom r\'eszek\'ent a kidolgozott m\'er\'eseket, valamint azok eredm\'enyeinek al\'izis\'et automatiz\'altam, ami felgyors\'itja az eredm\'enyek \'ertelmez\'es\'et. + +Dolgozatom kifejezetten hasznos lehet azoknak, akik d\"onteni pr\'ob\'alnak a Knative haszn\'alata mellett, vagy meg szeretn\'ek tudni, hogy műk\"odik ez a rendszer. \vfill \selectenglish @@ -31,7 +33,9 @@ However, these functions are ready to accept requests even when they are not nee Knative gives an answer to these problems. It is able to scale application components to zero and scale them quickly proportional to the number of concurrent requests. -In my thesis I analyze these functions of Knative and compare them to traditional scaling available in Kubernetes as well as automate workflows relating to this analysis. +In my thesis I analyze these functions of Knative and compare them to traditional scaling available in Kubernetes. To do this I devised measurements which provide an insight into the inner workings of Knative. As part of my assignment I automated these measurements and their analysis thereby speeding up interpretation of results. + +My thesis may be especially useful for those trying to decide whether to use Knative or not or to those trying to gain an insight into the inner workings of Knative. \vfill \selectthesislanguage diff --git a/src/content/preparation.tex b/src/content/preparation.tex index b96029f..1202f44 100644 --- a/src/content/preparation.tex +++ b/src/content/preparation.tex @@ -121,7 +121,14 @@ Miután a Knative Autoscaler naplóállománya analizálásának igénye felmer A Knative Autoscaler a naplóbejegyzéseket json objektumként menti, melyből a Python képes dictionary objektumot készíteni. Amennyiben az adott bejegyzés ts mezője a mérés kezdési és befejezési ideje közé esik, akkor az msg mezőben lévő üzenet feldolgozásra kerül. Az üzenetben kulcs-érték párok vannak szóközzel elválasztva egymástól. A kulcs és az érték között egyenlőségjel van. Ezt egy reguláris kifejezéssel listává lehet konvertálni. Sajnos a Python reguláris kifejezés API-jában nincs arra lehetőség, hogy ilyen esetben dictionary objektumot adjon vissza, így azt kézzel kell konvertálni kihasználva azt, hogy az értékek mindig egy kulcs után következnek. Ezután a Podok száma, valamint a megfigyelt stabil konkurencia érték letárolható. Ennek folyamat\'at \aref{sec:log-analyze} f\"uggel\'ekben l\'atni. -A feldolgozott adatokból a matplotlib Python könyvtár segítségével készíthető grafikon úgy, hogy az adatokat tartalmazó listát átadjuk a megfelelő függvény számára. A grafikon mentése egy másik függvényhívással lehetséges. Szintén külön függvényhívással lehet a grafikon címét, valamint a tengelyek feliratát elhelyezni a grafikonon. +A feldolgozott adatokból a matplotlib Python könyvtár segítségével készíthető grafikon úgy, hogy az adatokat tartalmazó listát átadjuk a megfelelő függvény számára. A grafikon mentése egy másik függvényhívással lehetséges. Szintén külön függvényhívással lehet a grafikon címét, valamint a tengelyek feliratát elhelyezni a grafikonon. Egy ilyen m\'odon gener\'alt grafikon l\'athat\'o \aref{fig:jmeter-for-otodik-rps} \'abr\'an. A diagram c\'ime a m\'er\'est azonos\'itja, ugyanis ezen grafikonok c\'elja a m\'er\'esek eredm\'eny\'enek gyorsan \'altalam elemezhetőv\'e t\'etele volt. + +\begin{figure}[!ht] +\centering +\includegraphics[width=120mm, keepaspectratio]{figures/jmeter-for-otodik-rps.png} +\caption{Az eredm\'enyeket analiz\'al\'o Python program \'altal gener\'alt egyik diagram} +\label{fig:jmeter-for-otodik-rps} +\end{figure} A méréseket elvégző szkript kis módosításával elértem, hogy a mérési eredmények egy általam üzemeltett számítógépre töltődjenek fel archiválásra és az itt részletezett program által feldolgozásra. A feltöltés után a szkript meghívott egy ugyanezen a szerveren futó REST-es végpontot, amely hatására elindult az adatok feldolgozása. Maga a program egy Docker konténerben futott. A kód verziókövetésére Git-et használtam, amelynek előnye az volt, hogy minden alkalommal, mikor egy állapotát mentettem a kódnak, abból a Travis szolgáltatás automatikusan elkészítette a Docker Image-et, valamint feltöltötte a Docker Hub-ra. Így a fejlesztéstől a mérésig teljesen automatizált munkafolyamatot dolgoztam ki. Felmerült ötletként, hogy ezt a Knative rendszerbe telepítsem, viszont szerettem volna, ha a méréseket feldolgozó folyamat független a mért rendszertől és a lehető leglazábban kapcsolódik hozzá. Ez által a két rendszerben történő folyamatok, esetleges hibák nem hatnak ki a másik működésére. diff --git a/src/content/results.tex b/src/content/results.tex index 550eb3b..b45d592 100644 --- a/src/content/results.tex +++ b/src/content/results.tex @@ -1,4 +1,7 @@ \chapter{M\'er\'esi eredm\'enyek ismertet\'ese} + +\section{Elk\'esz\'itett f\"uggv\'enyek teljes\'itm\'eny\'enek m\'er\'ese Dockerben telep\'itve} + Mielőtt elkezdtem a Knative és Kubeless rendszerek mérését, annak érdekében, hogy a mérőeszközök, illetve a Knative-hoz készített függvények teljesítményét kimérjem, mindkét mérőeszközzel megmértem mindkét függvényt Docker konténerként indítva. Itt a függvények a harmadik, a Kubernetes klaszterbe be nem csatlakoztatott számítógépen futottak a függvények, a mérések pedig az Kubernetes Masteren futottak. Mind a négy mérés esetében a használt connection objektumok száma negyvenöt. Az \ref{fig:docker-chart} ábrából látszik, hogy a várakozásokkal ellentétben a Jmeter jobban teljesített, mint a hey. Ez azért van, mert a hey-re megszabtam connection objektumomként ötszáz kérés per másodperces korlátot. Erre a számra úgy jutottam, hogy a hey által használt connection objektumok számát egyre állítottam. Ez esetben a generált kérések száma másodpercenként 510 és 530 között ingadozott, viszont stabilan mindig 500 felett volt. A generált forgalom stabilizálása érdekében az 500-nál húztam meg a határt, melynek szükségességét a korábbi tapasztalatok alapján éreztem, ugyanis a hey teljesítménye megfigyeléseim szerint instabil, mikor nagy sebességgel kell generálja a kéréseket. Továbbá, úgy ítéltem, hogy két különbözően viselkedő mérőeszköz többet fed fel a skálázódási mechanizmusokról. @@ -14,6 +17,8 @@ Az ábráról szintén látszik, hogy a prím számoló függvény teljesítmén Érdekes jelenség, hogy a Jmeter által mért teljesítmény sokkal stabilabb. Igaz, hogy ez esetben nincs szükség a mérést fél perces szegmensekre bontani. Különösen furcsa a hey viselkedése, ugyanis a hiszterézis akkor nem volt megfigyelhető, ha a függvényt közvetlen Dockerben futtattam. Emiatt használatát nem vetettem el, de az általa mért feldolgozott kérési rátát fenntartással kezeltem. +\section{Knative rendszerbe telep\'itett f\"uggv\'enyek sk\'al\'az\'od\'asa egyenletes terhel\'es alatt} + Az \ref{fig:jmeter-for-otodik-chart} \'es \aref{fig:knative-for-negyedik-chart} ábrákon látható a Knative-ba telepített echo típusú függvény skálázódása. A kettő közül először az alsó mérést végeztem el, ahol a hey instabil viselkedése szintén megfigyelhető. A mérés körülbelül felénél látható megemelkedett ráta konzisztensen megismételhető volt több, független Kubernetes klaszteren is. Az ábrák elején jól megfigyelhető a Knative pánik skálázása, amely gyorsan létrehoz öt Podot, majd a hatvan másodperces panic windows lejárta után a már nem szükséges podokat leállítja. Az ezután a Podok számában megfigyelhető hiszterézis a Jmeteres ábrán és egyéb Jmeteres mérések során nem volt tapasztalható. Ez betudható annak, hogy az ObservedStableConcurrency érték a döntési határértéken van. Szintén megfigyelhető, hogy a Podok kiszámításának korábban ismertetett formulája úgy tűnik nem volt helyes. Ez nem helyes következtetés, ugyanis a hey ábrán látható három, valamint a Jmeter ábrán látható kettő kiszámított Podszámhoz hozzáadódik az egy mindig létező Pod. Az ObservedStableConcurrency érték esése a Jmeter ábra esetén is látható, amire a Podok számának csökkentésével reagál a rendszer. Érdekes, hogy itt mind a Podok száma, mint az ObservedStableConcurrency sokkal stabilabbak, cserébe alacsonyabbak. Szintén különbség, hogy a hey esetében a mérés elején tapasztalható alacsony teljesítményű időszak időben hasonló, viszont nincs benne ugrás. Mindkét ábrán látszik, hogy az ObservedStableConcurrency érték mozgó átlag, emiatt lassan változik. Ennek következménye, hogy a terhelés megszűnése után nem szűnnek meg a létrehozott Podok. \begin{figure}[!ht] @@ -48,6 +53,8 @@ Az \ref{fig:hatodik-isprime-knative-for-chart} \'es \aref{fig:jmeter-hatodik-py- \label{fig:jmeter-hatodik-py-chart} \end{figure} +\section{F\"uggv\'enyek v\'alaszidej\'enek alakul\'asa cold \'es hotstart esetekben} + Ez ut\'an m\'ertem ki, mennyi a k\"ul\"onbs\'eg a f\"uggv\'eny v\'alaszidej\'eben az esetben, hogy null\'ara van sk\'al\'azva, vagy sem. A tapasztalat az volt, hogy 2-3 m\'asodpercig tart a Pod l\'etrehoz\'asa, a v\'alaszidő ennyivel n\"ovekedett meg az echo t\'ipus\'u f\"uggv\'eny eset\'eben. A bevezetett, nagyobb sz\'am\'it\'asig\'enyű f\"uggv\'eny e m\'er\'es sor\'an hasonl\'oan viselkedett, viszont \'atlagosan egy m\'asodperccel tov\'abb tartott a Pod indul\'asa. Ez az\'ert \'erdekes, mert a k\'et f\"uggv\'eny m\'asik futtat\'ok\"ornyezettel rendelkezik, tipikusan a Python interpreter elind\'it\'asa 1-2 m\'asodpercet vesz ig\'enybe, ez megmagyar\'azza, mi\'ert tapasztalhat\'o ez a k\"ul\"onbs\'eg - amely j\'ol megfigyelhető \aref{fig:go-start-chart} \'es \aref{fig:py-start-chart} \'abr\'akon - a k\'et f\"uggv\'eny k\"oz\"ott. Az \ref{fig:go-start-chart} \'abr\'an l\'athat\'o az echo t\'ipus\'u f\"uggv\'eny v\'alaszidej\'enek alakul\'asa. A m\'er\'est k\"or\"ulbel\"ul tizenk\'et \'or\'aig futtattam. Ezen \'es \aref{fig:py-start-chart} \'abr\'an megfigyelhető, hogy a v\'alaszidő Hotstart, azaz l\'etező Pod eset\'eben sokkal stabilabb, mint Coldstart, azaz nem l\'etező Pod eset\'eben. @@ -67,6 +74,8 @@ Az \ref{fig:go-start-chart} \'abr\'an l\'athat\'o az echo t\'ipus\'u f\"uggv\'en \label{fig:py-start-chart} \end{figure} +\section{Knative rendszerbe telep\'itett f\"uggv\'enyek sk\'al\'az\'od\'asa n\"ovekedő terhel\'es alatt} + Az \ref{fig:hatodik-hello-knative-climb-chart} ábrán látható az echo típusú függvényre egyre növekvő terhelés, valamint a Knative Autoscaler rendszer e mérés alatti belső állapota. A terhelés növelését a hey mérőeszközben egyre több connection objektum használta által értem el. Jól látszik, hogy az ObservedStableConcurrency egy lassan változó érték, a mérés végére töredékét érte el annak az értéknek, amit az egyenletes terhelésű mérések során elért. Szintén látható a Podok számából, hogy pánik állapotot sem váltott ki a mérés. Erre nem is lehetett számítani, hiszen a használt konkurencia érték sosem növekedett duplájára hat másodperces időtartam alatt. \begin{figure}[!ht] @@ -85,6 +94,8 @@ A korábbi mérések alapján számítottam rá, hogy a prímszámoló függvén \label{fig:hatodik-isprime-knative-climb-chart} \end{figure} +\section{Istio \'es Nginx Ingress Controllerek \"osszehasonl\'it\'asa} + Mivel a Knative és Kubeless rendszerek másik Ingress Controllert használtak, szerettem volna kimérni ezek áteresztőképességét is. Ezt úgy vittem véghez, hogy a mérőeszközzel mindkét Ingress Controller végpontját megcéloztam, mint ahogyan azt a függvények teljesítményének mérésénél is tettem, viszont ez esetben általuk nem ismert hosztnév fejlécet adtam meg. Ez által minden kérésre 404-es http kóddal válaszoltak. Az \ref{fig:istio-nginx-chart} ábrákon látható teljesítmény az adott Ingress Controllerek által elérhető legjobb teljesítmény. A Kubeless által használt Nginx Ingress Controller teljesítménye majdnem négyszeresen meghaladja a Knative által használt Isitio. \begin{figure}[!ht] @@ -94,6 +105,8 @@ Mivel a Knative és Kubeless rendszerek másik Ingress Controllert használtak, \label{fig:istio-nginx-chart} \end{figure} +\section{Kubeless rendszerbe telep\'itett f\"uggv\'enyek sk\'al\'az\'od\'asa} + Ahogy \aref{fig:kubeless-isprime} ábrán látszik, a Kubeless skálázódása teljesen máshogy működik. Ez esetben a kötelezően meghatározott cpu használati limit miatt a skálázódáson a teljesítményben is érzékelhető a több Pod használata. Szintén látszik, hogy a csúcsteljesítmény, amit elért magasabb, mint a Knative esetében. Cserébe, viszont a skálázódás lassabb, a Horizontal Pod Autoscaler hatvan másodperces átlagolása miatt. \begin{figure}[!ht] @@ -125,6 +138,8 @@ Korábbi mérések során a prímszámoló függvény egy Python folyamatot hasz \label{fig:jmeter-pillanat-junky-chart} \end{figure} +\section{Knative belső \'allapotainak vizsg\'alata monitoring rendszerekkel} + Kíváncsi voltam, egyes mérések során milyen belső állapotai vannak a Knative egyes alegységeinek. Azért, hogy ezeket megfigyelhessem, telepítettem a Knative Monitoring egységét. Ez után újra elvégeztem bizonyos méréseket. Először a prímszámoló függvény viselkedését vizsgáltam meg. Érdekes, hogy a Workeren elérhető húsz magból összesen hetet sem használnak. Az \ref{fig:grafana-isprime-controllvsdata} ábrán látható, hogy a függvényt kiszolgáló Podok és a Knative rendszer processzorhasználata hogyan alakul egymáshoz képest. Érdekes, hogy együtt is csupán körülbelül tíz processzormagot használnak. A Control Plane az ábrán a Knative Serving egyes komponenseit, az Istio-t, a monitoring eszközöket és a Kubernetes beépített részeit jelenti. A lenti ábrán látható ezen komponensek között miként oszlik el a processzorhasználat. diff --git a/src/figures/jmeter-for-otodik-rps.png b/src/figures/jmeter-for-otodik-rps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad116ba7e7ebec8b455b830f69c7a52631cd781 GIT binary patch literal 34124 zcmd>mWmr{R+wG!3TDlPwq(SLM0Rah-MmnUs8vy}Hl@uhD?w0P7kVd+@yEb*^_C4=) zzF+6x`E|H_t_SvBd#zdb7-Qb^9{bZ9#aGx5$R9uuge@y0`4)l@{UHcp5gir0!ZSR( z3jT-e^g>n@9sGEsn}mYDG3;fuoFE9-5dI%Ru2_x*c#+>(O4C`z?!B{{p`$5eW9V#e zZRc!lVMOa{>gZ%)XZxI;i=B&=*4)|IUXX+1|Gdv`=V-=(_nw3df@mRGNeNZ=@4Isz zI)rEUXonMyY!{A!v=6A69?W0hTh43ik5-mH9lcRkzw3v={@D36>sO3Cd;a=$U;hja z&zTju-dbFG`p;z_1ZLV^Hop3kYh$-yGFN3)^~tp}Z(;YR?YsTE<+}~*w*t~n&;uYk z@RQGHZFvoaf}hPLBj_>w6*E%k6Zm_Z3{@Qb`O`BP;WPL%H`Va}!?z)*FM%UOF6+hH zw<9m->?|#r-}fhe2nq@csndrhYn>PcU3bw*NJw&3nQzW#>~L>M4a1(DzY;i3$qVDK=6|s-En^2R_%9l-HWn$jE3YT_P}~ZeeUp z)%&m&4IKkRqTY3ndfK;2n@u{JI`Z()-g>GWWnf^ye5!oy<;;CbW@hGMAg-u*UpyN= zHMQ;etSM1u_ zT2cYW$FQ><4dZKPN5}jxHX`y=g3h^nFKK^jV17k3pZnFu%-t`$MbZ{m9_O-b{$^Ev)s=A8ar(n^P5x zzW29ooxDx=cV1vhcIO)@R=Of%&b9RPe7h&EE{|47MZNijg@qSaSA%e<1P%74t40Ph zGBSqi-Rz*2ia}A9Mus%+<4=_X!Ppc-S+7a>g@oGY=BNTuv0v!ud>?M&wV4hI4Moo# zx8$~&Ce-)6%IY!BpGCHoQ&hx(o$rOWw1`uRc%DY>JXD_RhGZnwfRGb7mPRwAzrIj{93q@ke^LCS@gmzOtU48}ZiAVr9tiwi%^?@qw? zdXEo_f)^`>QK<`!#v2mX_jri3c74zsotQ}4(b2KEmY|Oc-CS*?!Tay%=veB0WMnW=^5qL6^hi`x zPn+@ibCuGnDx&Y-zX$D1l)UaEc=!+*Y6H!C!bZVu{&}d>@Z}>uK8><8zIpeT_Rh|P z<>lqb5_my1HT($vrPfo=GK?*!%Cm-=e7t@X7Rr}-Umh;K0LucoNWFmnoJ7z4$MoPu z+eb`9Xeped=?&|_SY8Ys9v&?rA)!oPZ(rZX(o)VJ4l7+F zg#1@mO(1ax2QJrx`AEhz@3)r3M9slCRAI}@Mjc&U^9~Cn9C{s76=p}XPJ;;k!@MIS zBli2V0-eUvk>sY8R97qee}$715<=)-MH%!ba)H2(kDr;IUIy#-m80V`cD)Aoh3lJ@ zXfaOrLjz=F1oI3M=$qlaBJD#{YnS1M9OWB2jJ<)uzCKiCSCpvV7FX3Jv}|? zK1xc;herO0y4Eo*QFX`bSK+LKMd3kwtP7M8ci2zmG&eg3n+0E771KTM9FST2hG^(3A3F2!pL?JT#B;VND!g%-Y zouri1(%FPQU#+6K`6gBM(#i@Flql*WC>=#<;g~|qrv0?3M0lBxpMNqp-!&&suc4tK z{cYao`1tpy&&&KW+;!CUo_q#3c?nZ!#U);(` z>jG0)X4oF=W%+{PXI(g;G!tR~*iYWReLDm|hE>0b((8P;HJ0_b~E1Z{kTukbZ!72{4F+iOFLC%Y+hF8PTFI z9{HbkCEm(*bY)7s-!9(C-m^k3pE19 zg#z^=?WN7(3_$GNa2ol5gl5zhgrV8&D?$yX!$Jh$`wc*T5D^_MACQJ?oy@#}jDh@{ ze6E)dm)Z{x4_jiHREC=U{2I=uttP9iNMIKS`t;peTJSNjnqcP_6kG;F+5z}9e5TsY z7%&9`n)hrtAWlktd+5=lNA7!76YwU&DWgE6qzlA%))_ZBc08+A0FXeZ2MaVQLT>Td zjbviJ!thB300}e$DglGMe_9&NIpBSE-8z{WIGw}kCL#h0{`P3L!b??E!mcPPufc8` zGqaF57L8?~I@%Jsj7u%Y^U*x1LUYga0IpkJ(}Lf8uGSI~pP4>5J~>(1-qxN8c_}IR zzC+Ys@=V9pmK~_FQouMtAtBFi@bSlytPvUVH=?M7f&u(|Jy~NFlE1om@h=+&B*4CDX*Ml7&AOBkdE&A`l!B++b>COkcuwaBkgv{)0 zI)46|U$}uldGEK67ibKFwKXjoq1_5yLbJ28(B^_Tpo%JQZb?Z=RVoh;4|E)y_<@x( ze56Grykwubxj8bpif5Jg*>6%4qiFi4=(+x1DSFl*TJ%fUVECj5OxlL#0Y1JKfBm#5 zM3QN*{RUCO`0^J#{4ZI?(BpDEkIuD` zdzELHR!1`6x)Cnup;jnGEfG;mEGxX>b$&q95-&?rBhiA{h!7-!`uh5g;JT2Tn@~|v z(R?Hm5LE384_Tj00Jc3 z`7Z475C{dJabCQ6g9pEZ1Rizo$>TbWt#T-_pTU5R&J%KBhkRjMIhqabT*T};q0h|* z3H3(0i1;Z!QzvUgrHy&8|=^4CITFM>C+@R{-gxbGesGq!w6^zm#51o z*q-I)#(HzvG`^7!63aq@1aWWHEk+AZR(I60jWvYdpmxC z$-n21@Rdc>H<QCy+oNgImU}EA4ZJFEP3eY z=^YLiB_J4H-mrP*AsPg5EKoW_xsZU23kA#>=n?6~n~F z=JE8FmBo;glgm6fIX>P$(Rw(iEAdGkcE7};6_&O}l8_-^5ZGulR~tOzNr#Q0QE{~Y znR9ZwG(c~vy!mV9J>wj+WOtWdl^ds|>cMzQMM&$Q*nI>DYhxg;`8`jcsuya0sCC*f z>I@?aJ7eY>eh`qZ`92@x!geRr$0^_PE=9!a7k92?#xN~E|K)rtr3knFUX#Cu29<&PNN#==n^WV ziBf^B=Ewx-E6w7!ueF5n@y7E5C!wNoQDTGh`lMu4o3wZQ$saCwQw#sXq_VWJQk!uJ zG`d*gF$4S;l(LtsVT~H$C#DKbB+pJIoE@9jhxn(EhWL=|1YN1}1f(t+_L3Opf8sz7 zi_1MK%D+0Yh4nEbP7ytiTo(QMH8L>anZu1Xd$HNX-F1NF!qlm-{MAt*lrSkO;`h!~FfB-Pu|dn1_W0)A{~fIJJl;1l746M9t3Xz&9n@8$eV1 z{_{tzu)=OZG&WxSG;6xd7!3q*WKyt{WfeKVqWuZM4$v#$mGR$7_eC-xm5j&CCi zU-+=L-4R4qY+V76L@hVHJ-KreCMqcs2x~pLSP4PW$ZuQ-C#yc%5HNLjaVV7vjm8vC zp@N_S;~1{B4P;5*b4JK#Qoc^@4NHbR$8Wt2f(gg{()YKq8mh&Y^EyN=e=sJp?#;Bd z#D-%g9KWcT>ke)il3u)|}ebYA>JZ+_-S5lr^g45sf#AnGnfb-DAr2g1G*} zoV*1aoGHl7NAS;R^c~C1sc1s1=^h%>&L;Y-q8VoD_vFXmtjML&#K(HkjU)z|bjKS@ zoE*Wt$JH`ZI)0t<5kQuRI2@8`awOW+ZTH9HnSV$_NfdJbgScVGQ;vqH+oB-KhCHSyGt#eGmpb1Q%P zt<0bBah+6;Ld-BsQTgMc@4A}71zOg=u>^iOO~II9H_MK*4Z4mwA+r@Djw#OgNRSo^ zPyKDko{S^!K;{-lwy$8}fi1l+hj#h>vtS<=2=lJyawvN6;cu~K=yoAboiV*;_YNi< z(kDvT{>hh0g9q`I@uqm2c!k_%v}&g7d&tjd~~y1RvA^5``6^TPn=#_ z+T!Er)tMgit9LwJxw4HUif&F-3EFB-?HF{>$m(4!Z!TUO|DAn#Wd9)kJ}yXle!zWg zn1P`>@7IKWiAUWg(qhpJ5m9R6hFy}c#J;kx16dclK#<-apTogcwt}<75l1SyUTj@% zZyozJb%ck-Yw2IAkF0Dzg~?TsUi+{nUDg=wZ}MJ@zxZs1?tiy$d0Ch5AjpR6H89ta zsK~?jxzO<>_X!_@*(%Y>w*#Zaee>wci)(rn;`dd866B_LJqKn8kp6y?e>JM`Tb6F^ z1Xb!y&03nx;aJKW4_+iI+?>T~KCdNwzv|xPbkEEIHRuy{$5y2FqYaOnhb1MCGfjwp-u9=E0z_5pOR~PuulcxA{(fa_*2wwFJ%LV@!HjtM zDl3H3<`!eO*+39NY%zTKq}--7#HhAGYkG7F0WkWyWLjq}1xz$(XSw9tZ0fY)6f&z@ zQ82TuUuylQmhLnWeu>2if??-q9jk!Je$<+nmpy}p4Q-u2|O=>oqb$R z32!zY#dFe0ZL#0h-Fc@%BCDxtINn;-1tbv1?Cvic1*PMSZ}cNI8gQ}+r(0M z$_CB(qqkJ;kc_(2ca9R3P!etAO|-2Jy@9qiF^=WFITCn(y-#N>8kz<0rA)Oc6?&9a z2a9K!TmHsagxS1bO;|kRd6jjrrqBT`uH<)ZW9XJyz93<8Mr@IIxzJMlL(krgTi4o6 zdFIi%BXPN@N*!f=l8vKow;Yjp?RF~R1Wj%5y{#g*CHcd+-$}vwx4@0Z zKEvJlnZ8;R2X%)S-}jcyPA<*zd&epo0*;+-FZvQmE-IDaM_B9XNvJ*Ku#|1*faQQ~ zz5WFkYAuwkL;~GmH_h)N;*b3}`pn2`NXR@oFE?NW{Bf{Fp9e~MeQLAIU#Zzq#mkwE z?wbc5>6!0uSURR0;OewC32}dmkKK9WLA_EbB>!V5BahFM=R)FOy=n4DJyZ3EkiD`# zmGyWF)!lv+15L8pn=l&OoTu?>JdRVtic@H%$F8f$5-mUazPX=t8;@{vU3Hqe+pWkJ zhRRBNf8COcZ_x7SW?IRM#nJC+%SgNZ1P3*gK&%}TE3I!+GccVHuVUj3by4A1JV+AVYRV>9FP12g=D*vLq=pc3QqnDtxr zo{rLG5SZ}@wui0`;uf`vb%~)$y=}ODx~;Kk1on@w?(!qFE~b#Zb$KJ-tc9mtKf*Qg zOYLic(Zj;d2OY+7VXwZjAR2gQZU2}oT2{@f&r>}U^2HNO@sF9Ho~Mn$txlDm!F7F_ z>gN*oTaW(8y_0sX|4^&u#JO|fv@=3z@UuNL56Q;J34Yb-=bt6VmqZSi0(Z>wFoC7i zXytu#IbLdgcPN9TTX@KI^NtJpI*x}d0c+WzT+Ykwa=|&0ykMAj^Y%Vi7ah58Cs*|g zOWRk7n>l-?y4gYSc1PSzb=*c?&tZ4ycl)Uv>RXf{NvOYA6}yLnskn#=SJWJRBG zHhL0PP}sya?S#?ZBIwdxg`U$z|dfF?gSTm>Ir(n6)&=dc_mxeXU@x-?RGT|Ez(%8Y$s0FhO?(p zcV7OLg=Q*ib@S{*D&4tz)_B`10WYRP=kgc?3!3@3v5>G80@d(eA@H3#*R6O$_AJfF z8n#;-N%ir%LG2plhs`T_BZCD=kNH)Iq36f136~au<_}|XwOx&a$H3ckN2f}V)_Y(R zzyqb{=Jp^hju*bL=AsNIt-N=;xl0lqbqwF1402wQ7QL&uB1A^e^m>W{L?%9$aR|45 zsxbGipc7KXuaqy@>-fkB2X~%`wNj?`4yAF3mnr$JYWPU$^@a}*{(gW>$b5e$)AYxf zNkH>%BF-z7&XvUg5u2%wek62~}t@s;M0s}-24I2B-%x>)a%Ade$QpxamM-v2RT zCbahZr=QQ*$jvFa(!&Ph_ZVP5^Z=bGWek$Daj=gvvnN6;wrKvoba&vTPI)OjTwjX|t2|T_W*F<1g83DQ zyWLzV(y)3KBQac9Md1--Xa+WZKMHN8XwacNyuLr{s?(^ah;%)3Ey^9L!m?s>5uOpXtTh|qx=CaRLR4Q)ORgMtuP?%@QpY}<)oCEmrPJ%!CBNN z)Hn0!FM-8{_fGlDlQmM|DO!Bw4py9;DK}eWbA5)YPhprQLS>aQQ&jtmqRCN5O3d!$_r$;uzd6;K+`+Kn{Cs|BGZg-zIO zY&mcF_NGNde2(|K-H;*#gFoeZ`?M#)>!Xq6H7z%1!@5Onw!V-AUg^mxw($M!Bc1-= z-OYSYj220*OYeU3ND*+pQAQAsNsTTHcpIbExiaB+VDToH^nLPmt(-2-uT+`#G1iStp99GAeEU>{?;h%QdmVBjwEGVUaU*%{9z8bnW$n~66~!K+--Kp zthP-^|B*u=>idimI&A;IB7H$d!gB8K>*#hAz{bvmDHY7=PG5ptmJpe|Ww)O2)Rw1a zLkHDY=*NNfvtO_2Ev6}l8@Tp>E|u1{<#J6KXaTG((~uhSiDe~A2v2082>&})nt;D= zFI5VJWlQD%10M!4l{g~87VIK+FITHuZrqcbtX_gCGU6~}f>|ed-qXkqwB<^n74Uo$ zo1*~>^Z}s3t=_8S!V-NIeGR6dPda0+mv@~5i9;-a$$~-tBZwTWHoK`fk+*gA?3bPY#EouIUW^n0PcsuXhdPQ-sh^%Nr@#LAGF!vR>K6wn!WP zw1uA1gbk8TD=nSxE?o~yZ!B|L8Y=c{oL@_Dbp*K!(Sv}K>vKtL+>1~}D4bO~JN_ed zQK9X*_<&m99zx@ofAPx@Pv)hPS;N@Nskx3k=z3Efz} zP&5nU43{(XbTi);g^~~hHcl*k;rFgW?~nJ9^@cR*Lu#l<@w0R+W&rIO7t$%w(P}@U zH)H*qno<7*U9;0}{-?rFAoib}4ZB%su+9BTDc4o)#qp!GQU~UxMU_l<=3xUgIys}) zDq;Lm$C*xEz||&w6X{GAK43VhZ|W@*sXQvO_i6COZsBEE6>;oUXl?N^_vCAmcPm~*A$%@uJ6GBI&CdD~DRM;@&Fi|JZFXSe3V9;9dYo^^cjP@-T!iWe(3^*=%`T9zDw4);IDlTJNCUyyQ9{IQ;9uKpjU42SIia&YL$_T70)1M25Ok(AG|TDggB%Na#xL$Kx<{NsIf=S%yXu@d>mQ6|4Clz)_} zT8$~+1BKt~f(Xww#mwI5#r>`HjBR5=y93*f$8rO`i|^(DjmJ*33y7}+^RbzrXHn|eE z%4B!+*U5y*HVHKHZDaaTD_Ls}Bj)-JbqNEHQs3&ULGIbFJ0({ZnujpvlH3h@Fkyp& zW!n@f=Cim%g9?#vXh<$=1(-#{Z)V3fr}|&jnP2Z1F%-WiGTPL*2CElktM+b=^IM}P zf_#B}&zuzRu`G9b$*6(3FZD_CqNySto zYm>cU!Dan~J|dol7}nLFM4;1ICt717R_`F3Q`J(hoC(Srae@0-SaLas%Y zh3hO8i(WfTmrK{_BetWorJ|wgkL6!Svwxs2NV~)~;U3$!wUvRab2DT15?Gyp*NIe= zOi1FHvP+*%Y}>O+(LBz^{=2Z?Wh(#dnMoi{2SX{fg3r*Tq@SV#cSggOkG(q-Tx~(? zBPMeW-*mAgPyaJfZxyxE-inxL8iQv!bw_WB-_(K~)#*$r2DX%U5pCQj)9J z$KDo1JVskN)tbp)PeIiGgCi5Jqlv{w)vVds?wHhF<6BLs|_~c zNve=CHZ+RilxoSM7K=bT@+M`Qa2bOl&iCv2*mt@c^BR{~0-HcMSJx_jMx0*W5NZSZ zdA0vVCoNGKh8SBl`lsM9iyhj?v5OOJ*DpV(YK|*;^MaYxOB0@Z@=ef8%%70GMJdht z!IS>d7?*!)X8G^lTc*o!gwjtXnBOU_xx7p$I)5SYL|sk{ab{%CqWI}_d|9<-Ds?qq z&8v~wqfs9=8g7mg^M!f2;<(KIEsEo9PqYb%yn!D6$DNeA05nYalI5f{i)u z?m))-&v95^gf?YIG1{^0UPe51e0Jd1l7(!;agyOv15&7mIg~LyG=2KM6#bcw7T<-_ z$MCxCFhgTIl7{)}Zj z3*7tt)$c|gFLGS)Qh%I(r@rP`TJc3Ow9%xm0<-V%xYvE_I=1iy7R-pIiCaF4V09@- zY(A=EGYXrFn@-$eczF6vmO@QZWO(`dDpR?@ENV55e_%=^A^M$g@&~&My%!d>ID#n# z+#*pq6(V;c4Mf7<_kIwZj#HE&Ztmp=Hx^-Q^XBrS9*K30VR4 z&c{pe6t9D+Fg%@|eD$PM8Nm=?AN_pfe!j$v?ZM;7-!z_d_R6xOVKlH`y^ z31`lnfhfx$q{P*!`8Y;7ij-5QW?6)PZQpzC*vsLa_Z}p<)ShzdeCRDes><>yMH8hW z`oLkLV1JQs^Ah{7;%=C&0yB(3{Y>Ig^YyLlk8f!#p1-p*kL(@&LsU9t$6EiQ?nk*^ zdRlvNpSwzX>T#W?He(1;5P@BJa8Znxq5Tfjz{f4`DgP#mme~%`cDVpc%~ox8uVZ0O zS+EQNMqpyf9QQ!Ujkk$oUt{oB_jE!%qQB}9(y1FBbjry5j)Eu~XGjBK0-Ux;`*QIz zW-hzR3XppVWxUI+rbE{dwNRt>UfIjgIe0#XVJV$!eGypSU0XVPC-<*G3*M=`j26&8wbdfqI^!_%@|9;-<-~zZv}J z2M7%MC2zIFnn0@3e0e8qP`bL4Z_q_mHD8GPJSZ>)n|+S8!hghyV3C zCfM4-kLc_QMZk&BGs@=td!Jqo;uk(T28;#nS9M!~uuxYC&3j8XCiF0A7gb(dT&q!t zio%Nt231=x;sB{GNeXLLc;|;$bYD+(Kkxm(k8FRIUVQ~1ds|N{F~WXSX_fL1)qRSi@ z;PVDgJd*pRFHrW30zb30B89?m>U9bjxnB$uL_Ik%j-^$t=2|D7HM=}kqeDo|irXLd zRH)T-4#7Sm7l_~aK0n|>ptKT@VJq2wi!ux6SI+}$;-Vb318l4P4z8)4>pNg8H zbEnn2nbVa+%feoYF0{~gd&E&k!FZXgk;eC$`0&;xgg1GrGIeTC=ls+~(IssG0oCN% zWN{u%sn{IumoOgn?SzD8KqwyTG=XP)$%wQ6@v^_B0+JFUU@ zqUOshh#Vwn-e>ZiD1mZWU)RfS)@yMRt51Ye5B{QmtA2fi+wLq(r&5hdcvX{sbhY`* zU4=KRUktUXp_)#gPy>;j7B!_RMI}|7`pHSzc{&% ziVV^~u8ANcy+birDch+@bf7pO&nC5elFTbB93L7?eVG;JWgFgse+QB;=%@Cv`AuK} z!uPeHTI3NrEd3G)AkMRd704ft=Jxu!2q79|JZPJ1bnuHIS{+K1)cELUML1l+%vNi% zYb-m%V-zLQygUM2RX|XHs0U@}WG?lbQiYd@;@w@To0Bz0iyAv}Y)o-zA3p&dpD6MS z@ckU8sAC4fVyxC6{!Mm* zP_cPlysg^KOZOQvNo0#d&xQByjdss7&Tg1*^}asC%&a{N4ni|<3TTqm6>aqdvIykX zvoJZ2swk<4A-w^d(lUfP(tudNn&h5>j|3|4lzMFMs|1z=9m9JKG6H@^KTgLj;5!ae zP-HWa0}7<%%pzZtp#%yhOX^s?% zt1Bqysk*z#yapn+wNmaN5bVqIy>Y+Mm1w(yBO0Vg0tPZYA&=(fZF{wuN59)KKt>|d zx0`wZN0aLZrnIlq8|@MwdL<@E6zpP|Iipq?b6mH&I=DYMsfNDgvgbwkKH zF{`(C`T0;1T`KzO31yx7HZFJZM#@11qUz~ALVDu)%hRP$d*PX^FGgb}Oc{c_9oa!U z=(uB~AAfI?&NJYF{oUa>P4Dop)>oJC~>kLBdsF=T!CWtIQ7?~>izM3e*2~PpG-}F6X98Vy>}TjCV!j0gm9CZ$(yb1JW;m~@2lkZ zqo*lLIJ@Y6k22&9)bO%}O8_@U{y2)bR#(2)3+({|@!fi8~8Dw71O&)2k{b~0DoX^k;A%}UVB5f8p zzNAB3%>UJXqq~u{cKdG5$F{ppQtL_ad^#gY>5eVU$2PIufUO#hG)NjnWv|M(d74w~ z8aj@g^nMuGV0Y4r+8aUd`S$V9*`Xz(``uEU+N;lomnpm@s<#D9zj&G9eJnO1mQj(M zn$G1Ml%&xGs2=md=|#z#LN0ELaD|+UhqDS8R*O-UvqqFW+-c#XtE#Uy@Hm{o5(as# zSPPfUu}Kx>Z$-s^eQgJU4^Hi$X`RJan*((iXeNl(KG!pEQjMP1oEsfJ#^!&4!3)nU zx=WQ)^uO~Yus6kVz0g1)>|uG}dZFxreh(N1BM@>?4V7~G@Kq# zWwl!C+}41f-%C1jgHYB@tVna(v!mxcXUYm>j<`#`u?$Vcnj$|~K<OuMpi>vM1t&FY=N$0ChIc213HV(*Zfm_iG5I6uS* z4(Z#*K3x2jZ76mC*(y*p@g+&cS^qX=bKbo^e>h`m?m+35)<+1zU@JUD`E7Rn%A9-d zoiZ8u2Zh<(Aj{CR6t2AavcLE(;%mw+7ZX83N5c$>m*z3`CFTf#HyF?|KCd}eRyQ7m zQzpd9I zDfu^;Nc?1l>?3O`KYB;!gKMbQ?qsdw{WH3JMpa4_YuCSSU74QUNi6<=_-+m&Q-La- zn~)rkl#G`tgtil*Kfv_Jn#zNVh~UqQEwF}xKhClI)Syf3#8CFbztKfgi1okzZETzj5wBR~?Fs?M9y}}OU zq-KgSFCOf|W z>)qS|ZVfajHa2$g58pyibTqDxj?N*l(=7s{L6{BP9eC7D6A~Vd>Fw>!>2Yil8z0a7 zcM3QR;FiT#uU>Imj39@TaQK=JezA-nz=MFSaMOwbCF36=xv{b6(`(0SAyQD93@Y!p ztTqNxAphZvS4dE{{I`He3clr>G~YJh9I(GWw}ICHY8N$;0n?umaC|&{`V`m(&<=t3 z47e|_-LLnmvwU=F9Z`T?Q0id5(P4Lz>t;v)z6})p!~Gc{_d#19;&z-NxbL(O1x$6x zfWr6not=WqyBH-=2~gCJPe%3$lwh*z))4~t!i)R6TLcK$2BhunIbHXrKS~6m8iE=; zejgZjv0h^ssQQLlfMqNSm`#>|qbRt(UWk}OF9JA`4DW8P{#7z|baxwrf@@M9%dvK! zw$m1@t7u?z{Vk{3kJyfE&hAo-_*6q%I}Bc;dvkdNJ_52tRr9cjP#)dh+KK@DEn#Ojx3|Cx!d|p;a8Pnt zo0G!`983E(QO(U_z)wfud6R2-@esf>6$GjmTRsNChRZ z>xMmg8T>TgBOCbP&Pbs2OFx$he4(Ty&q8zHKLoX`aZO;%w2L+*)}JU6TEabxCPdbg z$kwhdybuE;qcNyjbO$zxEK>vogr{t5Qm(GQjOKvfBJU>&u(zqfBtcOM2d7O1uc=GVl^ zLQp^n42cQSs7T`4+T@__6s$B{Nc>`d?n`1~C|H0NDO5tP;zjBi;K~ufW1G+&U^Bu1 z9;S6~Z4*=@l%aSZ_}U5JMh`+5vfeg<#1y$yZ~68?GkHjN#^-d5;Y$`S1M7`IC*X?E)D^#jdeD6^HeH zGPo~Bv(A|bT#%ye(R6A6%p%{>l0ttAs_G0pM@V{|l8lN9!PjJLEFti)&TpFOdmo|f z?(TBF?6j)m0$%!-{%2CT91M8FME(DoqxYP<*Hw_j{wHoJFqcJ2s3!31W6 z0A`wnTxEK=9ocR66)+4%QH#LDyJcMh!GUmvDKK%DqmD=pRe4kXjfi}2a+Jwnp#E?0 zE-i|UF@~(+h<5Z3LqAprJQsuWcmn}C{uh@o`^aw#UK!5)Q$pAmi0^4YGj`r^p$Fj) z>HJ3?!H|C|!_oHxo8UTFNyH^a)Z)Gdc=%dKT=x!mp;w#$1_|tlIv&u1`x)Ln|EChP zf$NQ~oEgBfFQ~RS`iBCqJD(abh&zF-c{tL7a9CJYnoR%;KBs#is>yf96(;`>}@CQV?Av~fh7i}OZy#m-TwW2E?8d?~A`Kj0# zk^A4rjG#)m>+-kdf18>4fEE~AzKkzEH8=rwnDA_48s-yn%>UK`z^6O|99q4HkE=q# z=zX66eAdveUH&r)ynt`CXmAj@;4@}Ui417vV*>LO``_|ZatLRB4-7~H z-wkkjfqy@L{`?#hlcBi*h#)i~A}A(?ARr)s(`jA4X^Isq=L38IK|^Kn7D`M> ziA)vof}8)E@9%^ZflC^gC@86^sYe8z*85uA|gtrM5sd_xG#d#lwvOVq#0 z8*sI1pgV_wQ$@iZQtmFGGbz9~z%IzZhKYgk<&Fa#aeXi?`eNP-7noX+p+e0v#JjsY z&3achJ&!e_?*dM!!^6X&k&#jWLJ^?X@vIU6(Hwv&w$gkU(duuZ1hCV_bLit#X~XUP z-^Ki>PuBmm1Ek5KP*$1C9xcO24E;SlDMKU&?BxEvxw-kY;`G${^6HArW@d0usVpkb=J$p26tGfeiGC!HL~U(t z#XXeIW7zx`;W%Q$fag)fQxrqsMttBofPVo1eBc1^;)fHny)D$J{iKeE-1$sJp~mgq zD@y3C+R4G`*65eyWELM?;4uO|m~sAj40t@+)0v+XI3bjRZkdng#~Ep9YLWt$bNc*$T2%7JEoMz#IC>X=8vX zJ_Sq+P&}wmP;f9ExP_40eypz^5C@H37e8M`Q$zm1>qO7TM-qZd6aQBLI5r)foQQUI zXR2|tva&`5g^Kl@_CKR8@ljF+CCzq5whN34D)>>+1|f6~G-UpDL_H&UORD zromF%$B{uEa%|WA*-!9>rwFytPa3PW&eN9CXKUuPfVI@C+W3CTSPXAb^H|qiILNA!@062@L^7Q=N znuKpyT$q{ttGodB<|zDcnD${_M=(L;{@0lX5>9}}%4DLWF8zM*;UFFPpV1p(6hum& z0{kh(Vg{c`LHKaOyYw$$VY%)s{QnTT3%VY&{|7bLFv;{CX%@w2I0h%>64>{!IdkpGR559I7tS+GX`i0)?+ogL!3INnL_Fyy{D^yqYNX2RSfP1MJJbLdCX zED=5glCfCO;<~wh->Vmrk~~sRtdQT|JdY;F_6L&sDF+9iww}6rFd!26)$r3qihoMr zr8t%%&Qm&b~=k6)f{2eb|Yw3zO*6DYN zyFBM-CuL53Jz!^NM^R`Ubwy`=boJ_MJDoRwzVdeXGT#@3piM0B={GtwrcwNm)>S+YHE@wV8@OfH@BP=?y%!Uc8&;coeO=#=!c`c zSX#{Irbds|kPz4V`Lj)#A05JG4RdpTs5**{2{ z4n@nt|F34-3m&WMjZQy{Wk7_rV#5!CCGlH6I53Tnb$L%SoQsDi0L}FGpy1*;_Eu|j zeh4~IhM&7tM(Q#-FG}BKWe8ulsMRml*GG7XI{I^}`!ocawN zv3YrUO$F}amcFy@{3<^DTW>9dR*5>KIHHS)RzWuj#7H28xP(YU@ZsvneygZZqx^z{ zgWJ8K?{l2A9;>3iv$d^lG(I&7Xb< z{d8T7Som~yw}iF-Chhm385tWPKtU8dA|nH#a`L#KU~_*lZtZU$_uRA|G*fX2j4$y&OABs`GRGX*${(6Yk}t@$Z_0BNYL>5)Z42t7^}T{ykkKF|05j@ zyS$t89O@0!RQ-OdJ1!k1lpnMey7BI&AW*@*YE}69UDxHD;(q(&k+CrXCZRbSd3a)D zN=nL=zyA&>_h(_CaLaoQ49*ip8nKgOefxkt^+oFF>ub8Z=NbxQ4?2((*LZ;V7S{&lTRfrb@2Db9}%kIr13ZAj!x{b1gb5`z1f05J4EOYGAPV z`}gn1@#{)IKV2hu1B5_$*qC7dMjOmrpyjg~cmvUF;9s?hsIgE)4}wT!AhIQ$;s|Qd z%+I&!Fio*4{#ahNLGn|`Ra{2;06eB>yumD%uJy%-49-K(>cT>5zG`=TedWt6ILN08 zS(#6tK9#+Hzr=g;+cWRsVixMLYY%g3TFhqsLFm1ZfQ#TuBwmGFm-g=6JAsSQQ5%cL z7K@3ClQ@oN*)r1Hj(&f?M~@!mL_j4=NK8yOT2kp)t0JV9^t~(+4FsX=ga&F&YwI=U z78WqR{=kr)NHOL5P4lXXe^C(5G&R#T|xvclL_d=q3fv^e>B50Ao!uWLd zJUE`+&06N>t*fl|i}Dam;<}WDSBorBeL{}%?QtC3!rCocp6Iv>y*E^Gt-i1TX65S# zk8j5phuGAtAkYw-udgo_OAmTouQq&ql$Tcp0i(}KJlt*t1->7h_h{Jp3>;$-QC#p; z)oy{`HR0VAP?3^3_>`5rn{Z3OCzpGqHN2Xb5Z6>C=&Z40&DNvue|wK*4v7kp%>sx) zWJPXh3;Or0L(=}kX#TZS6QcuHHe(rtiJ1EP`==mZCGGRe^9*1@lBGaOBqDLw4JZSs zU#jHl=ROKJOV(`Mw{_F}@}Sh0Wl$*MMhsd3F%qICAYuNP3r0y(Tbp&O$G0%ZFc8;w zV)a#to9PQYTo7Y4=$NuxrhBu-j?+)!Z4TqO5JMQc(iFX}9#2(%y=s>cl3R+q+Kmeh>P;*u>+d7tnd?h?z={Jj- zFm(R>(Mui<(KNwcstjHf{OHjpyo;cR55q;3c(@4JO`C|Y1v0`ux2<|Hn>nFh))2#^ zwvI)LK^+e*^)Xk@j^`x{*qBPlh^2Bho_M&RwEm4oAb=K(l1+5w6DuR4V8ywAe zEB%|*De?`0JZi;tyaCeB?NU0+OksPML63!^fIudtrvCk7uLf-;R83VE+dOZkS3EOy zTo1|z@LQG0f~3919H=tnXhcx%pVyH!?Q%+=UWUWOi~@!d5g)&XEJ=8Ht(l1-Itp6@ z_U3MEu+Y`2KXL8%Gf}+)YYiEtuXnowVzFS69~wflCrM<=C5Q#@7f5{gl_Ew_&8M1*Cy8C=VDK z8kT+hXyS5uA+ze$7&+$4kAPUcy0jF}b#L}1I-nEVNm7@cEo)xtv+CKiXYYDYXu$gq zdE^%w@`}%l;@kz}-v4eraMbd*Z}-)ZYdAv4!gj zB&8U4|8wtDQvfMf_|DICT)B45ABL;4p}}}~9Qgh7(~8;0&yxV*@I^_#p!H5vSXdY% zMTCdKE&mebdE=OSV)Z2n{u@AxWUcra91g%@#@sk7D4T=D@yGZ4V`p5VTj!`l+kjRE z%cQm7f4|a6Z`iN^X#v4#-lmx;kTko)cfPnaSg_y-2Mv*XvQKWEsw{4K2n`*(AV|Kv!d7p|bFPG- zR5&u_Vw0J$@bExvKsUFXoZa`{68#sb2>1g9gM30TN;3n+!?4FBrHockrGM=x_s`Bh{p-3XjKzJK)I5Wxd1 zE!!=IhY?{cq`knXe*`u|4 zH>aAqdZII88fe5+Us^n=8D3{oW{73`>xK{Se~i4)2>XT6uX?pN2Lv4tJnD#xi;F-S1pzKPn6BMEaa?LH zvSn$)%)d;Q3o>0W6S;sGQczf!78H9mTC}VqMrR>CT<|tyJwN94-uO9WWl+>nyR)~f zu5J+$!QDPCUS3--T(~gSeh<-dY-|`ZC>x}eN$KgDuC7^@;@122al>kJP`H1n-6Xa9 zT)cR3-(P>N&7B7NmMlN=63Bk^>BqkA8o0*@jky_>wZ0@;h>r@gow0 zkUR~6YMB6_QX=(5(m|m<*29)%FtvX>#X12%*>V-x$V?)%K!P17KuO%pR7+lV<`L1BSih>l)? zd+vtCdwgnW1@Jw=fHGiY(K(ACmIgV+L1k=Fq78}v2QAE|Ip@etSj>g|ihd}SDb0L+ z)Yn#+FK4q3QdK}M)jT~Fp_+rz4V}b+Op2&axw_I(uVS|>>8*<+a;rGS=vyrT8x%i1 zluZJ|f^ErLU1m?W@;Y(`SSaO7{9DdLpGLa{%B<&dof;3;To%k;Wncf$C^IXo98u0* z6O&L#7!g6bhK2@;a&mI|+MLTyf+r{>c6N690p9DE9EIYXKcJ2tqS%H_*7f;wAe8z# zLq%?1PP=WVsK!cj*j0+`O__+H0Pq!jUM!ZIoBJ4nX>@T1V26I?{QUfCB5;Sw*S3bw zr2wi|O|C>H*i#*$P-tnVq~I$6{W1bh-4`BOBm|#-btZn0N<255sFNPk0+By>kYYmNn*uu31lJEyY zvL|s8QIl$FHF8auop(Q6N`5lqx~mcK@3XLw?7dS{(VtJrlFMHy-mgiEOPr`!8Cz!k zTU(hZMehlT+dk7ri0B>ErWRRx^{T5@-0P=r&3I?=ipgsjY zS0c8Pgwv0zN{5Ko<>TWEfov&5+}Vlc&_$)i8>*I;t6@A4A(|-Wk!x2t!YjR!;#6y( z9>ZLc%$ih9uCCwpCf8{{RR;4Bh%66oEc-Y=@nh{gv5W`zW=k==C!WHjY@8HD`?nWs zoJd;a$HqkS>{{a;L!}WCYoieKu#zyQ8ltWtupv4gGd0hj??ATN8Z5+a+(FfRvqJd4 zu8plWDOcJGG3wmd`#nVE7%q{NL^L!t?*e9qGpa@yJqqCP1w6m?xTIe!LA!3#R-ZFn zSZHYZ$vWj=TvKIxyJhosXb7$o5usi6_%+q0*to+uNw@0ik1(cDu{g*RI6|uVrtLX1__2Ierqv(E@tw;ydcW2LYN=etmt)5Bn_a6BCq86V#yfdz z4(`y<2ol^)FLMIXkAy{;8mnHEER$~HVrs9EQ6LmKH?y4sntQqDxCU*Be;FukbB9|K z+(m_jguL;dgPh-sEVH{U$N>*oyoe16(PJVOSAvd!aMx`WGO9o(l*YELn0r< z7U-k4A?w5@#pt}3!|#LGZve7%*F^ALs zymUP&3To9eeeWL-0#7I2KQaM?ZCYLy|7lD()bqcL33FK&*(5&vuC0 zQWS|1f#i&QiE*iT_KfLI@R#7dbmr$zLBwB>YOh|hN9k?0h~DeFJ-0~yvclVw5uF+ z`PJ*0q>b0$prWIrc@;NJrzjHdR8;Rn>E+d)ZTYXD9Sl zRT#ckq6d%+``pEB5s+iaJ%7!w>FF%?gLP@CxT1VzBErUVPSDDB|1*iGR=zTncx<77 zIWjS!30-LDaH5VR__eKY8Jc>q%qjugzeS9e{;J@jC7P52qatq$uVu7$+c06z z9muq%1OAj)wi#3e0wX|q6RTSTmXS#RZY-IqxcNZeV@D?8Z=`N%X{q?w6e(>h3~4K? zk}#C=q4})}iF(M667xt9JL&*n6cV%8R4^JE8w-KM2Qm1d++2C8thspw@QsR8lSk5a zHC&320tVQ0pybRGHx2;-0YX>88HJ#7yJ+LajW{Z3S6Pk_;ol%E7b-Ag6I3k9eu8x9 zjzKcu*@|zSym>!-OAmfqww&)%%R<*WmgR+8H8eh47@71CU(TRCrbV*Ekffi)7jC{<&!OgwzhYV$q@-#61pNG&ADvj45xTGy6dt1nHJ2{#F zfEpjp5CceT^q()T3#a=uk8tL0VU<{o|%d>Zb7;T${A3z(U|{L;BKbS4}V^ zZg~)oa&<|u_8-UpXMg<8IZb7X-Lm!i0_U^7PD^47%!8`iXXujceK%RZKDL^n1{FvR zw|qXz?8&Z1@hd)aD;#sTnoN2p>iK(2+|oExwLT$kBQwPlY1C!96KXyWH81Y>xLtNT zmA-iL^)HE4%a^71L@hEnlvXDYX#_L<)%mB@P4ak0^X}6T2nla!n~eeUZyIPcGk?XoMn8%2H38U0bs^Mz&7y&FJ&!s?2*8 zFJ5-hWsTkG#X%W*YBoAcOQuHYx6gI)Tei<#Yj>@)OmoP|xVlol$>S~;4y34qd4~>` z#mu-q$zik4_`4%(wSsuc!}5XI2gkFfnDs5B7$~=)H}`dh*W;}+W4AycT?Ql^(1r+B zOhRr95*UBsAh+Vxt!>L7kW2`1K;Vy$cJC~fT_$B-1_#ph=@TQsN5nXH3JOd!^iVK> zv9NY=S!88p1(dbCvv+d;0>R9mHCxQ3>aCkztTUHvq^Mf+CnksEm09mdWC1 zzfge$wUi|X&UVTPsX#W`oS9m4%0p_xZrQ+oDD& z117=qqNj?0Gmyz7n_b$&0L$2d@k(-5j8?F5cIJc(`^>k(MF{=ME-V!v0T?AHBt##f zGN*`wG&=>Bsz2zZuzv9U9E9yiLbj5rZgwS%>e&6z3Bsrlbc7NvB9()e2S*Q?Zg2nS zvDisuqH;~g#AAc|<$em23O{H6V)iKivbHy&x8v37^Zjx6yL6*8n5EaNJ9}AjW z&b8h` zr|Rn74K^6FeZ4igCMZMq*jRhA`k4{!Jsx%zNBLsxozlu$FQ-2qY2n;JrF%_pH%6_;+M#F&2{7V+wFJS`u< z6~fob)N<)_W#O&072k~3&Yl@{X0V<#i&X&GVRp;4g??(RWcVD;)B4)kO(Csx(aR|1kMOva-r>V6!<!h%%%ILTp;Tnyz%Lt2UYW zxy;n#!ls^~>Y2_gpH+$0c@BRI%xz3!*G(BXJfQDg#!@@so)#y@Vm8*FRFTmrE;Dl_ zof=4g9iTdUGA}Ey0?&qy!b@hLggL*uRsT5YkyqW`7rZyEzWiBZAm5t8GEgnae=$=!P}hiS!f=4x-NcQ|kXu{81uui4j6&c#VG@O{fZQJ%gJwcJ~n+}nmqR>j(7uy8~BUgpUm>j18so9q{! z`r34ExMXJG_U+rfGFTWH%NiPZLqkK~IKHq$bjW-3VoeQ5|7P9Al`y!_(`=`wx4=i8ztBq5u zFz9kq@+trq+;6Q8ouE68RssUFZ=e5ll2CcEp8^8|fg+gM>;G4frUJ$!F;hsSNW#tq z@pvSGWW)mrukGv-WQP{y)=3=>IgxGzs$DvVFtj2Nh=?sFRgfYbs{dIhd-V^PHRke| zn3<6-1p*ZS*d!q~nI45~@WuqDrqHlW$aX)*lO4gt6m+|SCq{mCDXF>$2~}ECa{EkaVXy{s1?6zpaSJn<-1hrR z8yR2A{Og6Jz4ZP4rH?XHbP{L>w4hq(3HgM&*)Q_r+Ln6Dgdf`QW?m5o_fF$*@Mwj` zk<;ReIF&5defA~K%*x5N-;u_5Oi49QfQ4=(K)iEuT7$i*oBzLr3811ALG z!|@|HV%&QU#7lf47a~dv{%OCs=9Yfvq@Z8XQhxHZF7;P19tphclV?nFF7iw$hw}sW z6oX%`JXyco&o9!wVQk~4o{+qS`*}D%)wj3O(;{pQSzAhOhu5D_|M#bHy1jR()F$vl zH8f;5J*RG>Y5^iy1tuS{1=6D;oZCLA#!C8)Q2#lOkt!I36$a(=zQ_&8eu3U22*STe z8eIXV70UuR2E>ONKEt;sy{idS$ffYQOrE!$`4V{p&(|?n@7&2m285wD()N8E;|Od% zzlcN;cNH)YW^lFvx!l8CDX~r9v>>HFh~$(ckED#gdbLzBNJ9ivH7 z&7ZtOylelMRSvhk{AzfX_;GPil%CdHS?lsMnv0&yRsqC20>O6%YWvSmOFTV2I|=BF zIv?4OpfD5g05v*Bij?F)(NjGAeH|$&kO6NGAF`1&6(t#XSfJg3n5QBnEX>Td_EItS z?x!hmRfJ?2uN|c;y7sR$ux1c|{_kjDZQq-Kd%zKSEmFTszlN68)ljAulmr1yaLs+r zlOrRSEyX1y0tySg?@bmI77j)}so#EVdzApt4P9F{BeA7L#l`c@&s&4!nBNrCpH;%E z{lJ#f957lfWhxlZo@eIXHD?kvy~k4EkGsYx zbRTlxordjcp#dLCct0>F3SPsw|FIXpvJx{;S_gXj%u6@XAme4z-ao55xjvVgo|;0Z z5~jE9Yc{s92v0~@M^y7Ef)4>7Av1&wqV8!$+yzrBLl55SVMRsR3ahER1fze|trFz;&!Lb14o4r3s$F7F==6EPD#U zdWs@#RWb(|5yKOR4byahtslh5EsXqO@hdoV@NeDqB;>`wBs9VGq~*8EPIFiT>TRlu zrcHYMWPjD7?8uQLo}aF0CG-OOp#0D$MaoG3CDCc@_P--K6}vOxbpYm(@t!zJT0l^@ z#P7Vz3JWE0vWA^Dn+;oji9_N)Q44y^Q2aRI{pppFUb81pTWiZ28Q}wYvq;*nbouz^ z3k!c_I@<43%FX(FX{_O+cJG}{>-_WB&tbc}61+)Bb{%ZWZ^WYJG7h?&?z5av+=r}% zbt=LfOP=xq+5dACsgs7#j^d)(kmZXR;upNrwWU!*L$tx-77qFIBFHaIOa{gi(r8Ex z7d~N;Q#pLmA3oi<(H^Y6y8g?`4U`- zVCCVNMQDdwV-(8=(#LV(QHOZ9TaPQkK3w-Q)Pr{B^+qRlszBcC8N`in`a;L_f9c zfQiW+)NPoRgV4BI$`}^V*#6jaHvD2^2mZrZXJ9rrU~>2?00g0I>pxGR$_pdQc7=+P3s2F6-+FsESWR-)(QUPT+H43IoU{aGa14j?Aj6!CNj!=|=@pJ^0l=x8>b9w&W zA(HfZ{J-HH1?%@D8hHUce~X&j5!bGNlnQP&mK-7=@14B>@lBhn>ikSsFvN#`L<1p+ zlUa7p7lW(OSQj=EQ~~v7VaAr=hZ(9|1 z&NzjMa>zBsoW2!Hmo8O2GbIg#HWQUkw4HPuc!1Gyp!R`ZMMejL3?77%RyRuEk#l8T zxh`9X*TeWrzwKwI`<#32RVDQ=>pVf>nLl_> zCJ2#^&m(3=Mv-XYJqUKZ8ml0NJ~2`-jbf3&47jPM=pt)95vjnibLUQaKW$yz#cHg? zsoP*G3@$K17Djoov9U4n$oMwqA4;aCralGxED**`~rE%Ph6&m>P=ZY-z^q zNRo?(e%CAH4ALajXUB`{b5(rjiVUmT+KS(LW3<@MpRG)Sj0ovR$`}@rQB$gIxw+{4 z1zFhgW6b>UGG5-z(`UeKMg60Cu!E6AM{I0rMn+4)i|~ibB4k3iw4w>gHE6J?ju5EE znp;s^H9v310n?{_XK$bKGBvqo&7e_C?lF#IP>Cx99K-($MPn?Sk+|!h$8YS3Sgj1I zM<|)V0?Hgr64=AwgBw+NAPQ(=S%y?YD&s7>Hh4s!z7TxU)|LTTCKbAWm33+I@an9y?BP&h}+8bvR^ zShsGSYO*2P*y0cAKMi9QjDPEZ1)=(%5odguKXiv}nhZE5A|<8Y)ZBalZR(-1vHW0+ zOM>n46d8AzMXqrMqE=X!5M+LIsxTo2MpoBG~S9@VLJSFc^$iRqi9Dd{P= z9f8=QAaZi4jWn;UeErBTuoFfFX&GahRjH-hw^kF>=R)T&uwd7rH&!PxrHn5A?OGur zHP(IkJg+cUP3VJTF7|%+o#54radTcXQ>d#xMYl>InBU+E^Mdfoi{hE4Vobwl1;n3ahzof!SdjcB?I2Xv1MBXOM{RX~ICksZ z9d#CRe}O6(pBUbSnoS&Ct{m>2@4?U&tp1R&bF^^ff9>x7W2}($EOwj6LS#VLoSIwa z0LNn{+&*LD!+-a@gu#OM&Q4U>m|!F`#P}IIlGpBI*i3ZW4lws5mpDa)7d1JX#~B z(B1m&KGJs(V zUd_X?0{sV-;6J&LdMcJa=u#CiE+rd^Z=;I@9u4oD4h2)vG93ZBW&b!CxCMm?)cdw5 zDJzrmF8~{iz#{n8nYo|6=$osyjZh8(X{;NFHw4mq z1m+1dUpBHU0qI3i0iE7<)=;!ia@XYd~|?LKt+0`1GBd z(76H@8)*tgC&VZ^{s>Srg(@;dp_jJ;jMgm2dNCz93?dH#m&-xxtsspX@N7hPK~zkv z0!$AXn0e$HCJ!rN2fOhRn(_A(X6dt21d*6WrA*5s4tM@b_CR^~$e7g|SK3W?RVmARo3VWn(y@NL_0<{KQ zyZ|mW^i1!ixG+`t#tV!zW}~_hTD;4{;HnVd>4E`VpFe*__qip}_i*VzJ$VTLfg56KrhBb(;ME-60r6a20?(h=oih9-1sjs9(=4Tz}&(K-iPR`hvBWvY__3rY-Z z*hFVke@TFGH#2iDt002ZfWFozkCM{TB3~$tfB35#_KFuF3HV8Ls_1ah&FJ+u7ZIT- zMlT(W9fn`Nuu%s=`a@`fA%cSFr;$QN>EivZ+$S8YbV_r~0K~yyDSA=7)-==x^urLu52wv?42xp;(l87K0j-E+c6`r2C zRcplhHtCnZX)y0#*-0-8u0tA)K1yS6)V+FGGb{?3wX~{L(l&9MfH*JYXyi3M08ztG z_GMD>Xz2DLoQsx{469NfFj>We?{;SmIE`)JIxK?}xa!xEsPyo!)`o-e5e$gv3Oh7A!6j0}V!!(Z4WjWPUMR zCo8;a&5IXTE$g7UfWFokH$9I;3*3JFsQg#8MzxFdth511mhjA1T`A1Yqh!Pr2hk3xT5=u zObG>@+e`8^0H`W_pL_>RQ{Avj=#*hVvyVjNPuMHu9A5hyqrk~Rj+?s`eT7@+#xr~c z(Rv3UgcYrZXm9`we6nQ{EiP=Nxv;e$1TEL z;H#t*ipZTMQkO|Qr68l0>}o>mB_|+HVUNmej+{^3+qc|^KPzEQiKYbUjRLW;97CAD z4VbIUP1%CCxfb@36j^Wk&YgZ-Shy=A-?@bsrhv>UCro^TnL}4VgVy?igrfp{bBSZK z>OuvZ0+R&nz<~UM@vh2ee!N!T%@zILF+b-)l%GJml0Ib=QWJ0-Z9Ca~Fsn)zz^sPD zmdW=&>ETgLaCQq$Az7K<_*S+wjqdQ@rN6L0|0Aj}r}8AHD5!}#eUZXHIy?0>($%cb F{|hCJYm@*0 literal 0 HcmV?d00001