From c0983b09f6fefb2404c3ae9d46b1414c71da7317 Mon Sep 17 00:00:00 2001 From: mbandic Date: Wed, 29 Jan 2025 14:19:09 +0100 Subject: [PATCH] Update config entry and switch to cmake --- .gitignore | 2 ++ .vscode/settings.json | 3 +- CMakeLists.txt | 66 ++++++++++++++++++++++++++++++++++++++++++ example/config.cfg | 1 - lib/config.hpp | 19 +++++++++--- src/config.cpp | 51 ++++++++++++++++++++++++++++++-- test/CMakeLists.txt | 6 ++++ test/compile.sh | 1 - test/test.cpp | 4 +++ test/test.o | Bin 84040 -> 0 bytes 10 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 test/CMakeLists.txt delete mode 100644 test/compile.sh delete mode 100755 test/test.o diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c2ebb7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +*.o \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 498e61b..537750d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,7 @@ "compare": "cpp", "type_traits": "cpp", "iostream": "cpp", - "iosfwd": "cpp" + "iosfwd": "cpp", + "fstream": "cpp" } } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f388765 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.15) +project(config LANGUAGES CXX) + +# Postavi standard za C++ +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Dodaj glavnu biblioteku +add_library(config STATIC + src/config.cpp +) + +# Uključi zaglavlja +target_include_directories(config + PUBLIC + $ + $ +) + + +# # Generiši export fajl za lokalnu upotrebu +# export(TARGETS config +# FILE ${CMAKE_CURRENT_BINARY_DIR}/configTargets.cmake +# NAMESPACE config:: +# ) + +# Generiši configConfig.cmake +# include(CMakePackageConfigHelpers) + +# configure_package_config_file( +# ${CMAKE_CURRENT_SOURCE_DIR}/cmake/configConfig.cmake.in +# ${CMAKE_CURRENT_BINARY_DIR}/configConfig.cmake +# INSTALL_DESTINATION lib/cmake/config +# ) + +# write_basic_package_version_file( +# ${CMAKE_CURRENT_BINARY_DIR}/configConfigVersion.cmake +# VERSION 1.0.0 +# COMPATIBILITY SameMajorVersion +# ) + +# Instalacija za lokalnu upotrebu +install(TARGETS config + EXPORT configTargets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin +) + +install(EXPORT configTargets + FILE configTargets.cmake + NAMESPACE config:: + DESTINATION lib/cmake/config +) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/configConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configConfigVersion.cmake + DESTINATION lib/cmake/config +) + +# Opcionalno dodaj testove +# enable_testing() +# add_subdirectory(test) + +add_subdirectory(test) \ No newline at end of file diff --git a/example/config.cfg b/example/config.cfg index 7a98b7f..60f0602 100644 --- a/example/config.cfg +++ b/example/config.cfg @@ -10,4 +10,3 @@ DinioServer1Port=5000; DinioServer2Port=4048; DinioGetIPURL=http://lab-it.ddns.net/getip/index.php; #ovo ide na više A recorda i više servera pod istim domenom # DinioGetIPURL2=http://ns-hl.ddns.net/getip/index.php; - diff --git a/lib/config.hpp b/lib/config.hpp index 22329f7..3216ff1 100644 --- a/lib/config.hpp +++ b/lib/config.hpp @@ -14,26 +14,27 @@ namespace marcelb { /** * Clears white fields from a string */ -void clearWhiteSpaces(string &a); +static void clearWhiteSpaces(string &a); /** * Removes comments from a string * Returns false if the entire line is a comment, * false if it is not */ -bool clearComments(string &a); +static bool clearComments(string &a); /** * It parses the line of the configuration file, * receives the string line and returns the key, * value pair via reference */ -void parseConfigLine(const string a, string &b, string &c); +static void parseConfigLine(const string a, string &b, string &c); /** * Configuration class - at the level of a single file */ class config { + const string configFilePath; vector necessary; map element; @@ -45,7 +46,12 @@ class config { /** * Internal method for initialization */ - bool init(const string _configFilePath); + bool init(const string _configFilePath); + + /** + * Update config file + */ + void update_file(const string& key); public: @@ -60,6 +66,11 @@ class config { */ string operator[] (const string& key); + /** + * Update config entry + */ + void update(const string& key, const string& value); + /** * Method to print all configuration key value pairs */ diff --git a/src/config.cpp b/src/config.cpp index 0692970..e464be5 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1,8 +1,9 @@ #include "../lib/config.hpp" -marcelb::config::config(const string _configFilePath, const vector _necessary) { - necessary = _necessary; +marcelb::config::config(const string _configFilePath, const vector _necessary): + configFilePath(_configFilePath), necessary(_necessary) { + if(!init(_configFilePath)) { throw string("[ERROR] Init config file "); } @@ -16,6 +17,10 @@ string marcelb::config::operator[](const string& key) { return element[key]; } +void marcelb::config::update(const string& key, const string& value) { + element[key] = value; + update_file(key); +} bool marcelb::config::init(const string _configFilePath) { @@ -63,6 +68,48 @@ bool marcelb::config::isHaveNecessary() { } +void marcelb::config::update_file(const string& key) { + ifstream configFile(configFilePath); + if (!configFile.is_open()) { + throw invalid_argument("[ERROR] Cant open config file for update!"); + } + + vector lines; + string line; + bool update = false; + while (getline(configFile, line)) { + + size_t pos = line.find(key + "="); + if (pos != string::npos) { + + size_t eqPos = line.find("=", pos); + size_t semicolonPos = line.find(";", eqPos); + if (eqPos != string::npos && semicolonPos != string::npos) { + line = key + "=" + element[key] + ";"; + update = true; + } + } + lines.push_back(line); + } + if (!update) { + line = key + "=" + element[key] + ";"; + lines.push_back(line); + } + configFile.close(); + + ofstream configFileOut(configFilePath); + if (!configFileOut.is_open()) { + throw invalid_argument("[ERROR] Cant update config file!"); + } + + for (const string& updatedLine : lines) { + configFileOut << updatedLine << endl; + } + + configFileOut.close(); +} + + void marcelb::clearWhiteSpaces(string &a) { const char whitespaces[] = {' ', '\t'}; for (int i=0; i$h5{4Ok4KvO$5^&#jqD15{enbvo<&|S(8;2M<#<7Oa z7!Fht{&FN~0PIeb1O-QMK5CH4jpde|a2)4TP_<5w%6VNQj*=7wjZ~SYa>;b-qknMu z#J?7-&XZ{c^>U)UI?nHaGbc#Af_gcUP1jwL-gRFr3~(n_3#LG0K1p0u&R9qP;JRM| z1yfm`3MzS0b@Z3b@^r#v6(S2T8nw zs=W(QPRK=)_xLZ1(yDgjcW?X6 z#vdF-d5CW+LwV?;`gq8#^x3$hJVG9aeINHegK*REcMkqu3B6qXQr7I=tXrn79J6-R zOrSik(FYsG;V#s(P`Mla9x&vF-{Fz}V|2mK#Lg$e8? zw?!V~ve`p_nmp?Hrib2c^61wTkNR)*=+~Pb<8rZwoFDV(*JmF1J3aU(`{=`;^ZK5L zoL}&${{s*HAx_u&PxHV}^pO8gJ@8-m=+{rc|8dSvA?^1VmoG4m$6>Wd~_iK2DXAs;q@n28zjF+E^mG69>bU zO|lWxn#GNjV?aW|YS)%#X2jdjq)<3mAM#gImkJ|Qt{su%T>xGtN?vN2l_Ik!-SlJ3 z3ub%wu`tUloMaYdn0`OnD67hE6yg(=&WfAw_-rET>xxS$UjVRe>PBjZkFo{ATv$Cc>gy|ZrDKo>N zl3-P^rZiNN5BX+WS!!y_LMEggDoi&E3TaZskSl9S!=dU>O~j)Vv0NC*hGvRNvT|!G zBTCqqoO@8*nut`VIHqw{d1XzRzZ63ZYZ8=m7|aySpPPXx4FeM_scg*1AX!!g>+8+P zvO1DSc`Ydix(I@t_a(tHGgwtsTMC09sw#m^tHB(MlvaqWQx=CJaNm8%8!YtCgVr7b^jF)xDRk1D%9hA+nuK8U|Txk&u+$7UldA=0KS+#Yc8niZ;?qrx!S^VH*qM3_{ zIuC`aG3_z1HA|(9bj;xRjowtUd6)r_kiURzy_iwqkeF&h^Y(iAw?<{JOQO4T%=%D- zmv*(#?X7u*J;9=0SzlL+^^5eWFp^bT+YpI!UQ8*it*#4(As?yVLP8-}Xk~E*8_WT! zB*#|t6ecWKCB2Wm(fUcHRd&a;g`q68N6Qb5nyO4kRqbNU z%rAwICMpA0PD`3*+=^?KVhu10LiG*RP-Y=WtO_u6S5guY7;-MjU#$*Sk};%(0-D)W z88Kj{;qU>645e4Vv%JDA4^~zgC{!OQD?Rm83e`-e@n2-DgVS}U%_s{NWs5!QO;!C6Fmoiqbn;9G0@`I828A{w`1o!+&Grg z4M$R>AlW$0DxYjbxqcKkmc8;IC?kw)&cCeh4(wPCGW?wW2cv((tL=FXBI4!>fHG2FEy8!%uiXCa`UWuGm+)hQ|O~SGI;%I!MGE4Ues`bp*|GI|n(eOuV_^5{ehKBFe@akC)k^3|}KhlwL2w;e8tZI1N8R!ym8V(>45f4WF&yPtfo=8vaBLAJFh@k_0th!%xuiFVOHOYxqSP z{uB*gq2W)}@O2uVVqEHK((tD%B;axlpQhngYxpxX{2C2UYoWT+BrUe=Ox64ELM*poeEyU=*m8Jz4{kPJz@S^`#nigF2 z-%8U$i~d__T42$CD@_aQ?i~qMnikaEJO1^#>c3B<-?7rPfTI6anifv<-%8VhiT+z@ zS}4(fD@_X|`fsIaVMPC}G%bkezm=wi5dF8(v;d<2R+<(*^xsO;f`|TFX7nBNB>nCvuVx^G@E7_Vm=}5 zccfddkEO42q_1|Q8yx9sM>^z4FLb1f9qBoawBM1Q=15O+q)&IGPjIAEAfgk2=!7aHN0cNdLf*zRi(tb);80 z(pNju4UTlRBOP+27dq0#j`SQy+V4nDbEGFZ(x*GpCpgkaInrYs=|ddpWJmh*)sFGk z(;0uyZGPplK=WS$E4KIM7x^W#F$S#wux5?}m_yWz(LQZd#5YkHGQcEDhxlOox=DqnVTifCALat-_r&_x}st&+aV zplnhI8?jEK4M9Nd!B42VRjT#^m~V@N&gg$++luS4BKZUARA9w(i;z*=PJJ$NXkf)o zh;Cc-Fx0p6eNdFV3|XTR`oA#lpsFGJi%iNMcShe8nVEUjxw`Yfv1I;Xh*7oLdYkNA ztJb*};B+WDMz1w_#&@V}XLO`&N3e_J75@=jhzgLrR3;S{bCCJh7%!?yR^A!C2<~2U zcc7)XyDV_(XrX^8E2lvnchKPo($hfmbI7l%JQ!8(Jjli?0sl+NTQ#*7qorq4l70Xk z&28QqXdP788~RAtdCl+YRVcxKmqtS4K#f4H1FweSBH|2Pggo*f0Go9sw8_+(R-x+Z z(GI-o+i=-cCBZR}6W6~Bl<3!peBCCR(%+nZ>GXvQpHs6Pu6kTtofZ)>r+(6(`e0zeh&() zHP?J~U!b|6H_+nm9f)0{p;qkj1)8spB4aer?C)zQ9a-4{!Jj*QMaNjm(?L^>^H)Iywf=~zB-?!{kEJ44Z^~mv_OmIs zcEqrpj*L)R+i3Q|Xm7(M<4pCH_|Q zr8G_pw9cVa_Y+hBi|(U;qoC+7#!2*dysS#(WYjy9Nepsl^id+y6j6-{f91h}g|7Ml zvO+0Mx6j&{C8t7X^o!kgl@FnC^zZnG=SlQ1!IV&($+(RMMeVUO0yYg+(w+g%v>F;# zi$Bm7(QQVtF++dUa6LST2DRjq&4cQV2sC#EPTm6NG+C(&aH27xk{d|jx$O$6H8H%( zS`4iRq!(kM@==hYG^Q_!0ens+Z=f2V=}8VGV0Mx$2B^5Eg$=5CyIXZY*@XsZp*^5N z3w|WE2h1!)b2Ps@qY`rX9mtp{^0$znqLN`M0)mj8sOc0@ zlQbNZv4Iu0GkT9z&5RMyo&jTyn)+f^8lSKd)b-|KaEnnCQWxyqgv#8eE04>al5CHQ zT56jcdUocbo*wG;3gSr25Y_7!Nj6OVmY|YGknOhwBhaE5ntWIH7!7S}2I1s-)MAf~ z=+TO+`;6FC6&kMfoYr)yyS;%^9WqI^WD+Znsl+UIo_xz#j$$Rb;_6-_@->mWg#{KckpZfV-sRMN!>U>T~>FmN%#Le%R2D=XYm^5;Yn`vkh5 z>hDgugBB#@=#1{da=P+OVHy98XAp#X?;mVv&Uy4`p8JjX3ch6++%GKiUF5{kgC}f z2-d5W-;(rV)#F3iu-nL@Qi}oaI$byy0_>y(M`~VY&Is*ZJck|V?AoFnD8?T+q_bjI zI;oDnh?1|_jyX!#FgQBUUTMH?qdqso-E75(wpx>Qoe%{{BgW6%`FHX&-Mfw10BP$B z>5ouJOm1Qey3o)A!_>Xm-=Bc`yD^WT8`QGUiQhX5S);Y{>q2r+;PYwH0$xaPg}=`y z2xs|w8{Q(5VvUx)eo&iip5}Xt;vwo**jx=Lze}Xb_M?E&Iu?51?Y@c3wiS52(i8%J(Hxp!r$$~KT#U!Zg_rO z4KGuPooCTFQMqS#P|IXss7A5U{S2Gu=)K@T=6NpqGVa;o{(x>{JqETRF(Q$w$AW)4 z8q*meEg{?ixc)SkWJCw7l)aSJ6#fdj@FA0OOfFphOJ2Be5T|Tb6-4=}n0> z1%m1#20sIXxy`>7K27u6Py3LJUV(K0!Lq#Of8;g)HM$i2-gy*tlJYgbO*j)d@|wkn zZKN?@v1u&F4s1=bQ&H7u`8NLOS>R+Mn4jAPChqGRLWOeW954uLXoX^M#mw_C}IvNE8oK4 z$p*iV=CuZ&p!`;YyYMWE8@&0SiqIKdB^!KsiE3~=ra9-k7!~jYm4fJu&VLUIcfM4( zO^WI1qNCfQm1v&=Z6`VC$1**a=~jG98-!1>da2IcLjsWjhxbtwW?$cxB}Wsez7?Am zL9JsoJ|H$R#W;8dm7 zRXu{(8C^+2Z)v4W0f~KrTn1h-Z>I)0b26QmBTaZ`JJh5jGE&4(chnNLb=4xRz8#6N zxHj6;+gU2GK}Y$cG}I5lh0q7*wmW6zW5iACs^wh&c;dHp)p|~j5y{&`>#eIg1Xh^n zabPmgdYj1C+Pa(wiY|AI6gW_r&gisvk)dUk5E)5bH7M4JD``5BI&-rEc`B7q7#O?1 zh@@x;GWxqnD!zJbzQ&7&QUfdghM_&2tOs(R0Wq)aNLjUo0$sMCHp)6>X?WmB{u+`c zz7;MR)rpw3=51fQv&m9>7760tD6B_z*Rud;$u^dAa*`w4BE}!(z^nFGQE{p3pFrZ# z6G-f_em-gBYN1lUX@XgGs$$D3!b)T2UmIw_A0%>;5V?P~N>7sMH9PQp8T|(VnbxRr z@vmo-wi$K>R3z!izyx7@I-|XUNis)KJQ3&Fv{NCGTdb&JRDY|m$xqu^I|wOi?Tp?o zo+HTix0B^}#`Wu>rQ5^4}@7j{rHPTBEZZL@!8LZ^Qh zI&bVe2SVu%v@Rgq(A`qJD^U6eWzmTt86cqdY)MA5&=4lua8zLI^sVskN@($;M7O8| z^cpHM^|_Q=;CnUPo${D}XRPz09IGvkaVziizwbM^)4x@)6z=r*h@0FN?7&OAQ2Q3< z>3A@J*maA4YhZ24W3!Uq7vXDi^hDMzl$Cv5F)@$tfhq9!fK60HY@(vh=p2%bV)L#Q z{;i;+LPXjU8dnUkus?c7Ns=Z42j=r(USp!sv~fY``6*(Y+E|7*5MDp~csQb~{hdS; zTaKrW=L~D9+Ga2$0@j_;c1ln6Z%MhG9M`j;2Ix2i>KfVu&9Crwr8D|V^ayG~LIGZ= z$0=`w5gdl ziHl}A*~l$uxlPQwmPciEHoJ+EUF29Ln-CmV39Jl6r-EZ}znrSQmGH7XO8$(Jr*bO+ zqKH;n^Ak{DeL%I=8C|!H>JTmp>Jd#GESp$Q_59*3*@W!FS=@)OQI3IqXl+0hb_b@* zs;L7c9IpL7ft4MY$F);SGwD8Ng+4)_xT2HCP#!sPM}vjvxl~uIj}MpB>v`70m&+0O zzThDFl1fUFHM&y}=y}#;f$NM;hGaEY{VC7qS(*o|ZTHa~ENkTK5AZYtRw$sj58dsP z@j>gJY)K#T_)y$%>?>21154t1*;&8F3DGw};xX+z=ro{%(VgX;`|K#DNe>Tc_EtG` z!hREa#j`#p9R-p-jKYWNj4pW78pb)K!m+m2+6VAH;UDZ=QLok_tThyXeD^FqW8=U65q- zQ6!|}lz}!os6FunAAUPq&eLfV)hvP#so)HT%K2mi)IQd_J z=H~;?e1eTP9uX34qd>l!!~)%yRpNjjvtS_c{o5MMf@mI zJFb($1A8>-JMvn5s+|(z2Jw~L)=^2Kb`ptt(0C6q!EFB-I~dvImb{ilBV^tM0_L@( zt6X2@>hcnL^O|?qT->i}a+42LvIV;%pV;(Izs#N~WC;SahGT!+HekgoZbLz}yk1K! zNc91#Gx{-gnI0Lp!bpf^S1dT!Asf7&Oj#1MoQmhd8yOjacT$~t7-8S4cKEzh)FR@gPD1xg#skXf`)(2O}9)TDONxIP)9rHS| zfn}sQk;>Zsic8)zM1*(X%G8oigN}A#F4a>$%_54`M?QP8coPrix;!`oTSe$yjJ-zx zVpg>Q@fXz!n`fI#ef{DnsB~B8vsGxr5OJHqVY*Ta=M+JvRx5V< zA!!DMavgr+L$B$6BINEvU!W_or$J~5Y=xlh`ZjpfR}xd7^8YadU{U1}h7Pa+1%_@* zNt{BPaKu^#8q$A)HaFs-HBdMO!d9b5HW=M`E(wUVXYs3~JzQ7IoG8z-*Jvj>8*IpY z&qZr-&;Hk~bnA4z+WM9`$wtiBCOA0Czpa=|9A>Vnz11iKKj@+KiJc zSYCf0-Ac#-K7~7P14g4t6dpLbuR=tck`0XALLbPR6EfU94|xV)v)Gpqnszz)BfgC8S<8*nIJnQx-3P_YPkY)yhMGoO zwNeJ?xxK7O6&Lc<%w#upY!~X5x(x0+qfa6!by;-#7f9M};5&jyLO@ZWa(K-izK(GH z?ABr@Cya+}?hZ$Or+~gJr)Qw7#;K2*7P|<+>0wCPoQ@Gh?AR?%vk2qDX}YjXgFl5n z6lHDAwC$OEjx3u0u4vG*&sie;02=_E5E_JY<8aGy+MV(_Rvf9B*61nsMVPi2>0N?@ zHP1wk(PITMnaLxwY;`AE8dTK6GR6phAVw+<$p|Cv@Fvik>qM_f_vKE8HoDp_=oTd9 z5W%8#Mwf^r)Te<8bkAvq#)-XNxeyAfS+OZyJYuozJjuEOt#3r@>tPiKSY(dVCX!8Q zhHVsHy&u^-qaVWCqX6WsVgtHC?x6%_JmrRIJqy`4f)#;0L6{}f(iu$`wbAOjmgYQd zB(_Bh5ejzMiceAH-xIQU7KeDZpefolY=QcrnJu1KcBlDnWnhAhzMe~h|UH? z@)^mX+Arpc!eE(r9HDsOqpT6G8Eny1lZSvc@ni|kBIRhXgLto|NDod3kn|&`*;2vt z%vi|?qe7c*YV{WCS8H)Q^5D;s-h*OnI8Tk}dyMqnf??V*U*K)&T`sJZV-#C)xR&A( z;(3=?Ok)Lj3>DG@XbtahwteoyJ5Cg12451Y21ZzPwYwn-x%qmHbP_6MkLYI~3AI`T zlo<0#6!B7WJ6V$($wb$vpHo#Vx19?iG!iWSETLVgsoc)99r|`3O7A>Ls~%Oyh`dcJ z4bOvivZKTc7C3;t`*+kK7w^q=wT3eMloh$v|1mEd4~yz!9e}$~t!CS#?a9IH--6i> zrGi>C&lwO$po8ZPGa(7&>Wuc2+D`SiM-W^S$JT{VP54#PF11mn^I(X?S|R4tl{i7` zoY<@V+eD46fe{Gw;~s6dG_;}YN1Lhd~JStyp!!~Hu}nwuV=Np$kv z6o~FuTTpz(rkvO($@YrQ7MvVZZ9yOd991i~$5E-JP(gc%ODvN#el?S z@S)j0G}{Z=!(`K+JlDlWt;fAd<NH!714@9$*9)#PDd!ILn1U7j`I6cDrCD3k~9 z6p%$hos|TcHkoMhuo@T@RlbWV5h8jf<~Zp9kBHsB!Fu;q)U63ri2|OcJvOvHWkX8c zkP=M2@S~xJ`XQ!`B81IOlXzme6CCdO5Yy*~t4o=aW{a-%U?&}Y4+==C0c##TxRXSJ z#t|>2+t@kDoklE5J9j#e)IowUBc6G%#&21 zu)^K!j4pbkzyB$$2?li{3VWy97At0-9y5B71@?WI>(rIaPcK60=;bd6{@SUUKfqdR zf!tq;B+g4oqy_>(3-O@(INVbs;&YIX19*Etz5K+}g2vI;ls~u@^KFeoYmpsjJmaP9 zX|umgrFRMa^|x>KKbWxdLSWlK#SkxCEAR0P4?N0Mc@4*O%W+_7wg188S3hWo7s*fr zN6h|+CscS>mMZ9s-hdQ0(}o4R;cf_#d=^X+Fkz(W(amomqMNgLPjK9E> zDy%=pvfo3iNEaK}cPW%Wx(MHB=hd=IXLN^HTLk-P3|=@MSIG$q_SFR4;9YC0UaQjw z&^-td$>!#rKEOYoL8D&wMn8D%HsWCV-}Jo5+P$KaV&u2!*x0?au2<5T`i5Y^J(BGc z+G#Ca6nuc7^x8?iu%NkVnYDP50*aF+oze9utLgDxt_D*ucESj}Ni5jA))vGv`ALsS zMv`;gOu57fSE(u}Ds*Zp@L1a(BGzrQ@yDlVC}?%IR*J_E)`|YQ!!{e+aL;BV$#dki zSsc%TIa-Lw+PguD>B_k3Q&k?~!16+(=VxtDcnn4>`d}NUQFLg~#W+Qt)-4KIgt2G_ z>eGNFM5@sway!JsvK|`u6Gc+&if-$WN^5heR!QhoYrYRP^vQ>TTKL4WbS-!vNps5_ zN;behx)jc+tuyK=F>#9lg})$H88}JE<~()#Z&+Y>tbFP=;Ww~6j#IZgkb_U%Wzy?p2(*&>Kc3EI4g~q6eWcq@$Ms*Lt5FlkQ`sdh)6dY zrrG1Rr;3mLvK70G5uw_P<%JJKSi?DR?D|Maprsz~4BRWPL~PgSoq=C~r)b~fGz=8O ziaDu`eI2NJG)t`pG2WmM+6P!2wVZ0!Er4RTW7f67OW)`g-|rS@%RuUkZoxYjknnoC zf0^!^DUt}C7Y#I_M|rK)G=0}nj;BQKg{b)Lr*p_*oC*VL&)ro(Ip^-_$iZ{B@z@gZJS&mG)RB&W9_IU@i#Wq~6#s73{>R`lm`O$2d5MvZt z7Sc*14C^V#D+ZaKBFIyW^V>y#5X-|8a7gDw8aRiepaxIa+Ri9ur)G!HUaGKK@laVp zh_*PYy;u(Rkl@Op5+`houb z9Nc&RvcJCqun%xKVD_W^{SyF>eXPHK0pesSw0PrNgdxBYha1K8wE z_W}C=hhxY>mjz;wV{0rLSj1J(hafgs`W&fPVpe1n?8UR{>3gw?72@6mT3)ksgAO{@H-10bUAt4&YUQivZUF zUJv*r;FEw`0p9@p3^4C`$Q}B0IbZY}EHMr2!8{_^t_XEZ|ze34rZ@Gv4U$ z?*S}%6Yb&~oXY{n1O50&V~thv(9p04o5u1GWPu;TxZqybV1Cyc;kN@FT!F!1K02PXHr; zZGg`Kz6#g}_#xo2J^lTo$3mY0vjA%VivZUFMgTVht_6$&wgaa91^ouR2GGE_Lth5; z0lp2G132Sd@C{fBxDs$J;0D0Q0XG4@0Jt4+>UPY}Bashq0$>AR0PtPFD!{StVSWKt z0JZ@x1?&Rc0Qe!`%YdW50UHOH1-Kiq2r%h=@C``s*sTSmcbK09Tn@Mu@NyiT#!s9X zs{wt0zX8kvd>e2PU_an;z;x^h)&qtCI{;q*>;ZfW&^QWui-VOu!0~`NfE|DpfUg0r z2D}B)yZZs#0AB>$3b+gK3GA`Q9*tj5KqxUA&%z%XDD;1hrmz;3`>0qOfvj{u$x z_$uIqfFA1{eWc2Y4&sX23@PZ$?D72XF(RalBzX2IvFq z2FwAZub?dgyclpL;8MU1fVTl|0(=;7J0M+{rs7JtvcO1aN=^92sDnnVNsxF9sWAd; zMCbac)v~>dRt$df-ZLJ0U0nn>;dSaPX zp5D{=%%d;FM;rc#{v2S^%^ENM6~huAwc8;#b?w96GVu*Ur*_7I4=Vo*zuqCh|-|9*bTj z>BR3A)DZ#Q518~*tq#a#*pvj3k;Z2%#_*O$@g|&J&v|w`^gGbs9)!LC^f2gdeG%i& z^i%ZugR*`faP+;Vt5E(z+$SBc@tGK~czhCd+>1O|D($}J**tCqeLd(?bvpWa1+owi zpMm~3=x(y|fj%w?YYFHNJIW{i%x)tGc`kdbzaMUb%|otDUj%wS=xI7VWYd>(c`rGw zXZq!O`9vuw>O%+U8&N;ZzukVZU4IYgcZ2R_Q;cNTSJ2@W+U5Orc^~N4gN_lf=@;7c z9MD&S4qIT;t8Mxs(C-92W(?|V`f|`80o{wg^`PGix)*;Ppsxkpt^Yo-)C2nMpnq5A zk8Hp)n};Mkr~L$Zrs#QUZ2EZ65Brt7p3oS~0{ukL-E^7g^aJDRpnJ`wm7pI3x|a+# zfIemr`XNH+dQT6n?Qd8bkF{S-VOQ;y?y8aiO2`sR>+SC%p+TMD>y8!i{!4sn}P)j(lGBj80Gf z4s3m*nx4#DTCqehp#Wv74gYKn^U7&Y^?k496Xp`jh8t6+% z4m;sVDLLdyA0^SWc^NknWB0gwT{LEAgMK9FUSoDC=%;{wyx!MK?E0?)Jq>g(yN;z`iY8HBzS^kX*m_s`ecPm~TN@&6g<#h_!$Wy>Mo=5HKg9Y;Uc-+!`Bm(y10 z^x2?K0R3E@-e{M<6m*J(cLBE;m`3C|Ls-6IRrsatuBjpQneh=F|@_g0%!7u$Bq(}6tOk*Cv{ z=W*E{^=~`!d>1jZXY@RY?H1o#!Ow)J`}^r5Zb^$B{M;z{p?Xe3?5PC(J5{fz#BL`K z^cv95(&=HFUIltH=w9pK4WKu9&`G}cgI)ppk?`9rdCb0XSZmS^$t#8r8&10mA4snv z-zC4rz6<@a@jKahfPR`z zFSY4SpqGJutWIBG)7OGt4*E$t{W6>04tfpfBp0iF)-mG08}u;fUURRH>0VO%nZ!$Ch??}OZ~8`KAqlMnP$aG!K7CZCdb(3aB;sN+QBahnq~W+bNx zpr40%opi2NhqULDX?7DYucDsw5NpoIz12>l9DAaF2zuin^wCiIyFrHv+2wif>jP>O z%HIxp8Sax_hjCSXVIxm%EI=KvA&*;Mh~5PH>!5p$*ILkb4N|@x^uL1+V7JfvP9IR+ zAZ!D@MyCroB?>D-JbZ>cCqM7)YmLL?oCvyC8)t)l0_cOau?Tr;k;ko{#3#k?SAss+ z{Mmp!ZOG#_9_zs1k3c6|n=~7XnHmqx-bPW!M&u#=v*?=cjetx15a@1wC0R`XeZwI1 z0O+@S(0wRh0s3mtuf@I9z8sHQngNvO2ISd}JR9}(jn=I@X=Ri9h&JS@c)7p7P_HLZ z1_7y#F3{J3{x_X2+j)a3p}u^GJSBK`;jjop$gV1^sQ@C(YA%wfv^U=apWJ!eV|Wo}tCe#YAcNNUrn@>3Pu6 zq|L7upQdL^9fQ!TKz|H$ufE&>`Xiv{==Cp^vhV?SKj^Q5PG2n6R0>DvCb4)nF4yUCDr zs{;Jp2zop2lYWiBgsxln+Im6H+m3$KTgSUWPaTBb2YMptUUP6PHie@>FW38#C>>nt zXEx}UfF85=gZ@*vUeE%@n&`>JL4KJpNDK@}}pLM}Y37R~4Y2 z1G<;)uLk{W(7oij5%fzz_mbxp&=-O3CC@16#h_oT_ffN%Bk)M##zE*4K<@;_6Mv^AhrS>BCykUl@em z4*Kr~p?8Dc3A&d)^nw1zHt*Qb*rRa1;g{~QAq;`h-=A>ioa8r#8!Hl$pB-*Io{)Sm z?h}*$nru9jn2f0W9}<%{CL1>;CEs_D@nBN&_YN|)Bqe`3-1ulXLX;?d=tPX@H`7`Y zj138xzQ7z@pM0h9Jx&lpv~$-92}fR9ilARY@^=yw{z>HTCyxASqVZ@VZbcsEM-=J5 zYfQo+XD5F%p<(2;#?6#lW|(QS_y+bCUhWWip*o57?aG$M0#ZBgT;>WeMQx35)P^MmKR=vJ2=r$PNLK z% z1k;zZAel|8ec?ACkIMIHzw95f3)B~!jxwYDoK}4Ha=L`+|KYTf12;c(;C}b2(tQ%2 z!!V!WB8GJgmor?$a6Q8|h8+yM81^viWoR60h>Omt(dA>9&M=2zKEp)}>liL)xQ5|+ zhHVTx7dIq;qm~ zr81=Ra&)CLq;qq0}EEe})Gn8GDSh!udq573wRru8+{}G0=a|(YCZru7y;-z*kbhP_4 z@Kpajr^*`UOJMwy@yd=XyE+U49jyKWkNTJLI-u%56!lQMYJE`kd&&PQoSV19-}R3iBh*G@uNf-68yZ=3lMTBd|)j)w3LU%3pVdY*6g6aeELZHsKS`miRLy zF!C8+$MsKU{I3|lxl$r(7@v)Wo$7JQ|7OO2N)r~B;;o1AkFY%RB-xk-pCeGNW4WUk2W--EnZ3sNGLk0GV9> zO2*G}@Uw~WD;fU~=Rf06sz25E+AN89hVjdRr}|S^e@Gsh-4zGNY2uHH`lu%T2^!kmZ=e zWd6~tCo2EX82`~6S&x!`GK5U^ck#He8W{zQzh$b-ACkbB0lo1-4&vZ3;|M&=`P&@h zdn61Z)t}D#b}W~MDh7&#s?Njyc)++7%u8pYP!VJIb*tB0RG2l`RB|(qmB1C z|E(-Y#oHxcbLVp@@Kk@aT-Lip0^?=I=g*UfpD?}*9XXEgb#N{4sx2M=q6dDPs3+C9 z<_wuz$+Hnlj$1wV15bROSSItU`7#Oykno4hm-rfP{Bp+skTY^K#&wLpc(Kfw#`zPW zYE;kLyk78hGQI$v=F#IP$&7RspROFve+SPORtw|Dz`ODPTh9M0mb1z~9vdsS{BwaP zem*Ud?M;%v_<-@}7V=DOlXxt<;_Bu6S(nSSlK-^vvVMaHkcZQ_k@4lMfM;<%C!8Sjk7c{6 z~xCCc6x;Xz!Jb%$0arH5N9ozG38UNY@S$`%gpc)tBWcPj@1w8RH z>Oxt8nnzWPzkuyFvuk{t@wc%3Q8w_ejIXPZ^_S>Mz+ z9tVR-?K=Ij62@P~dj10Qb36n{`M<|@L-7`7d?VX87OU|G#=pZ8RL#@r>9U?SmIJ1V zxE=;x)yXIUhQYv6yE7^!_F^WsGT!MQ{)O?ocwBNg|IwN5_1_LW)&E2AOV>0Bj4=}> z-s$I*08i`4Ez@O2I;%?8)trAa%Nf&0TJ{8XZ%REZ%S^{C(Ha!zwXD3Uj%)j3ua$jI~d;qxzcr^1jad2q#RzJAraqZ zd>Qb>kJGPvf$@<=GUMBv{})(qDF2hp=Q_q81-X)(+j$+t=2=|hF`p^_^^hN3iqDmd z&z~#tn9kyQjq&$#epYMaykc2@7Y~#guQ2qR>OW@66l31H>FxJD z@b>{v^*h(Kk5e0-i_6CazZCRar&}a5v|_hTB!+atIWF>Y2~; zB83Z;G2Xeq=w$qb&^x+RTXSaG_mU$2{Q>Y)|L_8t=4omC%_IN$vt<6)*ghY}mE8xt zYD=$wGv~jiTw=#Faf%=L6GzdeE#{gAJn{233sQ~C?MPwHtyRqU#6=jM30P!aMiB3mCs0^NcPve>XAyUS@>ZGREi1 zdYt?Hn;3ug6|x@H$IltRiRG;DH(wy@F)ot%l|GD}E%D`SpB4Tl#+R}_)W~AS8F}vV z{1))k-wO86p-$pD2I~#sopFP21Fv}FtOERr^M8c(gswv+Fc!>}^*HTnJL6N?F0r{W z-eCOq9P@7GJok352A=qI?qB}M_`8`Om}_xOg`ORT_-#&`OsBFw%mbe4S;Gs_$((-^ zR?1 z%&+wDdd7c~?g+@pof9>B^A6=wZBbojS4Fo&RaT3;v-mbmfSD;a@TS zG`0h(-8UHjJm+uc{LMA89;ZFr&iHa>FopA)c20WPFh8S9T^?FY`P17wwEc0_#6rO0T9yWPay*QN;Lr=g9mgNnqT~_&+dy zJmWuP{I^-(4rl!34YK}AIsa*lf1dH@GU6P@?__*iKq68Ye{rL%=O?f$bd8a~cma4H z-|OHF&VL%$uk7c$jBmJ1=2r7!#!~lsE(MgU3d|r^%B=b+;apCD< zG&A10zVt9Yo9)ckL@Rjrd6~ODGyzZi+{N}v$+^cP|H)U%{1;4=6|4L=Grpbm{0MG$ z+_z+Y=X|UOUX|sn0^Gs*=btUH(-g6=G#trDt2InBSW;<5g7_e1I8q;JC@)VdHOfNa z(BjJaNGNPZs?E}>+L};3a+cMai>qo&f>mZ2zA#yD1{<328B6-GWh7LVmhPUzEU&Do zG=t%AaG4pZiG-IK7$iqdS#_yo}V{w#`HWCX(%ysP4QVy z`PEBVdo0-VG2=M_w!<2U_t zXPG8a=g%!R{Q*V>W)&Fbtc&MPpOZV&Vtd|s=N0;k%%bTt^86@q$=un6ktwEG+SHVh zk&&r?V>7q3Fp`l`S`oy^g@cum`rJ}K8ZPzwr_e|R!y$jc?7}QF=ls0f88a6wFel#Wf8=7?4R#ZMYf=S_$0^LP>M;XUD~Z+ratDLjFc6sf@|^?rCi)wV>n-KI3W0 z@6Sjt3vq229H>Y>`dH2FWSaBE=Uhz;awx6_NPZ+Us4zx;vXEI}B-<<~0q3DO>vRkV zbS~X23{`>EjQU7!VK#=%F@!+*Gcxc&+p17`q`I~~B1H*B&X`P7T1;Trn<|){xcceO zqA%R40XlH~t80ir385C zNxGl@(9Gm8>aDFdgQcag5!OtnHO!9{LY9eh-sh9*`is)dBC~LoSvXV97P6nSGX0IZ z(X{60ELv)6m(gMi$#(oq|x1W6EmDy3y8W0JCN%JvkQ z{)|awmE}A#rWlmMi6;F&sKCU)O<5d@R8`i5yw{EbG&)f(GvFm03RdT0HA=@UpCXjQ zV=clu1JhHK0g>vWv(_87>hTDPOxny$s5LFA7eGzX&y2dtP-$psWqrv0YPK1%r@*W_ z$jM(g!_2(^x8R=i7LD&C8>AVQHVl=u&ae!BCHyN)Y|D0Q%iYA9&{ES{h%ng)*qeRo z8%+g&wzV`>=g%Jceri1f`hkQENy2Hj>jFlz8$wGh^Rlw2} z)&=3j#4W>p(H{)#B;E`_L3uY|c~kbDE1uyM`&{U_hs!4gzK_f9%nY^qlf8itKwbbG z73J{C)xH24B9?n{Lc|J_TT>QlGTAF$P%j+;f8hnlMyX6PEs{aYS&eHyV)+#iGfgBk z{$=(^+1MiKD-P{`hjv+~7=+(4K>Oq&kP{|c6S?AgyC(4{k*n*mU!w|2C|W<GAK>Bi2z|~MGnHO(`V$G8EF%xnx>ohRV5jp zj%#JXrWc0S-q3{F|mYSn>lpztnp>WC`ZH5TU$~iBBmzehFfh!>i zg#RfvACexInVFWEHc2wPx4I#hnt`!vh_WhFGqC;xvVLo8H5sQ|Y)|q^GW;TbBowkR zGL^TGwFu5bbsf=qe+@#TF7D}m@zJWQmF=9UB4-ri3yMfqT>Ecw{otBID-lZLow)LR z`C*FM&Z6(GVRYba14^OPeRM{pV%mX>0)&7#zAk-G4>z?CJ|n!$0zgEv#3<7G%QFsK zX2r-XLkcaf9XZV!CAR4@_$MZh3ci@3rqWOyJ@bZ97YB6!nKV~6s~WF!_L4{gbHGr@5QO!KF7k0T!%hyOW(dp?<=0&F>HuPAJ9 z)|WG9@wfsW9LQRA8Dy_hJE&mRRkX z2HSMIm@3}P)3YV0T?PX5Fmx0XhUqV>uQl=0gJo4AVfD0*y6M0^3fz9U>aVNvSBat4 zJl;406qax_#vLOR56`g=`|@Ed$q-?zW5fJ$RgFSl_Q}9hGBKF4gFH%+ieX1GhS+IG z$jOQkB2cPtI#tVCSy7EXm=9*ITIm~~Ma9?quW zI7CyESr-b|*OKQQS!OokXbwH-+IKVWp9imwDuYahV!tslR8yvQ%?D&!X`W_`yRJe( zg^~Rlank$0x7rHU=a}`_Z%fb2@A4djW~Lq5t--GZQ_SAO-F0|$Mf2y=fd% z$zlsE{Cu?oCM!}|lUt2ZfcKwC|FaR*?9UMFbSbny6=KFOgx5vF(y-bB!3mFjR(Q?R z_KRn9CK(3jp*wjv#E*TBLou;g6tP9uH1s9V};iRWH`U4YH zx!8JMe?U|nLNalx%b!o4gT;Y;CPfVghB4z>2I(xOe6k)JJF_0=TcZ${zA4G81E`Sj zmwA?#kx^Bnd4QtEeQXM~58#<&WM}8<) z{ftSl@Z#)>8I0gaeHqq7@g#qc7+idIpX#MKDuY%cE~!P+bce%b4T!Hvds_jSk#9x% z=&!3&n}of!4pSg2Iv(QBkBL}Xc7X<1EE{p2GL2{TLhMBa0%w@w1Pj^rAq=%3&cTo0 z_8i~N6!C3o-{FvDAiT}Gn(<}M(qz@vg=*l|3?>JJ&*iBfbaJAZTU&3=L!oK}_Vq1? zH6#bbRNK!a_Vrkb2y979?|AMpsV)pJR18gFq$Wh}@BXph*lF-?2#!%xWyJDr<)gR4 zNR{i8Cpk*mS>M_LXMG15XFMW-t?)kVJB0cTsqr~m+Ox|8b*%Cv)0m}spBKZ@DyTO{ zJ+uXFKU+NctW(BXgl!n?nE9S8@nDm4!1G6IuBx?)Ld7t|WVGm_GadABSGWgaMys=9 zL$raRH&x<4Jusc#%P}h|@d}%ALxlW>>R`4q6pp!#$a{St*ch6N6X^Bz!SFKGh5Z^n zvL$suj3(xxc35LycJ+;Jn-)B>vbOc`Z4iudi89kmA$}|?OcRTFe4$kB)en9IyZ=<& zR!ud_;+mrzd%}5hoXAxgcR*BujxEab)E*-#{a@JTKnRDkMD&f$Z4T}^co`=#=um#S zqZ0F5kEHKsd#FEfCZ&NvoJFBMbWtp=;KvbwqjRb11sb)emeQg2N#?*u=`~AZBDo|u zZQc2AY@}@MJRrKnvG=m7{Kjf6#GEFAAP&2mMF$Sz3LBGL;Vta#hGH__AckAy`q}^n z*%BDu0o$u^dmQs09+kG*L2CJ>@Kh$oyh~?!)k8Y-GI-{J>7lS+@;zeVGm{8ito#tg zVfR_cYV|)rFVMyW7M(FZ>-4Alsj4{o4sTCCH6;%#=*Gxl<|gx#DA+WI)tXFkUxZ~t zWoC7#x}>3e2#$1-^Fgth1G?^M4|E~mJ#V+=aWX5MDt6o?E8%sM-PO0mg0O!dKq^!3 zy~4z$H@0Isl-s`8W8ZR@0D}?x)}XGR`(u-)ul}_3$NxbF6`G0}b2ivmnfBpLaJgqi z@J?+Y_jZ+oLtQB2V)QAAdaNv%)9|)*?X;H`rzP6wJ$LLgEP6^;dWBh9afMkPtgN!4 z8T6oTPoo`=_S%cuz!)UC8))_by--2VLghOZA`Xk!Af<`;QlUC>tMu^`-Ed!R2MP0d z9|M$USjBTsb%eEO4h}uaubfbb({hgDili&^x|a`Oa4r>F6U2$|rXAt}H4)k=E@=>- zM2O@0GwhAqNo*{>sLY-S&i6iI_p%2>5cIf|KE5&70WvH@@yr;0kx9N!s4XS?W7(gK z;j|uZ3+q2rp&ju8i#l=b=M&;X;ooBBfzds@U#q{VvOnbZf5KhLq%XkGJ3@02{Z}uV z)UpeQHSd5-jBND<7U@Z9`upG5Z1Zjx3gYq##-5h9xD2(nzUj`4^Q5|biNiXozV};Y zZ0qLXser!bSU$r68EEn3l#jrRXrG+Auyu6PKcRe{5#TfF|f6iTofJJuDb_0%f0lLhB7GR6fZ%)L4ONVkk_} zM?9kssfTOU_mAQWFAnyWEf#X?n@1Es+QZ9SrHv)AUY9ik_W3X_y>Arr&IP$xL%H3e z^QGFS$;iKxZ!6$zTmwH;lwXjO^JTw2>TsT=VO`tLyJNY>EGmr0DI%f75n#;1dCoF_ zX-o{*QkuQp$Kmxg1O#zva<&W&%7HpC#@BX^V@_JD2*d$e{K=hEhtTz1U3?Ko9G0Q| z8FmP;f^^!K1a3PNbOJLTRnk^$?NrQ{IDjeNGTYCG*kfa0L*X!Ei-qt*MF_io+HljE zNPjgJ7;%hB|5Ad-QOLmzxb~R@GMIZ8vJ>$-aY9C%I*{jw59Fkx&21UZ!0y4Ffrf)i zr{wGzIRuaH#ap%zjn~HlXXy*)-aC`d=mncZ7}))~>^SxY_C$&sMlfc7Oqj9%ZR-1i-V^}5~xa;|JcH(<+V8-PKgru)2UL@QXbJwvuM z+#ny231WY)7%JlR?S%NeMfix;scrEJl74C%t?kW8s<;9N^t}Uh#CfJEj-w9QE2G(^ zL3}h1ueHi(T^u_s^_V*5X^8Dl91v}wCtlU|ci##lp(UP*yU(*io)0dmuh;z7_yhkU zl;t>{Qi#PGxzXP@ah9UWH}&H4&N)6 z&m!1M(Vh+BebM?oKF{O#xiG+!)LV`G4q|S+kJ0>%1^hn$e}8=JZ^O_@??(0`!3WMG z=5x6EfQ*yvDIAdI#e2*8dwd@5sz)foe(UeRaBuJNW1?=hP={jw1rt|@x2T&;@e>Rx zP=gg2k*?+%9f&qk_>3oma z${@hw^0h&iFM$l$?6@9h*k>05?0HNGY1xKC>-4yz{`CC6@zfTI4Tnu>yfBZn<id zhH7;xs&hOi9~$-7T&=zOh{bgKBNlPE-ji?;hdg(eXTtgj?vL{ij&mc}1gZCy)Z>5r zI1(L8-IpI=kH<9Wpw}H@yk7c({{?6bp$_^GH*5fMxPG}X&iy9scjbWv``w+rKHHDa*g2k-3EMhY zkjTTxiElCJuh!Cbf!?l_*3Uhv7}qN1&$g_Pw(joD7Jq*)TKemQ`P#eBx%3@G$D-*l z-Em1ou8i^xTx~rbimGKiE4PTAi>qJA!x=~VeY~Pz$-qw?4n>>x__}ShB}c_IOYzXy zEC|&%RO6-UnKSXTZt|O7^y0PKW*N47f5zQ#mWkgCgjb?|>&s~r_GyFeG-5+!bBEY3 zrbQe-SG5=+2}CXAZ=B&U4u$80*NFH3y+3P>F70b1+WLj0{q-9OdwU>(1R_5IwECxSeDzF@qL=z^j#GDvnb9NPF09|;G0-O`2{Wnz6!B9SsGkcZ-$mM z1gkhCudTXnLXKww+G?OhhWSH9=HhAu-sGp;$f2MYM+@m@fRD+a=#Gm42%J4k{;C_f z0bWkP0h*(k^w5V&T za{6TiBdvZ}btG5<7zs;Qq3*9P50x5e_}USY;)AGZ;ac&taA~0m{)zF5GSsG0Xr>e&s1?7efM1cJy_=|2{`$DA zL)}w7#0IJqEC;JA(Uzr zK*d#M6n0=I17`IA)6!tyb=;eEElN1F@6=Ph$+5X4CABsOUOkMZMj9qt0 zsPtT>?DiEO!_at&RzAw*qg-C)^D3W$^2EPtzn9DRa(U-?JL?;V!ZdeOdE!+r#>Kx8L2;%u$PG1rOGRK0_b{qqm47Km(WXos>)MQnCepe=WzM4 zs=TB99958EI=7$hz^n47I`FDG9XeD*lnAVs1uKq|@ECxv<4^Tl^^45B;$7yH|F%6V e;kc`Gtdy0GISdK6@-LnvIh?8(