From b8d227099607ab18e1435e78de2802ab65790232 Mon Sep 17 00:00:00 2001 From: weirdbeardgame Date: Sat, 26 Sep 2026 21:52:09 -0500 Subject: [PATCH] Added fileCommon, added freebie font, start listening to SDL Keyboard text input --- CMakeLists.txt | 4 +- Common/fileCommon.cpp | 44 ++++++++ Common/fileCommon.h | 14 +++ Engine/CMakeLists.txt | 2 +- Engine/src/CommandParser.cpp | 54 +++++----- Engine/src/game.cpp | 28 ++--- Resources/Pixelzone-E4MV4.ttf | Bin 0 -> 139948 bytes Resources/Rooms.json | 186 +++++++++++++++++----------------- main.cpp | 112 ++++++++++---------- ui/window.cpp | 40 ++++++++ ui/window.h | 22 ++++ 11 files changed, 312 insertions(+), 194 deletions(-) create mode 100644 Common/fileCommon.cpp create mode 100644 Common/fileCommon.h create mode 100644 Resources/Pixelzone-E4MV4.ttf create mode 100644 ui/window.cpp create mode 100644 ui/window.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d9b1ab..7040175 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 4.2) project(Text-Adventure) -set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) +set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ui/window.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Common/fileCommon.cpp) find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3-shared) find_package(SDL3_ttf REQUIRED) @@ -16,4 +16,4 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Editor) #add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/) target_link_libraries(Text-Adventure PUBLIC Engine SDL3::SDL3 SDL3_ttf::SDL3_ttf) -target_include_directories(Text-Adventure PUBLIC ${CMAKE_SOURCE_DIR}/Extern) +target_include_directories(Text-Adventure PUBLIC ${CMAKE_SOURCE_DIR}/Extern ${CMAKE_SOURCE_DIR}/ui ${CMAKE_SOURCE_DIR}/Common) diff --git a/Common/fileCommon.cpp b/Common/fileCommon.cpp new file mode 100644 index 0000000..ccf66c7 --- /dev/null +++ b/Common/fileCommon.cpp @@ -0,0 +1,44 @@ +#include "fileCommon.h" +#include "json.hpp" + + +bool OpenFile(fs::path path) { + path = fs::absolute(path); + + if (!fs::exists(path)) { + printf("File Read error! Could not find file at: \n"); + printf("%s\n", path.c_str()); + return false; + } + + stream.open(absolute(path)); + if (!stream) { + printf("Error opening stream \n"); + return false; + } + + return true; +} + + +nlohmann::json GetData() { + if (!stream) { + printf("Open the file first! \n"); + return nlohmann::json(); + } + + return nlohmann::json::parse(stream); +} + +bool SaveJsonFile(fs::path path, nlohmann::json j) { + + if (stream) { + printf("Stream open for reading! Please close stream before saving \n"); + return false; + } + + stream.open(absolute(path), std::fstream::in | std::fstream::out | std::fstream::app); + stream << std::setw(4) << j << std::endl; + + stream.close(); +} diff --git a/Common/fileCommon.h b/Common/fileCommon.h new file mode 100644 index 0000000..b801893 --- /dev/null +++ b/Common/fileCommon.h @@ -0,0 +1,14 @@ +#include +#include +#include "json.hpp" + +namespace fs = std::filesystem; + +static std::fstream stream; + +extern bool OpenFile(fs::path path); +extern nlohmann::json GetData(); +/// Note we have a specific function for json for pretty printing purpose +bool SaveJsonFile(fs::path path, nlohmann::json j); +// bool SaveFile(fs::path path, void *dataToSave); // Leaving it commented out until later +inline void CloseFileStream() { stream.close(); } diff --git a/Engine/CMakeLists.txt b/Engine/CMakeLists.txt index 0310a87..df6afe7 100644 --- a/Engine/CMakeLists.txt +++ b/Engine/CMakeLists.txt @@ -12,4 +12,4 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/room.cpp add_library(Engine SHARED ${SOURCES}) target_include_directories(Engine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/headers) -target_include_directories(Engine PUBLIC ${CMAKE_SOURCE_DIR}/Extern) +target_include_directories(Engine PUBLIC ${CMAKE_SOURCE_DIR}/Extern ${CMAKE_SOURCE_DIR}/Common) diff --git a/Engine/src/CommandParser.cpp b/Engine/src/CommandParser.cpp index 7865c47..8462223 100644 --- a/Engine/src/CommandParser.cpp +++ b/Engine/src/CommandParser.cpp @@ -50,39 +50,39 @@ int CommandParser::Parse() { FUNCTION toRun; - printf("Please Enter a command \n"); - printf("> "); - getline(std::cin, cmd); - std::cin.clear(); - cmd[0] = toupper(cmd[0]); - std::stringstream c(cmd); + /* + printf("Please Enter a command \n"); + printf("> "); - verbs = Verb(c); - nouns = Noun(c); + cmd[0] = toupper(cmd[0]); + std::stringstream c(cmd); - for (const auto &verb: verbs) { - if (!commands[verb]) { - CommandUnrecognized(); - break; + verbs = Verb(c); + nouns = Noun(c); + + for (const auto &verb: verbs) { + if (!commands[verb]) { + CommandUnrecognized(); + break; + } + + for (const auto &n: nouns) { + noun = n; + } + + toRun = commands[verb]; } - for (const auto &n: nouns) { - noun = n; + if (toRun) { + toRun(noun); } - - toRun = commands[verb]; - } + cmd.clear(); + word.clear(); + verbs.clear(); + nouns.clear(); + c.clear(); - if (toRun) { - toRun(noun); - } - cmd.clear(); - word.clear(); - verbs.clear(); - nouns.clear(); - c.clear(); - - toRun = nullptr; + toRun = nullptr;*/ return 0; } diff --git a/Engine/src/game.cpp b/Engine/src/game.cpp index 5636a3f..683cce3 100644 --- a/Engine/src/game.cpp +++ b/Engine/src/game.cpp @@ -1,7 +1,7 @@ #include "game.h" #include #include -#include +#include "fileCommon.h" #include "player.h" std::vector> rooms; @@ -21,38 +21,30 @@ bool Game::Init() { rooms[i].resize(MAP_WIDTH); } - filePath = fs::absolute(filePath); - - if (!fs::exists(filePath)) { - printf("File Read error! Could not find Json at: \n"); - printf("%s", filePath.c_str()); - isActive = false; - return false; - } - - - // Read rooms into buffer - stream.open(absolute(filePath)); - json = nlohmann::json::parse(stream); + isActive = OpenFile(filePath); + json = GetData(); + isActive = (json != NULL); rooms = json.get>>(); player.Init(); - parser = CommandParser(); + CloseFileStream(); // We're done with it. Let's make sure it's closed! + + parser = CommandParser(); parser.AddCommand("Exit", Quit); parser.AddCommand("Move", Move); parser.AddCommand("Look", Look); ChangeRoom(rooms[0][0]); - return true; + return isActive; } void Game::Run() { - parser.Parse(); - // Process game logic in here + parser.Parse(); + // Process game logic in here } bool Game::Save() { return false; } diff --git a/Resources/Pixelzone-E4MV4.ttf b/Resources/Pixelzone-E4MV4.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4cacfa8f734a3a667cf6d4d3943bd3af4ef0d9ba GIT binary patch literal 139948 zcmZQzWME+6V`yMtW=L>z3-PTEb(CjdQkuZPz#!x9;_Al0&mhOZq*TDbz#!)ztZ!tV zSisG|z?i|nzz~+4n^3Inr|~)3z-69mK$3B*DPA_fAG?Vv7D8%}53YhBpih3}zV_sfjG}ICd~FFsd*x zFsNkYmQ;LE`nrgLf$;zXgXoi-{N%(FwPqm<4C)FD3|v2Q6DtZ>k25qfFfe*BFfb_O zCFZ6oZF;WE!1(?P0|Vodg8br=ceRd|42&OVFfbUL1^bnefni_MjH&VbHeZ>zSr|az z+5BQY82!KDzXRg|W)PPHM1V0P0|PU|e+Pyb7KZ-~VAp^`4J-vASj$0XvsN<%FmQoI zm>3us7(rqT4h(u=5k`hrj9(a785o#mGM!;yVCaX?jISAt895mkm>Af=mNGCrW$^pY z#h7pkISTG zAbA)@QwQ@0j0WjPW`p>+FiaiT4`}A%(t{G7P&a|~gV?a}g_(sE4sbOfb+E97se|!B za!45FKIC|Vy9=Zjqz{IX^ug7@#6W6cYBDCZKE3$#fy^ZqQ_CD|_JQ0F z!`S305d*m!WHzy8fYjqr3riOa4gU{-;t9?Nr3F&#LAL{>7lc9fgD|>0t@$9kK^SHa z$PFM2;z#D8y$o6K{0Zk2C>0~Jtz)97^(&o zKNMk@{iK=)az8RARX;ZMAoGyLvAGQ-22%rKgY61p0}3|~hJ_IWxMl^_u2?Xv zUIUp2Dr?cg8D)8g3TI{aE~ht{z@LfYgF8NFNA;>;%yu z|HJG?62mYDSshd#HZ@=|WOHD4f@ly%*9#JZVRSiMcH&YG631c&*i9fmg5*IMqz2iI zAU-mNse#cTwIB>q1EOK#AU-w>lLx5<$%FVH`$2pV8zct8$ZQZFhGF6`8l(?|LGmCP zCJy3b!!UV}T97=5Pso0lT9A4q3{ImUy&yASYG5>yI#7BBV~|=9hRK1{V#6TwKp3VD zordW_7YFG9VRUg^e2`iYMwf?~52MlL3GvbOf$V@`kY03okQfMq!UiM zxf@v?qz1%?Vn|zn2zP_r3DOJ0AU?Pl z8%R9}gUV`Xn1JO#da+@US|m4s)q=$EV665bs|T5f%!jdI;vgF27LYiI4WeOu5E~Z; zsR3b7+&27gU^oD+uRv@N2Jt~Os6GSH(DVTI6DV$x%w=f!-vCJuXz>S919KCMjl>7X z3rHM;Ykr7>EX828dp8UUq=6L8EkF z3{nTeP<3E)LFOQ1kQ_`6hz*lNX2ZnLX^=jc7>EtR=zNeEHVg_cm>t;Uk;On}!uTLI z41>gAY-AcF4yyBDc7XVx`VU0I)WO&wH^A5+IS?C!LE<1YKx}XwgEXcF5(AlyEDjR` z(I9g`7{msd17gE4NDRbAr@`v}H^AZuG$IPFlR)Y~7^H_>Op1O|)FQbDmfm6RN9Uu9 z!{k9UJk5i{04bb7=7Zb=5(m*BJ_v*Ou&@WQK^PdczV<;?ZWUCceq3z^R`Ut_+_ z{Dt{9^M4k9mUx!QEVEe_v#e&>%(9#15X)tjuPi@V!&tjm`&nPH|6>2oXD{$yW|z!< zIc7OtIYBu^IaN7xIcqsbIafJPxp28?xn#Lqxmvkaxyf?#juts5>!X|~S3cD2cDjZN`R^(I^RuorMQdCpaQ?yj#R}xc_ zQc_UTQu0vpS4vb$Rr;vRq%5E;sVuGhS#`bYX4UPgdsPpriK;28xvQn?rt22y*6Zo% zc^fbo2n9L^wk`R;Tz+}a|G)qLgU8_)FsuWIVkcuC<8;Qkj0+goGj3u$z<7%B9^(_n zcZ^>ce=z=Gl3WV*o2z|0H{#S-Q!<`(82=04`d%vYIj zFn?nH&it2!ktL920?Ra(1uQFA*0JnhImmK>QmRzucE)?U^N><8HY^4SYqkeMK} zSB^=JLry?WMovY}OwLNqPR>QnLoQ4%N-jYzORh$)L2i=VY`F#U1@arfp?E?5n*0N3 zC<;MCakauag^dbZ6m}@=QP>X+MKPpM6jG8>l2g)D@=)?qN>EBs`hXOQ>r^+XZd2W( zdH@=V3AzTl`DmedVY&43Zcr%xfBgT@|AYSz{NM9`*Z=MRxBlPsf8+mU|Cj!s`+xfX zY5ynvpYXruf7kzx{{{c^{-^&>{U7?@EFhG>;6sn*ZyxfMxpv~J$W`Xemp4yL z@QBlmJ;WLW&gYQQV3Z_31b9GNITS!70|UbvaPDScsDqZT3!q|23=9nG7#JAq85kJy z85kHrbBrMD$iTqZ2E|Sc42+!&42)e242;eU42*pY42)A47#Lj{7#OEBFfh(!U|{rN zU|^ifz`!_K?@#xgK4o?>8Nyu-l2n8?7uc#naB@je3sV+jKT;}Zr3#@7s>**^xxcMJ@S?->{v z>lhdqLGzwp85qDd_zwmK#-9ufj7XcFt#u-Fi9{lFiA5oFm^C7Fv&46 zFoEie9tH*`4F(1#O$G+Weg+069R>y_V+IDsi3|)(E({DzAV1AyU|R%)-FHxP^g%nFE3uw=pma2Ieme3`~Ly49wpd7?^)EFffTQ zFfjjRU|{~wz`!KQz`(-Dz`)|qz`!KKz`zp7z`zpEz`&Hvz`!zrfq`W*0|QeP0|U!6 z1_l;T*w-;IuqlheVHbcUZWd{QT%Wg>-%Bh=D=i0t15pNW7SVL1qF2gUl{S_{r>LV364l2}e051_n7$ z{9R;VkmF!rkOPI^Wd;U00R{#+Q25U|^8*WME)^ z%fKKP#=syK&cML@o`FFwih)5cnt_4&BLjn60t16wG6MtiX9fnjECvR-Tu2lLGC950}CeugM0x4 zgM2Lm14}XkgZu^t2KkK)3@n8V4D#C`n5CG3LH-y7vy?C}$X{S!kiW>lz*5S0d)G#n82r)1yC^0aw)G{zA zs6jAG9|MDe0R*%3GcYKugkVs*Q&`Qwps%2y}*ERxt*Kz%~eG6=z^ra)E(i z$$th0RtW}%<D|kQ^3ABv> zqZk=L9WxLQMuXVcFsRcB>aVddurjbQurqKla58W)a5L~Q@G|f*@G}T72r>vU2s4N< zh%$&Vh%-nqNHRze6B@CquSuEQb+8JiDtY;`< z*~zktA)TQN6o@P9ik9i&Q3Fa3p zTr3tWaV#Ayt60vld|>5cHDQflEn}U+dVuv78y}kyTNqmf+XA*zY@gV9*!9?h*gM#F zu-{<+$05aG#}UO*#?i(xgJU1ZBTgnxHBKMSEY3-sTR5+9e&LeiGU7_(YU5hQb&Bg9 zHygJOw-dG2=WM831$h-5eOX82DoTQs%j^s4S1ClSKgrsbw(xfIyt&zGR z%_OZO9VA^Ny-xa?42O(`Ooq%HnG3Q^vIeqIvQ4sUWUt8nkyDZjkgJhfCwEPrNnT4n zOukKioBS&UAq6{y425Y5#}s}kYA8l2_9z}we4`|#1aqfTRu#x+e2O*73b%~_hKH2-MnY58e2X)V#Zqs^pkq@AEWL3^L} zI~^IF0G%eC1v*D`Ug`4a>gWdO*61$Ly`cL;PfIUCuS0K}-ZOn6eH;BG{Z;yJ3`7i^ z4Dt--7@RQpVkl=AWY}Uj&+wGt8zTuLJEH`nE~8CG*NlD{s~JZbHyE!ozGcEj}2es>?YYAvio4qXK!SmW6p_SXDMed=OX7B&WD^|x$wAHxP-Z+xzxGzxy*A}=W@p7p35tjZ>~(Pe6CWi zYOW@(F0MhYHLiyA+ zUjkGD;sP21Rs~!M_!DRsSQfY`@K)fzAh{ripoE}?pjAO`%B}ctH51@Ll0gA`~Kg zB8noGMVyLw7by^F6d4kk7db8RROGKHr6`xElBiWt=c4{aD@40RS4A(0J{A2VMlQxA zCMl*P=19z|SbNDh zNvTU&lX5GSCDkA`B6V8onbc2dVrgb+5ovX4%hK+p3#A*S`=#flPe{L)p^_1i(UY++ z<6Wj)W>98L=Az7NSsYm*S+lavWc|t3$PUTw$lj6tCPya6C#NE3QO=2+f4K&^Nx749 z59NN!Q_G9U>&e@f_a<1x^Jy1ziPe3LX@)6{-~46=oDpC|p-~ zsqkNsT#;W$Rr!(fFBJ+EE){7NeHEK3?o~2X zN>$obrc}06uB&`f#aCrg6;xGGwWR7;)w^o8YK!WW>Xzz#)eoxw)dj=?*7mNQqus2%rhQWTn)W^I7dqHF3_9XEnmSf>-04*4bm`3NoY#4#^HrBfS6bJE zu5De9y7{^-y0f}Fx{r1L>apud>RHxvu9vA-r#G&*p?6OoL!VNgPhU;nw!VA)JpFe4 zMg42~uk`xGcL{eF;iit-^`+!i)Nmi#W2fYR?MunSsP~En$0%bV0PN<1+$OLelbUE zj>nv$IWy*Ln{#2#r@1_Hedcz}Ju>&tJhgc~^Qz`8nRja5m-$Nb9p>lFpEdv3{0|ER z7MLsuSx~WH*@6oTg%$hn;j^M-#ex+VRpj+&tzWnP(FTzXP8$j~%-V2h!?TT28@)ExY+SYR&L*x+PMgX$ zE!%Wy)4$DXn}asDY+kkb#ulzE4qLLe%-V8l%df2(Tf??CY+bYU#MURu?H=2!wy)WKWBaci5##R(?~=Xe z_Hpd9+gGq}-M$z5+4fuPPukzMf7Sk7`|s@kbwJ{P#euj3EeB>D*mL0CL57272V)M_ z9Gr1**TE-;_ztNYvN@D>sOHdwLnjV19F{n2b2#E~%i(#4j~u>tgyV?H5uYP%M^+uV zaFpSw-O;L}YmR<7CUwm2Slh8h$F3b0I__}1;P`^$2aZ2G!F59Cgx`sV6B|xEIPvYI z#>tqIQ%-I;dE?}dQ)Z`vPSu^7cIwEfN2f(j`p9qcO&aY*Nq)FKHZeK>2x#eX4B0rH*eg0 zb4%iu->t4&8*bgY&2`)0cFOIx+v{%MyCZPN=uX0&wmZx2Ji04(*X3^6-DP)g-IKT% zaXvMh1PGP3$ZTZ;dvxvEH%S#LUF-)`(#v zGf0>fB)o~8jq#7oCPt9Bv7n-$y0M_L5~IMoGiR7q{S8xMN@IZbpB$JR7?>FZ85j&r zjYZXMS&d~`9YEj!h=5^`TE+&3156GK>4&U{GgZ5I0q}Wi%Ewwq??0v}G|iH5N6NWmGm*mSwVLlx0yC#c3eA z1OsS?2&gZ^t+ZJCW_nLxpTY7QgVo&OmiqF{~# zXigd2Z)Id)a$rzp&}Co{200MySV(|qGutv7n=0EfTQkWrGJ}H#C6vL&LCgj-QHXy~ zrO>cpY+wMz1v>)+#HH{E1IaUk!>)k|wChNmK^hc(#-i%Vwj9Q??1HAo_=1ax!2y(d zKw*!hU)0oC)Rxm&mV;T@)ELECs2nD6FfcHK*F1pI7AS2CgF?bsR2gIjD7k=QPgGeH z9;}SWW`Jj58W;{R9ss3Eb4dDvB`T;&Xh?vxfhU#!A7F4`0L3SRC^+sw5@3fw1{n@8 zg3>sHu(7B%lc_O8Gsq;cUIqrRUS>#caR6%rxgVPLI2i;%;U@}82+WX>wq-GvWrkP* zAsJEAfrA4mZ$Zu6wdU=RhRQ-}#1 z*!3dRgTh`Jlr|WxnPgeC8D*J_O^sz4wV7;LtQl>Y&~gl}G>2-QD$G1)Wl>{UW^E>T zmNdm;rh@}+Qz3o=xltbECuVS_mSr{ug)#>ug0OoKBnq0`2RRH}b}56>7Ni(pRun@H8aOpv}Nwtj!1tA0}f^$;8YI%1zA5pduSooG?Sof{>t4Lc*~0i6jIo z&k=qGnT{x7t(jywFg=ZA0GtWRNFWY0%{wq20M}>Wx(DP&kQ}&d0!0}UxLg9MVP)WC zfaX@XDhEiCVStp;kTL*NesDAJGYB&hZm^F)1hPS}x)+qDnZfZ5a;+^RsBQ#R zlT4s&2#Rx%MhJ#h8xRhN1eZskm8wh*pc+AcARDa20vV3f9KoLTz>$b3SJW98jFoLUtQkd(W!aQ%*_1)WFS3pJ z*hv19XJ7y)8&EkQ3Mxje8Nn1muOXQs&A?!YrXQvLKywO8SU^i7HgNF)FOLwm;|dIj znV@(_4HH{tWm#r$Lx9NA7GjWt1FC<(nb4L^+0>dz6dbe&7r`_jXmGlQr#)~v1}miN$A1CX@F$so@FN^hW25atI_Wm#rnumHR{fv^~j1uLq+Nd?J2;_x^&mSxB3 z5l~oy%XDZP*p`7o(Ux6VmK{{NgKBjSMR0mkmSqQ(Dh>_~|B$i_np5y|p=BwkED?m{ zRd!>LJ)q>Q400lI1|yeA;$U;M8A0h#mO~w!A#i#X-E~Or5oeHxre<)ff>{`x=g~F5 z`LG~|)Hk5j{7eoE(xBQ*+?ElPKbd4Xlw}z~;m8Kngu_*6UPksCCrYZYW&$N}P`3kA z5-}4_7EpUZ?RP|8L26fkaveCmg8Lqz<^ZY_ab-c2d@K%X=YZO7p!|Zf{Rc{82sePr zFi?yc%d#7T8jyH%3d|QE8maBT&L9fu-++2|wrs}W+Jx0umc_xr0qza7umu?b#*n@e zIK6}FVMzvc21^D8P=^N8mNy5viCr1oztm;~ao7$x9B=>yINW5gF+>p%yTEk{CxbA9 zID;Z6m4J&qW@T^&2X$P)ZEt8h2xJkGClIzkvmZhL+^R=}E2Pb-3^ogF0gEzfgC0dE zl!FweybOY%TmY#TKpjMI3xQdi(G-;Su=*W2gdyqT{{aS2{|eMMQ?})@W)xMH<-pr9 z1C?5ke%%441_o%qL>wG4pqkfMmQfuXPD~gMfQAQ59MgVNV_Obz$Ak;&S?m;O#uaqd z0jOMJW#9&lFbISDTcEzVEU1wp%LtAXSgwc04!HaW^`{s>Yi1chH7L9v2J#g+FEcqX zG%!Kij>4d}6Re}j1a=Hq4X6%bJis6c3VlIvOPWoa$(Grg(UwtJR2bZ#0V{?O2vfrSmIEe~=4vo@nFBe)gC3=SMv3V`ZEp&*F_ zk~TnoVsc=R1eIB=;GrE*`V<9~r;w2(6rC^*BwRsdJUBc+qc)%{!Dy<@XbW-;mR2Sf z2O;GYc=$3ofMdy)Raur5+;#!S6c)`er@(25o1p$-2Kfk-wgf?42wN6#l4nKAbfB@1 zf6&f6%m`53_rHMw)c*#z>p}WKgCO9>52Gx+BM#F07mJgS$_;h~aPJb_e`5msg9Q|% zOpu{BaL$3*iiL(m5IEUD+b*E-A7OB9Y>aRRl1@lJih&W--{NJEX3%8NWiSM_T0kR$ zka8PBg8T$3(HR*WU?n(`F*uo!HaV!yLZm-lP~J2K*9pqDY@lQ#%Sy;+$az~BtRI?U zh|P@9I0B6sf%B0lxRt{OO8w^Go(8vMnS7gT`h>m1S9sMX|UY zWEyfE32_Iw6fu@%1;-{EZfy|VuyoFNfPoz{W(G;;;93^s0b^NENe(v#Dd52dKc5kBdCbB1|-cggT|d0LCK2+mQvv+f{npRK+Fe^D}u(m;p4ubb`fOM8&ZoK z%YvGDOvccv4ADq}n2hFZNO=h@^H57XSjZu@+6XumT)%?KD#im0pfL|=Sic118nEk_ zKm{rjXha&~8YB{7He~z+RNsQfe?hGkX;8Wn2iK~g1_KjlD8mrMVg@y;5L%JULwFQa z@Id`}fWd*Ofk7NJa>HdTi?g)=3TsUJ!DGmvu~U$p(6$Q5AxM@Ym>^4GyaS-7IRj|p z)B#4&NmZb+Bk+h2XdsLcG%N&WfJ!is7Er#uOMqb-FBrF@rM$ zgQ7NzEr&I$EQh+WEt@v8ESoi>sWND&95Qi(Qq-b_E5veQNJ#z$xeYWQ0nU@)K7^^U zIcSK_8q`t(bsu0M-4V`UaF99T>P77|cO6 zCddzvpavTTO0=*z2Zy;TD8$V{p$i)FX8{K{v#GMFvZy#L8o;K*?L_7wv*8Lr3@j3$ z^bSo6>KWoSkonL$O&L^La=_{`aFYt`0aV|Bg^&qY8451@bQu`L zZ8?->Ih1W#K$(hJmJ=f_BWuQFL(>@}1A_x2cyON3X05t*$`50^$IL$#=P!euCXl@Hs4ua|(Y0wOYv8W)ZJOS0q zjG*-pprI0I9s|vEH8?n+_ccMq0<0a)bbvt?++%~UwBP_G75K=2pfYSK8|o0O6x4Mf zImQFvoC9iK5;7aqA4CpekakRrYBo5XfwqW&%2QB323!NdR*7&LgWD&ZkkJ)T?j>wK zEMh@6gX(-}zJ!<$n!`d`g#wx)f{rhsO!I^E;>JimfHeF-ZA_T?@(jwLIuzyuunnLl zBdDen2KOpqUO+Mi%`QkS_zy`G(guLoArGmgVK#7CGs$v60!SE3vj@o#I1|ZcP-h%e zwu9OO;Poel;E@4q7VvZxc$@*$_GAJN1fleb;ilnWAXx&++R$_kUSp&RDQ`jTH&6>% zmQh($*%UIYkI1p0EDft%uvh^#6Phj+LG$n6($*G|-oefXxtvj!iMTZH0Itd)VZm^K z=>P*>Gl@&<5HrDP99r))9bf>rT_J9Trf<+3EfdVKril6li?@-4K!pNwx&ZZm)gdJa zII)465}*+cM?q+? zd5H1{6o%kA97qco)J6jP7%^Xo98e(54h~p{??CMbP)Cl*0X)kDTDf6r3>tF=_Y6Q4 z7aMHe8<*1{4n!tFX&&KL&>SDQEJK;)gO_8-4n;Nu8ynKBMXEz2p>+s&gd4Q*3N*3| znhhs9FTtzN&~S4InRRhVoz~s z_JYPz7$EHm(3}fDgD7aO!5q|>05_v#K|MK9P&x#4ni)Z54k*EZdvH*rkkTcr4h7HY zfmS|3*A;=5<=KLJ+@P9*71F$g%W=p&Wspp=0$uL}!gkS?N<1#(*sRCa>qifx%e13{oZHM6lSXigL4 zYEXE<+=Pe53`7S?gan2QA^3``3^q7IPOF~WSv{4O{T;_?A_ zw2VoX2{hV?>;)(r(;|pZK*0o6f+z%b*b+SxmDX zK#S#}#v)S?JHcKAwR523Da@eu7if$E)Mkdv7DL+1Y@p#zB>fGL#gIrMP$t&&4=Q6p zEpYIkRG@!B&9~lXbwRqPh{M zd7$)2l(#`KgPPAl^V%SPgBMysY79tV5|vG0jzrDhpt*LanQYcfFi*q760C_30ZIjk zvKx~3Kw~o)c@I994=xeG#)9->rXa8sgaEgnAZ=ezy5xtf0cQqHzk&M1NIOwLr6pwH z23QYd&4V}tsFnriQqUq67HcNZyp}ABI&=&Kw1ElX8i%f51Oi+%7q!|c_;XsH0#6(d1BFY!=_yj2Tfj6Ik7XPt>TnRA;LP9iS zBSDb^2}^J}0}6lSF$omEBk~kuoTaSy7$!DC+Rptb@i zCqru%Q}Cn>D0Cq!B{&eF0Wts*BG`r&K(a85R33rWlA-LdgZ5KF%fU#;+^tsujpX+DPdNJbx<>8u9LIkf)ghmJ>Y6}5ZixXrrWO5x*wt#v7;1vy!Hmo)ie2D~xnIP>L z7}Y#b8ysA^fc6rAig(b~7f7>^3Dvv?oV&_ER)9=JxDiyQqPh{<)WkFsq!|lFHV-tX z0Ul9Aaw8~fq6H#u2Z9VkX+wfn0D$5J5r&{n0EUNgI1HuC0L8H;sNII_I!LAfI}nr! zkkciO!~?Mkl&X-*eo$OP_n{zMO2BN0L1-k3xd*@_lZKFeI^cFc(oP*vs|Ms`xBkH;rHx zV|oIsC0GLt>J3oS6XXwYe1hkkm_aL+LA8${sHKWNdxP%E1_uYM6F0DM0kxXIZCS91 zptcuirvYevD>&mo!XCv?P_2wPy$o?KxNd;gZK|-{;gE?tU;hKHN8u*}LEx2uj3|5!1SmIvY6(;i;OZ%WjE7hRX+t2@#RnKvL9=^k zzQI}M_un6S7F-oFF$DixOcPsNO}%UxUkCi24ND zwuSF!2Db=64KK*L1N71bNBRM^l0aiGFmoYeyGY}*pjZX%KnJBqR5P)d2r3G|>nxz< zAb8FI)H4Ltrr-q<@NL)1DB4jth!h8IzroF7hpcIb_)kz7vxH8>ozfmvAU)4q^tF1O*SavJKL%2Ctz7ooxaN7=%->dj@JZc>Y=#G!kP7nxEwW zwdTNkbfJ67kvrO8C*UVQbsG!#hD^}7lrVU1P8+;x6Kf3952O!{bxkCi zi^0(dYPo?-2dzUwq&3jc7C5j#%{NZav;pWq3z&Wwjp=4kwt}WJXnaaCfJ|i&2Mutt zfmV-#YDZA-2~_Gq4M2`ls1S$(8wMJM1h1Qfng<%^1Fc6fgw!q|hk^=d&z{Nc%m%-0QfTV25#4W1pA?vNpGN6$Q*9jf#1=pkC{h6ZR6_3zViv5HQ zSX_YDrGv*`Abn);0cI@5ki@|Z%IjEcL$(=Gi9_rLl^Nju{V1k@cGx59fU{A?Z3Mxi zAPnHOG3=n&g@zW$36P=&t`9E*oMd3>p2>lM7dm$f8ck;frF)3Eti+lNielupI4G}5 zg34QXP6aLL0p(OsVw43P-T+QjU;?j8A(C*j!Tm+hDFvW$dQci=G!_L9rh|LApl$J> zfCL*0CLr3el3+8zY3Tq1BwRtGOQ3@Z&_fnf)4)QPkf~6sKmiOYdXeUtAz=(Ykpwy$ z2`bJRm1V)9OoAPtzy_NQYd{TMipp}=Ayq#OjD$p@K_Qw5m^+TUv|%MLb=O&NO1AXd#tf}lD8=FbBR z)L)MWGuwfI`tzHh@*mW52c;`e+6T85LGv1*6_uc@1qup8f1JrScna#++1e#j{t*kKyx9QPVSAxujv~VC!B%I73>Y!`8LGcP+KMyWj zA@kMH)rHXU2iWvKbXOWIbO_o5_5?V8fa@o4+fNa+r$p6Q6ue;!X^lIm3nj}2sxF|8 zBboxaADni;dyqkUFZ4nC0-0^utdUm*L1x_{Yk|0k_4WWfUj8H*5?# zvIaVO0y@kCv|R*zvJrR%2UsJjSvYy1VhY+u2G84q_5(5)!Y5}yM`nUcC)@^r&VNL- zg+b-MASkTisnpTKnhw2cEAgJA_N+E#{a zn+Gce5jbWn;N|fF21s~<(l%%~1bjjic*Qe%h(aXt*eSE1V{mb$ z8c=FPk6D~nfE)nI8c1zPP}+gcErNXjvj^;aq|}4U9*~h37;FbLoWSt_&HuKX&_m^* zC##@49A*%x-vEz8c}N_Bj#ovTKn&_YLVHQLCy0>CV`yL67;FrvL>;18CF?K3E8DdqdV9f!60kjlxQSrWrvg2-K$ltq!yW4Gw_LR|aof0UxT2 zy=Mb84Ou_L4Il%+gFK*(p2ni!{r#YR4i2Bd&4J}VQ2vJPn1HWX2loky8Bl~82c{r{ zi!gIRYo1`M&tU6**hn%L)Nn$Saf98R;IY(b?awEYD-_6>513uyciG|oc29k40}ULJtfL4ewjpiyRU zM-6H+@}g{r^FdC+kHPgILlWm=AL}XqW(8 zW`f(lAeVz$2q?QdKqE0oEniU41aTC85}fG~Z31w+7b(;ctL{iN9}+5{QUJMp1nr^+ zpWp(Tr-f%k!~ifcVFC&ZsF|?32{x{b6qQ7q$-n_}B%=fL+&0MhfVK>d46dNlML>-> zV^J)p1PUvg8iR+U7>z|iZDvphpaDGJNNmU>#S1)|K~90W2Q=ym8dCtBA!Nv4ih61x zq_2*2k`Tr20SyL$odj|NtbBv6X#&j~fjaS!i7r-US@6ltVATW(Py$1$=Rj!}X)Y9= zzK~|mKt|#i?gdF9FxY5#o&)7+P|5|*a)HNt;pZa4(k@ghz8C_T32CDs$~w^LL!kBp z^b}pt@GhwQu?3x$2x&Ti!vja+MYRnS%*g#@&>2bK(QoJ&o-u4M9H?{y)!(vApz;o@ z*~o&RZXCi~(Efcv$f=p2raWZ*28z2uJs)UrKq!#M5$iXQ9nF9+7nCMJrxt-vH#Qc9 zmg^Xs_!(j@$jeNi9dD2!4?+z~WS7F`-Ize_1W-K=KEEHl3>$R8 z2I%}Aq*Kd~bt2fHatWLULFpPaQfX=|3R$_z4jB~yU2_4wX#hDUaRnW?-~js(oZg@- zEx`?5_|*l7%QKKo#Jy}43H?lB{+odKQu2~PW<(gbQ0Zm+==fb$SyyarUlD1yf6 z#X;>cXlDqrQ%)FE4S^1m2Q{h?j>KqWf^#Oqd;|;RbWmtO^9N+k96aa21nsjyqYLfm zB7_Mr7RVG>o6La$bgnljAHzp&AoGl%bG=~!LO36T%Pg?@Nb@V8bGE=MA;F~q=*&&9 zfv{;z(6KL|#s^p%P68GlkntL5dJ+V!k^#5d+1WvJubg0mIYG@CYz85M8$}ir4v6-c zAZX2?IC#E79k#Ox;yeuPXaZ1kKoP_QYCnTQ6Ea2z?s|e2yn;rk(R86W1%rcZCIjM} zTsCVah?%UAkx-({gqrog0X%lA&tT8Mz-r5>EDPH8%3;j{I`#zQK3GUQfEt5D84Oa0 z;&O0*5M&P{s6S{7vWHz+7Id&2Xc!l|Sf3PokWwBfc)^tfQv>*HYETG68{&{4flrX4 zI0**_6ei&E4t(t`=nf*#j2E;g3^9+Dm@ojDgUCyu`4nwf9S!MQf>tkp1_2<3K}Z~K zf(wH-w1K?}CYT&RyH>$1S_$!0)qLRHQ{b$F5_SX} z32(Q8&YT0yG(cOIkTwZ;J0@tfMHE(G$uv|Z*iew)!Epnw(?I9MLE{-Ryl5=T3~L7yaw_P=D9|cns3qWN z0htb(-^YIjFswfUnhyhww}9r=IY2Ybpqm%Ku7sM2n*!CN(7GNxCIu?i-+S=cIw`)drnY2r1*0;a59=nmM2XAG**8Qa&RUC^(IWN`Tt*Sl2><>u|8$pt)aV z25XS7A$?WQJgc%SD-os}tESq;Xl$iYL%` zI+|VJA|G=f2f`-Em^!qd4)+sybQ#$uBws<-*gy&{kU{X-EJA()=LT?D4z&+D?gvQ+ z;8mcoP(<<>R{IG13*<7eUEuR184jTM%^bAT4Klun7H3e~K-nI}hopMa0dkHdIGuy$ zz#)D#Mzt5ymsss3*0bOn3_;~FieFK}6*V3q`^{lV23+DmrUHnIN$|Q)kbT6)BR2bp z^c>tSW(EexJR3OY!FC9ZOW5O}FQ+Ey}{FCpmyorHKBcKse?6+g;28N^O- z4g{U^!X%6H)EcP0NH!p>#%y7LzycD~5=Ynzx#t76P7HK38))PKwATfc1R%G4fCi>P1HZ@x27Y^CcEM~1*@?W@ zNES3A0iVqQ?E>OZ2H&fNNB{^H!ZVmGNSXkRcY)`KBw_o~LAwvYYjW5?6WhpVOyf5f zB_D$NK%liQpuIY;7(0=y#cnC2j{{ok52`QFNBAICU@Wx3mG2?`0grHi{DX*V(AqT6Y#?~R7IJO| zsAmdVhX~qM2CDawT#9QA61e1o*a30@yiW~VJBzs{8FCyBl0JxToFwS9P*5uij{=F%YM zp^*omb1s;|5J!N+9F*}9ZUDCtKx3QmwjSuTY0xMIj&mGAA%NjskUz2YMxhRYrE<_n z2PhW7?LM&oL3bg6&e+n1w1_}E1wp-HtY_?Cx0wOQIWfq7g^rDa*9Q%?by~=7AE>oW z;JgBE!-C2qa7qD<;z3rMLJx|h=DHKeoHw`?VT^WL7ixtEN?-V^JCF)UI}XHxw5vdM z68Ii$@ZKy=V_8mh*tiU&v5%3yL3*(Wg3>Z_{6N>}L9e7l-vSR`LJA847YE zxZVVx=K@(Z3t7sFv;|%ivIibw9+<@9NYIcUSPnji%*+6umxi>QK_`KMTFvU#k!B$4=b>xA*f35ABgZaKISRE0F;)XAOAzG<=&S@#RR)?6 zfO~*IIR#S(idUGqpm|B~*f6O00hNtNK7gqQ@4Cj*y#|>F4G(a63tHg<5Aq-Hk66lM8JMd6D!2K|gn~_2T$<@#}h8PVeK|zYg3!sn#^&O!7JW!2+ZIuUP z`~hw#J_gvu(0LZ{xHh;~g}g@}JgRRj%K;xjK{XD0T8FDam=E25tqhxO0nK87Cker; zQy|TF$Wg`MN&{{J0S0QD1hO+3JU6NgCP8Pig09%YVDfR7Ap(#`U8-1Gz`)SF4Ms4B0z0K261K3 zR0U`%5wwwy(^wQTWe4*Z&V@oS1)$|(khB9f6WkL3tyu)0r30C@ftX0F2ccnwd`~6V zZ{U^0paKTcTEb@>q)7s)4?t-eTGoPZrG>0NU{wYmFro~)P6u>)D{6@iYDJ-i9Qr#a>ghtS+(Vd(QQbm95^fP_unihN;Pw`1|EDSV z4ii(*C=G3z^T3?|6oj!2;fHw1$LEeF8!lAyXy88&YU8P{VmmSq8z zI1u+hNDMQe0*s*0gPI49AJAQB;JGqTT!8Q8WyVvkz@h@=PiQ}n@c;v;->M9rF9nSh zfc;2#z7WZsFjGNpgqJPgGZ8`OO@OXJ5>*D@q6<1J9Ha;r2F?F5HZXwZ?$|-)5@_1b z0j&&Vgq%GCx?7O}GQ`{BHn@vobKSg9>{_XyFcycS2#! zz`)?Z0J^u6!4RCCpg{xH3nG{tz%?+aBMrLA2s(&n%Lrax#6eVEgBuA-OCU4B=Wc^r zBC?>NP|y}-S#UXKYAnk}jFF(c0$x|Z&;Yqt8dTeXZj}OA1q&CDB5+)iU7sS?F`)ju zI{XGm(3ywmb;1GE$_C^VP$h~;kKpq%K-pOxoby1V(BK*nxpoH+`G9=@)eog0ZLS00 zdn`eBU^0k;V;a=6f~o)?Yy?TeAa_IaI&7Q`K4lG4jY&iFGBJSf`D6v`kp!@znZEMhwJ;+C(oDNk9_cQnmKJY0>pgII};UGKskP6VkN=Vaza8x6y z07WM>?}O`o2JnaqsCWS-DX`<28bGV4z2m|e&nIwaFDy$=(C+5<8ay4D9gB>@^w z1^En0K9C$NE_ zhye!^n1F;8XhZ;Xbp$9KLdOI^6#|w72r~jsgWLyM!vwm^-kgC!5me~gvS>5Of(}yv zkLiL2i$Q^A%_7SN+I$2lL*Ygc&w#AY0H^B)2GE=wXif()I|eR6SRu#SfRiG4;1kq4 z!W?J<7uJyW3D`W)xq#rcF_5ANJa`UCp7=unDd3@T3mWGHtLjxQ|pb!R`DGu6i4?W2d*S>vl=7jqP+C~B`_Jr=B0hjF%`ynKt2%C_vr zpoV1}e#h*elfSh9i5BY^W0Xm1DT zE@^oG2eOXR7}UHF1lbV)R;AB)toh>ESol?DCFdK&@HscvzI8wz&R)$f{B9C z7kCZ?9B!aKo;ZUdB=sWo^FY&>Ah*N2;Gi^&#XM*hf*B5`K}`-&fdVQ^KqIf9b)lfV z4B0*gAz6tke8I*c2uS#X!v}OHDz4PHfq7j+=?62$_A4XhkGzyL~5;QlX%u`CCu zl?G}hg4cCp8U`Ao1hp>V{bwd>??*$lq0~XMqK~e{|*-=wN17yb)!dNg1Y%@4aKywOA4Gf_D z0igBMs5=BeS6|68LTe0EbHObjuvsty#l4_58!PDEYlsnouoe_ZF+?GjAszUdHb@%` zG_QncgMk7Sx`G{Y_9oO>V25Bg5@Z<+gPUdGdLBF`1FD;G#uPYoU>fnzptu2tA7~A` zE@+1t=xk7=1{vrSWl*UJs@{;d)?)-E!V=JYIfMtws*v;S7(r(fGl<(Vfh%2TMunV< z0`@&bJysGN$Ix~XXmu&5U7*c~$n~tC9-cb53KP|aw$Sjn4rB*Z6{uhZhbOoX4BmMN z9=ih(pgK^S$(E$CP3ZU|6KLH%D2Id2js`8a2VdjNqz)=npnEVu>)H`5JGg713`pcb zIUx5sfa^3+JTZdSAAm-^P*XW1AtCDkYeN%2E`vbxKcHE9@W?Qz`^E%L-%Q|UIQU># zunAZ@>`)mn1&VBtxsY&d0K1RD7;F|R$~Y2OHA*=~wetsI^FyG$Qo;Q2Xx}k`)B+LLhqY<>G4V0FkdO;)2pe7olsUaj;fx7gJrf3n4Yy-%2P-KB<(D|Q; zHX9?TJ_5BWK;;u?nt_iWxfzl1A zoMJq{06MP~)U$^)>{vkQ4sIC|1LA(D9#9y9oD8oa2nHf}EF63u7qm?$4xP|q0k!93 z8F4r0uo#ULtOyr^*QG-90#bWU9MlhChK}2t8jB*QYIsqEVFxUaA&iH#_d)y7m>3vL zK_|+Brn(^W3!r^j;29BcqCgmiU?H1>gU!Ie4lbM=z~f=;48n+0(?QG4K&>uwkmFe( zegR)dFUt%&@c=aa0`d;Ar!PP}h+JPm#$gaG09d&QG8N=x?3F&q$vp zEsen94ZBewOJEq%2LQLjSQ)^xmGE=SA-NWk?_tWJgO%uw9Jn;3EC;t8p=N?^K>@el zK(qglSY$N@AASkaM1%tw7~p4SK-y2d43gk`=D{n;U@-=1j|tSkAs8P3^6K$i(w9BSw`^M zSf~*=vK+)5s2Wge0MG4$+fv{%T^zJvhz(SsfXri6mIWPE3Q~^6JS4NAeLQd<5_Cor zv`k}?1s@;>F5a;i05TVfLFF*WU*Ne=23Xu-*N@dCQ2s;IZQxUPm1RL4A@FoJ$VW(Z z3bq;r9=4!!8$j!Kz_}MRTMF821=^Aabt*WIVOwDc&#R!b(jlu-C?AJ|FnQ5ztZ6@b);&bx1Tcf{^+PpgM;^)Rqfk22zfI>cSed;K>`P0#NfC6jz}74|3K5 zsAmW|Ef5^epg|wxaE7`7rWr;&Cm{22SY3wSI9NRf+v5e!37~oxyj%-Z+#pXs!RkeX zgCL_H*j9;w+mO(BX9nF*0n%y3aH5sFP9+k3HBePmJ-G^2RVs> z0tWk4D9GhK#66(-Fr>}Ps7^rUL1y|H7{L32nHh9JZAj2n0iX@g?8>ripyn2+3}6PG z{|K4CKss(8*(5@2P`L+9YvA>zpfmxUTLBvmx>-?KmKp5=c;o;eU;{j!!DEo>pqT~G zidbgQq^c<_K{Ls+K-wq-3?<9B7*tmeYcHKxX}uz}GaH{->i;V)1t1HRsu3AQH-)K-Gc;)6O6@JT%^i?=~mV662538G<$ zZ4mn)>nK3;jPOQ3JR{0ia2*Pp`v;W@&?7kT8-^5QkaP)d zD?wIjLRtyX@(*;GFOxD6Q;`stA<6~l7#qk%NXG+128WpOI}T(N3?urt;Jx9X76*8u z1m{!-xa1mckV`=nLBg_3j0~Uw7?4{W z92|(7y~Ai_g3=KpzLddhQ9vV#%HTWhnIJ_dWCbA7%2<${xGM&*dEm9Ipc8U%tSi1u>CJ5T+h^yR#m3KIe zL@Mk+<|4uflt(}LmfZ2+R& z8Xj}Jh;V_99pY*+rV?SS3Ifm92D9Y+!Yu8W{&>NtW<<6;Ee*Z^x>AbbvY56E<^E(S^9$FTB- zfeEx1LlJVv1v|Lw3U0ze+Q&o`w2(dkI81~gCxj@1;tA9_1T`uVZEci#4!`4&WTEZ^ zmsjBR8=yTEs0I@Z0dTlN#}(jpBglcEBH!Fhsv(S>78MMCwbPzrVGxz{cg1(2Z+I9fnlLs;rwxb~pe+-DjR-@QP=ZIhAXALs$$Q8i1MqrNSw@t6h`+sw1N2x*6}0R-ns(0K^TpgU_p;0P|KKFG}DiCb_Hy=C?ePpEadD3XM@LLKxG;e19-O66h5ztwAhct$zhaX zd$>&?heOx@+loAzO-{4K4>kZ9c{Wpz%spTTq)1K3fVg734#dikN^mk!^&P z4GiFQ2%s4>&}u1gI}da}4GU52JV==b_BTHRsJ>xP1cg7S;lKu&@PV3xQnw&G11lTq zHfX+pj`pG&h}Wm!u!F`YygmXs3f!(^1ZNw_rdA~DQ34Vw4oMea|0#pcg9hCJ1}@(~ zhzBObH1>X&8Ah)8{KcM*zM#%gLxISmZwy_Md3?1D~puRCU z|ANySw2u$U1E@EAq3=?|X&AU40QM93&REb?5a?tV(Cy@)S{He}8^|B%D<>d%3aTG; z3Knuqnj)D3DIy`h0U3n3LkFCX{x^W{b){f_nGv*Jj~Q~uFlgKjG;acmX=PhT+ZPm8 z(0oqfya^=!q4`T2v^xis%fUM$!G^-SO`xm+@hN!42AqkD0gqGgI3?&r0nlh7`FF!Z z>n|qIS?Hj3c932TwEhA&BN3;Pf$o@t^lcy+3`bD~$ycxf13pIuX{&-)1cOE*u(W+i zo*IF+PZ4VcL8gPxu|e8b538^6PKMy{3M>{N7CU8X#I`U2#bY3GPWJ&|vWP^1vVFtr!sOhM|4>KFQ9vQq|nh~^rN)%iIF~QAd z0gS31|?Z z7>UAxn2d-bP(1;%0~|NtwLjpHfyWG5sf67QG#g-L63A>&I%WdRi=gbyfsO>CI38p) z#C5nxBv*s`9U!y8eF2ny0I2r^TK<42O7SnpfV&oC94x#+XZnG2j55jrU7-0um^;xt zjmy!{@&_8mpjG-Hb0G;H9Jrw3AJhaV(p->vknsr6z9dx!Pzh`a+U*P3o&hmuxiOofA! zjwtAW8_<4rP&G!9-C#Q*Ybil(GiaWLl0l6@q8s^}79XwhLHV|B85t!FRq#H)iJ?jjhS^!)O zfcDmc#+q>sHi6;?HNC+KB+%3c)VWAbMP(xF1+Q^{k8g26y45&sMK%SoW*B^quP%c* z_*Owr@Twumz87#I2|8IByi6LYREMrX0CiqK)9fhycTj8-E`p#gK@|Nk0Z`=*iWl%% zzu@^2c5vSUbP6eWuQVvuQO2u5+jBr}V?r6P1|1|qp4(6oBq+sz+Bx930-XyDKXVu| zNDRGE9J=HN79fcDL$IJ8L{K23p*(Qw0I? z8Udj|cMd~XC?qIOpu4U?VGFKjpzUUP@Y;BA$_1Sr0xF2XjePL(N^rLb<^?48q8RSr z0GUyNZRQ3^BKrlj{t-OpfH7|biX(_Upuhy_gJO_X7)b-N-UVU{w4DI<12m*So0mXy zy`Xb?p-Y#*6fB%z-hf)+fX;`BgWG_}?g#A!gY@V?VR{YBRW*WSrZENGqT|J}C8rcl$xkfkSsAEJ9I7L&32L zB49y`LW3oc!y9yd52yu#WDmN#@z{f6HiQGU0lr59T;73BP&H<-WpKw@-oeTgaD4_z zq97q?xrbcd9dKxXPHsXh!%aeS3D`AAs*uWI(D(t!=b+W0pp^okCM0O>u`+lCvau<+ zN`hPf2dZZw?gEvESmx*my9+WZ1SuMz?tzUnfb$i^B@B>U%M6;YgAaMZ)`TJA0crq* zIsluLg>aEbu;(HD2XH$FRQjlcOF3&MS?qIyxa~kP7sf<4A9}tUXx0?oDFn^sfpRfq z3ZDtz%0_T5g_;cs8)#b-YA)zxK;q3sDh^N$2Ip7k`Zn-6`YhmCO~{e<%%JWjs4W3L z>yz2k8eCaG9Yr(+TK59#&w@Hb;5Gy3ba>Es0jT7KP0WGEM!^?^lWGm9(1e!BP=A2> zFQ7B^jb@0!NF=Px0hO8Hvv@!wUEt|8@X|uqkT1AgW5PU9 zn}B6t)1hS!*!`e=kI<8&VL26CHlz9kImg0Uu7vU|G#;S-z_iEIni17UXqJGJ5)qbw z(-TVhiM*~8KE2BctNf8d2ppeCVULXo$v%)g4eDEi=jy=aG-9M5GS0+iEQ{R|Bpb2W z01|`Rf@n8_dhg(KbU~#wWMmrN!w`fFdqRxG?gxl@@Wm&fxPY1MzyP{M95mwsA5Axg z9Et);0D_>AXV?rWrrD6f9@_i??@dOpjui)J|f^axwd3&8+2;Xo#X_7X|M&kZz|g}Dx|*HHZhZV<46CdQdSyC`Lm{Dj&4hPePdZw%cp z2cGi*osGr zonV518;ay_S#bIUhZi)7!uFKIRiiMF!&@9Fyiu;xMbiP*10KK9N3sukXb~us5L?+% z^y1+_!ULR^Kx_2D>t@-EO`!)b8_UAmjCjmImO=^>&?*{Ge+YUa5~Hy!-iwhTbqJ_k z2%ZDtX8@0#f_liH&XqNzA;>Jy9rs8H3Sl!MmpZ`02{f+_+6!X}I+Fl2r2#%!o(0_T z1!WOX@ke~h0p$+xSUN2K3)+GVVFw$`j@Y4&FO4JW7;y$!2GIIYaCn1;w!vGnSRm(^ zff6IAfx!qno&|lJ8|H0@U9h}~?r%u>0$QsN*=7z?2h)w4hWizqE>vNCX|(>jHY2vh z>d+xUEQW*5y9S+s4JuSw*i&u?9js|&4(B7g3%t)AG!VdS3rZcVpq?ryGckfjJ;8^n z!?hvp-$ICiSg?2m&Dm*#Mv~Z-WmzD_IjFW_ktJ4$2`A_d=Qi z*nN(YSD;E@ZiVGFr0`<_6{pY&2;?n77^S`kxe<|mjX`%_6VeZnhr}m1kAlh%Wl*63 z&QG94%(CppqA0$A=s_Z({sE^k@E&qyP!%Z40$WrLni68cvMvjUsVIJe)Dhr?1E8hL zI8W6CI|rpd4{AGVGk{Oc28|VfC#yj7Ni3k&9LOw2Wm_iDU>8^`e4rFmCPLeyPzj6` zWXS%7oK+02!$6HIToo8BJ%Q^XP@O@$eO=&o4m2)7JwKzS52i)aYhg9Yvz!qNy*n;x=11{5FI+=g8YrW%rl z7$IxwxEUCPL2=C}3YxctXoQ_b0xpN3>X;cgA?XF2_8s82K7jY#FgY+ZfbT2<-3kFZ zC5sVsARaUbp=Cc41GxXo4JrFUMJuB=BV;iOq%#0&_cJko@;%%v&`1dA+*z=*AjX0F z(o78C{wFH~FM}}HJkU%gcrB+aqq;Vz7C}s$zzhc^Vo+XYJOIv%oD2+*b2;F3B19o{ zTn)UQkC#E30d#99gCeNK0p4=}S)b1c+He4J9C(Z!lvSan7uccr2vE?XtYcsX-{b|_ z(*c?i0xkam9VDd=wh+{kGzOg|1Tq~oRF2PN6gg;^gT?|NbL*hp0gRvx)5@UMC<`>D z!}WkHfOAk8p!5yuhlAIHK~|7J$JQWM&7yC0z+x0AfS`s#)(k_<69(M{BMv&>5nQx0 zs>AkjfXo1C0?|;75DHBI6ra%c9ismOU8KfBTpIwC>cHt7>L&1MVW1l%pq^wmCg!pv zkYgb(gzxD9pEbn*o9_dir3Een(R={a1f?Kh4PL{`3po{<)mWAl)FK4+d_bv=s7Z6M zX%Mr(>t4a9g@953i!As)BhU;93urV5clQUcGhqup!FeB4;Dh&Bg342Hph3(D!AGDc3+l~-5ED^2%xdetm`4LjSgUUD1ejR9g1hkR}RPVq~UxeI&3e$&| zW`wsl5n%?}OUwxNE7;x8l_5m978H#jSAyEo;B`H$;JrvBuGIk7ui)}k8kDy|%Y}Hdqe{*E(2`UIYgD3TxPd z*Xn^vU09zKRH7s0WP}lzEYS28B)x(h$>ad@EoAr;dZ`s|A0itFav$UW1OFSq_qm8N zFo=R`0d~l3AXtoms)v?)&|C*u)5s2vbRx?LusO(Q7Q^RI!A(?A(86`_Y%Xj$D%8=i zh7XhrrNCt<$W73-oS@Y{;EW53Gi6Xm9e>Dz>vd2%W<0y@JA*)mWB871UG##Tc}r1vijD?OW{KV^q_j z{)SMXumqn`3NE|38Dv4}0aEUO-47epQx*kPzt|j)VmOooN?PDV2H6{C2%2*P*WuvZ zC7^4UKr1|m%?04G2C(~}ePxi(iAyk`dKQ!qnH)g7wPCd*cxr^*Se6sf2ZA~r5-8Y7 zP`v~i+hqi;#|G^*gEV#Eo8G`f3#{OV6?Ox#i-N-nntmW>8G}!*12x)+tT{k&h&a~~ z)DK}m%s7DN;h@W>ko}0vhPn$WnS z;1&y{E(3WR+~)@MlEFP7&_V5xl%zu-O#Y!(ut0z3xD2&%Wu!7GLQ!97P)&~gdTp{d%8qROVAAxcma)D+}A z&}M(oY_;jG~IRpv?iI#-iq+14u=UMPacDb_OZ|Djgvkq_Fr0RVji84s}rc zGBAMMDb8Td;LpGSwjDH5WD0VIEF)+qyQ#6LxHdD~@y4L5qSV0)RzYqAxfYbIMU6$3 z@wpOVHDMOmaWG}D@CNlS!DkSHtOl(~2CZrW4ZVR!ML=6tKu&;7+re~Wr$J^S+C|`9 z4xlR+A*-c8>u@1UlNpU=nL#ZiVwOI@8%UtE0dXs6Y)YF6G=9nk>HsqlGcpA)pO`>* zB7kPHKI;cWrDV#tCm1*Ake%p$P6S5D!-7puz41Ec!S1k!Oa0S(4k|p&~QT5ft?L*OM(Id zJnsWqL&;zWc8xKpWM+dc7zdqB3_7V8K2}61!GUdKVt}|4)Lw_|%>(xpx!|UNRUrsS zdk4IK6*P0s0C9t{EIZh0ggRsv*bYQ|FoVYeK#f(%QJ>)J#*x+IV?*qRra#c^6==OV zXv~G(SQOk*#2Kj=rhsKm~R$1~jJ7+z9H?q4*e7vVhlTfx`|o z(g>O(0*4@zsWs@d2U*ZfCya7A=o&mm@26W~Y z5Oiz^)|;Sl84YnW)Q_MN8eC#9!LGx^2q>K9 zfa_7PIg;Sh!c2{AA$@o@*o-MQt)L_f@)fAegv`Z&nlPXNa!|hv*K`NOBxJpyd2LYa zfL0`c2CqSB7H2$xv?IkWd~F42K?Acf`0_Vw{Y#KG2nM+r;a}Js4Krj&7}xe-cwGzf zD>yxY%5~5@GpJn070^iWBMPchz~_mv8p|>&gW8(LuuaqucOjABWQOWac=&=UY{>8Sn%^`LO<&%^X5OaxSxK>J{zI}gFNFzEJj@b)~Ahry@7fI}Ci1wlhv{qS@N z*{cW|!2|VJi619`+7C)2+Tg^@0-~63AEpHIH@I8?=ReRs7SI|7&=Ne*hIkutIxVOUfTS649~|6PR|JjNfVNbF zYdI#+N-^c(;t(1ZYJL<@9kJKQ~(40OH5pf(k#rOyNj zS^Px>#6RG$1+BLRg)OMs2lu4$P0k~^1KOSfn*qAl9aLU{N;y#V2Wr}Z?)w5C5C9$7 zMbZjgDF!JZ;AsoiSAZNS3%ZFNUrz%uKMdZ#s0=zYQ&F24a&iagI1=cRBJk7}Gg71= zy8|a1sVoJhSz8uR8xgc!1vG(yvkZrfqkzV-z&wYN3R~ zk%;gI_bF7tH8*I;6tsj6wE94s5p?`E=rCx=raxp?;V={8Tu9zSN#Edd54^Jkw4IX? zJc)-lfrCtfq;YV&0=mu?Tswi>28shvznZ|=;1HL9J2EJBBj{dM$kkSexgU^?NEp5R z0);aubc|)8>*$bs^~gbkWCnaX9VN~{dlJFDa?qLJjNp|`poFO`%Oq%uHYks57UWPb zq;w6g2S6*zAO$Lc-~{;x5eDGA4qkNxjt|fUs<`|Bas!I{Atxh%@&zcRKnp7(%N&Sd zhI<))AowFf=|ueR_ri z4E*46VNf{(I^Y15x}ixINfT&Y9OzC@2c`p{Tfv~U9@sh1{Rk}oLGlgEppu;(Jl_Id z3j|s}4&R^wT5xaxx@#7!7nDyy`u-mPuk~O6jZ`*(6)-S^#2Fmm=D|$^&D?N-`}%mJvU3BsU>Fi<0w6|%PpDdIuKV8bw@q4#fr+z-0rPL@HF!5DNNj;gV! zHnXWU6J&T;mI=I56Ewo93TkPC>t`lbP_Kj;boYrh=$KWAH6Xhon;szk{twz}0Fgo> zL8_3rU@yb-B_rtmGtep|Q)5x&lnPl{1{!aM)j!}dcF?{Seg^QaThQqqs5(HF8~_^+ z8KVJ(BLir^Dr6l7Y}_0)@()gj{|_)YFo5nbWe|m|Uj!}00~rFtpg4!j9fR8cpwsoi zD|JAl=-{IxKznMe8D&|u89|{XDhz5Xf=*i`P}{(ahXfjo2Rg&}KWsfKcy0#N`eudY zb#Mm_bWR=goHC41MVN!k0@VZmL2I5GK84rS{7tm-B=!^nWV^PprM^^BNA~W*xXi!3ec?rDF6XYhy7JejQFcUH~3@$I& zL38Kebz-1237NA7op;3`ZfYzFnpy^p^npqc&=q#J%%E8pSyn|*y9>0C2jl={&}B`K zECV}>0+ilCB^$^WU<(Nm-~tI$H$c{TLFVv5d;7q%3bt%WaSHMkF5^IDC&)kGFhkwz z3|guRF$@%)M4dSavjq~b;Jy^7EuaaSnPLRBU~NI=7g84l(z`>?4lrZTX^2Nac@x}D z0mlJoy(Fk%%L;BPgF+bG`T}{XncW{0aTlScC3MR{n|1>&eJ!RWdx-< z$W51^tRl+@y518!xC$ymn7|E47DZ)S(DFafsh_6CqKpg<|3D{Hfolk`jS$v9uuGt+ z5_Db%cy}O30VIWjSST2BKog?92JSlxf~U(ssSz|f1v-ojV{I)YL!lT2=0Iu{aJ>wQ zXlVNl+O|gAVFN20z|IA0#6v*q9B_I8t?UG?>qMFiU{i#xKZGV2m>cjI36TPoH=wk_ z1lj8cFTp^aV{i|K8I*MlLHpwwAtS^%-3zrEBo9f0pmrnU0r0vDcp73;2Av;h3MwB# z2^?jt9HbNCDy$?t48UbAc>M+VbaK#cFVIjPC=4KD+uBT^I!zYVp(Z*oKye1nm*6-9 z_2)pNvf!RnJ16jUOC z??lI(j)kOUP;(qds)hHvz&Q+>Z^7vUw6++uPZttrwxC6&%A&&HHBq1i{NQWk7(t^J zAUi-9657z{197ldARrm=86R*zg6d6u2GGetP=7LkT3Sq?E|ak=G~s}<4k$~5Vw)M% zC^Hs?G;GmB6YS3e4xmg8vI&ln+yxhd-AN2C^A#Bwz`L0kjb%ak6_RpUkZKQvACU|I zF+tfAQ5QnWCeTcmI_S)2ad7w{$|cb9MrfS~ngj>=2dP9l06U}vTJS)*U{AseA+Q%g z7NcWWegXRjv{D(KUs$xk`|%h-83q(*Fr8q7VH|WC?rDPKV? z2}qd+@&X5>Qwz%EXr@4lH%MuUCI#U_7I7l-3uqPtv;hNjtOjTU2B-lJUbPEq`C;9t z1~CVfgt{GCc0kS^0`F^wtZ=br1SK&Rkb6N(P9Q}RS_I<>8$_jqDDUB8i=a?pHU>?> zfZA+$Oo6xZbrV8ij{ zK=3+$P#y%|I}O@jZppv^N~fU3(V*rI=$KYz(1I9nwg8>e32G^WS815SrZ2!doWWMX z3D8b!Ecp*E4`#sK2#O~xVF)@~6I2*Ok`=_8V2#)baG4Hm0}3*LR!+jxJILM4pfm)o zEFcL9#XJ-aQYis0qo8#fFLVbxX#NvCehgld1sXU3ZO(wCAX8%q4JwvU%tUrFauS2~ zML~H>mI0DNbs0cAf1vY@pzsH6zf*>p45L9dARB~i0R|gcA);>$u3KO?TtH8G0rlcp zK)bl%Yc!Gdq8JSIAEaLj4R=un@aX}dvvxqK2im;=b$&qe_Tcl{nJ_CTs7VOZ;aLm3 zj{syg6L=3icyFjEc#jg~1R?^ha*&A#vp_sd3~@iG0|CC17e21b4B8sN2yUW-j&TCF z0+=9U4VdG*n8qTBKwJPB6NKh9UC?*~bd?-vS_+;njiFl-VOv44EgHlKE+o6aOr$6S z_j?<_bpiZdB+%G7lQHyaT2Mj7gjB(S41hQo#6rcOdS zP4K!EWFGjeO0apL{v&9lN0R~EcLXJH$chDU&k>X;Ss}9s;La)BWq54>wZf3g1<-kA z45FYuu&J^vxC0;xDi&;6(S|%g)htpd!YqTO6@~_A-r;5duT})P71DhMx#j?<>k8Tg z3mPYL0N_37pN8kk9LBT!wg3Ybx1u9Eqkc5XA)eGgToqhHwLJ@0heQ- zvsXpo;|rh>Mo@-DI1RyqITb{MoeK_IkQ>2g4nbSFY$UFC1?gvUU;xdHL-#Ksl^vk= z9&|kkc6Wf>0vRO(vp{JIJXQs6cMCJXdm)sKqd?sVN_9Px zv~d)Crh?;@_Twl_4h-PaOWBoW*+JDXc&H4#_zv94MQR?v{7VXr9yXx4HCfX4#)HEG zoW?;TAkYy3_)|)dKuBbR|M}@hjebR543ZS>r4qd*B5UuE+#6??7#9XkG;Gn}OvST;nVtgK=Td zcpo(X4aqSUsM{euSbfmyQR2r~aD@p!(3;r=W8VK<6?WGcYiM zPI?C2JO(}o9#pw9sVjqyCIpRnf<_fUyL&(@BFsT@pvh)LhKGmP0q`y)WYQXCsvlu=A9`?U-RVz5*Uo1Ks-ts!@@~ zSHS%vWzdRPS(XOSvJgnPU?Y(N5msk_!wNdi0*V2oHXo?lhHsn&-3CM%3(CHrR03L; z32v`Lu1f;k1p5V=t&qcsgz*%pZm>y61So6}bt1G5!9SjYq#J|D04`_1=>yb< zgpQ?v`j4RT31Y@lFpNYIKx%t~`oZ9l572FWc*aq%pIV0MZ>o-MfX5LawGeo01AMXs z{J1?(s|S=x5ZMaBLh&k;176AoAL9V;a{|pwfM)VQcY(vsm4>P&M8U%kwB|||($*A& znuWOx1;sSbiZDD!lY-Sk=MbRr58k;A@-Ju&C@4*V)-0l*QUf~d2gm87U?Y*|1HtDO zLE6di5j0Tfg0?XzBi7R}q78q5SAjteErJ<|N<*g1L2D$SB_f{h%)xsvL8Hzf z+n{L}v^NTThCidSC}a-~D6?YNhsQQZjSFr~LE-}3HUr&3D-Sv)2C+H>7Usu{?{Kd9DZ1uZtfW&lhKY7oL4RnUq%P(8s086^b|sWHhi zGJ_VTA}vOQ8h|SwL!?38MM}${lnkEH1?{ncq-OBGH_)^R${_&|-4GHfT|flD1JVx?hvYwk_JZdu7(r{e)fqr*yj-DUYV69k?BKY9ZWe$lP_Q4t<+30HXq^-2>;z-TcsOXe13Rb`CeTSj z1TNSI$n79d8yGY;4vi}|@Zc*eQD#ER0YqH{avx}91H5Y-Qp+jJvO_Zh(N2Up7F5?=NIkhAqG&)oiGl(0Ty0S40_F6M#3wg6jZ5@Uj}1D==tK2*L*Rkjhz* zS)eu<_~dam(9tuXFcbuph_KCJSaLkrFeEFW?t_Zg z3ALcMC#qi|GkmCSf$-4Uo{)P%z~?K2c1nQO*g)2hfR<>1oQc(Jh*2mc!d!S*LhBPj z&>=Ti-Hl=ZIQu~hIW!5-`g_nCTkt$Fs4WhjjR%>F-OXs)K_jQINJEkW)mPB)1*IiW zE{B|jF3XO;K>n z9JC1oX%T>(041=5FjxlEcmlU|!C?*B^8q?d0bBxtc8h`Y87Q$C%Q6vdHmIG6s0Ts) zC(vFgSq5!zeGJ}%0;=^u1%fcNYy{O3pkv65W!XTBuR%+z!F2;7OhIXnK+hBGAvgg# z41^sN0noV&kQ+cZ4S;H6G&g{32j5i!>iU8XUc})BP+;L%lL)bzu>ll{ph;U$8w512 z0y@`@NWYtcj?V(e6{r~iN>!lB57ah+&vrs=!ApW`BC`FC)eXdY9ngY5fe0UH56B$o}Q35PN0`q@!?i^v5k%p_zQI-Uw18;0DyVa+TH zy$=C&>=NYiLTyIqskg{l@w1WIE}*eWSPu>|y9vE!4b(}5n}WTd21z4DA7l(36kgyq z26!bXsQm)DVH0%E7wFV5MrBdR3PEr!3o-(XvDS=`sT+v7pfa18fdMq)0a^hHzV8Rr z-2@-b3LQrhHq~YXUDkozRREigoj`IsD9by5auBExJ;2leUKs^C{T{UE0kjwx0SoB@Zggh9JRO~IXScrwK6EpXirw;Ad)gniIB)5jZQNOr3=FV1M#_u0 zVi>${6A@+5#x#m6;2bO-hT6#l8Xt$u4;q5X8_*EED4rYJ4MAlABVrB%Yz4%(#CaB4 z4nXU5B!5C?9Y8yTKU0+ z0N;fOE)PKcK}GQWAf}MsFtp@B_Z}p(AlU^eejq`KBn)Gs`wyCKz;=SlAkazzQ0V|I zg>d^5W-+Qw5ZkepMo8%uWG8e?2|O2t(*8%CUqNlDgUdZ6AHX~XY3G6bfZBe9&0HWR zg_yxL6HFhNhBz6_gcFcKU#L5w?MFq>$waV$c~IE}n*RY!X@Rzj!P|7G!2vfAlL7G= zs8IkiAJJ|Etv$h*%YrzYBugM(fRK1SOnDN zgxCGxGq)gPt)NrIK?9DU(M(W#lo9H9Vhx8l8I)N-;SbK|;I`W2$Emm?RL<-0eCC$rC&S^1 zDag1hmP6`5?#6~8F$F2RKz2ae>!4fdar+70sKxCGB)gFP1J0|UG7{XT1lX-hj@uHx?z*OwiCG$TYA! z;o$)rlLDK`21zdK;AR{v(nvkHt_1lCeK;7A z4nT1v4XV|^=>WQ7iUYFx3hExPDTI?6+)Qx&3%Y>_>^@MegXW2#M<^0!CfF=ceqd%` zkOZG01zvH6X!wBE6p>UF!tDhyKnWG4O()6#uGv8)BedRyI+t`iAnhJdpAI@k0}5Tp z7>za~Ql}B@1Mu==&V1g&tO zc^b(-kZ~Cd|A4YFDPuB7K7#rO7H&+Sya$>sL@f!Sej&piNVI@bJ7~TERE2=z1vCzW z;R|qofy6NwOrM~P!GPigwVs0dgiO1jzJb{R?bB<6&cgu3JhUX|gk)pVstY8aI50X`~fl_I(84Pmq7dCj3GT9Q0am08{`5Gds&I%2M7n` z6J&cpDFL*?2|9WWvIjN4fYKO5D~Kd$56CAV^TFW+zB^JD+;c-Jw?KyWxt}CEAjh15GB&iF0=XZWzajMoBy89rnS%6!9p(uT4T=aSXw*409wHdOV3b$Kq3vidIdE63-bYt1{;E#fcgXK2k`tSs3ieQ z&(IKu*a2R0OM)FxKOoE|^^(B=?hK z2gC<3vzZyd;cv+RHXD|@A!b9vAFbRX+7qzW10+Gg;=6$X6c?Z~PLWbS#6D=P+JEr6~Q$SG8d9=z;hd*askxq#<)WQR5pN; zB-~JZ3}{jZnF}p%K`9*+0-$uji0oEb4w%V^Gzeya3EY;ztbmol$m7kRxi0X^Ey((L zWyDew{2>8xFCzoEJm-YKV$O*2?i4CWcjC?=tBK-)kd zV~z0if-ALPA8jV&Y{&vou$#ek2c$o3sw@gFupmVhXycSEXaNmqLq&NCO~6(pacQ(6NY0PKyd>u>lq+t zwxj7YMef>yOn_m~SR%B|0S+6`colR{E2OUhyI>j;I52H^Xi%dZTqol<4-znV%z;UP z>R@=g4s0f<>;mO>aJG?!-g1swf@29Fn0X)?WG1LYM7R^DnTRGFUNa#kf+CL-5f-a*1t#<_-=?}6HRLOzXK!OJCAfw`t6a;cR zJ`5Sd2CD$wPypRm4O;(7o;yHpA>AEFu7Hgr!OJ^P`wU-+2bwToG&M%{F6=;6u(z-i zpi~SBdqml%4m!KW7-|!EWh83J3Ms)+t-)?KLKIZ*K=T;bKeV$0xm*G7iiej~V6U)3 zmw|(l2h4dGsS`~A?07_a2bB+?`%&N}3pC&%x*#OXXfO>6VrcmfDw_mB`_PO*m-WiB z8jFH<1~Qt0)nX7}%OQ0uw0t66FL*2(DgUFjk!7JhM@T~n;sN|EEu=LV;B*5u8?$7A zq!oyf7+ymYfcTW!=5c`5AA`?!2Cbmy2d}^Zjr?1JZfyo-Qe#ojE);M>3wOx^N$uc3 z0Wa+aA9)D&7MMWu2@)5Qp&1w$IB=A0pk5wyRX3iJ4LrRG%G)5@K^U}j65=Q%%WyCu zZU9x};9+(KMi6uWm2#lWz-(#_ErB5`xZr9)_fvB-Ffba6YO|PHGeJxNTLEe*fV~6i z2{SS<5;m)W(Sd;%Viv2ZH8aQnut^{S!~vHL(EBRHLFJFQEtjz@mok_{&Z{5|1Tn~M zpmi(`44`{8KzElhK)04b!x1^sz>x|*ca^aLe7`Q}78vl(6!s=xDM1yXHJ^*(H#5_n@z(}HcP}`6JbT1I- z78S7XKn+cZ`4Dp22!1cwVW&OtM< z;I=!I0Nto5stmdqR#_HQE}&^e<3i(y0d!w_0|Pe$gE{CVWY9UD{ zP(}e&{Ag~34;(|*Tfw(rgWL{Ys|UU#9n{{igzPhdxy>BBG75BRt1Rd~LeNY)XwL!2 zYEY919@^jodl^9oC@GsNgKl^L7ZaGSAWj4vWFWVJ>pgIt4cZ3{yOqe)7!<^yBW*zL zfz0f)Kn@Fr1UV75fa4!TK<)zu?LY)=yN6t=gVZMi*#P!2Xz?D{U1)~Gi!U^B&|VEt zx(A<42)+RfdZ#<|5-?DRfiPlx0nGq77j}j;I6XkxyP!H0bRU5+==LPYLPpRjP@sLB zpv6y&=Ah%kp%`usUd92~oIc3i(0l6MCuu+7ZThO$N2^z~}CO-48i? z50pDV6}~8Fl@=39aDxwm2H$mz&k~%W4vJC+sQbaA>getVch^PnyBI19t{0$j2s+yq zaz2AKXzwB`p#cg|xdC1;4ssB9e2J3*w5J)odk%8=y}B}ZxvMB-JOwncWeU2)9+W7M zE@p$e1t$fHFQ^^R{vYTzNl>}~uSQe`83#H-0d(jfw)Bf>Fr*F!l~qg*pb=9==sh&7 z;KLK3r-FdCr?Mf{%9zIB5&`9Fa61c}uOX`g!H1cF+-wWFq=yB3<~V2#A|uA#EjUaC zRpTHjh}-`k0FRr3#<0MPy+9e54V06i>-G@4o*}nT!SA*N89@RD)mPB;0lI4lyw@1i zU6Ex3-v~t7u^XVxk)W`FlzE`DA3(F-=Ag6dlx0DEda$XW-BgUM;QI}kU>DIKEnW>_t)p6N0Q|hNf3g zeFIsO4$c*z_OLc1I2C~U)t~|mav?crhyc=1f*6CXkcW$bEQPKa0fnI`ct4aiXm<@0 z=n!2{B?&sj!dMn`m!YyO3+Ns?MpJWT(3K0aprJ&_t^rtrg4jqj30ac`YOOJW+ML>; zy_@E?ETB7=lw}#kwOMRAtXX9_)QxS~w3%hutie$ScROq^0}_qO#NiH58Nk@U2llR$cr@;aztX3L_@B+Ft9x$nnR*_O?kMV1XzkbuG#u8~*< zD1AZly8|O=ov|wDMlNQsq0HLgvfr8!wt^PJ0_329SO`%9X@^475$JqA24ig|@cqr8 zc}^B%QP2exAafC^6Wu6C6#_B>QeQZL$Lwu6lw~=TZ8@!(WI54wKpcRB1cf6b1H%DE z@Gf3Z--Zb`f(iPHH}iw~-=LNi{HQ!-Sw_qX1<87lTVde{Geekx0o@ExMu9mG zSvUC1b8xu=Z|8&WUekdy+_1;$YCfY~4dcxY~FAzqz2x6(A`s@=Cd{UCRkAErp<_G7J{q?>jRB8L&6-Q4`i!2B&{$(Ph^5qNSdH}5v^)S zIDpCrklSIQAPu=^j2$vkWv*-rURjK}!46^^#C!+|aTmCs2t7Ll$xKinAcY5r3mTaQ z1u?`VI0-QfLV^+~wEhC!qXF_YxStBr4#N?EiE?6^`1>X+^8%;;ez@StCu^yR(M=(5Y!FQ{I+L55< z3q%_13Q&lF@;fLV!D_(6G2m1Vk%w9UDiB=odLhsWn~-2Y(h6ll>Modi=r}8=Aqrg;j!Pd@ zJA#755qLaQm;oH~;Oo&qK?-h;Aw@Wnnb3US0M^G3zPUsmrdt%U77bEFv4aOgKuHzJ zAV^gNH4aLFixgNmK+FZzrjT1Its(d7B9{ip(TL;+c?Je^G(Dipc|mPh(BKim-w+nu zatIfm9>M+s*>4JJwb?RSvw&8mFe2}WM$!t-Ll8GJgYV=7xdK#{f~sI>O=_ym1Zn|- z41%x?Hx=zrczmOZG zKx0BM8zD53Q4j$KXc-A^$Aan#(49Hp{YjuXM^G6r2ul0Rpa!irsImu*a)7E|Sw@Jz z(FVRi84xsS4Yml>yMkH+YTv-U1o1lqxG$;+8aoB0YfyR22tNG{riCC4H3yuhl%e$l z`1%RZo$;Vun&2@>(9R2jMma$98+g2gmqDF@0n|rf0mTOB3P#X%bl{#0IPZY-jWOuR zR=Af4S^x`YQ27R_|3w*;89+09;0y#R*+4t7VZmx{3+_3I8p|>(f@VI!BPh^&#URNG z(q#hM3u>dl1{uKu=mgSS1ZZp%bkd6?189FKcuWh_DFYYDkQfD3CyJm=EFceyLi0B$ zp+oF#09y>HUO@JMV;aOj!eB92T4jKSsWwWOg08#*t>s{{W(2K(01ZwlgAd~-K1jh9 z!tQhdg)8KIbx<1*bjO(?gE@+gpfU$JckDoGe`F)vJ1d|29K*EdLZH`A3LZ;0_Ep(SZ8XqJ+(Y z_x~Yb1X|Cb3%dUYDTO1&23mt2)TjVuB}PzX%Y;(d!W~MGf$CFee*)Alb6^1X%RsAI zkp?Uv|%LLA)pu6Xplx;zScFahvZX_$f7NhwY*=$gK4!YwWyxJ6$vq9-n7IgKWu`DBK zN)$Bk1UhveVg@)55HKFLb^+{mkonO45E!O2D}yGwppFL_3b6ykf@18h2ephr83Gh1 zkoF;iG5ADRP(1~jIRTjiABlq+1*X80@hI*Co%;zsF%HxNR0f}%37O5o9-LrP9N?33 zp!5N1gG1V8khASTa}CC_Ot^Z4U@t+9L8id%8i+Zd76qtBg1!?RsV1TT90iOsB zy2}=n_?f^LGlEKRCeYzBkO5GTC4@1krU$74`4^l9!SxJi{1~--0_|;r9Qh7%4oC-i z7-SD019%UDH3NgFEvGfJsj)1lHnXU?G3b0$P)TSE3t2=*i$LnYDh;v^+z$lL z%R|DMA94dFs3L-4xMv`JeaJ!wh(6HxGbaOR<_L7tB50rud^edaGbD$DOHl0D92QdG z%nB-MK#l>IXW)9A8GM603wVVxQTLl8>JU&_4%)MB4m#NxH2$Xuat0H)(gig>z^*hF z1(&?w)*iT;{f9`S=#4wD6XAh?&VcsaAms`?3_&ASp!PhdyadsZK!BJ8D3J2>pXVGk;gK;=EW zeGjTpK+QG~26fQE!;nm%4iDB81#%XO1jLVEvq5btcnJiWVPrGLyK54BCJeMa25Lux z&QXH)6c|mFL3691o$sI{LBVWxa3Ku#7RUu43~~*2437e6*#WBOAY})9HGnDjCUtOK z4eN%$R!lI0I(?)RB#?Lq4JSdu0~Y7t49y6xqd}J^fh+?RR2)$C*ximM3d=iSGokew zI30;xpIt%n?Y=0;PFG`Nhj1%m6yE0o*>x}K32Sph>kCi~ ztPP42NXwZG95F~*@EQ#=4}wACBL5FS#}4Efj2X-s7+68!2cC0dk!4plHZ`_o1(^;S zXGQWbWQ2&&s5!(IFbS$oL7@aH-=XC(xV!|H$1F%YM!>4E5RkqDG@ij@te_!ZP;7xP zR0AjoKp12bq6~tSp~4K{Ia5%X1*-Q!7{o>{NkN)H7iHr0c?f?*T^0Zh`8WMq!0D(IWT;idLfy+xoy9=~R z9dwT_G)_U89<*KuG-3@}0U`?Hz-PzE4HCGcz?~3S`3NpwH9@l(%Cbz>Orl_CFoOzN zxC_wT4>AbsF%Sb4L+TxHxPkh-;IapFw6rlOo3TO~su1HKB&u!@4-|1A8s#?mGP{WgzE#l71XvzcPscr z9nktEP=G+33L%+b3wg*HO+)nxw7mn4M^JkQ)USusvycgBMq^P>3_xZm!R|m!8VDYk z1*wCe?Ld%u;FZR(mJ_(B0I7r265#Tl5wy+}JZ}W5`am}cfW|>VijdZ$L&`wVJU3)) z9u&&3v3angKnWQ6>}s%nFah!|1M~j|&>pt`pgBTNN(1j(2bJp}3@RGH!+&6r z0TdFTy3Q0d9l-?Z*n!$j#;7MLq9j0w8Hn|>ptW+~<_dV=AGBZ!)HwjH!GU5TR>DHe z1h-+pX$91G2d$X{wLMutvvJ`451{4Ta36!TV8xL2bBOYd71Dc!#IG^v4ggtDXG+=B znnhF@bQu9?8v~Q6F=%ifZXh9Rz?LBF0NtHr3eFdxQ9N*K95j5#j6ALeHyg)n8(bce zbYNUqeg~&t=y()prUCONIzn!SnFwlfBBcRw&`JP9(1;D>_7RAi5sJ}RFxNry0kjPX zHUl#L3BFyI1JaTw=pu0bfSLg+W0j#3A6RaBLvsci7t;O*hY`4*#keT~O+B~{M6H{_ zvBnPCBaO5Bgc29fosiIVt>Cc{Cg|J-*fRXxOHkPePCsBbbHeI(W@Av|1b13Qm1UWQ z!EJ>Gl%xqZ9F2fQ3OH(!;uhL!fb{yALCsjuMZBQoZwy*P4>ARB9Kp>+3SUr(0hwbl zh7Nk+tqoDaOdhoA0@T0)m4L(t8M+yQ;Px5lLTXTHYRiVS-WOM>qlPzVjs@DMgREcz z)x+=`05LJUEcG!`VpYNW;n#&?GFV zR)n?Qajas7wgtiY2h<;yWKd^7*~tbf{~>cJ;3G3-*+9dWpwx~t!NQ$|!9Z&JgT`_} z=RbmHsv)TlM1uO>;C3CpE*!{QYypCtw=ci1I$n zm7qL~$aA1MPWZX-pg4kFk%8Yxq~aE-EP|K?nht^WZ-_Ds6ogO=avP$2f!6_Or$pm- z8)&=@#SGLk9Mprxw_RZVW2z@z&~K%}@f(4Djj~P(zN1gl;mD8IblHsO68x0Hibl z@jqyN4;%Qd3zC;jmJNzvNIm`k00T&z6*OZ68jXc`8PWCy>tRQXsDX+K zkQ$KtKzoT892h|BWEjN3eR0st4@?DE6*wM2b}$}*s1pUNLmJBi7i4hzKWTGIHktq6Liv*#W*k44kh)@eCR-0^P$0x+xem8o+2Q3ibhLzyj1? z0S*3wnyzRD!MLzO6uNF3GOx_a0BZe$M*TtO)WX+p!DsV8%e6tt5LBgtrm4VV)6DAN zgn0n8YznfH0!+dz09go)9S{?a!D68Jf|hfjy_gKp(J#>I572&DPz*CG6Buv+1utlv z9%>FV18Ds^=+;b7s6e)2F)NFzgBo0*u7$EJBWR=;?hZ5t*jZpPaO8vH9y0$zUOkF4 z&Oq4%5>+5iGJ;|Xgdswx*$nI&7y)-5@_IW^J_WTk!SiX5*n*It9Z1HqjO-vgm>_#0 z6v1P}jEoEpkoi~8;1Bv>JaXKjq;*g}2Q@C392h|JLhwC&;3ZqKpybSkq8H|B3>uW4 z!C?z-Z$a8Vp#5jyStd~K0VgfcDeKH|A7dDTDS*_j0*${>KAs15BRJ0ySNDMDRKVlb zpj-s%V}s7s0*!ou4s(RWE-0SCO*_y5KA_+t-iM3~uyveJH^FLVP@@8J;waIELE;iz zW`Sk}L47ambCBS=1L`MmOo3N!f(jdyJ#QeNpeH2E7=ns`;vaH;1Y}$jl!8IC;L!E^ zu)+&8;R)Js1qw1ywa*AD*+65G&`k{x(;$l^AZ%n35fn)4LqYdtgXXnCD=5KtErD_( zxX;1?S{Mq-DU3+*1S(b;L9^zde1dE^PBy|;2T)c4Rd%4cZt!|6P)QG35CN?nLCZ8j z~v;w=dr=*6`Yo6(+@$6V^Q8`1*aFVTS4_7tfm63 z@&&hfKxqUi_Mq1~fvPFUkQ7qDq69Yz2b3lH(vNtx$FcK=024y9wFvuv!k3NI@Qjq+6)ZL3ssqz5t5R$Q*>nVRZ>8FS0Z6 zGJy8dfo@oWuKI&4hZhGq95N&Znm7R21$8PY=R*w!Rhm#H%2+m*a5V;>HfYTx3!2;} zaHln_DFvD12G<#&RnVZ)540`|yye{%G-v=a3$&UKw7eX3xd_6yaQA_#HmESjec-eT zHXGWm0`2571~vFVJIZ8PK|TgG9Uxj@`^XTcfmsdURxu>6g5wL?ZUBwllCZW4;ug@} zTUiEU24~RPT#Q}5kXAEjA-gOKEP$YH08^wB=wl$Da#9^Mjsn>YCk)zzV#{pJ0=nN5 zk|-cq3p5gfunn|D0z8lF;D9{u4j+C+4Qr?!ps)swu9#XgiGr@F7gZJoZA1l4T!L=F zfrL524s;eg3BvkA;CKYB*kFLn;4^_ItU-tSv8fw_hI2tnoY{;~(kmfL;Ff~>X3%v~ zpnD@2%x#%LJ1C4{qgViV#F6w8q~u(Su+FUZQk51Qdp1$SUT*TjR$ zOVFxC(55L+y8|?l4PL#6WCVfAG|-|JVmXF=plN;3o>NhfgOyS4y~Jl9#GT+76L7TR+8qW8 zH9m%Q&{7R_@|O^l&B(yXpbup;F|aYXL)pv>LJTEPHVXqM!)z#V-RAv z!Qjr|&fvt5&rrhP$B@cU!oc9}?v!8Rms-NW5WtYhP{EMOki$^Lkk63EkjlUikXezM zQYEf}!ex8DXfuWv(fq?=c$3xmJ4F4NIIT#dWsF<}HoZgri zm>F0YSQ*$D*cmt&I2pJYxEXjDcp3N@_!$Hk1Q~=Fgc(E_L>a^w#2F+QBpIX_q#0xw zWEtcb9|5bQ$y*^uZo5VlZYfVK8MdV=!m1 zV6bGcVz6egVX$SeW3Xp%U~pt`VsK_~VQ^(|V{m8iVDMz{V(@10Ven<}WAJAPUcaG2p9BOAj!hE)t-8NM)lV_3wnmfaI(8-X+kjaqEkjs$6kjJoqA)ld;p#U6-r3@tuWenvEuNW#Asu(I6su^k-Y8ZAf zEM%x>sAFhgXk>W9@Qz^@BReApBPSylBR3-t!(WDfjJ%9|jQorO4F4G!7zG)H7=;-b z8ATXH8O0dI86_Ac8KoGd8D$t{8RZz|8GbPQWK>{OWK?2QW>jHRWmIESXVhTSWYl8R zX4GNSWz=KTXZXc%ozZ~NkkN?In9+pMl+ldQoY8{OlF^FMn$d>QmeG#k5yN9fdqxLF zM@A<`XGRxBS4KBRcSa9JPew0BZ$=+RUxp0~8yWo={TTxo0~v!DgBe2@Lm9&u!x?@v z{9$;)@RTuvF_JNgF`6-kF_tloF`hAjF_AHeF_|%iF_kfmF`Y4kF_STiF`F@mF_&RC zV;*BZV*z6!!!w5Gj75yaj3tbvjAe}Fj1`QPj8zQF7^@j;7;72p80#4u7#kUz7@HYe z7+V?J7~2^;7&{re7`qvJ7<(D}82cF~FivEg#5kF83gcA9X^hhuXE4rWoW(esaSr2L z#(9kM85b}vWL(6!m~jc?QpRPB%NbWNu4G)rxSDYd<66dbjO!UUFm7br#JHJp3*%PC zZH(I)cQEc`+{L(?aS!8O#(j+Y84oZXWIV)pnDGeXQO0A8#~DvBo@6}5c$)DH<5|XY zjOQ6IFkWQ5#CVzU3gcDAYmCy2TF!3_+G4V4AFbOgVF$pt?FwAEXWfEf& zXOdu&WRhZ%W|Co&Ws+l(XHsBNWKv>MW>R5NWm039&ZN$y!KBGBn@NjFn@NXBmr0LF zpUHs9kjaS2n8}36l*x?AoXLX8lF5q6n#qRAmdTFEp2>m9k;#e4naPF8mC23CoymjA zlgW$8o5_dCm&uRGpDBPTkST~Mm??xQlqrlUoGF4Sk|~NQnkj}UmMM-Yo+*JTktvBO znJI-Sl_`xWohgGUlPQZSn<vOI z=>*eBrc+F(na(hsWje=np6LS9MW#zkmzl0GU1hq)be-u2(@myZOt+ctFx_Rk$8?|R z0n^kErdLd_ncgtHWqQZ-p6LVAN2X6qpP9ZeeP#N_^quJk z(@&;fOuw1_F#Tov$Mm0>ftit+iJ6(1g_)I^jhUU9gPD_=ijl zhgp|dk6EADfZ34Qh}oFggxQqYjM<#og4vSUirJdkhS`?cj@h2sf!UGSiP@Rih1r$a zjoF>qgV~eWi`kpmhuN3ekJ+C&fH{ykh&h-!ggKNsj5(Y+f;o~oiaDA&hB=lwjyaw= zfjN;mi8+}$g*lZujX9k;gE^Bqi#eM)hdGxyk2#;YfVq&lh`E@#gt?TtjJce-g1M5p zin*G(hPjrxj=7$>fw_^niMg4%g}Ifvjk%qpFrQ^U$9$go0`o=YOU##Fu!Gf$NZl81M^4bPt2d0zc7Dg z{>J>B`3Lh)=3mUeng1~VW&X$fpM`;ik%ftcnT3Ugm4%IkorQyilZA_gn}vskmxYgo zpGAO0kVS|^m_>v|ltqk1oJE2~l0}L|nni|1mPL+5o<)I0kwu9`nMH*~l|_w3okfF1 zlSPX~n?;93mqm|7pT&U1kj03_n8k#}l*Nq2oW+90lEsR}n#G32mc@?6p2dO1k;RF{ znZBKnln5$Y-KpgvYw%d;SfVR!)k_OEE`xhvTS16%(8`L zE6X;P?JPT3cCzeZ+0C+tWiQJD9bU1Sq$%4jR%mK!WLS#Gi1X1T+1 zm*pPIeU=9-4_O|uJZ5>q@|5Kn%X5|&EH7DJvAkw^!}6Bp9m{)`4=f*9KCyge`NHy* zywfR#rAvc2*8nPF5~fZdM*vURFL< zepUfiK~^DFVO9}VQC2ZlaaIXdNmeOVX;v9lSynk#c~%8hMOGzNWmXkdRaP}tbyf{l zO;#;dZB`vtT~<9-eO3cjLslbJV^$MZQ&uxpb5;vhOI9mZYgQXpTUI+(dsYWlM^-0R zXI2+hS5`MxcUBKpPgXBhZ&n{xUsgX>f7SrjK-M7EVAc@UP}VTkaMlRcNY*IUXx13k zSk^e!c-92gMAjtMWY!ecRMs@sbk+>kOx7&cY}OpsT-H3+eAWWiLe?VIV%8GYQr0ro za@GpgO4cgYYStRoTGl$&de#QkM%E_QX4V$gR@OGwcGeEoPS!5gZq^>wUe-R=e%1-B z6WL4iG7StI4Is3W5tKHD(xy<_lHD;kF}Wx|k3A7WvpFUerIw|#C4wn-$NcpCywq&= zLSLYT{)g<$h|BRPa88-Jr z;?7Gf$S*D_$}h-BWp>R=XHLyaXZMGAnmr#vv-yL4&6W?Qc>Oa<^U@QGN^^4(OG|k3 zk$G%EV9VKxz!XmqlC?ZVNF25xu;pw;5Goj~oUIs4aR(!Uj=LDa<_SSEfTskB!xjQD zrUXo}gn**71QeyA;J9Qf1yk&y5Z|zuLTI*7uy@!>!4zv~QD$B`Ybl824Mp}7Zz(d5 zJrok+~mL^bnb0}>ArJ?3ox}Q{p$?%uM5;X7pQqIQ1e`%=D9%K;{tV$3)DR>Q1`e%!@&g_4lYpp zU7+^6K<#&d+Uo+f*A;56t0|j1IN7nKgDHq>U7@DBLQQprn(7KQ)fH-*E7UYMsA+Cc zSGqy=JqenNi5EQu=5dYo?xU5!BdRH0lUb^5aI$OLx>BE3?VKs zGK9Fm$OsaSMn({ujf@~JH!_0w-^d6O{zgVneMV4y#!!96knlG$hJ?S7F(mwrOdvip zGJ*Ka$P_AW3Kchn#D|e7BtDExq4t|X?Kg$G*9>Zp8C1U+RGm50J`1RN3#fVvsJktp z^3e2ei+A?x6%D*a0nY4Kzw9u0CAbI5yTW@Xh<5HL*>mOAz^F|@wu@%RGm4*MaJe39~hfMd|+%2 z33+34NXQ$TyRnw!=j9jkrevlTr50xvgLzzzIRzPsU?yi`UVcexPHJW%k8443W=?({ zSeV1L1S;>D4`uQA=VpQ$2w-`hP$b1%{<*2?5aoiI`6Y=ccCmu(VsT0>Nn~|T%*{?M$4tl3~M%Ae70hcXAD`v6mv;pDLd3&=7Nk&=H!e_=7Qo()_hO^^MH(lIfoyr z494eynhAC$4^$G&;R0(0Gg%5UG7Z_ld`J#7hL&i?&=SoUTA~?4OEhCQNRBXegXAP* zXxU@z22F?1vd7pBl2eS`py|>Lnl9a->Cp|E9^Kr)`Nq(|z{nWJGBt#=jNmMUtO;Dq z6wWe(v&`Wv3pfjsHw_I8%nV>+W)T0H7`VViV0Iarz|A#;n`Q_%%@A&y5!^H*xQmTo zrWhE(-Dw0j&j{{LBe=;%aFd~Bh@pXjG2CQhxXH$Fla1kFVGOs!7;c9#+zw;79ma4w zjNz^~f!kpMx5ET(hY8#c6Sy6Sa4~_~VFI_q1a5~3+zvCitIXg!%-}lA;5y9UI?Um& zGKagx9PSo#xLeHOCY!@eHiw&R4ma5xZn6d3WDB@|E#P)o!0oVr+hGB>!vb!H1>6n` zxE&U7J1pULSii*0Kx;`8Xlv2L z5>hvrSVGDK6Sz94`Ie9}!Nd|$CYV6`q9%^eJPB(T^Tlbb+Wi6+oi zq6xH>Xaa2&nm}8HCN8iLwJ?E(1hf=2ftI2s&~~AT3#2qOfwm7#pzT8wSEvtMp+0bh zl)5Ia&=7&PA5B~#tpO8Ps6DRG5QnxPO`t7E6KD(41loc$afP%FOkAP%LtB(4&=#eM z8`OR`sQu7V-vnCfn?Or_6KIRm1X}8wKudj7XnW2S+MY9ow&zTZA*~owV~D#=jUnzf zg|?YYjUh2(Y7B{KQ)5U>n;Ju6#?%<%Zc}53yG@NDF>h)NiFs2Kh`UWqAnrCbfrOi> z2_)Q1q3uaiXnWEW8b78ckZ?0Kf!c2ZwciA4zX{ZS6R7VFHU{m}NmsRh*k7Et>vp#HUhv{FpX&CDRBDu@Ls zRY5FBsS092N>vaGQU-unkdoWf+zeW`fmo1|8^nT?+#nXD#~7-`p7z`sU7%*f)pv-p!%CcXMd(-P{=x8|KcC z*f59o-p!%qvN^O|HiwqW=FoE49NK#~hxXphq2;tWw464Fwsp;+ZC!I{DQyldrOlzG zv^lhtHiwqd=Fn2w99l}7LrZCMXen(DEv3z&rL;M;ls1Q!(&o@o+8kO+n?p-!b7(1T z4lSk4p{2Arw3If7meS_XQra9^N}EGVX>({PZ4ND^&7q~VIkc2EcY}sMw5@IqEw#;| zrM5Y=t!@r&qnkt9=;m&a+~x`?Wep7=;cjRE33o#SNVppsK*HV7021zo29R(!G=PM= zp#db^4GkdSZfF1rcS8e6xEmTk!rjmS67GfukZ?CNfP}lD0VLcF4ItreXaEU!Ljy>- z8yY~u-OvCM?uG`Ca5pr7gu9^uB-{-RAmMIk0101pXVd!iL z&Uc2+koK6NGo(Fc=nQF(89G~n^PQnHq&;Tn3~7%UI$J{QcZQ7W89G~n^PQoyB{&@z zIz!rPhR%@onxQkKy=LePX|EYNJA(7Qp|c~@en)V+Gjw(Y=X*nENPEuE8Pc9JbcVF& z44onEIYVbhsQr%Md~fLN2(=&5zB6=&wC@a^A?-UuXGr_b&>7OcGjxWGA{shFMiC92 zA)|@e0IoF*T@ApsrlG3=#Qm-Y5c6CO!L^j3t0B0SG;}qD${WJuA@;dKM$-&kA){%A zu0~MxMv(AyHG+hvE2PzA=n82y8M;DRNrtYFR+6DBq*Y`H%df7GR*|7Aq*Y|-3TXuy zxM(SLv^or3A*~KWS4gYF z&=t~(Fm#2qA`D$2tq4O`NGrn76;i7kx|+MNg@cF2*vcVPICyxBtsG2ohQo$3ILl!y zP_1t03Qg~>(Dd#KO}DPlbn6ODx3181>k3V;uF&-A3Qe!B(DdpGO|P!d^y&&tuddMa z>IzM-uF&-A3Qe!B(DdpGO|P!d^y&&tuddMa>IzM-uF&-A3Qe!B(DdpGO|P!d^y&&t zuddMa>IzM-uF&-A3Qe!Bkp7CHs}nRmLDR1*H2u25(l4Z*Hgtv5(}u2)dfLzxQcoMY zLh5NlS4cf==nAQ)4P7Diw4p1co;Gxa)YFEpkb2tC6;e+dxxUT%q-aE403Fh1M6Y(E7p^T3@(A>kC(C zec=kNFI=JZg)6kaaD~G!`=mu$X8@fT-+=gzDHn*W0q|I&U25EB}x8Id=>|KNl6J zrho#@$N*AY8W}iRvZUnarL(w}7Ue@^AQ{le0ODjL14xE5GJs?>BLhfAGctf=EF%L* z#xgR1WGo{CNQN>pfMh5m14u?PGJs?xBST0YIF+|3wJaw;Ju^8mCojJQtj5?7+ypQ(hD_`jL5FpXOrarY>gdK^Qk0pPURnTF zZwe{0j7%Ykz{u3e93r0ragQl9#7vBjLe{ZGlNuVMrJ1Fti=V1DG-;MK`Ig> zGczNWRcliNS$ls z0vTyAa)FFA7`d2$%XA|b$Vh{c3pAo#AR`S%E|8H1BNxa>gOLj~*||VQ8jM^ZBMn9_ zkdX!>7f79MKsiVb&Df( zq|OmKQs-y_>5Dj;K>8w%(2+Vv=t!L-bfnJF1X8;=nm}q7N9f3%BXs1>(FD>LaWsMS zMI22aeGx|!Hy2Q@bTonVMI22aeGx}aVVn=gGA?;{x0d5;R znnPw*-Q3(<*h&ozEKLj`lp%yNf>6c~$^=50LMSr`We%Y%Ae1G9a)eM$5Xu=sL2Yn_ z@Z7+ZDa1Zgh<&CI`%EGBnL_L{h1h2bvCkA@pDDyXQ;2=05c^Ca_L+k01J#pkrG{>X zMj(sajLku&xS5!P9N}i-3^Lly#1%?`fE?jw<_I#y&B6d=k(-49$Ralj z1CT{-76wj`tqY9*|AY4|KzMu%V$hSnK|38lJF`I;BnPI?*e*H`;+&|^b_CJS<`?q; E0P)7Z?EnA( literal 0 HcmV?d00001 diff --git a/Resources/Rooms.json b/Resources/Rooms.json index 04baad9..1eddacd 100644 --- a/Resources/Rooms.json +++ b/Resources/Rooms.json @@ -1,101 +1,101 @@ [ - [ - { - "description": "First Test Room", - "exits": [ + [ { - "dir": 1, - "exitID": 0, - "isLocked": false + "description": "First Test Room", + "exits": [ + { + "dir": 1, + "exitID": 0, + "isLocked": false + }, + { + "dir": 2, + "exitID": 1, + "isLocked": false + } + ], + "id": 0, + "name": "Test Room 1", + "scenery": [ + { + "canTake": false, + "description": "A Grey Rock", + "id": 0, + "keywords": [ + "Rock" + ], + "name": "Rock", + "roomIdItBelongsTo": 0, + "type": 1 + } + ] }, { - "dir": 2, - "exitID": 1, - "isLocked": false + "description": "A court yard", + "exits": [ + { + "dir": 3, + "exitID": 2, + "isLocked": false + }, + { + "dir": 2, + "exitID": 3, + "isLocked": false + }, + { + "dir": 1, + "exitID": 4, + "isLocked": false + } + ], + "id": 1, + "name": "Test Room 2", + "scenery": [ + { + "canTake": false, + "description": "A fine looking Tree stands in the courtyard", + "id": 1, + "keywords": [ + "Tree" + ], + "name": "Tree", + "roomIdItBelongsTo": 1, + "type": 1 + } + ] } - ], - "id": 0, - "name": "Test Room 1", - "scenery": [ + ], + [ { - "canTake": false, - "description": "A Grey Rock", - "id": 0, - "keywords": [ - "Rock" - ], - "name": "Rock", - "roomIdItBelongsTo": 0, - "type": 1 + "description": "You can hear the sound of a waterfall nearby", + "exits": [ + { + "dir": 0, + "exitID": 5, + "isLocked": false + }, + { + "dir": 2, + "exitID": 6, + "isLocked": false + } + ], + "id": 3, + "name": "Test Room 3", + "scenery": [ + { + "canTake": false, + "description": "A fine waterfall on a cliff", + "id": 3, + "keywords": [ + "Waterfall" + ], + "name": "Waterfall", + "roomIdItBelongsTo": 3, + "type": 1 + } + ] } - ] - }, - { - "description": "A court yard", - "exits": [ - { - "dir": 3, - "exitID": 2, - "isLocked": false - }, - { - "dir": 2, - "exitID": 3, - "isLocked": false - }, - { - "dir": 1, - "exitID": 4, - "isLocked": false - } - ], - "id": 1, - "name": "Test Room 2", - "scenery": [ - { - "canTake": false, - "description": "A fine looking Tree stands in the courtyard", - "id": 1, - "keywords": [ - "Tree" - ], - "name": "Tree", - "roomIdItBelongsTo": 1, - "type": 1 - } - ] - } - ], - [ - { - "description": "You can hear the sound of a waterfall nearby", - "exits": [ - { - "dir": 0, - "exitID": 5, - "isLocked": false - }, - { - "dir": 2, - "exitID": 6, - "isLocked": false - } - ], - "id": 3, - "name": "Test Room 3", - "scenery": [ - { - "canTake": false, - "description": "A fine waterfall on a cliff", - "id": 3, - "keywords": [ - "Waterfall" - ], - "name": "Waterfall", - "roomIdItBelongsTo": 3, - "type": 1 - } - ] - } - ] + ] ] diff --git a/main.cpp b/main.cpp index 340a362..30bd6ba 100644 --- a/main.cpp +++ b/main.cpp @@ -1,16 +1,21 @@ +#include +#include +#include +#include +#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */ + #include #include #include #include #include #include +#include "fileCommon.h" #include "game.h" +#include "window.h" -/* We will use this renderer to draw into this window every frame. */ -static SDL_Window *window = nullptr; -static SDL_Renderer *renderer = nullptr; -static int width = 800, height = 600; -static Game game; +Game game; +Window window; void EditRooms() { @@ -47,78 +52,79 @@ void EditRooms() { {{3, "Waterfall", "A fine waterfall on a cliff", {"Waterfall"}, ObjectType::SCENERY, false, 3}}}}}; nlohmann::json j(roomDat); - - std::fstream outFile(absolute(path), std::fstream::in | std::fstream::out | std::fstream::app); - outFile << std::setw(4) << j << std::endl; - - outFile.close(); + SaveJsonFile(path, j); } -int Init() -{ +SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) { if (SDL_Init(SDL_INIT_VIDEO) == false) { SDL_Log("SDL could not initialize! SDL error: %s\n", SDL_GetError()); } - TTF_Init(); + SDL_AppResult result = window.CreateWindow(600, 800); - window = SDL_CreateWindow("Text Adventure", width, height, 0); - - if (window == nullptr) { - SDL_Log("SDL_CreateWindow Error: %s\n", SDL_GetError()); - SDL_Quit(); - return -1; + if (result != SDL_APP_CONTINUE) { + return result; } - renderer = SDL_CreateRenderer(window, nullptr); - if (renderer == nullptr) { - SDL_Log("SDL_CreateRenderer Error: %s\n", SDL_GetError()); - SDL_Quit(); - return -1; + if (!TTF_Init()) { + SDL_Log("Couldn't initialize SDL_ttf: %s\n", SDL_GetError()); + return SDL_APP_FAILURE; } + if (!game) { game.Init(); Game::SetGameInstance(&game); - } - else { + game.SetIsActive(true); + SDL_StartTextInput(window.GetWindow()); + } else { printf("Game Initalization failed! \n"); - return -1; + return SDL_APP_FAILURE; } - return 1; + return SDL_APP_CONTINUE; } +SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) { + if (event->type == SDL_EVENT_QUIT || !game.GetIsActive()) { + return SDL_APP_SUCCESS; /* end the program, reporting success to the OS. */ + } -int main(int argc, char *argv[]) { - - SDL_Event e; - - game.SetIsActive(Init()); - - while (game.GetIsActive()) { - while (SDL_PollEvent(&e)) { - if (e.type == SDL_EVENT_QUIT) { - game.SetIsActive(false); - } + if (event->type == SDL_EVENT_KEY_DOWN) { + if (event->key.key == SDLK_ESCAPE) { + SDL_StopTextInput(window.GetWindow()); + game.SetIsActive(false); } - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Set render draw color to black - SDL_RenderClear(renderer); // Clear the renderer - - SDL_RenderPresent(renderer); // Render the screen - - //game.Run(); - + if (event->key.key == SDLK_RETURN) { + SDL_StopTextInput(window.GetWindow()); + } } - return 0; + + if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { + window.Resize(event->window.data1, event->window.data2); + } + + return SDL_APP_CONTINUE; } +SDL_AppResult SDL_AppIterate(void *appstate) { + if (game.GetIsActive()) { -void Close() -{ - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); -} \ No newline at end of file + SDL_SetRenderDrawColor(window.GetRenderer(), 0, 0, 0, 255); // Set render draw color to black + SDL_RenderClear(window.GetRenderer()); // Clear the renderer + SDL_RenderPresent(window.GetRenderer()); // Render the screen + + // game.Run(); + } + + return SDL_APP_CONTINUE; +} + +void SDL_AppQuit(void *appstate, SDL_AppResult result) { + if (result == SDL_APP_SUCCESS) { + window.Close(); + SDL_Quit(); + } +} diff --git a/ui/window.cpp b/ui/window.cpp new file mode 100644 index 0000000..02e2c74 --- /dev/null +++ b/ui/window.cpp @@ -0,0 +1,40 @@ +#include "window.h" +#include +#include +#include + + +SDL_AppResult Window::CreateWindow(int height, int width) { + w = width; + h = height; + + SDL_SetHint(SDL_HINT_MAIN_CALLBACK_RATE, "60"); + + window = SDL_CreateWindow("Text Adventure", width, height, SDL_WINDOW_RESIZABLE); + + if (window == nullptr) { + SDL_Log("SDL_CreateWindow Error: %s\n", SDL_GetError()); + SDL_Quit(); + return SDL_APP_FAILURE; + } + + renderer = SDL_CreateRenderer(window, nullptr); + if (renderer == nullptr) { + SDL_Log("SDL_CreateRenderer Error: %s\n", SDL_GetError()); + SDL_Quit(); + return SDL_APP_FAILURE; + } + + return SDL_APP_CONTINUE; +} + +void Window::Resize(int width, int height) { + w = width; + h = height; + SDL_SetWindowSize(window, w, h); +} + +void Window::Close() { + SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); +} diff --git a/ui/window.h b/ui/window.h new file mode 100644 index 0000000..2fcc62a --- /dev/null +++ b/ui/window.h @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +class Window { +private: + SDL_Window *window = nullptr; + SDL_Renderer *renderer = nullptr; + int w, h; + +public: + SDL_AppResult CreateWindow(int w, int h); + void Resize(int w, int h); + void Close(); + + SDL_Window *GetWindow() { return window; } + SDL_Renderer *GetRenderer() { return renderer; } +}; + + +extern Window window;