From 71a2c83e5ab2b8ef396c2da21e40456477843b7b Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Thu, 12 Jun 2025 15:43:58 -0500 Subject: [PATCH] Add GUI Support --- .onedev-buildspec.yml | 2 +- CMakeLists.txt | 49 ++- README.md | 6 +- apps/guilayouttester.cpp | 75 ++++ apps/tanonydrop.cpp | 94 +++++ examples/sdl2.cpp | 97 ++++- font/Mono/README.md | 8 + font/Mono/aardvark-fixed-regular.ttf | Bin 0 -> 399304 bytes font/NonMono/License-OFL.txt | 95 +++++ font/NonMono/TanoheSans-Regular.ttf | Bin 0 -> 128040 bytes include/TessesFramework/Common.hpp | 11 + include/TessesFramework/Http/HttpUtils.hpp | 1 + include/TessesFramework/SDL2/FontCache.hpp | 16 +- include/TessesFramework/SDL2/GUI.hpp | 244 ++++++++++++ include/TessesFramework/SDL2/ParseColor.hpp | 12 + include/TessesFramework/SDL2/Stream.hpp | 9 + .../SDL2/Views/AbsoluteView.hpp | 33 ++ .../TessesFramework/SDL2/Views/ButtonView.hpp | 18 + .../TessesFramework/SDL2/Views/CheckView.hpp | 25 ++ .../TessesFramework/SDL2/Views/LabelView.hpp | 15 + .../SDL2/Views/ProgressView.hpp | 17 + .../SDL2/Views/TextListView.hpp | 20 + .../TessesFramework/Serialization/Json.hpp | 59 ++- .../TessesFramework/Streams/NetworkStream.hpp | 9 +- include/TessesFramework/Streams/PtyStream.hpp | 29 ++ include/TessesFramework/TessesFramework.hpp | 8 +- .../TextStreams/StdIOReader.hpp | 13 + .../TextStreams/StdIOWriter.hpp | 15 + .../TextStreams/StreamReader.hpp | 1 + .../TextStreams/StringReader.hpp | 15 + .../TextStreams/StringWriter.hpp | 15 + .../TextStreams/TextReader.hpp | 1 + .../TextStreams/TextWriter.hpp | 61 ++- src/Date/Date.cpp | 28 +- src/Http/ContentDisposition.cpp | 4 + src/Http/FileServer.cpp | 2 +- src/Http/HttpServer.cpp | 18 +- src/Http/HttpUtils.cpp | 62 +++ src/SDL2/FontCache.cpp | 235 ++++++++++- src/SDL2/GUI.cpp | 231 +++++++++++ src/SDL2/GUIWindow.cpp | 367 ++++++++++++++++++ src/SDL2/Stream.cpp | 77 ++++ src/SDL2/View.cpp | 173 +++++++++ src/SDL2/Views/AbsoluteView.cpp | 109 ++++++ src/SDL2/Views/ButtonView.cpp | 77 ++++ src/SDL2/Views/CheckView.cpp | 122 ++++++ src/SDL2/Views/LabelView.cpp | 20 + src/SDL2/Views/ProgressView.cpp | 39 ++ src/SDL2/Views/TextListView.cpp | 140 +++++++ src/Streams/NetworkStream.cpp | 58 ++- src/Streams/PtyStream.cpp | 132 +++++++ src/TF_Init.cpp | 16 + src/TextStreams/StdIOReader.cpp | 36 ++ src/TextStreams/StdIOWriter.cpp | 42 ++ src/TextStreams/StreamReader.cpp | 9 + src/TextStreams/StringReader.cpp | 38 ++ src/TextStreams/StringWriter.cpp | 21 + src/TextStreams/TextReader.cpp | 4 + src/TextStreams/TextWriter.cpp | 84 ++++ 59 files changed, 3114 insertions(+), 103 deletions(-) create mode 100644 apps/guilayouttester.cpp create mode 100644 apps/tanonydrop.cpp create mode 100644 font/Mono/README.md create mode 100644 font/Mono/aardvark-fixed-regular.ttf create mode 100644 font/NonMono/License-OFL.txt create mode 100644 font/NonMono/TanoheSans-Regular.ttf create mode 100644 include/TessesFramework/SDL2/GUI.hpp create mode 100644 include/TessesFramework/SDL2/ParseColor.hpp create mode 100644 include/TessesFramework/SDL2/Stream.hpp create mode 100644 include/TessesFramework/SDL2/Views/AbsoluteView.hpp create mode 100644 include/TessesFramework/SDL2/Views/ButtonView.hpp create mode 100644 include/TessesFramework/SDL2/Views/CheckView.hpp create mode 100644 include/TessesFramework/SDL2/Views/LabelView.hpp create mode 100644 include/TessesFramework/SDL2/Views/ProgressView.hpp create mode 100644 include/TessesFramework/SDL2/Views/TextListView.hpp create mode 100644 include/TessesFramework/Streams/PtyStream.hpp create mode 100644 include/TessesFramework/TextStreams/StdIOReader.hpp create mode 100644 include/TessesFramework/TextStreams/StdIOWriter.hpp create mode 100644 include/TessesFramework/TextStreams/StringReader.hpp create mode 100644 include/TessesFramework/TextStreams/StringWriter.hpp create mode 100644 src/SDL2/GUI.cpp create mode 100644 src/SDL2/GUIWindow.cpp create mode 100644 src/SDL2/Stream.cpp create mode 100644 src/SDL2/View.cpp create mode 100644 src/SDL2/Views/AbsoluteView.cpp create mode 100644 src/SDL2/Views/ButtonView.cpp create mode 100644 src/SDL2/Views/CheckView.cpp create mode 100644 src/SDL2/Views/LabelView.cpp create mode 100644 src/SDL2/Views/ProgressView.cpp create mode 100644 src/SDL2/Views/TextListView.cpp create mode 100644 src/Streams/PtyStream.cpp create mode 100644 src/TextStreams/StdIOReader.cpp create mode 100644 src/TextStreams/StdIOWriter.cpp create mode 100644 src/TextStreams/StringReader.cpp create mode 100644 src/TextStreams/StringWriter.cpp diff --git a/.onedev-buildspec.yml b/.onedev-buildspec.yml index 64e3c85..3d2b2c0 100644 --- a/.onedev-buildspec.yml +++ b/.onedev-buildspec.yml @@ -16,7 +16,7 @@ jobs: commands: | mkdir build cd build - cmake -S .. -B . -DTESSESFRAMEWORK_FETCHCONTENT=OFF + cmake -S .. -B . -DTESSESFRAMEWORK_FETCHCONTENT=OFF -DTESSESFRAMEWORK_ENABLE_SDL2=ON make -j12 make install DESTDIR=out useTTY: true diff --git a/CMakeLists.txt b/CMakeLists.txt index 50732d4..f0060c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,10 +24,15 @@ src/Streams/Stream.cpp src/Streams/BufferedStream.cpp src/Streams/ByteReader.cpp src/Streams/ByteWriter.cpp +src/Streams/PtyStream.cpp src/TextStreams/StreamReader.cpp src/TextStreams/StreamWriter.cpp src/TextStreams/TextReader.cpp src/TextStreams/TextWriter.cpp +src/TextStreams/StdIOReader.cpp +src/TextStreams/StdIOWriter.cpp +src/TextStreams/StringReader.cpp +src/TextStreams/StringWriter.cpp src/Threading/Thread.cpp src/Threading/Mutex.cpp src/Filesystem/VFS.cpp @@ -42,6 +47,16 @@ src/TF_Init.cpp src/wrapper.cpp src/HiddenField.cpp src/SDL2/FontCache.cpp +src/SDL2/Stream.cpp +src/SDL2/GUI.cpp +src/SDL2/GUIWindow.cpp +src/SDL2/View.cpp +src/SDL2/Views/ButtonView.cpp +src/SDL2/Views/AbsoluteView.cpp +src/SDL2/Views/LabelView.cpp +src/SDL2/Views/TextListView.cpp +src/SDL2/Views/ProgressView.cpp +src/SDL2/Views/CheckView.cpp ) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) @@ -69,21 +84,31 @@ endif() file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include) +include(cmake/bin2h.cmake) if(TESSESFRAMEWORK_ENABLE_SDL2) find_package(SDL2 REQUIRED) find_package(SDL2_ttf REQUIRED) find_package(SDL2_image REQUIRED) -endif() +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/TanoheSans-Regular.h" "#pragma once\n") +bin2h(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/font/NonMono/TanoheSans-Regular.ttf" HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/TanoheSans-Regular.h" VARIABLE_NAME TanoheSansRegular APPEND NULL_TERMINATE) +file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/TanoheSans-Regular.h" "\n") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/aardvark-fixed-regular.h" "#pragma once\n") +bin2h(SOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/font/Mono/aardvark-fixed-regular.ttf" HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/aardvark-fixed-regular.h" VARIABLE_NAME AardvarkFixedRegular APPEND NULL_TERMINATE) +file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/aardvark-fixed-regular.h" "\n") + + +endif() if(TESSESFRAMEWORK_ENABLE_MBED) if(TESSESFRAMEWORK_EMBED_CERT_BUNDLE) -include(cmake/bin2h.cmake) -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h "#pragma once\n") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h" "#pragma once\n") #target_compile_definitions(TessesFramework PUBLIC TESSESFRAMEWORK_EMBED_CERT_BUNDLE) -bin2h(SOURCE_FILE ${TESSESFRAMEWORK_CERT_BUNDLE_FILE} HEADER_FILE ${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h VARIABLE_NAME CertificateChain APPEND NULL_TERMINATE) -file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h "\n") +bin2h(SOURCE_FILE "${TESSESFRAMEWORK_CERT_BUNDLE_FILE}" HEADER_FILE "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h" VARIABLE_NAME CertificateChain APPEND NULL_TERMINATE) +file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/include/TessesFramework/CertificateChain.h" "\n") else() target_compile_definitions(TessesFramework PUBLIC TESSESFRAMEWORK_CERT_BUNDLE_FILE=${TESSESFRAMEWORK_CERT_BUNDLE_FILE}) @@ -164,7 +189,7 @@ target_link_libraries(${TessesFramework_TARGET} PUBLIC ws2_32) endif() -if(NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoGameCube")) +if(NOT("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR PLATFORM_PS2 OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoGameCube")) if(TESSESFRAMEWORK_ENABLE_THREADING) set(THREADS_PREFER_PTHREAD_FLAG ON) @@ -176,6 +201,10 @@ if(TESSESFRAMEWORK_ENABLE_SETDATE) target_compile_definitions(${TessesFramework_TARGET} PUBLIC TESSESFRAMEWORK_ENABLE_SETDATE) endif() target_compile_definitions(${TessesFramework_TARGET} PUBLIC _FILE_OFFSET_BITS=64) + +if(PLATFORM_PS2) +target_link_libraries(${TessesFramework_TARGET} PUBLIC -ldebug) +endif() endfunction() include(GNUInstallDirs) @@ -281,6 +310,14 @@ if(TESSESFRAMEWORK_ENABLE_EXAMPLES) endif() if(TESSESFRAMEWORK_ENABLE_APPS) +if(TESSESFRAMEWORK_ENABLE_SDL2) +add_executable(tguilayouttester apps/guilayouttester.cpp) +target_link_libraries(tguilayouttester PUBLIC tessesframework) +install(TARGETS tguilayouttester DESTINATION bin) +endif() +add_executable(tanonydrop apps/tanonydrop.cpp) +target_link_libraries(tanonydrop PUBLIC tessesframework) +install(TARGETS tanonydrop DESTINATION bin) add_executable(tfetch apps/tfetch.cpp) target_link_libraries(tfetch PUBLIC tessesframework) install(TARGETS tfetch DESTINATION bin) diff --git a/README.md b/README.md index ac8c7bc..3b53e04 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,8 @@ sudo make install - [mbedtls](https://github.com/Mbed-TLS/mbedtls) ## Code used from other peoples projects -- [Multipart parser (rewriten in C++ was C# in dejuric/simplehttp)](https://github.com/dajuric/simple-http) \ No newline at end of file +- [Multipart parser (rewriten in C++ was C# in dejuric/simplehttp)](https://github.com/dajuric/simple-http) + +## Resources used from others +- [ca-certificate.crt (from ubuntu)](ca-certificate.crt) +- [TanoheSans-Regular.ttf (license OFL)](font/License-OFL.txt) \ No newline at end of file diff --git a/apps/guilayouttester.cpp b/apps/guilayouttester.cpp new file mode 100644 index 0000000..64bebff --- /dev/null +++ b/apps/guilayouttester.cpp @@ -0,0 +1,75 @@ + +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/GUI.hpp" +#include "TessesFramework/SDL2/Views/ButtonView.hpp" +#include "TessesFramework/SDL2/Views/AbsoluteView.hpp" +#include "TessesFramework/SDL2/Views/LabelView.hpp" +#include "TessesFramework/SDL2/Views/TextListView.hpp" +#include "TessesFramework/Filesystem/LocalFS.hpp" +#include "TessesFramework/SDL2/Views/ProgressView.hpp" +#include "TessesFramework/SDL2/Views/CheckView.hpp" +#include "TessesFramework/TextStreams/StreamReader.hpp" +#include "TessesFramework/Streams/FileStream.hpp" +#include +using namespace Tesses::Framework; +using namespace Tesses::Framework::SDL2; + +using namespace Tesses::Framework::Streams; +using namespace Tesses::Framework::TextStreams; +using namespace Tesses::Framework::Serialization::Json; + +void Load(GUIWindow& window, std::string jsonFile) +{ + FILE* f = fopen(jsonFile.c_str(),"rb"); + if(f != NULL) + { + FileStream strm(f,true,"rb"); + StreamReader r(&strm,false); + auto text = r.ReadToEnd(); + try { + auto obj = Json::Decode(text); + window.SetView(obj); + } catch(...) + { + + } + } +} +#endif + + + + + +int main(int argc,char** argv) +{ + #if defined(TESSESFRAMEWORK_ENABLE_SDL2) + if(argc < 2) + { + std::cout << "USAGE: " << argv[0] << " layout.json" << std::endl; + return 0; + } + std::string jsonFile = argv[1]; + TF_Init(); + + + GUIPalette pal0(true,(SDL_Color){.r=255,.g=0,.b=0,.a=255},20); + GUIWindow window("Press ALT+R to Reload",640,480,SDL_WINDOW_RESIZABLE,pal0); + + window.SDLEvent += std::make_shared>([&window,jsonFile](View* sender, GUISDLEventEventArgs& e)->void{ + if(e.event.type == SDL_KEYUP && (uint64_t)(e.event.key.keysym.mod & SDL_Keymod::KMOD_ALT) != 0 && e.event.key.keysym.sym == SDLK_r) + { + Load(window,jsonFile); + } + }); + + Load(window,jsonFile); + + + + TF_RunEventLoop(); + + TF_Quit(); + #endif + return 0; +} \ No newline at end of file diff --git a/apps/tanonydrop.cpp b/apps/tanonydrop.cpp new file mode 100644 index 0000000..b7e7409 --- /dev/null +++ b/apps/tanonydrop.cpp @@ -0,0 +1,94 @@ +#include "TessesFramework/TessesFramework.hpp" +#include +using namespace Tesses::Framework; +using namespace Tesses::Framework::Streams; +using namespace Tesses::Framework::Http; +using namespace Tesses::Framework::Filesystem; + +VFS* vfs; + +int main(int argc, char** argv) +{ + + + TF_InitWithConsole(); + vfs = new SubdirFilesystem(&LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory(),false); + + CallbackServer cb([](ServerContext& ctx)->bool{ + if(ctx.path == "/") + { + ctx.WithMimeType("text/html") + .SendText( + "" + "" + "AnonyDump" + "" + "

AnonyDump

" + "Files" + "
" + "" + "" + "
" + "" + "" + ); + + return true; + } + else if(ctx.path == "/upload") + { + if(ctx.NeedToParseFormData()) + { + ctx.ParseFormData([](std::string mime, std::string filename,std::string name)->Stream* { + if(name != "file") return nullptr; + VFSPath path("/"+filename); + auto strm = vfs->OpenFile(path,"wb"); + + return strm; + }); + ctx.WithMimeType("text/html") + .SendText( + "" + "" + "AnonyDump - Uploaded successfully" + "" + "

Uploaded successfully

" + "Back" + + "" + "" + "" + ); + return true; + } + else { + ctx.statusCode= Tesses::Framework::Http::BadRequest; + ctx.WithMimeType("text/html") + .SendText( + "" + "" + "AnonyDump - Error: Must contain multipart and POST" + "" + "

Error: Must contain multipart and POST

" + "Back" + + "" + "" + "" + ); + } + } + return false; + }); + + Tesses::Framework::Http::MountableServer mountable(cb); + mountable.Mount("/files/",new FileServer(vfs,true,true,false),true); + + HttpServer srv(4985,mountable); + srv.StartAccepting(); + + TF_RunEventLoop(); + + TF_Quit(); + return 0; +} \ No newline at end of file diff --git a/examples/sdl2.cpp b/examples/sdl2.cpp index 737972d..c2a8ca2 100644 --- a/examples/sdl2.cpp +++ b/examples/sdl2.cpp @@ -1,28 +1,101 @@ #if defined(TESSESFRAMEWORK_ENABLE_SDL2) -#include +#include "TessesFramework/SDL2/GUI.hpp" +#include "TessesFramework/SDL2/Views/ButtonView.hpp" +#include "TessesFramework/SDL2/Views/AbsoluteView.hpp" +#include "TessesFramework/SDL2/Views/LabelView.hpp" +#include "TessesFramework/SDL2/Views/TextListView.hpp" +#include "TessesFramework/Filesystem/LocalFS.hpp" +#include "TessesFramework/SDL2/Views/ProgressView.hpp" +#include "TessesFramework/SDL2/Views/CheckView.hpp" +#include +using namespace Tesses::Framework; +using namespace Tesses::Framework::SDL2; #endif + + + int main(int argc,char** argv) { #if defined(TESSESFRAMEWORK_ENABLE_SDL2) - SDL_Init(SDL_INIT_EVERYTHING); + TF_Init(); - SDL_Window* window = SDL_CreateWindow("My SDL Window",0,0,320,240,0); + std::vector> colors={ + std::pair({.r=255,.g=0,.b=128,.a=255},"Magenta"), + std::pair({.r=255,.g=0,.b=0,.a=255}, "Red"), + std::pair({.r=0,.g=255,.b=0,.a=255}, "Green"), + std::pair({.r=0,.g=0,.b=255,.a=255}, "Blue"), + std::pair({.r=255,.g=255,.b=0,.a=255}, "Yellow"), + std::pair({.r=143, .g=188, .b=143,.a=255},"Dark sea Green"), + std::pair({.r=63, .g=253, .b=170,.a=255},"Aqua") + }; + + bool darkMode=true; + size_t color_index=0; - SDL_Renderer* renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED); - while(true) + GUIPalette pal0(darkMode,colors[color_index % colors.size()].first,20); + GUIWindow window("My Window Title",640,480,SDL_WINDOW_RESIZABLE,pal0); + + + Views::LabelView lbl("A random label\nThat spans lines."); + Views::ButtonView btn("Dark Mode"); + Views::ButtonView btn2(colors[0].second); + Views::ProgressView progress(42.42); + + Views::CheckView cv(false,"Checkbox"); + Views::CheckView cv2(false,"Another Checkbox"); + + + + Views::TextListView list; + for(auto item : Tesses::Framework::Filesystem::LocalFS.EnumeratePaths((std::string)"/usr/bin")) { - SDL_Event event; - if(SDL_PollEvent(&event) && event.type == SDL_QUIT) break; - SDL_SetRenderDrawColor(renderer,255,0,0,255); - SDL_RenderClear(renderer); - SDL_RenderPresent(renderer); + list.items.push_back(item.GetFileName()); } - SDL_DestroyRenderer(renderer); + - SDL_DestroyWindow(window); + + //Views::LabelView labelView("My Sweet Label"); + + Views::AbsoluteView abs; + abs.Add({.x=0,.y=0,.w=400,.h=64},&lbl,false); + abs.Add({.x=32,.y=64,.w=200,.h=50},&btn,false); + abs.Add({.x=248,.y=64,.w=200,.h=50},&cv,false); + + abs.Add({.x=32,.y=134,.w=200,.h=50},&btn2,false); + + abs.Add({.x=248,.y=134,.w=200,.h=50},&cv2,false); + + + abs.Add({.x=32,.y=190,.w=200,.h=30},&progress,false); + + abs.Add({.x=32,.y=230,.w=320,.h=240},&list,false); + + + window.SetView(&abs,false); + + btn.Click += std::make_shared>([&window,&darkMode,&color_index,&colors,&btn](View* sender, GUIEventArgs& e)->void{ + darkMode = !darkMode; + btn.SetText(darkMode ? "Light Mode" : "Dark Mode"); + GUIPalette palette(darkMode,colors[color_index % colors.size()].first,20); + window.SetPalette(palette); + }); + + btn2.Click += std::make_shared>([&window,&darkMode,&color_index,&colors,&btn2](View* sender, GUIEventArgs& e)->void{ + color_index++; + btn2.SetText(colors[color_index % colors.size()].second); + + GUIPalette palette(darkMode,colors[color_index % colors.size()].first,20); + window.SetPalette(palette); + }); + + + + TF_RunEventLoop(); + + TF_Quit(); #endif return 0; } \ No newline at end of file diff --git a/font/Mono/README.md b/font/Mono/README.md new file mode 100644 index 0000000..464e033 --- /dev/null +++ b/font/Mono/README.md @@ -0,0 +1,8 @@ +Font Attribution +================ + +- [Licensed under OFL (SIL Open Font License)](http://scripts.sil.org/OFL) +- [Get the font](https://fontlibrary.org/en/font/aardvark-sans) +- [Made by Belleve Invis](https://fontlibrary.org/en/font/aardvark-sans) + +I didn't see a LICENSE file in the font ZIP diff --git a/font/Mono/aardvark-fixed-regular.ttf b/font/Mono/aardvark-fixed-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14781d70d928bfde325680acbf672748b11b830b GIT binary patch literal 399304 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 z�tXmEyB(df&3sQM`14M459l%AJ`aniDTgpcPXd)qCdrs2<|Wf|{|pQCeLZtiD8L z&{!;ez$2a_s+Ax=UiN6MXnTf2!)RVmJL6gVma^g)OP5*7jIHW)V4XqDDA%YYL76#6 zt;5uhN*gW7$TglrR69Xy!8xD{(g8=^-=HkJv!*aq8G9bojn5Bw8-4*zcHE=+(RO0< z;R~>t z-$c1Y^7VQf965p(!a3mW)cospCE%D|imgTHp$7O~pcWj;ajTU{`c z7x6xr+`j~M3%c!S%f=T3ZJAMtw4l>^eG%y4Z0cwYXF6a_8oeo*OR~*L*OBH9RFPie z*;sVEB^WBxGLC+xdYVV@AIr_)F{5kRGFJC@L2Xl!1Fw)MUn3RzqoTdknh&&Z##L+B zT#NeJ(PONS%>DQmbAl^B6GyyiL6$(8zrY_Pj+ZbPu_(_gt~tw%hSF_K34nf3xr zr=J7+i&$^a2kaGEZXgHF4-p?IP=#y4zwwAhQo2<=H)PC>OP_)D*}AB+Gq6S*pVD(_ zwxxO$qL!gCxSsWu6<{i@h2Q z=b+E}Y-mg`Bl*x;psQ%zKo8lUBeZ%ffp4S_h?#Vhd!Y5KEI&ep^~{wVNT{tE=OC?V zbKt6~X)AqvB5mt5+EY|75uWiq(Cx+D-_l!&(ixeIv=@Tt4RQhEKlF-0NewaXR~UW7FSh#-N;7n|6y@(>e`!)Vd}gHaZV5M^-{#9HjdSc`)gYw;b%S{%Vxi=!B8 zaSUTEe!^IbpE1_r48~fV!&r;oFxKJ^4zU*O62@8(jJ04GYr!$r!h%?fJGc$;7D2>? z#E1(QBQ89QxKJ2zaScXX6u^j!B#gL7#fXbEJ`o}=iebb>35>WXgAo^HG2)^EMqE_H zh>J=XaZwo~E~;R}MOBQrsD=?2)iL6t21Z=e#E6Sp7;#Y#BQEM=#6=^FxM+$I7cDU2 zq9sOL+>Q|!cVomw8;rQ>aO#d?gp_zdGNj$_=#PZ)RcGsa!~ig6bgble61O~+mEKXlv$L}KW;3xaVM6yq*9 z#$5=EyRb0s!p67@iE$T&G47%`#$D9LxQjX%cX21iUG&7bi(VLa(HG+`24mdC5RAJR zj&T=LG4A4NjJueQaThZ%?&1ZEyO@h{7xOUgVm`)Qyozxbi!tuvb&R`Mf^ipbVcf+# z7J%t;$k#LTui};i)k2f@d8F%yoeDO^DyFKK1N(D#E6U6G2-G4jJS9cBQD;- zh>PVIaq%ujT&%!|i&YqL@c~9$ti_0n%@}dNlqaZwH~iQ-Bx^V zeCkRhIg#E2Q#YEvlG?E}SJL*C(8Th*9R6pLX4h7B`Il?!O6x>z%$>-EQV1lO(${jaSf0j7-o2;2q0N^D$|ChSX2l^fKTUe?9@TSIiL($EN=K zcsNgH8Nvm^dBSPow8Y)v;(zUc8hPL-9<3SSzTcdY8*ny<86jwAKenaYgMST8>ws(B zr_+bSF*w#T^pQ4Vv>b4W$O9bGY4qqs=Zq8Kvf;|{tzfyal?)uydBo&{OyTgg;X0;8 zLxDO7NBC&ks6`k&$U6+yVB|rLAZ1|JAY-^;ppS^%?*5CmV=QlfxLM-iZ~>#$_#S}d zb+Q`&C>7}Yw(y;C?VbP`PlPL*JnX3+@xT0s+BqC;3C0=zKuY~z2eqPgq0`s{twrdG z9vAor(zY4?VH9*tIP_n}(k#=!AKNfem>yxv+Ct3iu4jf|%zgs=r*NlmH~k;TYb4ej z!o9=&kss(i!V5>$a7PMr?Q4$ufRT^2=YJoM>IEc-UNva_Mz2~s*dx=Ys9hTEYYpSI zsCysL*J;z*8e}!-Cl>inES4M13l#>}-umW?0;T(o5 zqFZ=KcqG)S6CQ^eHlrNTFj{Uf?s(OQCxs`0uBXEP4ET>rnfkGLNEb&FTbj9k_N6ce z8LSRue;({*YHS@yO@;pVH%GMZ`r3#3akNnPWtc;=vH6&~IJ$6c7SOW_TIikHB2d#f z58;&?nd6~eps#qVNT1I%XQ&amf9cT*@QiK#YiTX%zgF`ywSu`Uy-!B!OwwcDQ6Jhu z;7{|^V+W(9?>CiUj?`nZThDsB1mxUV$poGT_T`oRAOHSe5nY=qHDm-pBVAWjCduSzU&A*>oGwBmWT`@iUjXg0#M3 zW~(c}wLR{~yM>^P+Ppf{f6M*L-j4{JzXLO4f5R$jwP zo1m>4dKW9$V@Shmbn9dt%8-w=fSit+GsFaZ3;74I^bah}f%xyp^LLc?E!+)jy{<*p zBmD$&Mz=!lLihzhMe>7(zoOk3@Yubw7=?W+|Ih8D^jCfS6<}ATO0b90FX-35r2YD^ zds2PaLy7Um;Muo$GdOI13mgvk_;2SDz55C1-A}~*l)~WMZx1UAdMBk^=+`fVe*MDe z*Dr#8{SxTcFNuEra_HBufPVcd=-01`e*GHg*S{A1`q!afzb5+iuSdUrE%fWxM!$X? z^y}Y%e*OCB*Kde^{if*GZ-##TThOoH0{!}TqhG%b`t|QYzkWyb>vuxGes}ci_dvgX zAN1?@N5B3M^y@!@e*IzS*B^;~{YTNSKMMW&qrtEL9Up^!{YmK8pMrk%WVB{T1lfUyFYIt?1X^fqwn{=-0oX{rZAxzdr1n1p6t$E=jPT z66}(s_fv9lKP83xDJ7s^KN0=*qtiekJtlS3|%4&FI&^ z1^xP6LM=k~h#~0RAB*1oap>KD9KHKbqj!HAdiQ6bcYiT@_g_cv{!;YrFGKJCd+6O? ziQfHH=-vMSz55@bcYgzV_cx+#T9@CxB}1wR{&b#3P5XI0ce9O0Qcbvz;s*zn1L$* zGjRoA4z2(!#ub1!aRp!rt^h2>6@X>90`NAj04&E9fRAwnU?Z*oe1R(fJ8%WyD_jBC zjVl0qaRuNYt^jl&)n+@C-lC`uuGEOf9X7~2KXIvBL zf@=a@aZTWUTodSyYXT4Anm`|16X=I)0)uc(U@)!;Jc4TiLvc-D7_JG7!!?2NxF+xf zt_jS+HGz5lt^RHHOSm#HA65p2*{g9);4@qk_yX4icH)}A0bCO}h-(7hg*94ra^_qZFM6U@rMfIA1Q%tW3IOPcJ8W|p$@!zSUWAf9F zq3KvO?>~iQ-Bx^VeCkRhiT1|Sji#@pb}Y@6w0$Ksu{KlTXLnX2X(VP2OR$j zH$7rmbBoUpcxO%fS9ANo>=k>Aic7_o{CDv2S;#XP_Pdw{$G;-cc&MAX-hh}q&Dk7A zm(yTWbX(KHvk>aqrhG2e(p0)k=go!x1+b&WG}y&s0pP~>4+8-TSct`A5gX^vH}xF!vjq zh>oL?Qu7PsjgCq{rTdfhNChnfJstqou5Eo*czbwfcyD?tu*<*a9Mx8E)dhS5ZEKww zJp{HGoJ~*HK&iGJeLoEJYx?kaz>HS;cktBq9($N8J~rn{@!0EQJYFxcIZ-ZVY~w9W z>o>4UZPS6Z1=`j29N1qlGX!N>oi+7;<_Ijpoacf)!fr*Gj@UUD{(C7c_rJ#>bM0VGjFxD*GfQtqz+A=A8B5=fjcscE86MhB&3vyl zyCsqvp_wJ}n@mer_ z3h08ng_i0EIL^UgEM^qs=yv06-q@zDozY4!pEmNEJDH&j?o!j>>WFeRbFZ;YZS}gR zx>Vntb*n}XvAqlOqWukY70uC4Ge&2DM$L5@OOYKOw57)zb})-MbPdflporxVwdKoQ zDQ5I^{iw`(?2N2h`{poo29LH9q&0Q)-V`m5$4m>sC9s1osR=PyYq<`d^?ukp`j!;L8OX-xkTyzv#a}JS@d{f=KkhvpPqAzmVR5 zluI;(-}@iMy0`-o#1d#ehNq4{h>H?P|0c#iQ36-9f1(8bi4yoHO5mR;fq$X|{%=GH zoY2t%5GA00?GYU2*V#epKYPx)t@zyd)L)b5->Iuxx{~@=Li5+8&Yn8EwzA95p3{}} zP1ldL4Z|D~Zj|D39ToK86qrV@5w($F!((qj{IdGV05;8Lgk*8gLAHq|f^I zi$U775JMRgi;_{o%S#iKn)VN453`H+$*7&6ZuFe7Z$`q%FE3%N%@L))QcO!1aM5+5 z+S(6113h2~_5dj0Z0f|;i?*lx_~-qJ(i`2!wrk`tBVuNEV+AJ1$Q0DiSTEpaXalOO z&OyyTr_8GMVdF*1GF$5?Pw?^$E9)?_#Yzv#uY;rcJZK(eTY0_ieJ5`PsM`iwL> zt$XxmmKSZ!=*i4SM&sG(I?z{aU1OssV&WHrQ8QfPY5#J{{N_6H%WEU)U*>`1o?R`i z>v&z6Yciws(Y_lE2mDOxB3_*VZpxw>jn>sAfqnuGna@#r!y~Zdc*~;?c*_6rl>g%?|NpP2oPl?Iul~n$c)^<5O4CdUW>yQ#YEvlG?E}SJL*C(8Th*9R6pLX4h7B`Il?!U#VmG zWmhx1d|fN+vaEAWE9Utxz6Y11kEi@krLIJRE1}WyT`67A7h@gzEhFO*l<2tSpWq2y z*U&UU&A)yQEb*_&m>qR|e!%;$OO;iPfZIjvt@h^_DxD7Ubk5&}2fVI?pQa7^9z&1s zl19qE2qRwIjI|8!ppO|#uRI;-E~W;ws8cc0$KkqvK@S6}nA-5(oW2tS@`;v3Yen<2 z!u0!KMjpD&EM(2lf|d=aB0Vs?V`@cX<>B4i^fIP26R*s&MX2>?!hhy+y>EctbtJ2j z^gOhM*mku~LDw^R!J9PZ>XIuybPMrq>$-Ypg<$6Z(}GTG&p6OyFEp0^CLY_Gj^x)q zirBnA!Lc>X84uH5kTP}?FQG0AdT20{6Vx&MG@p20L3!4>LFvDLj_M^dFK9cWoy=uA z2eqGWC(!$JO=eC1za$qVj@N4D5xY`JV{7W(8w+q4(hLHaqcKd70hPP$%o$(79w znRsO8`Zwih-(gm*#p)v{M=Qxht+kb%%?CAuGqx6K5nIrjMr|7#j33RQR?HddM&~nl z3X9B*dN-J?B#x<>N$$&+Wv7?R*ZPxEEq$CE!90_dwFTM^&YCyi`hEi%!`#UJC1!3k zGisa$BXl}1E?_ir?PG_?X!bpPjdud<&XSW%)cd}ZCwM2`n@oYdSq73huq(@0GB;EzREoSD zDibP0=7%bTDv$+!A-@oL#V_KQB(Lgy49FX>k3l)I#IN92B1>U6gX-jM|60EuSpj<* zG$bGSjs3>tW4*HhSqD2DKTOv9gZxLxMy*r$_U~3Y_kZMA0Ie+kA8G0D>Cdu=tcyYF z%geoh>b_+@vd+y+XL3w?rlm;D;F}F#t@ru_|A zBd48cCqiJCnqGv;qw=WUfeC8Y0=ujgIqJjN{6{fe7ENhPr}Y^kLUik}*Azmyp7a^4 zU#yhHNvM9qW-Uq4jsyGjATM|6b6_w$O~JM`+nm-Oh+ua~H(_qrzJ(j~Y$ zKs30*IOIsUdTio=Tm?XG9p~Y}_aI7=Qsiooxi~37(nulVlLV3o{VNC8R}qp-QsC;# zL-InubCS}e3|xD;Ntj$kl1M>P6t2IDq!Ou2s*tLr8mUfdkZYmMnoxt+ZFE}-nQ~Lp z`YANr;U6*?JURXPn|H98AmbvhSd4Z5IX{|e>lVt^IsGJqB73V@a98i1AQ zI)GK^7Jyahc7WCBPJq?vUVt^|p^p74mZ!%6R-iustVquRtVDkYSeY?^RhR>?DoX%Z zjpYJZo#h8ugQaxrU#UDR3a|nz4X`4s2(S{X4zMz-1+WUM53nk00r2 z<0^y_p^MN)=pghFCLr_>DulTZ=0sQ!VKTxLgnBNcIG<9uhiKf~r^+IZUn7Ehiq0>A zFgL<{2(Lz%h%k(>BEm`tiy$nD5We9I910*zLRbi4VT6?tRza8_;WY^JAk2%fG{Q0n zQxT>i)X$R??u-QPYx&^*mj~{36`&`@;f_`g?rceLFRTLhyEM=tY{-RsCkB)SfwB}* zmQANDjg%7ZpIT$Flv(rClv=~Fl!j+HxbMccF5!+G%QIHaVnA6qT~1A@^&IewQby%8 zJ<49rc*?8bc|m1rJzmbr5iMoxk#0TElI~GqcuolPnQ+;@>mC_>+VG4L+xHYwJ~BpS z)3sC@o=|eY(~Z`ARnm*}Cqu~?GKowh&yknOV)8awMb?pRWCz(x4wF;l9JxqCG=b)! z1tE&IEUijw(T4P9+KRTNooO%HpAMyC=p;IgK1W}MC(*a*D!PttqdVwcdYGP~=jcTi zVhOlwDA*8v1MEnj*G0}-(5fiiZmvNa-kfx~-8FKC=R`~|ikvT+v(r3s)=|Ge@0>Ab znHD)m%B9{x6v}0!zT9ont`j*=F=wwp0dTMxq@Fo;aNWc>oj~z49^84=faV5q`ykC1vprs*|ixg!qvoG|RiX|4Yv=(gp>u7zX>IUT&;qWdx z2H<-PxU%=zYJeZG4*+gp8vyQRy8)hHCjkDyejtoL!Jhy)jZY&?)E5l^HWG~iwh%1< z-Y!}JY$MtLY$w_Q>?k?{94VPx^#**bH5T9mYXZRi)_#EJ ztzQWX*&#`oz0rnN?5*}zfII9R0C(EE0Di6Ck?ei;K7eQJGlV&|;{fy=4`3~)7Qp__ z!vF_6Lji7bHW4OmX#>nF^8-wlDFBPeA^^)s@CL{(vJ1e$axlQhd$R$)<-G;)q<0eF zSr2-r90k2ozDfX?L*)QiNEHTHPL%^#K~(@)U)2ZLR5b@7;FEWe-3PvX^RBgrC^o$K${hviU3DAP#-LO3BdQXokRai!xI7{ zx1fbmwhAniqJ>hlP>L2x(LyO&C`AjUXrWXz01Ks}F<2-?3#FnJSSUpcrD&m4i~!rD zVl3DuMcbs}J+MtG)`M+Qv`UIrNzopu_!=ycq772CK4W(j?T(_|QM5a1ZvtDRXloR0 zjiRklv@(iTM$yVB+80IpqRtQp<`1+liuOfiey}epQ^39`S`!6pdJOOhU{e%rilQ}9 zv?hwyMA4ckS`$TUqG(4HEr_D+Q12Yr4pkCthpGgy9jXe0)ljq=idI9>YA9L_MSG!W z9aJ3$>!4^C6fJ_HMNqT|inc)gF<=W6ZGoaKP_TuMAV=E*MO%RHJHp$3K6pmav#&l# zA!Y+Bnvd=6YKnesG0%^~0glVA*g9^tK@JoOQqHvD6A0{*di6#O0xI2MMw4m`!= z5@6?Sm3R#1jZI)f3}%x^iT8^x@y_cKeT_m1g*j}jr>_8*!TD2KNYwm` zOK^cpS(3}S#z}FCI3=BOfK_p>a~e2JoLiih&RtGNr>oQ38Rg7(7Ww;tUoN=z3Oa?H z;!YX3{wl$)y>*?&&P{O7xx;Dibar~e_4tzWst+?Ra!zv6oMKLCr-GB@RCBI(8ad6J zTb)+U-OhbZH>Zy?#(BkA>>v0SI2UkIouW=Dr@T|Zsp`~p8ahp#=FaU-Yp0WQzw@9o z+F9Vd=I{R(IOlhgox)BDr>v9Tsq9?q)OT)lZgyHYcRKevU7QD;N1d0Qh5p{Z$hiRV zoNt_Oozu=Q&P5rLi87CDAqP78j_f%*oIS9Y@sG}V*vnYTu)In3b>W@~?*^W;%h~Uo zaLzctNe&lXPT5@cceGVpzSeH%fOFD0>-;W-^kpu2t9;nm{in6Qb`CnHoO8|}(vk@> zx4cabaA4;8leWHc_BzL$pPXMMm9D%>-Yok$U;SyVoz6bzxbw4fK{Dyd9P$?VkhAl$ zwVIGLHV%#nYzmvqo@URond~|C0-ML?vxRIidy_3=@30kYJ^Pq#X4}|j>nx2BX?iBA2UDuuL z{bsniPkO({68!8d%DbT7MtSwZH4lF z5uWl2$2+6Jl6RtG$Vwlkd)^bDP>*S_HT+X8psC*a@wRidz+J0q6% z>cHQA!Y+kL%^&eT4e5G!HE2fHkd#ZE_-7Y?AcTKL!|e&3v+pb5l>;JO2uXpqpdj*J z09u5Tdv8N%@x~g_8;--I>%aX+Y8=NyCz!Oq!nb zO4912^+{hO9Zx!wbg|&C$+?r0k{cx7lzd0>UCDPR-;?}E^0MTQl0Q%WI{9?+ndFNp zc8ZshJ0&fpSW2~&S}FBYnx;IMGAU(N%Dj|UQWmAWpUP81sWLTZYTne8)U?!MsU=cN zrIt-?oBCMl%+wcC7pK0Px-NBB>e1A*slTU@G?kV!Eq_|Uw3M{6Y1PuMPrD(lL0Yr4 z+tRwH4NRMmwjk}bv=7tPrJXP26)IV1P@$&_PcHIwkvT=)E%ITJEk(X8a=6IpqM@R7 zi*_m6t>}|QUnrKZSpH%U78_P0#wr z#dZ}}&o4H=!u-4EkC;Dc{!{bcTv&c#m4z)9-nakB{V(oc`Ww5{305lf=seHXz^r%z z^-Xwl_|imc_`<{>Sf!lEC-E2gm;5LG3;#oO7TrWYF!gR127|tz0DaF)TA1_^==-arQ=o5fc_rsdPDyT@+&rT1cFDt&-%ehayd!x} z@=wXUxT{NQa=AiG%sn3DFm#3~w z-JE&|^!*Fyo24bD=(~Mdue6bAPp2(PTaEg53Y92S74+S{ z@T?-!iacLrWs!A7wiP)D`nHPJDcT5m>xRMSVX~D!EjP(%nlx zfchR>o>siI;+vrF^7C8I9}fDSGXIT;zB}!oy#KlVi+`h+I-tG@ucYli)IZc$pTY8n zn)Ag}bG|%0`B7~7>79g}-eYpU(>_LWT>CK7{|@dtxclIa^kh16@{e?seE0D2H=?OS zTaG{S?JIKdBAgXhh8@2gO&Bg`=Sb^63z zr6D05kn)bzZQZ-T-&>?>kv2tc!vacsG4L3N?hP%_>Cnq|UAq}fGR^EhHvBTc9%C9E6^k$6+365GbNv8MK?;!hdnMzS{%Nz1?R4 z&Q(+4Ubn%|;YT#@7xvr3w*n6N7ZaR>(h21g>JXC9ETL6Gw}jpasKJC$31bpgBy3Lr z-Ri%D?Fc_bxJ^UI+XVlI5-vd814|T%`4Yhgomdn8>nGls*gml{V4V|(B#wmh$iy)K zCne5HT#>j1epP)&*N5L$U(_z|@R;ynLUQcL>Ez6lGc9L%aN1VQSv@Ck%Go&b-#lk) zz`Et^ox7K=nY%~sUb*|{9*`S!1gYWhKPESfa_*J6SLI#<=QX+4>Jq?UEbzP{_ewZ( zYoNE=b;XC?^E|irtvl6yh7b0ZiBV2o?*%o`zvOoC^Qdp&D=E`d4|Tic%U$A8)k4;> zYTMhqoqRalQ*I=;ll#bEvWa{`z9m1>!n7o2;LLwfnWA6@+5hLj3N_g2)>>48~L4l zM7z*Y^a1etzDq`X{WCdi zpQ0(wOK|7!NzOUNsSlo=OU`ZNXQu}(=DbbII~$zs^jc>Rt>v7j*E>JbhO#AXEc?a?+(7S=>*Xpk(<(zBcWcl-Zf-i#Ek?V$CFmCKJNl`2oPOdRqu;3O>36CL-LGz- zdsS`vt6D_Qs|EBIHJ{b;2eVRsLw1#4oYnLnX32haR?feLHS?ck?fuVL2iC{`kqz*F zW&Ql0Wotf>+)7%CX7oojfG#B+MQ_rT^dbGlG4UpOg&rWY$yRG3c;-KIa?u2GmR54M zzsfi$fOYY|W_|si z$a=ET8exs{^O9}W^VU!PTCv1A!o%Jf(uE8VC*WIL^<-0e2W>CEBe~d1?dRrY zIsK9>$*;<;_A9V!{7S5VU&VTe6l5Do3j2gO>}&G5wT*mfeNM|c>*bf) zoMoglc~~4LpIRT0A6QG;PVOZ2d3R#7UGyz?Fx>RMBstg|@&r7o4HM@mb?zX)IA!Rg zZgJYz%|pNRex%#Hqb$|GmgVqE(8H=3{ar0%-TiOL5&H+)NzA7`-LY(BLLy0qXTTBS zJRRy5qVKw+=`go29qtxk-TZ^_Ft|m%<181?ds|6E(n(CAHJPiXCgdgit<$6l3$w;# zv2_bA;w+_`yv=m0cZ9X|KjUNBN$&CK?nCgksH0+;RbSOr4XsL61FNCMop-Gh`pZSu z2Jf(Q70k*MJR4)3=jH7%8$Tc$$)$1`eBz?lE3BKXroK?W_(kD6FOT_C{SW-({*iAoM$WeS2pW)Aqq>A}# z{G;A`VuzT>JBSHlq`1Q$D<5ZT>@Bhfe6^^vY^#1%=i!OzKEIdP>n)e_;R{+DR1vqV zIw7_wTRdrPkwer|{#NUpHN@d^uIz3-;!pIO*qgu`H9{Si6WsCO|6DKLgWFSK@ME^} z$AIth6VbvM;#=AaB}UsD+557L$|3VQo=o<8iap+2@+EhYcNTo|D^wvdMs##b`=do8 zXDImghl~2oV0BE6mtDkm@C(lbZ}Cv@9{bKC;5}{*zP)kcOM5H(z}^L(&K>sGqOny+ z?3VfDMaO0*v~OHVnPN@wKbBX6$2tN0|69d2@rC$Y>=K`euh@H*aB8{9epz@rf5|>0 zpYcwrrQl0k?;nP{=m`0!y_@w=KiglC>+COK&1@~bhSi`iI#0sydzzE&9*os$TY6d9R9|-fFj|Gs$n`w)5|ITX>7TrE<7` zh%tInb*4>dGuo8iLb1oNLzZ09;c^SC-|b@5Y~&eVPp6d|559R zc-3i>;QGHApCEV#)2xziqBqB?XEg%fU}4L(kElzc3;GK0_jjsp;wSJIe&V!shKp6! zDW{z{?Ns#lIPbyNvkv>j+2(Zc2Z$e7Z~ruVz&}OPoHuA8=S^19uTS<^$H_O=F*ZEG zXM_DeXc^~YGQ%oO7Fmtq$Bt|1&*~X^MmB=JGyPWmFBH`UCwZ{M89Lt&#o&cG%kN9QKx|koS?5O6tJ+YzxwqJVc%) zufi`oPg9SUfR)!qv<1BnR$bqK_skFJE?8GB%UbXOd?0t&9??`Bv2In3t=p`Y_I_us z^M!oFD(en&hr1)(N4#}D^9RW#{*&wof7aS6-tb-%4>;XbnqSW!&!4e2Dd8;?z3hWl zIhyP|=FNoPdfMVGF2&Pgs@2D8VXbo3*aw`j^MW(O>Fd1ctd@_+R`6A_H{pw7A$iOl z;w@5Btebr97xTONH~N$PDG9j~@+9Q49#vc9WABrax;ID+{Ras*5Yo` zODrG{h*wBIv6^%fb4d>|k33@)A=9kFWQ_QOth4%&k>Xdf#TrMnkLsj-j-0Z8At&s! z?R-QlI-6+~=M#E^l(eo4(+2V;S_hUTZjqDdt@2rVo197S zky~k7xs7&|M`#Lz+b-AwnWT6CYPLyxLk=pX7mdQq)nmimGIrru!r{fexP{|L+DmtnR2A*_twm^JdB zV)guy>{kCd*2JI2Zt`caoBf&W7JnAI)8EMM@Hen~{V!R6|12BmUto{I_qsxAIehKw zdww50{ogI`A-lz5lFGJ|!t5Z)%NCKV*%FeUy+y8J%Sk@=I!RzpkudDfaTS|IaQ##@w(6&I=FbOz_%O>~4?l#X%B(}&&sbf8;+ z4sw&|V7DM0;9f(=xfSVnw=$jJR-qH!s`N3p5-aFeV}<;htcYKW74z$`;{FY+gkP5x z^=q@v{%+RM-@&^2->{zkF?Nal$OStGiy}X9#?HWRCyT>xCd|ezCh-Y=dF&`9adMXjn&Dz)9P%sCM(DrWDWeX;XU|X>HB1 zJ*;-lEN80Q-o4xJ=HKhKbQ|&zJI^if4pI1yCTC~i_n>89{iz)MnxiEAI<&Oa&1!4i zZ{1_vXWeCWvF;|T$y?+D@(x)^mcVZ`mbtgO4czAN7T3(J1_HG zokO4I3G4#*c_RCr{lPB6icxv^<#z>A(fJg<%D2XQQM_aIw0c?Xtq#_`WIpVk{vlaT z-t|88KJeB$vz@1$Db5ql)6Qg?M03*uG>@1gW{cRV%tAzUAdQ0`So^o=_0*Ys$?fQ0ZKXJQyqCR~K-ef-0!_BU$N@C)7?(0aptz7D0OQmb% zhjO+2NY0ZB_)t|;+^oiX?>i5P_r(Y9Q}TCthrG)f4f-{i0IOSxUvvp|1h)HpR(J*LK} zt7K{Mjo*V0k_*)zVy(QSa>@_nTDeAkEU!_nOj4dKq{6%+Z^awHw`FhOjrjFEji-P& zHHqKEYr;2X8}jPB1$=F`8867o@?yLmufxmmcJRg7w!A3#U2F4ucsckc?XA2xFUhO& zLi}#<4W{y1;2SIgKEf(InV06(;ES{scwt_Gw+BCMOWuSx<)y%XSc%`pYw!ZRJg>~J z<=43P`uWs8Yq9l=>Zw{;339jk&`R=cwbgpZnxr05ZLP38;Ja=QKUp2NmRYk^AJxXn zEBC2&RrHEhdO+P}<&@v>{Ng(BO&+!?TPy7K z;L&-`dEfa=_L7SrnB!q@g||hOQlr#azq$Xo|GvM)|1RMw_zhb#ayRKt9wnQ}SL7Ic z6`?4tKx@8tPgt}3^?w9h1`_K66{O$gk1a1}d9ktC`Zaty;t9I5^@}QsKcJlM9 z{nqQ&v#OW6!%CE2tB(>aA^2W#6+bRqen@!yJ7Mz!!r=!6=iB)fzDF?rDc{7u5n)kE z6ye82q9`E>@gpLas3r>Yt)epjT$JReL{3pvr18z768}sT=O+c_KZrd16TVSg&41=! ziv<3o$SaD8RFNP2>EDYS{3nr5R1qnBo2baoi30qz$j!eHMa4DzEI+|7@}2w=-^Ew) zwfrl-fxi!a`1O3HC@Yfr2cnE9$k&K#MFsw`s3FSpkHBlZj=v{LizL2UR2Sv=hx|Nv zk$>eE_#gat{u}%VNC_zj-^UO0Z~1N!5+Xd7tcPt(K)^Iaxp! zlx1a_OjSxYmd}fseoK|em-@^6xBa)&L^WAGt|qA`)CB&fzl6W$FXr$1EBHcx5nt}V z%ir;r^EdoA`Ro20e6Ig8f5Cr=&-WMdm;G1y9DlC=qV=@w=|2zO8NP+j7K6njVu%q}=e?<3Ztr$? zhxd?s&a3LamUhZkHoco41)V<`@cGr0A-2GmP z`-1nZceQtyyW1P+UhuAU-}4^xT(60{+3V&W_e!~oyeGZ?kGVGwkgF>5hVQvmb#GPO z+V{0<>#FLi>Mgx@(n%@_4V9Gw0;D67G+V?aAnvFbm;o7s%;18%jylSysGx|bqax}n z;|MBw8_>GPqv!IUS@RG{+d(OG{)~)X9PH^UrkC0AR)v0sO@|Df9dZ9k z8*+b4yH)dRXS=_rUFH4{ZQOmg_6AMTn(nV@huuHd3hobS@7B`V^V~nxUh95VTX26_ zJFa=OJ?@9J7rXye8*zV1d#e`F_PZa`Uhe)+ZQ6aW_NSUdTXg>)?Q-`&YZdn$+B>v_ zcEJ5(?bYu8*5=(`)Na;X+D`YkwJY7f*6Qw0Xn&yvwR7B$XfJjDMw@VdR=Zx4we9Y& zYnQnHNh`VkN_&@<(hj=+Uc1))f3;2SztP^LY1(f0ceEF|pVEfipVZ!>g|+kCKhR$0 z{+%}E{+#wFnq51?{Y~vM_y41n-5=F%*W%iR?#H!Px&NTexxb*j5n!{H`){=uxc^0~ zxj(M`xfamc?(b_?yPwuJxId#E)0no+{eZUYeo`yCKkWK<+%3GQK5Dzu`$_M|Y#(vD zZJ+XfT7H%H4^jnrW((e1<#WAXa=gmPN<0FobJ3i+4E5{v<+Z8l-n#$Ucb?W2CfR}xCEl0}7J}u;U}=H9uJfIzo|2z9 zQE16$Bl>Cd=LfoTxLFG`yTtau+buJ@`~vhox7T4q-}7vrBn1P23i-p~u;NNKCa0&u zlc6jtO;1%zN|uEuD^+FT_V(><++ZEKC%tv+u5Yo2I}_j9wQFK=abg#9z5C}sM~6HI zNz6gPa}bI(#}G!2)%NDr7{-q=U|LQYGjmFc-KiV_x>!2I2PE0;jzcb0c0dKksG<>o zp2I=@Ulr=)l`-BN*Cg z%;~`1?wpoZ&q>QR!nE3APBbq*r`gGAmAee%t0N9+35$6MEw zGLv8Y!D}%vbG$SstoIson#CvggRT_#kGtRbobes|nJedL_WL<}$J6}|tn~`L7SBPh zr|WJTyN`W{7LUGjvVz)?)GuO+Of~zptz6%3Kk9eTa#cTg?>_sRjAuEWKne71!=J_H z?R*{kUGF{_bFjb5=*RQaTF~Z-QQdQl8Pd~&I)s26hcT4hJ zeCpjb{f^ns4So9I=aJ7H864}bA@w8H(CDZC8uETlv4*_O+H1(yhqqa0eZFAM>kG!b z<)H1a93# zScYR{Pn5A;yYI@j4>S|t3TzpSZ_8eV*=*9X?10$YD(y=*0ZlPJ0@I(@KZh5GK3-}@ za|28ot`E%SX5%rRN6NCS>WVeu#cHKmnGR0P&dknCPQ+vQGd&wDO#{NND%A;k8=q36 zQjy+@1|!ty=Oe{(qEJYbizD@XF(I>do5_h{K9q^Z19AKx%?!ko^jk9Sj6`c253uTi zjkRbb6dAJFhK5fh_u!vMsO9mdYg<`$Yb^~`!Jnya?)-RjHRGrBE8{HkHNrVFUU$!( z_WQNg)%HD;_TFdgk97}E)CvcT4k{9U4!X_KN$2U(t`sb{5SCNP-3pd;EnWW zH~2K$Xz|&n`U+}Ve_A)JNd-Afeb>!s!}n;Yrwz`ZSX*-+yLHQ`1y+W)@^Mg_9nOf~HQJpl0hicR=%HK~Z_% zH%~!M<>IJK^KHmx(`U{mo;`VLTAJy%W#Pw)0<$*@-q0b!LR%A<50luGWfBB^W$n% zg`SF|Z}4Pr-Szn~3-_?$y2+jwO*TAWvSz2wgymlfCd~PB=f|8sw>T4KRnCMtbME|@ zGv^iOt7Lh-Lf_+hFxQLL)q~fvFAfO%VyV}@(7-2Gu)kTdFAiVRzNT%z#qNJ)s8)lz zdkZ_G^EbClPG(A^?_T=nz=oQ8`vCaD4xKNY%l<`v!mi7I_b6(zSlj7(orkh+xvp=O z9iX85xITuyEczH|$)eL{xlJbeS6o-3AHk141-UaWp379v>%nWT5Vph>y|%Vn(!dAX>8Z>zLbg7TkW!q^{9_A$YI?(}D657y2=Bv&^t)4C$rouV9BxTc)5ZVTC zm{ejW!9uhU6%3T~&r+428^JRd*ae+uuGl)#NDd4n8zWn!8==J8m+ivFL& z_|S+m6(1Vk&X%^155-fdc&#wx%fwPXzu%Y4k96)B$tUUeR4n5gD%9dB&=T3$U*^8N z^XbgW_hZ#bzN21&@a197A!>s;Z<5Yz?nuOC**-HZ<5cZ&Fd0Oo%8ZVjZ5ealvKP6< z(lYcxGP0R8J~~vblyh0q=$xvwiEVP33$Yn~QFutZI$hkl7~pU)2f1n8XF-a^HJ0Rt z8`fBqceJkUyDHbV-m!97=!}VVd046nPZm>vZ05cyV_kTgI;{(0Y?t6O(L#I|@AEZX z>RD5(f7IZoie2bq;(6b}^SGyKjpxx`k*|mEmC0YNdu8ZBu&0_uoEBK+(h(a@dJ5`~ z-JZ6?8%$PFuo5dMYN}C~F6j=BN#V!X#DbGS_JX4ejY>S#4*Fur{L%J5BxBGJ*w)V1 z>H`U{kA3k(0d%o&@)hhqa5j_DXtM$S!yGnHf6t;N znrS$u;hpXC*vTmS%emes&mBL$`r%hTYRU-meO2w;n}#*J7*FE^{)GBebrYDCgsbnG!{?cU4{;n(ibVa$ND$A_rOLtrK zIa~V4vfC5!+C*z)AnEr%2c{$2;`8;Pc(xVtB~yd%IW_;wv~TYIBxZ`Tl06bN-Js$40Z|a&~mAdH(t3jgd?y zvax)={6soEvF+mTU%YK1oo*Ei8+Lzx_l81|WNQSQ^)u|7ACz3By{e{UIK1{C5QANl zk>n>!hiqMgLv?_xXj}oLaRib9Y*aKNjEkU9>$zGNQ=>7i*H2D|!40Ff$!M8dxinIu zxX6xDrW7kMR*2!3dv3n@v72x1yvpZ^`jSas)Z>$%V772#Y{wPfzhcK&B5X&*s?|Di zcWbB3>CaB?|Nj2Ttlwz^se$5Y4!^Vg9XM4?$^%VyLG!%Pf{a7EC(CRJ=nA_XB+VSs zE?D(Ux)BS_LuG~{|YCi^hmcHA69K_4TI1F9cDkCTkM7oa{ zhpsE*JmkT5kws1Q52VTFxYHpcgn1qWFV}igdlk^4g!(T!yAK5eI295szhETjQqv9a zuGyL3bb&|y3ej1_JOgSz4J_l1Y`gR8>`y;Das1JVU$NOUPh9!v@#BxmXLr8-@A^3u zHg-{JG>1~KXQBE?($HRF_Utf;nHt-N5U3O=28(1!#~n_Xu!0TEPI5Ie%gT6z6F0mS zocNXKLeS%#n`_O@c|F0-4}R)*I2GGqxjbl7oDTo4h1P~mPv3LT)0;N57IwAdO^eZb z+V`p3Zu^ukU5_qqf}UvF2UMYQra4L00gX*q23*}01_1zvhltsOiZSp?Hcf{1bX4hY z2&}<9Ooe|9He%}bYp@f+_t`hFhr`lKK9^xAG_^jZnqXI&UEgU-_dG4 zPznVCq0;m@@7y+0iNv|wJ89S~{7mUKi)`8~$Xc=Tc9M?Bg?i!;D>Y25$tve28RSd?!It{NwG*M7tRIz zKCj0u1sS+|tWn^~jc!s-7jV?7IAmN3bM1l2TSx0;b<{_y4nY=5t>z+Fw-kT`lJ^WUImbm2_j>6A-Xv^2QydMz ziW#U5Kq)U33wb)CeZ>()SxhpihE3trD~`Hi=$;#IeC);>SMudvA#~z}Ep|hz)w!-^ z$ReO~Nfr%479DOre-M%g$ci}BNO@0#*(xNFFfqo(5o{{^G2;yL1A?iMd2dRka+#!3 zd9*w_GF-0>RZmMQtu@g#q|&Mx&kLD!;#;RXcgTWS-JVhyyc(deg_Dz<<}|6+tO#A5 z)QQ7nMyBCKcQ^(J@PHb38b@%boQDIr!T*$^@JRl&efvWX0kLwW{EicahtMZ-LiIk! zn!})LL`{Jcv0BXz5U~yq>GteO8#Xh5A%*Bcc5&x7k3GhqW(Xh%A1{rc;sCQ!v$?rE zNKpU(bnoLmki<<>t-Pd z2ytRmxLxr_cY_MQ|1+zN;m00ZW%+F}jb|9fy~gmLwQgQ%_Ho;}a|gE)xy@0|IIZ{Cn6JaCSZqvle@T}U{TRAj@7@8^V_B2c_zLk|17Bes z!!XAAAik@x`}@%)tlKERamMoT@i6E03Qj$nWSx_m(q0h%T&?VT&si z$THWBFk*b}W^Aly-S|Edy}cd3@iVxJ9{5~2P4YIYX$EtBk&ZRfq(1zRJ46LPVIQsCi zDpd!A(K;NdWHRuLC*aE{D-~(uX_Q@!QIE&|elQvL1w#JuLSfvm*xT($rZhfY9E@e* zK^k$k{N6;S$}S(xL(NHPo)e#xpP0)8B9UliVpr!q3&Yh|3Qs25IC-v>*C8HB|3QR6 z_IwkvXP0zFb6ajew#gnibr#P+T}m6tAG^bb+(#%4%a|Xg*5fkSx_N2>?thF?+6Aow zikgTn>-LH8@T}#K7Fa%7j&-7b7smG6C`Kx9uV?2DY1h#$QhuMM7nI#4*Ly7|RV&6+wAbb1QYk!HWZe2+cW`3<`m z8WJl&W#@epw)IVj#q{kP{066u>tB8N4V>cS7%!pk!-CteI_EYgPT*@;Q|>Fq8Q>mg z{+j!t@f!YS;y?I7d|i{Knj4%r^)Q7=t%QoU8>hmEJ(Gn%`~e|xd=1KFC>U|@2yECk zjkrnJR){XV^PNCL{|G;8utZoD>ids7kGI4)&OK?w?m0cI_T6D@##j{MjmB%P=ioI{ z`_dx+4yQ%l#@>$>Iqr(Lxtsbi@oFXx2E2gxqvO@4qzjw-Ia&>F0UfEPtwO3PlFNyB znhG{JwAbU7ov2>Op=!0M+SKI4hVe1j7L9tr0IPYQ6Ijhq*ugnZ2crhI-~Q=ofzx!c zP#_UOYiwfDKHGn7j5d59?&@g+{iqKnP3%Lz^WNQudwcpZ_rctAI)@Jk8W4Ic_z3UU z+&kO>wBp&sv&6Ie@r@O9(wA>^$M>cF!^zTV>n z(__X)?0{53z)bqP{;s{29c;19ef@s_*}^<_U={AO5td2t%%}Ryb;rrH#a2*UFGL%B z4feK>Uv+6mv&l{FuIC;lEeLjN6<>zw4L=o=^4w7$k9sw!&g!K4ObTEfOz!~!CV^9y zkVMn7kZMs?H@A88|Rb3lMWenG_patmVGKo%J)o<2|burhvP|_UMnLeo6TmT z=~yvK^TZ&z9)vl#$fvW~|3b0Yc^->Jomx`=6&I{4fmVR$MfbZ1ugg1V-MaQWC}<7) zUFcq9hkl!{?J7GIcSb!9KP>46QR)2Mca?yW8z7|_?jdq<8mJk=6xi&5wU9O&KygAv z`^(LSvTi6)I2jIRZYZdRp}>I`m80e8~R| z&3#?qMKM3>3m^STCSI+RcWG?<`ml?1B0qj(>!HQ5p?Csw74d$`nfNa4)oPvxnwf%M zko46gF!>YBv3$tu1Zt7(5$IYnBn8w27`$|fNvT@87Vv9sDan!w4!Foe6Cv)WhAZo)kd;dtKVP-7vmQO84G zEgUOe|Fef!`hoYo?}5%QzWwtXim|ZfU392{vtN4g88)xm9#9>8--r%r+zu(nLBCw# z9NLR$wp^pI3qEiJgLWrjuRtcC_A5HS1}&Vp5}(oe2OT^K{dPgx+uVhH2f$>Hq=GC| z1=vD|i=z0eD8LPinnO-FvQAgkbV^uY3!1qgy{R24H~NH4XQhN$p@JjGA1!e=$7#`n z*Z$(8N54{UIAW(w6|rpVVCzGziL#Y0$e+mR!t~{t{L!Qx(v3u$e!jw~lRl2wG1@?X zdiE*!(MZR7O3yRv@{}{M?)`m&f={gG5_>O4PhwpG*oP1cL(n52-;)c(d z?ZHN}-Q<}@)cF`Z5naQCk+(w6sKi%B2a|>23i%->MP3ffaAber4?n7qS;7+MQN>cR zG(9W$dvJkH=f?NHB$pl~hr{T6I}n&IizJWoIKUOVb2!9uXmJBpzxD4CQ zG)W=uYO|#Y(Hz4k?8a3eEHyo7r%Eaw?oc@%4*ZQyTnvF;`HA=ZljY2D9Lf&DRuT@S zke5{}3PnGE6iT(YR!pE5;dw2HlpQFb*Z0Jo4kBe8M!X&eWs@_0fN&G>e16>Tx9w9R@mhV;#>P-0Tk#JtIi;mPu(UBUXqU^0x#^Ko(&x*h zk^>=>xrNgxUYp#ub9<`74kmAe=3 zg$5?%?jh1I$u2GflnA|RicP6ntPvLa<@6S2#BRD`*T>Z80E@>g5g#FSpP8-ZfUo3B4zUkJrw!CWK}@_PI( zO>E+*-Zlg%dt2^_;D31M~}0?Y+v98 zm(`pyeH!3x2Byov#o>mqCK3!o3Q}IknuPjfcU(%ek=hI8Tz3FZNE6w_Kq5#{Jp#r} zjloaMbH-<9w#s9a^~SRga#%mk$=q2{Y{lhbJb2IH(o67cKscf_D-q$0}jmM9d z&pUr<>HPD`<>w!EX!7e`$27;`=a+lmeeLVUPwVm=EP;g90eI9l1UdB`xw?ES7!pr739{cb<(&LZfbzpNAeldKay zhkmk7v>{n1+VqPVt!%SO9`ZRF@gVeL;NU@@Mo#=H`aH0g(3l-I0`EqU8#JRRSV9+~ zzxP87TR#H-hWkFriJeOB$J=JdMYh1ohY!%nI9R-o%n0QmQem2*8$!nuK^;AuCZtZwRx5kCvKY4k!!S zyhz_VtC;i!+sRmY;`eQ5E9_5Z=VjlC-<&^OiDsQt-GX=*Ur!$6M#YbQvd(D3uDZ_`(AUD2j*9NgGnMM6J#HiRnsYwj-){q{TaT|M?p zY*hcVE&8FeE&Azqw$V3xAIDdVHtV15-_Uy5`?cZy@Ob32)P`(39>97VjGXq~q)cm&oYkN)1$-7_;Me^o35-|dY7QC=eQve5_a#eL|5$3}D>K^T9I z>442;lP5O7@xn136jM7wRzE2>z;qZ67ah|l_qcBx(GS^aeE(L**U`^qSmVFoxu3kvYF*2G7U^UB zS*zP%Z{CSm(nUO$q~n7)&pQC^-{5(DqeueO2cGxNjT^tQaU+6A>}81GytzgDPc%x{ zc||%d)&=oa&>AqW7%OnRqxgv?sKqL=&v4!-Y)=z~@#8#`1P}uL=gDpNtzl zSjs-LZK|9LN8b1&%^e6Pw?)Ib!EyF%>%`xr0Y!CV9DE%)o#MI1>+X5)8y}+Ye1OM( z_`0r+55Z%_`!!=fOU(-q`%wuJYKi^8ub|>Ih$;n6VE@%a5QRf~T?qfU4|#BrOU?bi z7yZGi7((bYqCZ~~a_Y3gKc+C#*YC}iwdohLG5DNYES-mA}y!bke*1(Ti4u<6`_`O_M&fmM6B(~wZ?0v z@Vzi(rh@xuX>SB?BEBQ!4@tb07%kqX9I{uOe~FW#a(NBCo#eIKkk>o#$=y5-!OxJH zQ*HI@P#ofJQ~q@05HyCT@qU7AC>4M|94jbI%eu}ad=eN}LP`WvVeWSjiPX5e0>&@Q zL6MN6$||6XFUiN0Sh!HxQ;&r`K1X?u=Tv{D^P0D^v39u_jg)MG>(5J zp2`Mkte*GC&tIiCb#<4suwwmn7xW_sZO~mrKlU4>D_8BgF=vI^U=1#W4gY$`jDBkX z_<^wo+;+FDLDz04Nam_V_?O92Cg79zu|TL04R~Fyb3YUcWs7Vu8py=c{&*nla{7XC zHqq+bG+f9ABYZ4GFJynwFVfF57 z(sdXjOIRDS&;P*b7xWR)V4kmMpM#1qtf*n1^RW;>%N!uL!~c2?gK8T?eAU4ACHeSdBX^XyMcW=;t`%g`xlP4qp=OQ>*{%O?Ch z(!l9N<{JfF(D07rrF<+EjERtyfJ+$}X6B-pyVgx2>)F1%B}we<{Wj8ACw|uXy2$rq z#4CB-f{|Ci=VRnT3p<)}p;yx!^d_?Embg`?(;Vg93pCsGEYVynUZUI-*wg1#WBb#E z*;k{e?8WIkS=K*1f3X~6>9P53|9bA?SF;0ui&2S~CE0fTc>&D@l3IhtgV7kLaauST zBo3AcYAOL=i8L64yg4NiZL|F^zr6Fa$r+Y`ExDf-3Xj9{NG=dPh!_h;{3ASy6dc3x zC}J!;t%ZEe2iq)0`0y6&&=K&Z?}+b8SKjOOAaHD?pQK2+=h+Q7nuHj-#A#DS(pMV! zq}>le8S-JCSx*TDHh2VVs5uP#G!7qtglxB1FrehroQU;^JbU=jq9Q280pFavbQ$c( zjyJqK5sn6;=qIMQoobxzxi#gFh54|ZUVpx^5IZ~Ra%K*3F1s|7r=nP(6TTLlPH->P z8a6DKo0zkL`%P&5Li+k~-#x5t2n4wA$;yE>?r=3q%*2lClOx!hevyqbx_9$)|k3wS1GsnH9q72k3u%r}s7(qD?xV9qkHJskdss-PFEJ# z2T;qyp{fqe6AWsaqN<9fbzZ;Y4M(!EWFVkywtJnp5Xz;x)gY)m8B9jytALvJ4f(vP z%ccL~JaHSR{m1;lQlXJ)qytWeL-m&yIsKnET?+a^BeH~3z`h6C&Pokwx{15I5%G~# zo;XZpFpv<4?ZXiz|2CpUlEh16;o84otspW21+E+JEXzC_%s_b03O#^F*BZR9o(=tspGU_Z*k4I+5_-123$H=cya1)mGb%kEj zTAci^-tSAb8!2nyzHRZL>Sf z?AbI$F{t1VSBQ9aAgb?U??LwIX3qL4rLt4ngTrB81`xr%)ehw)fed|#P=VP@s1a@; z3zTxE-THu06_gJ)ieMKE6%#)v?4&ODk6bj%cHl4btf9|zc3!ZFCdTezn48_+`N^8< z4W0k)8M|Q3GbY-Q4Z+*2#??_j&_75=HQKDNf57v%hW@c&Z zy_!Sjp%e(>We+sF9g3l*j1nuK+snU4{%zD9`0N&FARq%q0p`Uoy(@(;^lxoqrPg_^HOsC`b!+RUCOz( z;qG*s^Ga|P)RJ)=A^Q`_@TzJ*>{76eyoSvnum<=-94ZVV&TfvXfsCg=yo485)kuX2 z_G&Lv2sm0*mwoTIDlHIn2s~Pp7PhBzPgh?7e)5YteljQRyEh6L6I{vyM~P~KoaA66 zQ^d}`Oc2k_cCZ~dLGZg|zr5Rm3?*o7QclVR6G*Lt``iRhu4asUE@yHGWtTLViLN zsjeVQ)Ec;^Cd= zL?fN6Ouh#^xZvA;{jgnGOZ-;U#iso0B&v`Bd4`?PVMi1sHhr4}2}OmV$@C=Bt$QG$ zJ)t>0ac}Ly)|6_^fv_W6y1(_7ALE6{Oc3lCDvNPIEOM#o_ZF`{#+LMWT(=ULp&!#+ z6h`3BZXHjr&I=s)#GwFh0-DncFgS6Jco>T7vK+%tYEnAjgC*nzWFX#{rJ8>5r|7ks zjK~!CRZ$8bhoekBlTXH|9%d~0k6+>Cu2S(zW8o`DFS_U`-1t6kBHQTP(a2J+9c3>z z*-~?)8cXs_cpB?4@VO6S?8r8dt`|o~%fXidJ1?O4kLmP&kAoy+xFg zSjM!s@>02*3CLG4JP`Vp@^TYBZI+smDx5&$qm|j}ES_CXHX2T7D2^betnX&egatzc z02mP9AmjQXR4;em-PdltYTG zQyVX){Q*iq9A`f=ez)7ztfoD?pLso@3j0wd8Z*Rflqqjl!teIC|FDSp!+H$bdA08!sXBgfK%g2Bu>`qYN0o4v!*es9wQDkabVF z6MRC*QJt*gm2xDGGH0WO!YI%Z@kqH6r*eBETh=7;{PwYGJXRW-x%XZW2O4J^_ue}* zR08IAY&$+QNj^W4&RvuK_*E5bvU5Y1+4?z^Rx~d=SFvo?Xavv z*Gm)_vbxQ~l3D+c^CvvZQva`O*An#8;;XaVXCcO8sq5FLAKr%WBJ7pMTCBp0 zOp$L7F`%lQBUhNht`~E+jAunZq(k@V2UsvW?gSCfGHWMTu_>aTcNuNW+6k-LSnDDf z^IEkRz!p$@o%Ku6kHyZQ{(k_v ztJ<+T(nCzhon9Ksqs{%i4X?(~w~ZJl#Uc4PO?$;UP9e8Rw*5tS{ua73YBE^AgMLv$ zW!YXuwch)r>$=ZocU@=1Zbch<_8Sd);c*dbon6oi^&{H!&L8ia-!;eG`&}9Xoe$o> ziEUZkhV&NR#?)I@w81)(-cs(AA8!-YgxtH;e0@ zxbHd!ODzu&9nw{q{U$7lUIV~G5J|vmTo8Ts>V{5e$m9#cXn^W~dFgp@- zIq3?eNuwqt*DHjW)djFh8it;gU@4lQDbOqdCe<2;+s<)(Y4hp<-hz8{pYPiTKdiV&}=Njbg}Q3$*@3b%qObY+yW3vM4{^ zd2+50cB+2@@;3EL@(X|lPnB;i+N{RYP(PHjOSlsD7V5{$*~OXD?+5A4x4uHUyXgVu zMqy_TlLrx|1?|SXfxq#>B?cFna-GIpZimBl4TdXj3vs&@Dta~wG3anO5BoeK3p?H1 z*#En3m*d!}zP!{d(uE_nD{5CwixB z@9)3gJ+%Lxo;K^yeqS6|m$p9G(@#Iz*J-^!9s=JcT(927l^CZZxG6ajBJdsF@MsgxuV_}-(<#YLXzkXNQVHe($`FhIw;!^HSVSnRrq|T)uf{G{7 z&r?;NI8RQKSW~>z-G;FV-EZhrJ9V4Q|8n+2{M2tUaFT8-=1#os9@=k{ADa7Z@;0(l zxD8_3DJyI)*u-RC+-vl+h7EEn_!Kfe7;JrNi@3cccXK*8|KoNk?}zBGw;!B8!qXFW z#}Awhs>9*p3Y2W4viWBEvtFH;swk%tfpjoUX+E_ArTMH3ZiK0puc+D)+r)d57Sh%eCqA_o-^H|sB zC_bSa6ov8v@EybFp?F|>n|+YI&igR$B(U}&Y%{`RK7ci|NyF%qa=``70u#Dvw2&VN z`WVv609v4e(iAE|DQWzU5J}F)i%5ggC>4?$TeC&*j zfG4C}PEh#q80x6|DZBhBCcp5g{5Xx!<@HU~u#e*b$4 z9t4!zX>1h3xt#l_s?s(IIktJ!Y)2h_P=j6#0aqZ>ikj*6_ICLtEQt+uT)h)Zs& ztlBMLNGHR}v@vMI5kYCz@Hea--(jzrspP|9Hk4Z#=E;;;BoIk8KHkR_{+?I}wY8Oy zUif51%qO5Eif*m-_iILe^fh=1UxSP^BQ1X}jXf~{hgnbxR_Ue2^m9Bw!etkd&Ty3= zeJ@su&AYiFAxWJl?n?>lx`2X@Xo3nj@F$5a*xtaQo z#*SF5(FizEz(b&BHskJR{OK2_A_yfNy2-MsXn?d$6@xyKH(oSc2;=4rT(8@`*U`9k z*XN0(=R03D?{@57yZhB-xKQ0~x#7`z1Mi*_g|S3b3w(Z^`**R%B+E#CC!|4Xt~u?c zD{pbLpSTR3__|)i1Q(O>`XzL`R;iF2Oby~IiO2x%^dkmp0V#0xszhpJDQIQu3tu$^ zdMKKXpVMBa8zWdd<{ykAMeF@v(CG{&yI4S3k1KW~Z1BbZOoO zxk5Ke2M|+1n*)ZwS@c8xVBV&0yhOAi9}sV2;*YG)>gF(rHU|EPY~__TX%y|Z{2YjW zNxu-^=@$>^<}{#<#n;W>=k~y(H2>B10M;l^^Y5;anNK8JY|GtZjiA3k$1!ytnk(0N z%pAquxf-}u8k2#!Kv8#HMkb*j;O-6|rym?78I}7@@pbr=t|EEdZedfFXr1@#<$eQtzwi( zXXtasjdIOlT$oMT48zG6Sb04pPf!<8&8#RD3)Mn|;2#A}((r*}RC;B(l~m8J22p?T z^9E6W{_{N)Pb7`%YFuG$8LEq*b}T7ILAD&_EN`Q`*oG=9>cl~UfFtR=3xl=Ta^s^# zN*LJ2w&|H(qllBvqW%>z8_sLEDF-oXxbp{a&7wLrJ!SGAp<3$KZ~oWzv2y+FL_A%k zn#cZ7^4zORz-prA?^+)?)6tzZRN0UdbuTK^#WUOTjnU@jiP>qYd%W(4obLF1Ij#OZ zrr$l!R^JY9W4{%&`BQ2``Z%{iaK_BsbJ34Awu$~Ij%x9_bo=?ob^7VK|BT;eK)TH& z#m}%WWmJ&C4FQ0Da~s=om4>jjd*c1o3Kfy5OjV~SmmEnXWmXo>6fFN{R^ZhM*RZpF zOvrE3vGUBu^OAYC5D!chOUZQ5rR-Easrtym=HW&%pHH5*F-KRiKgI82A0M7Q=f0~p zRk8!PXd@WT#v>z%6z=|;J-hScb7qIf#r?lmU#(xlj`MHKPhmgj`@&!M#6t1@inw%F zez)T|x{bkQS#l#&FutP08RP;kUlhcW5ll9U`Mbro5yVkvj za~5%Ce#ad9m9g)=HlanY)+F392XHOH^9aG=I1H?gBfaXb3XaMX*gRzMoryn`)<8xB z-By9+pgxh4_Yd4IhOUlE>9V??gQJnWK+tXJFk1C5n2su1-9J(G=FX@2Bg)5*Tb_c7 z>0KKqO7*mIh(;064ah>^r^pz~2$VR#VTW!A1`DSey(U>l_*_N$BpS$oHws)N z-Fw!(`;vTKMx}nLW=a+$&+0JmKf~RZyw(?`qu^e1s*>hoRK=8R7=4g8zw~PxXWNNf zF43OdxG@up`(rVGJeJvr)P>HEN9!~1ovDwuJib)rPU_e7V3oMr!m9A}-oe>k>jKWsk5^y7DWCiuCQteo-3N-Ah{RdQXV4uA zlvfAxuGI1lLHw#HvTnVO?sY=#6lZBn+Ls$hA!vbeYqPo8R5q2( zq($h$pC~x<^i9gO}YkNE#z$5k8$?LQKWhkA+-n#U5@A} zU!+IrS6)xjHas%TeTd#jFv8NeckiaA6V&xtQj7Q5e|_UX*T+rTiqqiFy@c{FYkU1m&fO0K%560rlW%jNYDZcmj?SQ z?zkX&=UxiokPw`TJ0CC|J_ex+@fv4Psbt4~dI**K?9qgJkCdqg2_5LCZHop(hf3tA zlk6-}mMD~OWPO_)6(`lXsMm>g?!-%ek5p`e`~jugMNRoyl`pf+ia#)k0Y(j9j~`K-{$+O z-zOpX((3ypXl*bN;y1!iO&J$71>51i@__UoXlM(!w{LHex=C^feQ^Dl+l}zN!t#dN z;sEpuG;O~QdLUl~CZI7cAUgC$C4s&kVezb~E~tfu3Mv+L!t?Q4DDOvS3h)3Xzs zo1=~VwoKgX4|wYd8ATn3c1F|den@KvyNuQ@O*s=pQP7n@P}X87elPM2dy1imxpn(rjmb2}0KBgl!|HgbWej}JdVF^) zaJp;EpJRCiJwcQC4qu0WL0862Zg>u1dWpWO!o$b-I@6w7*Hdq!(@$UQ%u4z(FuW`1 zhp@L@46iYE3x*f{2pq0FXzWj~oh{ae`oa34P4C)RziW=O*Z-(vct!svhIe%v#KuLN z)v<9z@O-dsegL}kE9MJG@=MMbaJ)gif)81Nq z%RO{}Pwun5ALsK)<9rHgGtY(vParqY#)2mRzdnpy5z=R}2ERsu1A|`!q{C2kH{b)m z&a$k-1n3BUEo2RZ5PwOrmS?8Q1Hn++<@D2F$zDkw)o*?fat+qnsSx!k;BGQHv@ zlleIHd)PP)ck2QgvShP#^xh3##4agx$MM#vDGTG*c8$vQCIu=B#0<$&y=W}()_M~P zh?8!$x(&~Mr>h(q_51+8&%-BeW}B_q?>Y_*f zL!F=Fm=Im^v(;UzzIbBZ2Kgt52Xw#le!PC65Odj1sHzc>XEZ%~iyRzQu^ItIT6cXpy zyi>@~r+pG|A5=KOD9qNaaDuDjV_`eNkMt^jARo~xs?%BiVaI$!S6EbTwm2tKl> zup&KvBw8PQLVA6X_7GxDfT-s7@+t`P97Tn=Ts+SAP``u#H^Sf#FEcN25mg?MCjiw# z(Bqw(Yt7AhJ;Ao$;Z$scKM+dkz> z*Q1M@sJx41JiH!D*sa39&Rw)NxG0X1xi&|hcEf*%5^QAh^J;QpVNjDLtkYOYV}G`{ zom`k$NVfM*ZrQ?)-ErT2H+7z3!<`?n$W8a%cSq+K+t~R(mh(wA1n6cB8=^~>`!Uuv z=#tix>Me?X>^H1jbCdtTho-mbR|i_~sBRm?;(GUvpKs#~5Uux~0oqfA`Zu3v&dt>M zOg^Bm`$>E!FX7(D9M&Dj1g>$@EhH_A#YZ7|BVL=A^6_FK66O~jSXN(938hMlMCypm zvJ=r@t_X*67z%@D#ism_RsMW(Fc*xpT+Tpb;I7V#`R;Vj$C@<3YxEd?8iOXNMvoX( ze0DM}@K?4{RlVb^w!b`F_P5U(u2ykyJg>a|`lU~Q=}Vtpy8ilCc7FFwfuRw6r>fP5jpeFN-E^M&gy>dsV=9 zbz~q^ItOmjb2w^_eNHFzJISdzaR-21#cl8oeAk97xp*TC_ZQRuPO)1$cd~5f6YLgp z26Z06U;K;tboV17m74jm8%1T!?dVD(kVPWOxmZ8_wE3fG!9QCSqa)rwzWKsVu$<~(&yJRJ=g5aPSqyQ;axSC~lR7u;H{Dq6h0;g*S7 zB8k#Po2I8;v&8;{MRbHl50B#dk$gX9&?BqRW&raMJ{)R8KAbOz>SrgvAVNN9)1~zb z(8GGPPCQ!ZV(as0(PsVgAlj@t4>T{t#EBR4XBj*iG&77D5RMs@iKG(UIH}XomBePb zLzNwN+EqwDYz&={5^f%}N9*R{i<|xpQyyZ@ zx9E>{WLLQUN&gW<1!OZV~4^b@Ui|}{MO9RdHcs}Rzx^y*k8Lr_i(!Odros_8# zg}AqgU!$k!nIG$3>jZU6Z0>^dr3V*Mk+MTM@0!H5n@3`ykT;Pm;=**VeV-!|A8IV% zBJ@N$<-uLy@M;VU?s<{3<(?{H`==^4`*?Y=Qc9N#rOE)^_moUz{k0-p5*{DgFgGz8 z35DW~soBY`!<(@NJ$0dpmiZo&KFQahk3K2t%TQgDoU}oDnW$@0p!gHN#$Huz%XDo_ z3f81zTp7bbxizy5eTsTbj%9do#R~Lb9F_t~G7p)c?qbLm5)tDN%2Ew9!m}k?c+ys|O@>Q0no-I2%<==T zUz)y-z4yB5rS`5&JF|=3@gFCyWOuN+&V!vLcBu0~`pd___X}ePL--(HB+eAl?s?Xd zBEJAlaLb&76l|~s##M&cwHN?YiLR&f{$8<_mVQt6%e;_h9;_ZQ&veJp$$M*T}#_8ew?st@RRdTxJ>y zhJ?BV$QDFDt`KMW&d+d(_|I70D2{K^A?dR(MQ8o}{rcSD@8@m$-aEtFaK8#~(>KoE zl_wO1Kb1TY{j8EFv=)eU{~h*1lb-i^C*njG;jw;9+XBf24Q7bsTl=MibRG=O`Qj4`z)1%vy z8fUuTblA}-- z{>h3M0;pNoZM5FZLYj(8 z)WYB#JdO!2VzQ9T(o(w}!=JYC3%i#AL6y_VHFKLRU#VtI7qh3uh5?KK=b@Y?643sl#gbeH?& z6f!}#Nw02d=@gv7byQEI;u~2ig@WbaWJgOvq5f@v&=4HWu3|soM5AlpRy6?=nAh6@ zB}L7ann|ikg>q8c#skf-U|BDx#6*hFA_>5!a>a^&bG03ihLvA z*PhpwwIwvtk$V$i)O0h-B_??c4CWUDbb>>YY`85^;yMwPbITC4f|2@IAZ%i~H%5j~ zM-K5c0bGKH69H32K*wn^RXyWTU>4(mH1LJ%E}d{`^7Ye`AAdelEGG(uM7e0>#I$*? zOsG#zj589gZ9H)Bz{XlMf&z;++ny8uCNgANJQ3y~uf*u}XR4bIas)K^311r+=oMNk z@W=b{llY_Yz9Row&+CeOb5FZj*x>ieA*M>-Lc2+dda?UXPMY?gSo>cY{d0b0_Ambm zPkeK?|30tv=bgs)Q0v1S_mA*A^sDP4k0CaUJmSarpe$_^`K>Fy!|R3cHCX)}vKwh0 zkI?)r;}P#GGLiv#-$uJ1tY}9uYja%O9$Wnk(MFNq)o)zueCNx?e7Wt^zuzxot>0_u zm%hX2yY_eZe2Fepj;%1)m+upzG{#!;c0?B|+Ht=t-v@4+^dHxEFs=`E`{Li><67rC zsAwSQmFtM+H~^_ryXZ2sM=Yt zm5P~EI0%V}Kow=U+^tAwh^rYeTvHoVv;^7Cy>h>B9GQ*;fkGTgsZdhf13Hkb~(}bE}W8}na=em z11EQ$1QySAamOR*z4LW>^5k*I23U0BJ&AP=$g?Nk3mSAtgM8%>qCzbS$V2kba7$8R zX9q(vLX3PZ0MU<@I`3P&;eo%DXE(f~MdSHA7Wxh7w`V;6Hha@{d9v|WG#)(XD{}qh zVc1<}8-_7=PHsE5E!Q(&E_U}?ehPcdWf%96chBilpos^1+O2$D;on$sZqeV$c8dH> zjLELk&2^Fs7W^hyTSxf{T-vA?VRf8^+Glgj?y`|d;E^>r+!^ln5?8Gg{h+p)`$`Fy z3AvU~#@xQ_^vZUZ9kqis)GI$@`XdBhODrC6#IpJ(Q!5;6YQ&G z^GC4i}BK)NvTvE^z= z(@+apmg~G;vO=G*>1Ff^*s><-m_M03dwl1KC} zB$DDr>1FAhi49EJFh4Or2BcNBoFB-f6R`+x8b%L)rDx5!w0xNKoIXvNl$2*csM}7WiCdbb5`9@eEkcs(y zW!#&%$*U{J6u_>5CCP3p)Ki z=%23>_vMq%miq(c5V&nz+TPrXA^{Wwhum;d>WC9sxD#ocuam9x`d zefDjXzj6++dmoTLjQr_yq>H5IH4mh5ZcvB`a+tZ;()1Mat6X+UTyr^?>j;oHFv$tT zzPwj+nmdG1?mO>XCLOr&+>6e;Xy2YK3*%$Od@AA90Q)1f2`_d^emeW_@Au#!&a z?PFfJADwZ~Z8{e5_$DfG19g6CG41YInL?c??D)(O!pV}|@R2F>dOy*%L z_>|&tdKBj|$*JN79iaOqkHS1h+*UrN5uaK%_|ygGGwFE;&p&j*p>xhQ_!KR9FyPhj zXp>JNn9A2&Xli|U6uB}^vFhSBRCC=a5ed2-=TmF3qQUhT*o8WC^6I<_Y|FVeBRT~K zV`Y;yflqN}wM?8#@F~OA*Yzl_Hjy8)YyljhWPUI+EHa^{vE&qF75q*2u|R@Q zVFlb$i;y{9EQ~fX3Ab||0ODXOkJoz^EHWp^8?bVXhxmuuoJ68+82j;*rWZ)Sk33qtK z9Z92|7^60U8Bn4_)I*$%Y#Q6&ti-1tB*DS!XINo(uUUgc@_I z&a?OLZ`7Hz|HAzjUT}VM%jAaod5!Z1GO>tDoroMi$^EV;lH`jVX?v8(>omF*X?UFeb!~C^66AKuk-3!~w&@O0dB(kT{h5 zfrREbJlQ+@e&0Fw&fM7|%Z2}crQNx6=gz(7eCIn~FM+7TS+~33jfl`mk9(by>t0DG zWm5#zlEl}W|H|INzU}h#M{V$kclpC8eYGRv#tEO#!VczqeFKPi3aUL7&HJCM&0-rKV7D$|{wY=d1ID;mfkor(ezIEVcx?d_@bR)lwkz zeBR2(@@7X;aZe=|!p^+ep3)BAm@_+4if1ahE#$%#+MyE@7PiSa;8T+>u6u(Bb%!w+ ziK)9GjO`S5_9&zZZttDb%2uJ*g=Sw*wm*VpcvAaZi(x%b4;f9t!Vug}HCtr}rgoDY zYjqp?OKb@4>RtZXDJ{W-FI*0L2>L>oG$$Rc+Xo8C07R;_rtu-8X&mXgi8`6ads?RP zAu^3u4W@Bi1JihSm5QEK=ep-m*DVBybg?d5E2Fm)B4}?Sb}{y#=--RC0yrX$hGURk zA@GTTf-sU71~Tzn%;B`#m&{Iw+2ukIfOE-db2;PLSjOiLLjH(Eyg`pI>M`$ zJLV4fVNgHg~F+bo2Nmf(dM~q6RT(K7frT=RX9SPMK#z z@Uz-^_-N_8{5!y~U60<>sz+}UxT(yer)?Lc@T1Zv>mFW_{$;xtrcHK-?iL%?vnHHi zIJ_o3VK$PRFOjGgJv9Oz+T&(+yZMOC1<`x}Ep8DLsij)1{gTxRwAQNF1Fdbgs`hOc zoNf3riqW5WMt2q6UCuk>=$S`%?wH+N8>{Z?-j~yJF+9&J7lTvB7qb;kqagj6FJiaI z4;K??Cxa$4iDKH1pY(BmbfUrJu-ls&@;H_L{PJgB@Q&g*LbxywT!0L@9xim?5quB= zyH?@R)2H|@-JkpizwNljSeu*lQKEw#cq>Cc<(jDxZwb%AM->Rtt+B&iL+=e^UwiL= zhs5<3El*S58x*HN{-xzpf0y=^36&u9nH%B3Yib+Er|l~R7aPX2{=O#mZtf4H5t)zI2Lx1z8XDj@wE}bXNW- zo2sM8ed(p$QXNI_m%sj!>?h#qx;W5*KVQ?a%7D+H%a9>A{;s~Cpg9X_gvUqwVtoNWnx{ut#LCT5*iRL-C)JO@+^lTatp;&&vgYswZ(BJ`C9jXWdH>n{u>g-B8 zjPs`8jdMFEM)RhVm^{ZE9WErRubwyW&aBOwd-6h7O3-LK;6XXNU&Wr%bQdQI z#GBx70z9C<0Ui`1B=CUXF=c?qtiS_0sl!9pZPwFW{62@B)H_2xD;*+je+np zKzBADm6_fdv=!5`kfz#wRJsq&1GEmMCZaYTy3*Av#|_n8#qJU1`$X)DA)=)%TY~p; ztJG>9NIV%{&GqP$PXCDankbrX)pr5ois(cGc@n%@M7W4PN%-#c%F7Vfajl8$Cu??$kZ(KKXOipH$q9&=sLel zp$?#wl*2t3*oeSOD2ZF=nKXaS)^j#ZbXSXoP(T`B1BN~vTJnp*hZN>k1yXmAARa{0 z4uSwdiWJ(RVuOM%S;!6>Ap4-mozc$dog>r1QLl3-637+?2lLq=h*v7UC)E{Jmn_94 zvoF|pxE6p(!0pI}LO#{*sn~j{Zj@O`ZqLQDo-oAWIIkKtH8E1`3kA;JGhWFd5z?P0 z|4RQ%sW%$B=2Mx(!d76oE6(ok&lStrh#Ig%ugZ^a^)zopRVkaje@7vmj+VR1nV83m zRmAGLq(5Q*E}skkPNANK?MB*(v%0gL)J8_jZI;Xd#e!a`jH0w%>$oqnbzKrMf!~)uB~`3{f$zT$UbtKF z%Hw6<#}!?Ccdgt!$K~jX{h|(ewT3qnujs2=Aqx?XiNL$P6T_)&HZ?r4w{`T{$}8E`mCDuZ zm6Z!di}_H*te7m$P`)@y@0=ER1S5EN6@BY}>R;yvmtNVBueyq{#+5r>9SRnzlZmJt z3l@SQya~qSXkxO8Hyp-Q!2VkVdkx0d>M&k;0`c&GA)SXmn^x>YSYKFuKcuhkv@{LB z^&QYZuE#YfKtNVwW|#bAe`I!z)bRuUEbhOfJSF=V>7G2=f^x`=^_W}qldi#<>*Hyi zmv}6$IFB`*Uil%$@B`HH%SuIxZ;takcM=h9KA)dGyzXvYXrQqyy&OWfT|Vjxiwayr90Jgr)TW0Q@^v7l9L{?ij^ z%i^?B9<{^eU1D#!b7%ipXv=5b{`Svo361sdY{eM`K7Ii4*R5aqfjaA*qxq#;P@N;CrprDTHq~>dUC0D5-~0+2;sJ zr&Qj#GJR($KbXYNV7|1qeR$`;ghRz@wHP|6y@qFIK4J+Z2Zt{o9!v%-Pds6G^N|?{ z+P!91uyIBs=rXqs1YTpWd|rMd_R6a})(g33?Y**c3*>@f3whJXs}6#m^_#F&2r zGDX=uf)iq`iS~6#Z^ZR28fQ6%Pg^t&pb7$({{mPdHXB{SDFhwG&Zw0(*yn!gsBK2+ z6|e!~2CZ6hmIM}?f{dwb9k}Dyzs?^1`qyV>iws z4@m~^4ddG{{Ra7Wt?_Y6+ZrG4GfgmIzYsKdeH_+t)l_!fiF>#Ax&=7=DA6SQV8?mE zPfX|v1xkWv5bPd;F|SPT^|4{&>#(65XR2HYT!LnB5dg&G{g6o5VIn-q zGb2l+CxTSXQcleU*~85@vaQW8&M0R+`$+(YaMyTGC$HFx(JaE2Xg4-2CF*StRE9d`QXz=hBX@Wm}CG@#(Q| zq!OhteoBcHJEIv#bV#b6O8W4l9X!R(XkUV98sT6Cy{JjM>pN)rNIpjEas1u&1EUlv9Bjv%hf^wTgIMgErwHH46Jm3vu&e)SY&Yu3(?y1EzGz( z;B{FM>R`9JDBb%xkM&h<{@P}Prw@4mHvG6eWWKlAn%{08w?D^pSHU46bxRBNEy(Mz z$f)yhi~s@*Lw_lxewYyY(gp(sg|fXi0HK(N11;f419=S_?M46)eZ;>SC<0GT#)1pa zXl+a@uGE_IjeR``P&9iOYBG2b-y-+)p|q#X?qr{4PBhKc=eYd(cYn$5uLLFsHfI zDpm!>SH*6;`)=&Pi!Qooifz67Zn4uodH3Dy(q=DCHvg1edNy_2_qTpw z+yjf-c(-gr|6W2Qv9p{Eet7IGiwiUxF+P&r&1|yWX53;9j$5T-mT$75f#OtYDqF}F z^0`%8&11y04YryUm?vEGr`&EHrx_@1H9OHaxqW;u>wdrCt??s$sha<7vpAd{FX9~# zTi|ebJpjM$*u=yq+V9#|01zFt-hmu1)X4B5Q5-q~Aty|0Cgm6|BPWt^;YiY?h4Xq` z6u?DH#iGr>5{O`yH7uM`P=IVdyQ-)8#hxCv^}5a1@p1lKj@bdtG}LMEyGX5Ae)`0OQsC2Qkx7{n7RhWeGUef8dJv z{KS0xiVx`A?uyuqeB<()W@1;Y=0{X7#H-U`L3Zq*L?&!Ziv!_^ge`3XB9H zUY8g6%u9&0$WR9z26!my!mts$n~$>Y)*^muV&dM3iO#igV{NdbFi`*p?AFeKgKM4- zuMgGCA#-J{CN>l?{Ul2?f0|rg)}Q@@-n;5|^;+MBw3W4Vt4BJszSNb)-1%nKHW7&x z)=R*fz^7yjcGGIGq>{v*N`+)kswbe@686OUV9CRvSV6Qbv1;`CLXaPP-kVuvob0O} z7O|uum1@Gu-SKFc$|Q!V!G(V0jUx^Zf3#P9PR&7&yDyRGb9?mHUQfc)`rip>2PhZv zhyh`Rq8z;n8R`KG4bEH?0SjUbnKdxzkO*WF6wHO7x>YF1K#_re*b2FbpkntiSM!VK z#$FHDKQ$dYmk*Ks9oyIZ%(?OADBCw5Keux{?R6JI)^n}9+og@6E#r+@OJgPMNd`Sm zz%SYSDMRbTFS4!L!i#19LDRzGSou!*FCiVMpA+!QR>UvKhz=oOV8>sC%JSe=W~&7; zh-Oey*b|If0-f!+(1}`RQ3@ZVJxZwC0+QQEFJUPd8{xm$t)T+_w$}O$Q-kLnja~Pi z5$#o9*X7O5$0uGh@l*bHExwLO+oi+xLs&5@BC(D+FziYJ%ba;GrVLBRB~Jc%G>?oA-U zGfXO+j@Q?*m@^%7_?-^KKEV+X*v#^&;#e{qP*L-ev8X!}vH4lXABCL2Y?i3Mb)o>4Z+a3 z_S#+mDaKyF>YeUhP<=$A*6al$$Fw1=m71n?xUdBX3(t*BH=ok>0(Jn~yIf{_&yCNo z8V}KA>K^h!bdf*-spkTxVkdri;FmESTtXG;n719Y7Ipf4Xx@WJK3)|DmB(b$F&Yo2 zx9$B8M#%R+?M{m*7Ns-7QeY%N6CSfVnV`7ffHd8ntFG$dkN=F^00+Eqxtz7jvE`rJ zasN(UxCLEs5!{bkqaZ#Bixi)QVL%zAEx?RCfN`hW3R~o_C8F1((cq<1}>W|0EsSMGmvJZauwn zJM{T$aQ;l`RV}?7)hXrsUPT5wqkV6cUDkCq?nLV`4co)#VS9KX`ZZ7vtwoy;JteT4 zYuBX9XQcbt_YC%g_v1+hdjjlTFN3`c^WnY}i-p^}@V$ieJNARt_pHk65q3g9$i_SB+o;5~@`&x=t$|ILU@~JDNA*YsxfZ&3gT6`126r%w8>U2DouAV6zkUaiRe& zyB%=p53t>$j)7i@C1ZIGi{GNJAbex_ z0Rjo_|Irl@zcDH8k*=;g%Oxa@Ad=2XL3b3p(S>V}?g4!O2KOTn3aJ(aj8jJd0j)_A z?!#j^O07#NfeEo3>wJS^In=35^K+Z_OzlbZl)I}wyFF=)<`5<-VY#1Tlyk98KsZFM zRnZ;TY-G{r)-Els1GOi{pSwhbXhZs`RYfX9#}BGQ@!ZuaM7YQ5auwK%+|LVxIQPq8 zB`ySuNs93(Kj!MOEZoVO?!x9>&Q@hdDc?$|z0 z`RH_=A%}f!t|oHDl}lHB=jbWElLG$fIgu9oC9UU)^A_cD?Oxh-{0ePc*h}MboP8Pb zbr$3(Q0BH58VAgxWGuYW&+HMN<%ay`5pesf=kGY{j`{x~$NT^GZ~KvUPV*m^9%o-> z-$dR9{7T>)yk3Ri7~*sN{`5JXmyn0SZ>-2gsq*Kgvl+Jw_0u4WX#NZ7N?7Op5?UN8 zh9o;~XCr&6Ft2I0SMpNm2?}g$(4XvzxXiK|48^uYqZw+Kv*wgM?DWo6+$QGA7dJ;Y zcaI@K(KlCin`E4rn=P`k7ue%6Vf|HxQ-Luf0q(+yAEE+0>Hh6g&R}0x*k#&nwyK%(#B^8E>t6Ck(%y8y=bxI2BIe2A zXGPT$jpwuBxF6-MkwoY8M!c@HKOFJJBbjEiKjii|T=q;T9CacU6gK^K+!MhKb%3C6 zGGyC83OQja6j96h=1D*NE z+$A54ebBOG`C#m$m&~2ZzSwg^|H8yQ_e?DG-_Sz@75h`auSI#YcrSgLeMhcizv6xK zcN!h~onX0`)A`bm5&tKjVjNH_Fbd;1zBV_1LF_QbaX5Ct{9NtFJ!dAj7B9J^xHWlZ z&)FD5Qu>w19fCLVW2ep?f*iC2Ip`+H$2+A)ow{j3|AMUmI)Fv7!WCtKtZd=3vSi** zUP!p2z|r^4Oe272ZhGg;&P@{oeO+bh04q(gDM}C0GQvB>WG?$?99?|Ew_!_irqDVR z&7y=#bl{>qaANBxsajmJEi@yuBb?30W4=JZ7mF9NdN(6_y$qt?%B0CJ*+(LMdV2-t78LSM250Q0<-fl?VkdGkfM^4%n6QXBqb>oW_ z1*N{|8{j?kg?cXxAILkm9ozUj?aL1wsHZ5BZO^Xxv$mdv74FVwDIFh$Vz#g?&Q@Ji z;gCW(4|J*q?vs8PMs;*TaD8F*(ArLhv_a|A9YK%kbOQ<9syCD#@&<$6p>!zYvJR>? zhuxz3y@R>V+O%EaWY9bCIj0S6;havps@gBK*+b#1(-wBvlJWcqn;glexox#DRsqsJ_+bWnFk9TeH zK&lsj4>cY**XDsd{E*keo0_Crc$6p3d0=NPJR=X}dAS-7)VQE7+-ZF%4f`_1mRsfS zHc&Yh%^p<6JJ70vSL6x@I*p^?9lLa6MI#wQSv*#1m%$Ty24JYi3ICYK319jE!i3ui zeJP+e3Mp!>0_U`RJ$Tr8ET%~6Gky-pi6ZLK5k$vn@tW-w%qTbI!apIXvCS;NV1RcRP%_H)O*Xhn>U|f zv6{_Wr>DniXPiHJ^kv!XaNnlkfpBQa9KH43NK&-D^{t6ZFFE#x^0n`ooIHC+cHh2o z`6fK)1Z-b<<=Rt>kGy&(mc-Cd(U|X#A45l(mEQJ10EHLqdeUYEc2b1JSrzy$O(v`+ zs+Jry1UVthL=3-K8>*P-SW=Ho;{80PahosWj_`dH4Gsil_6!L50ei{ zHQNo34)}-33O^5m9T9Vb^eCjBP)%S?L6pN(G98Ul(+5DyPf1RRY}w z(5MXh5&)oespbR&Y?~L8fcRWc!M#BvdLSxuAzJU~P2igD?*8YVY|@7W>!`z?ReeE! zt~wbdnjXFR=5)w!cRC$NlDPTu%ir8!d;MxMKhTwkc}*5Io$Tt*XMzzn;SKH%df)dO zmqYcBAuPz%*C07?UAX7g!&8ab;+po>RfBh_+NL1huK z0GBwD#Sz7T_yu^DlvQ!FL_QEWOL-*uY_uAyx`ZVh85MfYD(YBqx)9Q`Nl^Z$MHG-^ zB1}0r7YY9&l(hHv+moRX%Eq8{fzMk)F%iaKk3nA>w@Y47JxNx+3??(X8bNet*l)L2 zU7lzWq}%C<6=NRKjYX~m>Vzqrub3VxV!Hf%8SDOI?YvfZ2{e=V5S{ObbO(=f29AEV zo0Qd^6tY29Ewq=1Ac0zN*bk@;Iyitp%uNH^2DcUSQa|el9e@xAGJxC|bO`1Dp!c_R zf9OtlBa8wxdr=3yBbSB)faKgWW7%?~5E(glf8xM-WnaYWHwBaF-pSr-G?k5=xhX>_ z6yWo@{IEAjsT8)s-rBx{iq&m(*esS0&7%~$Hptfjx2rcAOD6ipb}cP! zT?(q{{6PQKOc=#wRd-J!?hkvS-* zH5zbx>=?QehsluN=|1DliAW^T?Xc&Z4u>cHaj}QaUvaWK*xk@$Kd??66xc7M525zp zFcx+T;e>#R4h4u|94B7Rae_A10ge;r5l(EL9vK?!Z{vg$`mPZSLi!RoK_KDQ2n`P? z|C7inz1`e05EE9MANFUm{X>P6>i4*l3Ut`456N`FK(0K#un-Tb4xXL{s7+2pksEJE zp~Y|@X?K5!{b9V6MFn#;m9FN)F)!M7DuGn0XQ+@1gx~WR{MC3D^gEnrmy`&E(7w#B zdc(Pv4EA$Wn_QIMT6cwlkX`c@QlGVA&UtJJu4y1MhI~z$37s-yV0zUUba}mtIBy1F z#+78q5kl!>K0#bPFlE}T^)3IWO#y<#~G0%zHqsJE^)9pe|9 zX~(X6?SXofJ9)h}Ef7hwDLKIFsX-Fzit(HQdWGi`Sy%Ljec^{ceE<8K?|tHlTW`gk zMgA4h${6DFX2{o$kP-}*3iWFRrZ>ZgNd`Ji)-Dwjak60+XG$}$&lM5{7z|=)gNkL{ z*sjv98EF+6DV-g@!DICts6@1@Z}aB9u4sZEC9+x6@yaGB&&lscep8`!#50|?umf8L zs*!j+QXSaRyoVpNnM^I4t!1A=GE=sX9q7vRER?N&V~DB=TJiax%?!^(2RCmXRQBxIvlOLwOE^MP zx*fOP`u6!lAO7&6`A5Eb)}gPQb?DHRciejGJGLA;bk1Be76Wy1ualM_QCF=1$;b#y246nF*#B`k;o(lw&Uw|WBgsW%aB)XG5sgu*aj z)`W4B(p-R@mjE?T?rc9{h!y5H7&pnrxk=g-tm3Dr+AS$0xS+(H9@VY;9I=u0Lm&V# zS4|kYKaGWa8KCL}fcK zLgM250OhlAV7D-FKzB5mZkxks4e)H$dL^so$wwY}48ADZ>QI50ct z5C6e+_~CyIU!hyP@Y~2U%308R+drU|^pF1_$_DlSU_Yn-_}Bhvo~<9#S#g2*ju|gx zVB_c7-)X+gu!b4QU56}!73!|a02*;>V>V~VfS1JKPtMg|jmm2gl)j1hqF^e)WC{Xr z^wqV#m!1FMYp1Gkv>+9@duFCPfdg-{I`!HI&&T56nbXKqr0`k@UiTw%VHo!Ev05Z_ z^2=ZT^7}4(;STeZTkG@;4!4V{uboLy}aY|Z#7@e z?taT}e`~~DSqjw=odzyMbHn3hsEI@fR90no1G}0p=VQ`o$A;H4wd49LfU`FMXWO_> zd*kMtZx(xF<-epS*$VpuK3~_CflW{e$|C)u}7`J5Uey)bm`DfFBM#{NBw9q9@J{-p|HLD}Y~ zpT7N0bTL?>y={a)C@I!RHJ=CQv!mp&?S#MnIiB(s_9VcM&)td{3t-d5WjYs1U<<0-Zt1Ny9Zs`|%=~4)b0=L{sxp9;s{b zB4WIOvqqB2k+-Fmv`MGS+rrejHV%7TAdy$2M5@CX%JiQ7&c>E4jdz~in+YL$&f>h9 z2x6PRY`mr#taY@4F3aPo2w)ab$-?h%6e1)ef3wf?Nl44yeIJl+Gn9`|+aiw&jYv*WsYfehx3P z1`w!=>fAi33-?e|3SU1hVp#Nm&)eG^8NCj#_}`R z{Pg^zc)l4Co3J5R%@jcjJ&@3f3`r&gzK{f}APwH6?1dsES)3Lg;f(K?VT}i(F@#Pc zaFIWf#hX84NB`xf$D6;F-``j+@TbvSW$7kuuEuAXxX#HZiU;V)uz0L#gJ&U7GsIgL zVq!P3qs^aTUU<|GX=3`Eq^C5PTBQLvL?{RxWdkn)YgBlmoq`R6Y3?N`8hVFPI4Hr6 z7g~I(>B3C_uv?H8i*=%VDvxkDc_m~%KrhBF1dQxv$nWqn!l-Yxa^IO11~-T*dtEL9 zm&h{c1ey~-Q^or5HKHfpv{YZZNqeYlrWIO#hCiIcj-G#1dp_0)Gs4rc7O3z`k47se zo~UC+9-NGsNAM7?S0aTZ^~1nF6~H01X$7x)?(=85MJm4W<#k{uv1h$AI7 zD?HVBGF;W`;{$xwSfvV|+D%I={`k^OPsu-AzO-=*pOlUZG#`r9%-1teVVHCSe3Ag` zmFp}^fbNBV1f=G#O;0|PreBPW?;i~=Dy)ErfEO#{bs~S)V!IJ5}vWDG1rPkxHMEYZw+}Jf8gJqh>jqHH}Ha0WC$C`U>836MG6z!Pegc zqDH&re*L~j+4Z2N$TLSsIK&%c3@Gqf+}19^hp2*0qT4gwm4HY0JgVK2#!7djdkVT` zxFK!@kQZQoxn6*{zCoyJI}Svj`|;!KspI;r z#rO!8J8>`cx~S(M*mh2to<^hN)Y=3@7W2h@cJkXSBPdR+$4=k{@3{z_O}>H46gSf3 z5I~C;UcP)?;9=SE@A&Z(OI`eq1Ub4Z-4{b8GTItjC+KhirQ{gLMsUN>Xo>`});(Hd zBf^KVDW)3r4#&)G&Fu!ea=MFot#V1oOx<`=bS-5)t-h6ev1U)%P$PHSy3ESlaI`0O0c z0#DKKjzkmAtEIyjm&`G^V`<4@OO)nB*ImasyyPz|KSnpzVE>}ml_o6iOf%-U*5oB2 zuQ{d3`Z)NaOg1=VRgkO(y9Y!yGJqnLA99qCFq|eXFKJ09lxLw!XoT#L&VEE|-V)A8 zFynhitoy^*lc>!twj;0{dJq_Xd)a7p*H9mFW)f99fgg?s<_4%FI6Pe~)~$VCY$ZCs zN<<Qs5VHRb73p~~GFNmi@&A|)$?QqtP&AtwAhxI#@ z!!PT-t@)bUSo9YBU_7#PeC5?_r*f8lKN>m&F2WIRZxMT0(A4L- z?=+gK?>h-=^%P&L=g>zvsy;=lB4ELy(#g~N-bm=A_BDc`_B<=`WxNC3##u7MT!i}? zYO1t39;8*mwb03vbf01a-cS=P$x-&t8jexk@0R*3;?}VDfNA^yxaPDv%yz{FM+1Wl zZnF{28FPINBEJipk?;@urS;2h+4T_rCs0vCM?CxZN*ibW%VIHgf?jSPMzNG{Y_oyWy#xXatS`jC}pclg-2UJs;*0@Dg@D zo<};xsrNQJ->|m{hWL(Es?@0w=|-h~I?$4{9&iUtm$L>9zv8IBnu%$<$E@QX5OVG*WvE5aBQe&isfczn11h)QVsr<|D>| z6DYga(%CQ$5ngPN1&NFDsc`<;F^=bgqY&=J*g1{F*k7zHg`tq3#-$9wa|Qh+*owGm zlGD}*%rtcZa0iIEf_?n>@w>DeLSbypPpmnw!o#@=nBA%4u!$`Y=Mw`oJ*i0q^k9AN zZmCuu<+2sBjwB1ok;qm6b^|M*Ja@{_Zplpw2pLe4TqMWs@c{k^lB5k_C~9)B&WDWh z01+S54g$^-?Ky>zp5wPBX@K+XDhR5s-*DOt`11Q=J`9Eh1O)Tj@=XfD+cq&8q%h5d z0U8Yv_=Lda`-x7sVdA8ES{x=qwkFDt0aMXC(lU($Uajc~fRN-#ch`}Ei|^X~LBn)d zkPJhT5pfliErI0&P%98*wdz*eW60o<^}PYis*Qz=C`!xEqWhBB=w9-Le)IxF=v?g4nqB&fM^Y8*c;)es3{me)kS}*DZmT z8}M%(SQAy}8)XCZE0AnQg75K`td9ldiim)D9=e=LG|r%B8ZrnmbX8JwWua&Cuu>k~ zzyo5`6Y(elR(!q#v$aeSLe<;q1C>auQOu5SKBq}pyt-`Keul17Py`q|f(zKbRnMSs zB}9>H(KPCbVx~5Gz~`IkD@Wt>jB_@RXN!$kq%u&~o*}VmmIuD`dC)Bh-({3V#mf;s zFYydtI7jmUmTNv~1UysxMnT+si9d-=H{$5(UT1G>UVYBYcoxD9p9h{nG)5);p6fNF zJje&=L3jqd*z@qlsKjCm%5$!?fkF*+WEcj@xRR{6Y?wNS0$EzDTflvcP@W8 zA;Tx!`hLrAV`nwS{&&;06MD&$rY94eXs&Zzpu!?0T(lE6#$}irH(~$oK zj{VW)e~yY8I^x+UApht8Kb8Lph3RJ_`TsQ6P?P_~Vvzhl4f$V(;Y%w2YY-z`R{*bh z!0V49{|msZlK)RY{wKPAYPt2ql2QJDJ~B6F?_^6{C3Ew=gy%kg9Rh+4wg@*HioM0h z|GabvOo!h=v$x`YnxBgF5Zv^1eoyZI z>$F+DV7nqQV}o6>wWhqDc56*(o4}BQ7lYbhG)L(1KP|tk7#?{LI6h;1#8aQwxa3UWrL!)8yFB_>BDeOoS>MSXSgyA zcxZc&@(!l!lO&qRH`o#NL6HX(rVV7m3y=v>+AtBVpF4o!VH7=}kxFh4z3C=S({F0Y zSh{E=o=J3_)?lnYES^abW~-tdXwKq+t5?AIF!3P6V<66HF=cp$BGws8jA#~m1}~J> z1{XK1ap&V&Z)~7N`?bIoOh$wl=|UdBqrvaR(h3p|v^i)u7x#X#_H82Bx_qnC+vinh zgag57-(D-hCv>~?T57YtU0SC$d?Hw1+BTfxAR+)UuX-<@ zGWFm=%-wNNxA!4`7kyPkFCN&2`cG?K(^G0nP5CTVeO{PF=fv=? zH8V;QL|PQjF4V%hMa4MG@a3EP!r>HJohJMP$>e}P;dSF}xNq~z=etuLeq1i|D?F+0 z`TL9UuF?eyqnjf!uhZFZI=!*T=Fx=t^JL!Lmul^_=%oE^-1q( z&kvUm^!N2<(y63swTk%xC8-1;55(89NwkuHVxE{4<+-&dig#kB>#f>`YkdDH)~s=g zrN(qI-&dff!^ct6L5tH^6BV@DPK#_p6paNb8wtIF&Hw)QsP)iz_CjGt+KYR=uXQh7 z4dpR=c-GpO54sm*3$l3c{r&IR{Jjn3js`Dk!I~GYbg%sR$~O_=JH)e=Nl)Z~Kp@h> zsRHjDcdDR3GV1D5OGqSxwuTE&>%`bx>}g*W%HX`LRR-sXu?!As2Z}N{#?RqUqAYdDygW4* z*Pv}-yKgGh3_?UA)w@7-LD4~!b}=zdD%tf?br2nrmA`q;2BPiyKN)FKy6OQpWu5D_ zVR+U#RWm_Zm{Vt+uf7N%m^74F6j|rFER*_svy-{Wpr1ErKqDWP>C8GuipdMB0>jQ} zo_rqZ6N3P+pm$z zRE|L^TblTbGEn#{H{U0pwelwUSFmZMr3KDyHvvbW`6$vc30Wc(2!nEUvTQm4Vk@Jf z1F9G7bE4={EE-1p2uIqPwwNS4L-P~Cfeq>Xyx&d*ycm_^z=$EpA$c|si3I4kf*fu) zoAUbN@yrw|mPX?82O{MN{%`fUBhh@^>&wLR(TLl(-W;CQ=Ky~FvX#KfXIK7Nvbx_X z_%)rACs#g;d00*RTReQXJjw3GIg6CzGY#`1n&x(>HA z^5kv9?|RqpZFnel5!JRLTp5$L)#rl&zy@{y0GQnIapESnCM6CpD5)=s-8`10Sb>a|(b7=xUk4`b5Q9i#eB3*kes_v{s zrC?((3hZ>?Qe~2Edx2NRR?Sk2EL{Q_`kNwJ#6l zA;IMpgrg3RBGd>#T7L&Z z=}gG)u%fZB!xav?sf?35h@H)PWvj#Q4caXZhbzQ>pLLfNn-k4Him4F)rr+gux^W9C z>x8Ngc2vQ4q0W^@P`N{6$ITCApP32p+O1UJ;WBDnQP z(;RL?l55J3fw9@e9a!wTPmx{`cq82z8LnA>weB_uDn zo*NWyEUaner(BL3N2V{b&roAVW?6`G+o(^)7_74<)G<(Y;7StfE}^IxX#EiDsHz6v zKC{Z=L=9zQcTDW)u6FlX?QyNX9chi7%dXX=OvzlRAzhM7d={SlY^m{mLmIXq%lP<= zMKy0WyED;h@AOn}HKw9YjN3Py%MJTN(M12`NLLQ!r32~e?DpYUAn^G@81*V0b~Tj9 zqzZX|GMfl&*<`bI4IbP*+7pe%qCKg6I1xfWxFgIkw7k2uH-XnH023)4Y}<; zU)iTRTxxJ2siMG}*iS@DPzOxVY*f9cA12*~eRd&^!qPZj{~ounD+tXB+XVcGwuwQr z3QHmMjx=jRJ+v##88hb5+oWm+L46Ciy~=|ETsBYFlG_=IL_+cMqYaxSV6mQ`Qmn47 zi7uCy#?`zV`o`;Uf2-*gE&4gS@>Q1lmdPgc(3=;Pw_ik&AZ|gKS|;2fFcja!cNlzkyJ<}(2& zxe~>9TH9np>OD&1CL$=~>y9MK0V)m`cp61ZqT8`cy>m`?zuO7E0NWg%w~aq4TppqI8E z^@@-)h4p|+1=ly4^dTVQl@x)2a=8*JW71S&QcR_}s5UFwHo#K4-gJw!~(}rt;GRA_iA(0mzY|exaO^8&+DB-U_qCbreBef(f zG(0qHQPpS^5#ksgU=4ko0MZ6GwsQ!oEFivZsgTq_ZnH0KTe|Pf*I0aQu$z^=XA|UU zjHrD__4F;K%f#5U_f?8hEdh10=Dd`Q)UyYyMXP%U)u9?qM9ntZs-v?^8$^bMGw1@x z*Wb&?Qdbxo9bn}FPrJyfbsE(CF7fK`}=SB#PJ*Y{r>C`yN$i(HLuV3 zaq9RdI!_TTq`GalGB@lESHKqk8m<2LYYg?rKZN?@ABIMQ@n^!Q*sPELTrqxLqYWSP zuF}pJieebYzjp96^7DtMr-zrSxm^71d5>y5IQKm8Unw6OG1At?9H5I_H(gyg=`YnKa}8EGbqEUaLz$<;bo;#EvV^ zuq%*Fp;`&&BY80$%f{2;A{(scR8Fx%o&tf6YKuXtGG3 zK0toRQq6y3srQ^73|M+#;7ux`oL=h%p#C z!T(}%$k#wlnsgOprB_0vOGzczp~ocTXqKYT$ok9B)F7ddi-qhx(v4t9V6BKZf@Op9 zpJdZsCJhddiz`BAuMk7OO_UK^7mpQQ+7BA|2%lL+R9deUtYZZ}t8KSwD5gp@1Y?kRu zy&e$$_0XXpn+OIEjgJ;lg6S|3G5&|%t^FKmPlsgr@L`a$pU@w?0aCW@ zzX_=a-O#i-k))3(B3(G@}#^Da6>o( z36Fe?cmZ{W@CfRhs29XVG8Zv7xavS16}Hh%A&KdW*uyKcAfkeb7ya1A}z>rcyNH8le63C1~j|Iw! z@OB%lb6mVp)@2qa+XBofkJvS91()WV)}EuWGwIKv=QgBU;R5#6-GsF}aQe!A>XIe8 zW1yqCvDPdZ3V%AQy0h*;+9+7nz2B}z!?l{M8ic0!<(DPU$Mtr$9UQX^UG;6!->sB{ zuDVjv{d3JnRy-?HEC0bim!5@xg?#7F{z}(nn~%u(l_~flyi%0geB9XeVw_!i$3XO0 zC#iRoe6%#g<}=+HhtKIrMNwqmBj-!`e#Pk-g1vEDElPNBBkuVL5DcsHZ(4p3I`=_- z?rW`c@4&h1lzCkDw=I166ncj4QBb{E?-?3n3}Ayvmh4Zo^vK4IRrQ{s#K|sLpiG@L4`QE z;!;DIL;y*v_)fAOA5>xbo@zSbbDEovv8vhWOQfs!+_QD4CzedcdWN=sprQJbfmkCJ zNcz+Uoq9WcMlhoK+=J|^%5m5mcA&!-BAw6PIlH;m8+D^lHCMVYM0s7K;fyp>&S%o| zy#0I+tD*caALIVOc&MQ?#h(?-elK-4L^ZFBT6pZsN+!U$o1WZ+vZg>KeDKiuKsKKyCSOPM^l-E zFS5~j_Kn{t7EdgFRyyWEv~l|oAcGv(_QBL~VtpUX>e$6k;7T65$l9@s$K(O_dhAz2 z?lsvN;3AAzE1&G$y0v$4k^hwkM#gKyn>Pc#Bb&t-MpwQHyZIULnUP=C>bizKg;#Dr zB3~M0P;lA)KHa~wfzMfMTQ|Z+gwL54ZjBcN=k&GXR$2`gg%j-LY_BM#-aCt;>XD#% z(d6!^qR#87yG@JcV5F-LCDpqIx4d)9AYaXDuFI1Q$F~o{iytGi?((?Dz$=@>sD;FF-xU9q3b8g$&b68m%ADfvPn;)OARI7bfC(8AK z1cC_87&`!P@4A?zRYb7pz71kAKu+@YkV%}ZVL;$3cRPJ@_w~%J?1TJ&G?> zi3fZRstega-b=m15C}To=R%_e&+TZ-XZIvi2^I7J+4a#(G8_!YX9x3He;BPA)L=N| z4WloaKhXnAdB8g`KHv!?(0f>pPJ8VUI~v1y>=qwiW9l*b0r_JatTFmsY62btn&2Kb ztZ};y=orBOOn_)eM`!_eYHDsy-AnS!NIB~dF&6S?%Om5JwBKdgBU|m>U;?Dq$@@t7 z{Lw_vi`53;F)ue63I$=r!9>+ZZh+%Vf#Leghm}hQ_W72VsS_R;Y?R zOn#i2tu}kTY@*JhQC6RrQL2-ZRb^(?`wP(1t*GDGbIISTAfh9bTQ z{)dujYT&~g_Za$@`GZ}G!eYz0-8_(~fg0!4*@LrHQRKWbqjl=xbaxuDfuC2dHC52p zQ<6Rhr^n5BML#EY-{&}@0FU%*%BBy39Eu*{yMRs9@p~7)NNvUBn-QVnMum+KB$N~| zt0;9zy@(DRMR%-esSb*BYyG`jW;ai5A`}@w2v3DL9$Es11Aec^iH=VumW2$lo7Yc< zyTb+wd_x=_yr?(g3A;nCpflj`qwmU9L8iiJ{S<(Z0dH!D?@{x71bYDi(6t6rzj};p}s}>^2x0%>D!~{s(^??O7JV7^jpo4&>VYO#Ry88!8o)+P!S?nSWItS$y`b%Gly^O#Z;) z@&oMI#pW68{Ke*fetq%EN`2qY{htcDd ziy(<&+K->~aes88!DNKfr-nREr9ZFF>s`iqS--8#OObl9_aDOESET}K%P-aUj1IxF zzW{qaOllU(#2y8SR%V1vnay*19I_p1z3GU}2?N`#X|Yrc_?fh&PBJ6f3N=cNWZYi} z6dX3H6hkfRN+4|L!YMW|Z<$(HbB2eX>8(1+Pe?ETr9c52594l5Fh#b<>+t&>UjFxX z!?CwGO6}W5i_ySRAgaG9#$9&1D_%!`S?1_M`z7?5eOkPByldx{EA}N*Bt7^KL^CL^9`bVV#&EkNf0KvpF8k z$&Q#{bY`=R`lC`~OYLuwzkOhP1xCPh z($}Zb!&JO;tc=0woCCq2*k|WGV%G4Tme*z4hSM?x@S*bjPc6 z2j{ABw00Hzx|{eD+9&n7Yv}Kwu{Fm1K(+fuL3mOo5a&ZJ37wJh?(&K zujbROCVU~SEuWb;;ZwDieDZ?b?hm60UqrP-5xuPWc+#U*wJv;GPd);M;NeeVAB%pK z*}&RVB2$Tq#+tlUjSr_4-v(?g;mY3jSUa{VLbv?=U)1 zog6A1_x$<%<(Ds^b>->v`s=B0bCr}gEUtK{`lf}nhV=xW2xw-70NsyiBWtB!wk+exUlBO2Ldzs%F$ zquABL%moK8m?@|pw=ahs;9CB*$?FWpONBVP9;TvBuPuPsAw zI}h&c4m&JnyCW2GIBbdy>QdTmu=7I87(L)?c) z3Q|UzjaOVh6DY{2#bI)f1xyy1%2)s%=0mMgaV;XLRW#*8MjAF8!4I7SLX^6Q-p>V# zHJh>zu=&(d^B1}Ae@q#;`5)6CeS8S9FgM@)kL=oi`Z(>OV{!;OvJH6-C25jdamb!c zw&V3Y!IYkmO-Dr{w^-BQVC7Uclwqb= zAs-8i9;D$|zJOz^$shG(Llt};HSaa4PLI=rfK_KGggPrN!n?4+h4% zihiH`x^O8R4g^BLg_UJU^xp+s^YAsIc5aNJcCJ<41@NI*4zL0(2yE~q!?TWBmedy= zeJ3c;yp^jD-eKNbEJ%nJDD)NkaHBjBG~8WwqK4*(s_pqTpai~(s?`QS{cpwW3a2Qrn>rE||)$c9zB3l;)*#1ULt#QkE` zo~bO-4`{oDH@jU3@qrGA_;Fh-(lfSe|8#E`8qNBW`R=|lYy?9MgtDR?d_L%g!OhcG z>e{`3*H{mVJ9<0_eceBrjG|QyMTEMO)tUXZQo`fmJeF)B)OWKNU3&nhFyJ&5adg1x zOa4g@mg(HOdjqdl0{>l^U8y>q-MWrlRczH6C=}u1z1cPPP;FVn2skP5G%4> z4Hu>p0iPYBnUFhr5F<@Cz`ayGb&)h|P)ry^kQ)t03lIo71PqbUa3yQNpzm#n zBI_a)s~STFNg)0l}(Pw7AyFQy;PLp>)$+3$op$>@ zKA+3ymgV_*S$6we&&C5$U%)bL2|HX)8zo%XoU=RM@Qs~_V^)(%H4<$8#%_tl&@fDV zYO}kOn_qwM^_!D!yWNp6nV((G4VX;{hy5EKU%ot+*_CuUaz~G59gQC~8b6X1yDvX= zrfrVgYY)CQM?Jr}EG}{~jz#ln|?BR3c5XDG0>L;@49 z>_8PAqzeGnHQ!*!QdMi?Tepnwt?f;yiJl(xOh-gs2A;!IncUSn?BoMMFaQ5Wb-TQ*g(G$3*;)h1ngFuLyZ7l{?CDE$m#p5Q`trL z%a^kcD~|yjkGAY);@p=+EII6;Z^0+uquLqlzVGR_QvG{8-W>GlVeFK3ui<*aLwAy% z|In*&5&XihTq&>o#mb-I{{Mh87SliAQ+{5)eC022z18#u%@0hu*RO?6ag^Ix2P9qv zg@W8D36O$Sp-PAnC{&{ZhAb+9qJ^qfO6^cpNWO@UqSQ9wplxw!N&zJmjpF+Za(-=? zq#F9y5J?0%Qwe$s1fOnpUXiYX(2mukT733E-+tnoLI2!2#9)a4_HKE4{l~Z z;s9?*+kxyA!^INLO7;uZ`H~EDr>vh5X`~EM7Q$?g>a=E{ZgJG*We)`lj>w zk&l{WnQ}$ZT$qJBclK{RD{|?ZqksCbp`C-VknS=MPn=JFbenC)B0TG_S@3?RaS8tY z(EFIxrMuAo54qG$rsl7?gB|l?()|DB?MnbGsj9Qfhw?c8&|^Bwpo{sNp84hj6JcK8J-z7Cr?_|oz1 zb(Bh$vZjJ(M^j+S5Bn@-V%>uG$@j#rwKpx`|9jZSFRwf*yBp`?&*DoYFN#YM^72UV z>pGYW0m0DC`Q=eKs6q+bbvpil#()FdcOsvf&*xXMvk8|2#LEr~Pav#dop^ZLp4o+k zo%^=!x#^Bg9`^2km9^*DA9@<^A=(YJ%{awmDVwEr(st-VKkHi`s86Af?glo+r>O>#`#-T!RU0MrjmJvZ;QZ~*|C$u1c37@3t z<^b0z`BhK!WJ+2P=~zN;f7m;fjE1yQs=Ux~HXEMgXLq=rA%s!-uhjomE;wusfRCpl z%U0PG32H8@=|3E{++c5if4LCysqbI$`#@;TcKv%f^fxBerG=vLXu9#q=En%cg+6Y` zOErBHCs_0NbO}5Yz1`TZjSbr^u-=~rWkACIACq4vssh=b@CCs>PM1!fo#_FUh1s%_ zFh$4J<;FYn>T(tSIlU2dp$ieWgc+|?;v}m;w=dbNoha7M?+pQ;AWwv&ap7d5c305( z3WDvtuuZ~{mVOQc!8c09TS@Hbyi{ub-WCULHbD|!g)-6YNhq%yY%QLdBakRFFk z3a~&E($i!N5Zn|LF@G!=x7ZkiaVm&Uv^-ei@}pfUN>?ZH>RhTDJ*n z-N`@CLi;7oP%u13l3(q4KLi5-f1C%;)t~2tPx3wNd3hgjTv2#{hOt9CRXSI?LVBNc zqx4bf)6$P?KXgJ5f)je6VnUSV-i5l!?zraAWfz*LP)6btc~53|7^-*L;QZ~gR<5C7puZ~EvTTz~D2 z*WLK8cU<|tx4!Q!Z#wUa^RGDbjNRw%Id^_;Mxyvgm;xP8*W4TriN73R!}=Bg29Utp%?9&=`#AiPOJ}An+H_o5b0~0D@#7`#oF}#~RWEomGMcOp# z?46Bk**o7fI*NaKJsMZC$;OvazFrSr1By6jXY-`wv;blq^eK8_KzD1X{pF1-kv#%( zP)>s!KJmNXubft|L-uuWPd!2$T&``+ez=Z(lRX4Z*OKF*KZeX54-p9z?}rw4!BUrG zmHN3P3Z%nZ1lOFPw-{kPAy`ODZhS%2C4u1&m zuxBZ`^x)EuO=a6fix1&R7TZOQv*?j{=AX*P*=fqRq^vZ{pE;6B0>}WfC;T1cG$12h zd%QTTcbuXjMhIAolw}CiZ})fTihr{+U zAJ^cub~v1=bBY%i!{We|I;VsKye{hU5%ib0qra3~*Udq8uIoOppNE{^4mp=xhjB)A z9mcn)ANGOgVqbI!y{l9^shqXr*spM!%cJa_N6%%C*Xxa8JePO`E+*bG(@&Z@0dX6g zbt0D;SBo#_`hjRHEQuiHBQ7)2xX5c@G^6-tB`&itIY{9Gc&hej?WwcZt)mnv=PcdK zj==70m4Y<{SR?B>oH!Vg(%XWJ^m?>ESL=`6mfcg|lfCS=%)Bys{2%5s80Y`IbhGSJ zwn09ZVuY)vXE54HK1P`?ifKn;c2TSi4j;Vb+k!zE$%OQR!(!8b(hHM`#AJaUkX3BQ zABn}3>Epl2W{mPuct^A3uX)G-Y-)Q$VE^%kEcMmozWQai<<}~C{ti#+_2Tz{%f`6J z$7{u_^i+Lc@-pSF<3C9bwdD9Eimpv{2{o>d?H_~tP-xK&n@5K{4`9;Aih6)mI zoCgRodOq#1a2f2dQ0t+#Gop!;q-5Oh#Wik>z!p6mw~@o#ROY0CWRdG*RW|*pT7O@% zSWNcy*Y@lwt_da*!8OG_vOgXlT6dP|taU^2cs-XLoHNZ0W^*J1@^Ktl#`Wd_Fe1o- z5#V|g2efyF?YRWAT9fOI9l)$*aJ_MeAUq&#TyOgKsMafSy#Y?)MKF%e^%ls{#sj#h zwO~Vpa%S)qRL5Y5%Ai;)9uKz zLN-}hGrOje%z8Z0uP-hRB6_^;_l454>5$J)T#5u64e~xQvPAa8XQVD@#&02eqTqTX zdm>DP9dI9l0q{D)l&E6^xG6D*ZiIh?4~6AXRb}B6Xd(Iq^C!f>>XPBab2hIlffq$XgMAg7xw>AWy)QciQg&Jo!%j)j_7@2YQ)3 z%l$xQaMC;=Tsi&#;KkTa0a{jIrZi9}Z~)S8FCeIiya`UL z49@@(%PMyCyGa^?L;Ru^?#J*9U}jNO1($;GW^&#Mqoo9+Aa_FStL3{YDR_5=1}c+X zlc{nFi*`Pj&9r#l2j;v_vZ z);fDHmg=kPwdIZ&6PNF=Sg48F~q@M~2C*e59dK?3jQyNZvWqXyG5eOyEfhA7a z7OyqGhmDV!Y|FmaU}ja%MkAmlEEW^)fhTBk-VMVngQHG>{AyhT{ly}(?@5#6{k4Hwv9Aca-tMkS znNU|+z*4XlP)F5+_TU)vuw@wpO_;_`s#(~s{cB-0-{1K5D&Dmf+eeEZb_)lX%DUij%QL$RBgAgnUcng* zk5GU)Ec6YAh+UzxdFGVo^roT^DAQqRPcFOF1vdc33q|@16eY%sN4DFg12(hb#&{wB zTWz*^hts%2!s0>e8=TpyYB?LNg(h=4m9uSdDPZt;;8d3mxQ)S6o|#6D;?v+7-8elz zGrwk{uZQ57xh#dC8yI-+s}3Lv_si>p$k=9)g$Mst8Ar%>4yq#Q++?v6_PEu?*zual zI)-s}uG!-CW2wU)kJ;@0aG_{E)-mpw77f_UW{VU5TgAB`iCvE_{Al6mQLKI83rE%$-Ei%n=%*Q9vHh z7OsFW7MNF~VEj6D&6-oAnZ_ew?+EZsai2}yYH`N8d%yH^icv_XDO$lAi}Z}|+`kJ1 zhXXz1yLQ>8O39SRlk^3W;b3nh2CBuGa>4^MVWN!e)R5OWH&peA?q*Kv&PAOsDm*$onw1#Ea;1*h2aWP zHr?!hPN4sM^2z0_jcatOP-_QgV`UmV^~*>bn@pjo8u|w54`1hejQ@!fu-V|Z@b5l^ z7{W08dt-#u?8%~{XitExkaz^MI+Lyu&MZ(@!G%Np2QD1kd4Nb_WzOGHrMVNMF`o;K zg~vqXH=*2Cj=~XI1XsMqTj*8cN8rAmV}+Oi;l~QCPqPU96G4PWk1iZNYQz-wDIRw; zxd*X+9(+jcN#X-?vQ~QE-CK$H)H~`w|9Slm)feF>cvzYt3)Ecxht^!L=U*}PsQQKs3--)EIFn?B^uGU>VGi{{UTD^~cTPrT+a z;~MAB@sy5t)8`EuTPbNHF>HYD+Qg>~3I&8+MA4@W3x->B-pHhxG&MOf)>}<)%xuIa zEyYr;I49~s*vyRZd0Zbvd?ptdFFuhQ6F1lEn~8$?(aY=lvhcFGG{k|F3qzZyIR|fd zAQaDK4eH%&HKjT1c88Ygo1Cn~0#+N~<1uS2m`*QXYZFLi_iYFzXm+7#CgM;nbv~OA z8?VRZa|Zl<{(#e02SC_eK@=d5e-OHSn=HccoN`$ZpA2xM#uR#jEGEbMda7L{3y-TM z3&;R<<&&nc8|v{cA>wxwvfy(l@jmjowQWY#p@EC7%4e5}Wkm@Tn-T&cajWvn?;l{IaF_(>o`SPD(8Cq7z zj47xEbeRZ9ILPUOE&Ew{SYOe9lMd;;uSw41dVMSuhRRq~UC}f5Bccy+eexz3$W0Rl z&uc(SmO?QX!ovYHelH9?01daz9fZji@E2G@jJkQ5;^L%s8v+!|D23uMe2&)Q&HgrQ| zY8pt|1ZS5%Cf5RiNn?_f2CU`f5|cJii#K%uEu6`OHK#kMS>xeS_XR`!;{(;fk>ReQ7Kv!ZuHliv>cDva&;{M4aJ&ve z=~z0S>mD5J&gIiFa7wfDszrQ^Y6KV8qWBVFevoHt&i;M0P}`iXv|?h6Yf6^))7)&~ zS7L59t#D1*a&2chCcPY3`iyd-U}Ks_^w@6cyxM`C(^G5u$RtCnvZ5;H-vi80Q7u;k zm1t5drmF#~l1-OEec@#8?bPiDX}y+C*|s$v10rMhw%r@oPfm;j-4Pp&j{=|;Wl;x~ zY0-QHMsKRbI;uo88DOMFlms=K-gISbe=OngFmG@^%2e{qq4~K&eQfhkUo@SL_6==r zeqt_%(+-S&0o%m5%kOu^(*>W+WxqC??bfspN9?NAYPK^LcBsx|0=6ZKJsIyEnPa87 zk={6XE%3SVL;m?5i^ZGjogD5Toldx1@tLu{p*4L;FO+I_q&AS*l}n=#)gDRz7>JKt zsg#R4vEQTilzQ3I@_q2({0Z9O!vK{bKM}>DnvB?fla$4n_%g;s0Xorkm<)k%>5JPG zisFTsv2YRl7f7;*^b2#C&i!RY<3QZICdP@LaPMiLDc(M@y*O4H!$>Kx0ulACI8yWh zfo1I~nW*Li!E(NO*;t`}yga&QqPG|f)k9jM*j3K-^=9EPO9aDpV*D8Kd2L`w z_67!kZ??0)C?xS^+;6w}1My;aDM9+@^wKxktP3i9p zd;nB1PWj<-!hMLCXOoa<9}_wN40sR$cRQB>Q3*jN)T6nGKGPK^62^E}Oq)qYb~3iX zW*KB!FtO2MU$aS3W<1V9f5GXs$oJ*Du0MMHl^%QYs3J!SPS1baz2{$b?b|@pN&RR4 z(h+tWyNg-O0FVeyQsu#h!AWXr8^g0eOrA}#4tvM*Ktj<9uOP>V`5G$>B>>J{O+yx* zjEg#Y5tcUepWh!<7e<2=KSqxAH&%H$rM?J3>km zP0}=Gd506Db`0Z|AFniWH}|H9z?Y@EG6aKnJHrGn2~&)T$DQdy?1|eIN%ba?!;iwC z@F$t}I;_r8$!SGk?W&{L?+!)ciIGG&981K*Awq71!f`Ndg>f<-0bb}gn$P3%qAwC@ zgYVk_CS&f8Mlti_W7~K(@{HY1qnfaiiZPxQZiA;d1Hxl$p*5}tqZt?sLez7;lcEfa zH4ZlRVu4AsGlX&oAdHvg^(X`2LeQPY`&j1^#|IwAD$;amj9XgCsP~C8)C^+9J2qKP zXBhKqSebmDWPW%!pY-^!K52f&GU@VURr5Oh!^3`uSF0wx7PG_S&*l6c2TTjB5cW;x z3z=dzSu5ldamrH^Pvi@=WVV;xvWW)`iddO$Z)|)!nYZBs+KU7wqpF&(0U(ZV+OSU(w*!5t%yCEHER$ zb%mhmD>>uP*oC)>HDNvhL9wL@clTKW;>a2O#Ru*+I zu8BgsElc2z#3mV3w<_;?@BzVcqEKdV$Q9^6edB}C&mZz8mutUK!CRA8KAfXT@D~gS+e&cj_Okz|}P`2nP72CtL*? z8Dm8?6Xy-}XEAmnB#QtdnK9=RfRt1NMZSi-!C+Kx4WftymT$ipM84rTBcn2};JA`k zcoznl_TD$Xaqog1BZD27K7ikf9VWSdV(GQpMkSQk8c!?oGJe|4ZjThscxUC2A z68c`mc0JyV+EdtoU_&s&`MatOLANuAYgV)gNNg+nHTw{=IB&x)^m#6(3Q(BmqZJwtGF`d4VaO9PZetC>NpY(ZgX0)pr3N5CE&KSQWfy_#+8)=zQ&+xb{%5h#&3SE@q>Vv zD@41iR@x9^o`Q^?VjqG;Qnffvz9QGdSKQOB@(3D&N zJQ0E9&!w2b#Jr3?BuMN%638m}kIj-4EcOB`47V=luK&>jEV!Vof9WOJ|Mb&{&gJhm z%`xsVw9s{*r{F{*m$lWiZHFSVG4}!r-~x#x4S zxG(JYr;E2ivG#aFKOo0CdDwrzt{`u_$D6E7|Dc*lfshGxV%?k<-@(^!01d#!MyLx3 zDXY^X`TlP&-8Je=U2B~Pv@z@mY3;7X$sPTy5lFLM^y?@r> zgp2kB!^xm02}+a7q-~esj@!R;tS7pH502{fs4<`P^}_O7gVMmO$LACB!@>F@{BX;w zH#%G?C1O11RmXh7vBicXuG1K97*J@-LLRxM#wlzuA_Pf%{-3#_uBgSdO)+_5nSqfU zSUE5QWJV?@dlLaWCXzt1w>uU>{>tsZau)kG)(3LX0KFNT-RsW#JOO`c)S8TRxg2qe zCF=DDTs}+}epjH5$%Ez)j{{IG%t8^Lw-|~g;AJR*i7;R`sa7o+&v$3CA)dRNWb|vu z=v3*`bDxW2Bzb$P5Y%==L6D%V3UY|jDYg9+ocDAoLerp%Qa}L)BDya~7dnM$!#aV! z60h~aa|I8mat-?MN!+ln7KM><^M>^^Yla6wWh9#6RCa1B2KE)2!SG4AnRY@WP=X=q zoX7#qHvqbs?0ah}nE+=qwEMJlGUx}~)$R`_`uaj%j}>kkw>K1p_;<)|U$QVVl*69b z%jBBJSqx*aD7}S<-xdsJE7ouzqrsN!^b@enADjr{L)~Wc_(zD8)^1IBJn=}%s|Ee3 zTwghX#jG3)hSq8BP&heI$Ogg~pQKw8cPG!-#*cYkJRI-Gc!e!zX@=dcSfIFVnfu%j zpZ&)kCka`r?>ZdUq6GEJSiCj+t-Aajp;ym3`OKakt)`%tMron~r1egqw zZ>;Bx=BIDgz2GPuk~i)sXM<63u=r(u0Q~Yd*s-N;%GG#3Bj?m=?}1msOJrls%woc? zB>XLyH#Abeg)ZZ!a$__!+_sd~{KSrR!3Ow3%In57E;Z+ zRtqE%PsmCLFU*n}vpt6{CW4RCxK_kx6P+67yVUig4;6;u-DNLj*%KD% zQJ;F^)*OmCX|KZyskbzpQv2f+ySqNr6^^*Plp7U>LIm_h3WX@eWqG2h-e080B3Sa;KHpVmcGU^=)X~v+#AUbF`BCFyeq_Uw=g>}{fh{dAO^J@HVMXQ* zf~`?|gZR-1yd8|Mfnxmv#yU?ZXNX@+lOkojA$Rtfxe>_OGfgLI%U|8R1Esd430Z`t61h+VhyzU^xeG$lI zUm#YAxJ=OWL5_RlorGnMa8z?4?9Ud4W=9H05s&oig^>+0#Lhb4CXBlrV7z%Q9w6Im z0PVX6`0kIRPTba!i0k{GvC$RxKd73q|KU{|8mM+vN=Q&1mL}O`t7{t}7A#0!>vd8VAglfwaL&PaBosRn6f%>ZE-Dp!- zHS}X%f7<_<`mna5I5PE+=FqOMq5kMet)|UqDz^+IpgK@0k+2`u_drj`YToMKzGiI&)>NA#Y&P4hF^ApdPV}%s zBvj1U)C8|&omV()wWrEGWM7DB-hc~`46|GFLP!x`l=`r+t&wkVSVDv_-|@D)1$7)8 zjpa_P!ZOtxCf(+sZfV;F1de+4Ng?1K4*SOP`Ej4!yqN>wzVhn`C2gaW(GdZF6Xq;} zX?*drDIk#3DQ_?#0C2Zlv9^*#)@XOKvewvRJV-i>?cewu!SRE%2c_e-J*YU3J)zix z@^9(>3B>U{h_PET??u(aVKcYj-_lS{o*=!~LhQW^8_SF(yU7#4Nch%R|*1%al*q=2BXPqFNJ!!Jp0CBXoERnjMr)A4J z2{PKrRg7FGK~j7C=d#kl@z8GmT3l?k)dsW`&G;*{7231a&fKQ3LOTP;w#vPtFOZ!9 zcF(qJz~wCZLbH6bO}vTsH*pWy4siTR_YjUn^hwT*(yR}ihcftz_qO_T)ArGbV5`R9K5#uwJw6 zIb_pB&LS|6+j-}0c$^sKaR&0DJJS{qk@EBpT$q+PLa)Za1v9AR0OqJ4^P;d9zzWLzjX8MkMURoe+ z`ouAWj0{78-V(Mf^1!Ap*tZ>?fV3YgmNBEZlTFF|NZShgZ5FSu20fGd09gZPf zCuBi1y3q(R3U|r^Yez@gs!EyCxRu8$1YRz&l0iMHv|P(jJKALeb|MmqP(w&01h*h* z5XRz|o)jKnL7$rp;Ja+oX4UO>gt~o2n}(F7_(o?W2F8%@jYJalDb4S2nrzVE`~{Z@ zY(o`u)MqWIgWHqzO_$RhjkrPiLBFvAq7Q&T2zEg~_$`W*0Y*gt4tB~+A`_r|Hugl= zW`L&aY%5$xlVtZNn07WD3gQlb)(0BoD7^QaT8JxFx)Wkq+#{*=)7{-GM?e1l@4s08 z;feu}A11|L*ZY-T^wSyYr|<}(pHkA-SQMane`nk1{S^8!_0!Se?wRTg_U6=2TdKdI z`L{QT-c8Y2IsSm7sL+A+EdUI8$TcQ(f3XipMpTIC~ z=#9UD&cyMd93w5x$H}i^oVQ&}%?g-JrWvp_ULFd*!^0)BP@+Eo$u-Ih@UMmqv$ z_Vt!V$|E4Qby`#cXbOu41jP-zTpX6=w$9Fxo!5~nG@RM=@(_#ZW(Wo!%G}n=NAL*& z7OnUTF?4Mr-h%3fh!EY*yNmorLuBXOeDZeQsmZ3DcNg2$ZpId-2)>o)6I2uQ++pVh zI7}x)%Fv|=LSmQAlvD3MUs8P*%gev)o!3g0ax4^2o`!bZW+k?z?|4L_6CY0 z)r(?JYc z(gwDnJ+6^ng#K?6eTP#oN%li-L}+VCeJdo=73J^~k5pDlS@aG3_>BZcooS0^>vQ$l z6;l`SZ&pZOgfVzO0TuE&yll#&)ln8Xvxj{LpIxZSA6?8scH`WC=4Te^ zZz0QNIf{($u`XGpM~(002bWqoj3~#^vlxFvK!P2qMLk$%$15PiL>62{QkCr~rbL13 zoD=AQF1!uWe!vme8lfor0Kyz++n7eVox0q-7THr&%BS4Cr^QLiE!OdoVG4*D-Z-)` zn9Anr`sF5w48k(zev_8^;z{lIO8>-2y*PrPc zpBjV(H{^*%GQao0lElt=z&};3#8Ls9O>=IyxdV}*S|tD3dQ3AH|2^Cr;+g6<&44p>lW+aF#IRfK7VJ( zA6b74`6D(Doq_Zmpv-DD-P@UAN}Ocg6ktCZWo@lanAk7y8E!A&`X4_yffS=+JCMJhH0S@!1 z+vmrO-|O|eeDxdZ^&65}HdF1%W;LK=s9&EceGK#Y$KmI|`iGt)T%0oXBX&ZCIMPJo zcC$07LYY?U!)HNu!*QcRMs2w2t~39l^{LVIvHkKma-KPq?X8?=oWDByhIfC3CEq;+ z?FKa1lpO72njfD-nitgtV>N7^HhcYWy?&Sl1L=JKU>3k>?boaP}-0m&b?#JZc zNO@`B7yLf##|UK92cJb8O9}`dVd|!df_nvOaAT?Jq{>}^x{IrImHr(ZG!T4V$^$_K z>QF04atSy1D$A{xD0%19Y-7yEp6WdG#!LxM!JP37S}S_@ZmxYtZ1&1{>8pJq7Uu7r{dQ@yPP8O9%J%aE{J&Qh>mbS36u)-qa5ZJrqQ7mm_hUJHL{jh1b!tN4t z^fjnD>W$XB5G!#FbPYD!)V$Rx6O%Ruw&MUO3LP^J12s4zt$ZJd8-U?h{azX*gDc#t zqIlJDK7aP|G6Vp$b#}>?ONMt#U&|veYym{t+ks(3@={uAcdS{Xx%{4BzzYUIWv%Q&W*5aZKYwR2 z8gjUz7L2^;2Eo1V@qmdv$ym^z@1h~Pr6=YD&LNhm#@2XEimy(?vk7?wZ#wt^!0GEJ zx^?gaI^t^&HU550R~bMwx$$A}asIxdA`48)7@@>{g;;N9x`uiMlolA&;Yt>4&QSls z<{ZK#ACGD&U{8Wl5Qal5Oa^>}8oO{>TJl&v;Q>dQ5QB5E@nPn2hhyb(EbMl%DUUZ6 zOHT&E;Q;=ZZ^=dAO+y%7Bp35|)3NSwDU5%32@Iw=U?n~S3_xBwTVN$p(5&I0GLan% z77o7kfkT4Z{bwv_@BB&^V8tN(1iwtO06#$)IQgXM3*kSTE!jezwi;IW`9*`aVJY7K z{uY`-eAe+4XqAOFM8yKyL&sFW&Pu-2=kd(3+OR$sV%o!WkAc&i@z>5o9njoS?ShKQT{OG#+f>+rMcOONR4>!GU^@Y2M_)f)on-0xm4#o`tXB z?J8S`%3vv<@AVeqSlR53P;RW!aI$-s&Fk-hblT?iRpJ=tqzh~3!*qi@PW{Yk-n?ma z#AE~FNRn+PlZ?FU7N!7Vgl(c^wyFq}vr0DP&br6}JOU!-@W&(_1SgJ3IwhB761*%E z7-|E3J=wY3Tr1?kc~T({e4pP8bfT@L7B;r@7-t--AXJ~#!y-Q9up_Y^NUm(~4!RsW zE=!vzB+l$*%&S_gs#D3BUAW}c0w=zxTD--Ln~Dh8vF@GuK`iPpo4q4LAT@KPg2jjz z))>-rTk(gVguGXXspwd1f!Sxi){n-ye4Rw?-aN`3Hv9B z89GcM41K|B@kG~-rK^#2I?~lMJ=N0{^;x!?UEZN=cF3z~-ndp?-&OE=v+3&W<8>F* zkBk$)&89%4I=X%T_K|8N8jVzwxlmk7Al|b$zJIicNP5{64W<&=;$#3pcM9x?x3hnc z*J6C-5h=UAHj6of2fw1r0Rm$-trSvMEKn3mUr%AQI109od^oR1p`fP;?RohET^?G? zMyS?q7EG~mV)SSNBZ;r$*u>yK0zU(T6Rl6ZJ9?Y{LKOm(RYLmT+i~g8B}3vK@u91C z$9}p2zjk9{?4!9+{GoYJ#Ew5Bao+trlg+6lnE7DJMPRK zlYrDY)Gh4n#)~FXWo+z}7;;4Kwhr{AOYvMRMQkd`o*R3UFj9MxfpCU>u>PbXhx>b{ zADHeN=;+%wcJ^&{Vmx)(VqAl`>ULcd}ny_^zZRz!7wtJnST2 zhW%lPVyJ7oijZ6ep<;+g;#4k1Xqjv=W4VKlU_nNC$Xn!`1$4uRS|6Tpy`- zmC0ltBa=JrwVN|jhcr9vi)AePdCjmb@>N9aIG1;^n-Zb0*QNHG07$UATtNL};&3N- z`^aoJhz?GO$ffz{Odikrap0KY;}x-htQ89=H}(D~tb?c3POTtu@7kHZUI4HmOT!v% zk`!P?FT$Kp`9VNcEu$Is;SY@YJO&*pAt(ZDc#!OaNDQ$dz5&ui{CP{7uN2Tq^AUP# z#{>_lzRLVwuOwm~+RJ)k@lss7{n;7S?umqu-P9Y2dR*q3+3JlYR-M=H@pw~Bf079vXx)k$pVVb(J85p>L4z-x9cAbyb^S0p_yhz&e~xxozxJq}<3$^j}9z>@26x|0o; z7JZ>osHMk^50AEmGlsDD~|uY(2HM0~j* zH6$io@)2u&Tlf$X{p%2KZo@miS>T2crlFz%hSE!ex)<@y$~c6E3H3 z!Gq2GUt;^LIQ5?oT=JpM zBKk=FEZ2jU{u?|D&w+=5;#=DEPJ<7lW38C#yvDrJS~1aiO`ERNvR%N6_^Qu>wcu5+ z8R@)c#b>QKiEAc1uUWC~W1ZKm_^i>DuR(vno1*VNBiX^h3(e5Q!~I}~VRP6^q5Fcz z;zD$Z3DCiTDbWN6vD1Nzu@3nWn-{B+?+BsAw4N!$K300^*@NrX|LT)Jsk1LNw$y(D zY<5k|gU$A&6e(@(Y3w69+S9m3U)S5NnO=GmU)RgDt}ot#l^q<0u)@&FZbP>C2N!P< zCL8F1f~P~&Eidh;&9&8z;z+N9Hi)ikQm+wp1sUoEAf8sS-Xl-~1ZEg|yF6}5!rGqq zCBjJ3Bd z4!=EqydafHlOZ5H5FVI+=4=)q6M?f-uEB0gM$k3UNf0#&e8ZRrPRE2~ti8n|lZxdc zv>2LPTYIcmS$p9^fe7-Lo66(bO8cj&josa+zWw^mn^#>z?>m3yrI%)AKJWoF9<_gy zd*v3KXj?0r@#KURK<|D!og>zdh^&#&Gvda(a$ z?Q>UW`xsmrZEa}8GJck>gl>-9WFO`O6W5F*kJ49^_kxG=?f4e4(E1$YlZfNN#4Su0 z2&4+MLv9EmqzcjQTCI~-%t1((pa(X?jA}~>gh~@%PLt98>1ly6-@pHJb@n`RvR+>Q z9G+$1*KHDyx?7H4hjB~HauSkq(IZsMaV_M!j$7xb^<(_qDVFvwWd`fyyIZ#V9L$nQ z!(vb5A*dkd6F-An@AtuaKli!bl@0u7H7`M|Ps=2ZGRO@;27cTQV zCp;qUkls~u_7E90cge}{Ya~(a98AC>0z(i{bNvX;9@6!&-@;Y`HoFoOC+L54B}BRE zg@`K~8)edlb)!4RcJ%dP^8kJsX@rfm+&zZIOK^@En$-2Jfx(NXE4^?Db4^B=+*d-d z{bIV>9kZD0is~B%3t-F}UO7qNLMGbXGq6Htz$c@TUWY4Vb0ku3PqI8U!_%srkRxz$ zabdg~jWUpp#k*$rbEvLh#^dNVvT;-)<8MR8YvJa8i}d}PqsuFsfE2)ZybPB?r`&<^yGP24YXqPO;9#k_LhKXhO)`m{F&0xOH zQmDpCH=+OL_wB9CGU>d7d*8C}E%RGvPp_Rm(qAd@^(P{&WouoWCKYBS4hBJ2rqxyd zL;I9rt;}r^qBZfGl+q!1^;$a^fkgx(4*~^bu1O2%Qa}d);R~T)bCcDv`QdWK?~dA3 zWW4rc*k%iOgJB3AYK_V6~N$Y zb2vj;xMFxd>}tZPf6`)4rb3(hy3cp^Pu2o6HuzZsEG5o}7Lvd0+;&qk1kny*{N*i+39^RZac z`^ip3aDAudoX*QCQcnOZW^|J-2f7IvGAZDb!1L%P6deraDFy9ELy{=UTfJm>l^f91 z)Ju@&kut@DO1S;j+TaOyp_A~Djfbpw5Bf-Y*8-E?uz%tFUFUCFKQ%c>2%>773@tm^ zPN(P}v@02JGg}#s?ItwyRk}<^hcUcuogL%l?SqxD#&$B7E1Kya$@11lI4_!eV>ar3 z<=zq)YU?W_r>)c}lA%hm3p>s*1qNz|4xsCy!>+(iPd9>ShJu{U6y<$VD*-V*N% zE!;7mJNWspqmQ)C8`rDmM|fZ2eTQH7&DM2%ei#1yD74O@T7L!^I6)!7w$scq)s~Q( z0tsQ)iIwAJbX_~yb6Rwe<0EJ(5VDPp4}&2~3(>4h;}wQ7e4=rBtS@FYyV#nsix#%@ z_itIaXncyf%+^?+&1}(p3Z}Zp5zM4z&i&KdpZdsESAFFBxBc0<84b}po4|!NwR_Wu zSB0@1OICzpN-$T3B;=;i+!kzW*mh_Z+fb`2=u#N#r92<_o;;kCT77gxY4xkH*yJkO z*N$L{HE%TA&GMz$H!ghU@yEXhMiA9wDOtT%)7S6)mrF-SKh${OanfaHmmJXDi9_pg zLw9f4&G0?xA%uxg%`f1|&}((PM^ws^OjGSLJ)=#gz;|$&X5-nWOq=+Qm1Rm2)q=-L zAr<6_z133|`m@>og;T1%9M=I5j{9SpYV}7qU3Jk-`{w5M-E`4an~=lYW}ga>sUd*( zgQ*kmM?5GX^{nL(PQ+yhjf7-)2AAQPT!tY1N-AI~;E|qUVCpsk?HgwVgX_#~ z_kQfAD?gr#SF@$_PP=JKv3UN!-GnvGkGblnXr~!z0r;1@Yo0-7vV&^g2=5olLmzEz zkaR(DP_9+GT`gmp5i^LU-88$=w{{m04s)A95N;V=QpAFL*r``dCmioKGziiog2q@2& zrg0Ii_)7Xlz*>O{Qq1)tDmWrDBy=UE<5SO3C`BSg1m|xh1;l3l4$PQQfUj23JhIhs zi*^6rHC+f_48!)Y8vKB%a2OG#u1}A1 zV84pmodFBTv)tj38(waIC|k&e@xkkke=C6~2iH3s?r0(Eb~xRUf{1f4);i=3HTn!; zcv|wM^FqGHc_H7QLo)x=CSSTv^cj8~WJA~>;y+#^P1h#9%bB>P19%FM&g4KPt%~u4 zQMh=`$PjVf1BVv_9)i+F>7g?aBbOD|SokC$An0%<(u$*}b`}&+G(~8>=~QI<=vbu~ zj;8}jv$=;{pgrRYUhhaDk;x^KN8-IQE~16k3^;h}V$KV>uZCWQ9czzjq2$Hb zk?|!Tbw>(k%IVc+L+ijZApe7K)r+q7^-L&ydT-8V*HRmMul+pe*7LdEo?Jc@Qs+$| z7WV{#9=|ihM&DnG0({v$@s`Nr>us*#9aED&z-s*e-q_KtL;%`n9fP*bXj_ zP;u7tqQ#@-GNrBC4$KOj+UNtS`Cri7!iGR=w^>Sa9xxvJo|uQ#RA;^vP-9C(SPp#q z*&7@G4x2%POtt8%l` zA#brLVqZ@n=Js`)(4O1?&_$*o5aMEE@+#NvtHsx^1ITWE-Tw9aX`$Aw05w+YWS1eo z*Q;3pLog5;YC1t-_o`L`YJbEP$+Kva4TQa=5Q1z*wlrx# zD(Dxm45&@85gGjW18wFV#qWRB5|QO#RcypUsWXTV8LTuU)z2*YL#F&-^r zOuIIuhj|!~Dhthky30$C8PqAKphk&d|35Rx+Y#5}J4~jQSa+CQMr4PdVmxx0K6l`f zuO`CfZfh*u)xZ7*5#1px;WiO|%$*3ucxsSL?+rZ2BOb{N#Ovp7>aT=3p8?m?`5uV$ zbbYS`xsF4)w5RBkDzzexfe8Q;5;S?zK-bOFpyJ_lxS+2*+Gplrbi8XB^PTS63%5ra z8PH=Q$ax~-=`Mqs&KXQ}gEq>EWO@t1V5xW0=Kf+i>gy^x{R>;VW8Eci;bRt~T)|o( zDg#`uRA4qhu+XONfoigx52Z&C|3LE&f9L1nhJO}sD*UkI`{8xqMgcGta3&arzzRjQ zJj}C67}VfyHLa-c3Sa{@oNx{Dh0P#f`0uIiu5eJ@p?Ew4plykGf@u%3H^iLTg}5Uo zvy`Wlj8v-DXt*oed6|`B>$k2O?h3;gZ@jl3 z_C>78HZo?Ay`6CJK=}YsEMJIDyxetM?JgF`zkxI%Fb=k2!YG@)j(^A8uol)Pstf)T zsyq4}IbX$cjrI8D&Ap{yZ~?JS&QQG4ozOxaXBjk==J|CC>w4VzE^oM8?6<~3g&bZ9 zRKDS$Mom+SCZeHyIqCA&t+t&zZPt1yTS}DA+NhBenf(0Z*BFw(a?Z85O2Cham~F?R zBI%(q0)Ijm@4_u5sZ^~Rp)mn5lCYyT!ZlXlDoe8OhMdV^yt*wHMNUiPc$kx2{#0>v zxB#er*qIn%-IuN_2eVV%(SR@DuzH=IKsc24X&^=^^z>D<^hE7aJR7e-cJEu--xm>x z(0}NC8QvEYNPGHX{e64d-j`&okN=jnnnpi_EEama??}QKre_b27E^vF(Un=f{&+NJ z!(bRrVtMbrv^J5}Du8XF2AU69Cj&slS{-=(X!le$SYD^UFRkHUfqpY0jnoF?=z8$c zbS|~RN3SF3@xr*$m+tP@;q!1C2?zK}?`;TOSQokdk$ezOtea9jZQXp$YNJ83Zd!Mw zo{e_&^i{@0aj<@*P5x!FY3Q;ip&!7TpT$*?eVl|F45QT^lOqBaMBcGGMb1x&iAcOV zrk&wVneVV#J%Jb~=j;w$;00bF5*+Od4rMesZ6lE{!+Z3G1qW;$D(|Uw#i$M zPhD$7Gps0Yt{k=$MA0>b$|y|sVoe}5*&^h<$*MVHik$GIgD{_EG6NouvIB61%$vr940tM_AE4preX4L5Emut?#PwHsQa86LfOe$0kmjwt>1*mLggcuKFZZgIa5#F&a zYiII>LVjlLme!}qgTPBB4o>QS>DxavF5@3YCkF?AZ*Xu@|AY3x^soDV($br20B@Pq z>%5@z_Z)`eYqFR@zYc~#o5gwod}VgUW``0X$qq%n070lu%#Wajg2GA;JeS+;I$gq+ z?raIx(w!(Ao-1zY7b!%MXUX_c)99%fYvj!04lNMRVkqH%jxnImKNCMG{qN5jzdR$s z{)hgpdoJ-8iH04&plQ>dW-mJqKV!E9ZuN{EeUMfO;L@PVK+k0|fG?mh1n>oZ5t>~U zXrxS`*|i%v+e)Dz0! zjDND(2TC(*Ho9H+n7WVuip7&78{dDMVs?fjo1)^1=%z^6X;yB#XLqfTWlv(go?g0C zU>GfUBdMe=;kSWd96{Y^U+R{UQXdp+880rgYcRyvweSxqIyE4ggz6IkvZ=gn|g|2^^}>-)PX#~PHW#c5glb3G_Fn(1x6 z>t#|&yeoO}#Jl1M0S?`A? zj6G~ohN=iZC08)Kj!yDBF5a|w6WV*}5&b$?Z0-lU-B8t6wy|+G&7NrVO_PhVDsPsz zbmL;tw~xcGNoDf!Y?A?BL4oYo*2XX8%jL_-o5`<}2XGygsb3dHJTAX*y3vQC`NiFf zUt0VtdWV;>{vBse!yc2bA?HF8#Dyw)7GWV7T&KwO%_NX3z`UYhOpCmshU`1m>}H^z zh`42Y!og&3(T@$3C0+>lCp3SxD->GkB$J)q+L#?Qq-%5Ka8G(J;ymF5T8A~hD6LuA zgLiG4(*ohff37)i%^EixO#GS`q$`%d=!I)m^ZynxIvOubU%`4B-@`4iNqrOdY~}Y@ zq+BhHS`)?$5HmQAmy_C}KLQO)fiS-32M!PLQbb8idIB$*gMPaDvnh!8i3Rx?1OuZV zU4rWm<9b!XOp9lV`-wPjwRhL=_X`_H1+8}n?vK(wyr~aknxKB5!+)U_L;qq@z>k?3 z4h=oW49yGUDOv0;NAXsCV)*GKwDX{OhbhsQN{7PkzykIoUDimbQt0xe2V>+<8jur< z&utp0fIf}h`Lp^vc%(uti(@^Oc^?V(09OWSdIGU~$Y-LdNjDf7PyFnb970PMqM_oD zwH`n;>ZI&md}&WliN}>fMn)Y~R^ZQb!RCGdYf^;j%+p!Y9^e(~9AObrXHjKl^ixr3 zH+x{P9`;(cn_@wKIE=u@;6gIA^~vs1G8ai8v4h`w<__i{uWZjU3vKlN;D{3Gn>=zEXh*C!MUdK>!Us){`&83<8dBpWAQ4m7;NaQRq^ z-c-JzoxAi_$onHG`+2Nistr4A92@+%s(EWu{uC3dnjvp|Z^V45<{S7iVNnQktD66q zzpI9rum|z36{%j^1S(h+)Wp}o04c%feGScUGA!T-T(rWxCc`WV?=xQ_ZSZab>O+I7 zB2^If49!F+5cI~w+9L!eFVDk%OF*-3f z$4|5cg3SX09jz>8<*#wBT?z){r|@*tk@_U%)lr>a7su#h;`kf&I_pKj!a;H5>hda#7H6UP8uBh2)AYm2Ad*NothDAb()rPKWeq7!VbodNxLcS*6ZT zk!&0RZB-LIH3ez$s&FmvxrDY+t@#uk{l=m|+wfEl3vHBP#Seb4EqwzUYy5qS+zv-$ z-{o~7A28}-dQqysgyYY*wlEOoJ0(BN`C?O5q2*!!CKn&h9*^@GXV6}To zxz{^2ws&;A$(R-N4CS(e9)yDEd|CVJL){2GR}fpbtt({T;!F>pan8*=+p(U5bU25U zd9nQPet{|K=zj;6wfDLFSj?fw8)Lg4vQe9PV~o8Xw=3!8&|X`0+#_Vj`=!Vs3DjNA zjX4Tu5zP?aMXFb z{tDm#dw8KIGBgzFSr|yI+Y&gwl6&j1GiPDc73bHLcrUO9z5*6KP|m<_Wr zc4T+s&Di?<_Nk?%rKhlW`6}T*)%ACtTp4DRfwW+6-p!8iLh$I0ayH&c?|v^!vpVuB zi1sM!?_O@c`=^&i*%s*|s2lqC;`_z-i|=oKe;@lRHm^h=N3q6ynthgSQJko&7!UX1 zc%F_;Vm=*5d0(XR96vG2lOJp=ZwBRkh01gMh_}l)?*Ag)PuJspXK?%#e*9x`ytI*B zrW{2Mha;b-@2|!27y0o=G1be`LFrufDdiycA`S^z>L3Jg3jxrLy$)#cu>Hm$!fXq~ zoeJ!}j9Hd*EFsdCXml)CqQ@!9$A{FMa2*|F8*aX4{^lQ_D=*!@_&~2be>y#5=h7i? z^BihEgCcQ}9fqEz(6e6s8Sn-}8!gg8ncsQy{f!rYJb&}`_sjE(QlEVH;{B+XDt(td zC0j6q4DfoVaQq88c4Ae>_vb9#gFd(o>&~V6@y*;es+yj`dm#Q>zuzjAYXxk0$xMna zxeaSOMi`D!698^;CEMu>%2e+%*!bWm3qN=3t=V~&YW#HmySLqz-BaH~<GM;0#WJzLpit(`&NqI_QuEncze~ksZ^It&$)%67 z|CXOcdHO!o%)pfxwv-wBLgVsM&&+pRm$92Kl7H|P=XYj$;)~@DnIKLD$1Rz_KHMRb z%a_UIpZKv6^QtOhZNC&Tu-735R#mW$;r`b5ALqyKlwM?q*uP^89^^7LjswD{iMk4N zGvB;nzvHk;0T!S=D-U!9Zxt~?Vgg1!O@z8;r@Y8d==V-#o1b3HCR5pLDw#F@(sP$S zA^GIfu0uBW^5bd58a&94KgEyhklmA9cAw?PY3a{#T!o%x zr{m^3tJdfF_lE3LXKBUbrtDpJ^6y*6cR>b76f0fDUX;&;U9fr*cEMZ*%0#tg7hEkk znRM~Cg;79UcTNl?GnwSj#Lm{IkwQ)jhqYW`r1|M8y5tkawfsX}3+B6iuPaY!QuPls zAX@MKyS88J1)85$cq~1`DZQJ$AfNFHYYgT!pOgLQ-RwsV+SWp*t$UCwqE^N^IPsJV zu(f48_=V%~WrjHt&}hV`0?bafF)FB-^<`05<4QK&c!U>OXWQvLrqM5sqhIJ8d)Op{ z>0UA)#ug7>chJ4yc@D|JjhYtFyo{4c6Fy9Cr9OIe;fFuG{l5Br_=oFWPr1dma+&*y zCl)^OiDtpDMg8x*?+<_2`M$i|2VcJ&Q0~#A&DSN{8Q%BxmwWURpICU}iS}~8{5s0T zG;g$9*aIXX+Inp<4n7x!v4B3RbkH$qTt!af1HAM zot6%<$K-=pziYgX6&ycE$Hsa$UdFvAsw@u4~CCXb5WrogXu3aMqzt`(8q|1pS7!*|1>MPV5 zzk1tRyR8oSTnt$rBUxI$wVvd4gLFtvh~x9<_(dFFgJX;3Tf{_2eTVJFx#z?=)}x<$ zP&%a4^>a6ib4&kmWj~GM3&k-n`$`;}=pI|mD0|6^a_$u8nq}XMbJO}cy=>`f z)Xy!-;xf4t#{=S+WCG@xL-G-EPg5or;@r#PTvH~GK_+j|&*?Ierr1{H5O`87>TT>{ zstfGm@6fqZUO6`>RtpB=#Kt?68A{Fx`TeF@*6r+_ZDk!t`6pY}dw8NxwzL-Sa8mav zc!zJuU*)%a%!1Vo00y(aZW{%yRU@cv&a)UL+fowN;cw z?*;M|lJh5(1yR=VpZzZHb^K?h$6N2Em-Q*^p7?w5vQGNFj{nT;)605Ue+O0l^q2Wu zak6r!tb)_*VJZgqEq&-@>q6~ysa)pwp}oM@O{ zsp@^V>V1^oce4HJ1^z(tPl@Nf>V5Q{R{2f(dp7<~ub)Nz^Tv%r=Jf7L74P(_WpP=_ zztm+#<4bw_$=oN#m#NWu_mdwJR@tOKZ|TdwOWSP3BlI?<`%bD)k*qe#HGZGorW3qP z|5Ca}Z$FYdom18Ou^jPymr792cS)I)z_`G$6hT34E=4@~<<1oxX3d0_^3#hI`Dr7e zC7-XK)$?dt)Gsvd=ItayulmVreil`Yl4n|##PR2p#0k$jjyhP>2OBTw^}Gzv7w7(F zX+%69>+esLAHCkXDt8_~N4c}(`H^N_A6ooTTU}r4vs!h1?s!6Z?u2KFdVQsl5p|_{ zneOKGe;A%A`jHnG^mn41qQ7gqQg)LX}l=vL^72heT{W$ zK1;q~@k;rIj%QWT2LmWqRsRlZpS(oReyw#f`pNg?e_R}p|FQKP_`WgzUi14K?caD- zdEt0Od7)XbXn$U=MSYa~a`=%O=lw7AwZ?hM?&J3=yW5_{$Lr0!U;hKp0peMx*K3|b zTJ4-(6f{hDyXED+-hP9nV)0=t z7tL~M%|O4I;4=SqYt7Klsp>ys%}^TefV95O@emf+2RGH$)8K>+f`Ma#nXf?>Rt7IE zj2vb-i3CL_7*0UZX|vKQq6MreTdFNNvJEP1fNZsxa|D42c~d%Q$xdBZe41_jV%Tf2 z(1UrN80lMl^qcDS#-9@reI!go^u+w$OWgF>cM*5hEy@tE=h%03Rfx9=ZXdiey=8k8 z5~s+8k+H8QpM_xycyTifjruDYkw>~Ui)?|Nt{}b}6X+#wCy`R-f+K6|WGC?QbY z7t;JGE#eE|TdUiZrEl$Cd#qe26;lYw!N6g#5PYBYDsRHx7&uLW`;oO8Ul>Me>_uUv z#--Ri2NlXz?Srj&*!M!Yddeo;yDl|YYrGlXqmR4`c(5x_f<^rq=e_~o4g3u{-wnQR zK1+R)Kl^H2|5j#!t96iLic3B(U}C%l2rLHnZ1gH}7?5pSk#@$qx_LH93i>j0ryDv$ zc}yU~I=Tj&Re)TwD_)9dlLIa%W2so&?PMDjyDO6F?n*^Gp4 zi(~@f0IYGEa>w<5^3wGmVtZz18_>K@ke@8Q6C8qvAirKjK!AM>$$^R1jzZ@lEl}$q zGKEOKm~=j6S&@0{sl21VkJ2ag&GygcGFkxL8JzO1w6V=Vy7AGbyL-Hy`pZJdA(1&2 z=XGe921EOAkTcn5HP=+PClqpr7`B2*1M(p$hH>t9d-zcSV08kjOmd@ueK)pvU7&1N062*K(QQ z*tPT~bXj;x)F+p&TD%4Q;D4kKfQQN7#pgrKm?zTKeBWVW(*kt(aU(Zh{tGL7?g>}NICqr)4IE_U(ddO?(9o1&7OPL zbth5x4q4$LqQ5J!YYtIlMF3)B+g;9A#yaG(3|QIhP;LmY#th4}Mfh{fjGmmuqQ^hO zU4(wmi8+kUty1qkMx7CzwUQo1N^`Hf3)lI=?fp9<`f?ahZM+vcHShIr-ZYwaTc=ek zGAnqk{1h)~7M(bQ&g~9aO=+Kp_vNeEciAC6*Pt&zKL3}xH-VGms_(?>RUg$?Rd@A$ z-`7mfeP6BVIV6oGjU-!^W!a8pVavt_d=ZQd#+Dr$bHxF#OngAVT41pq5@TXxNVt|w zHUSbs0vHnVCmRCnK}aCSf`fbZ`+KjdkI`Im^8b8x$JR`Dbyan}_kQnp|GqzSymtGK z&!u&2adZEdq;Y9C%D$098DxglhH^#nLsmT)Te|aiDWzy#lb{0toi2w zHKL)5M>L?J6Os4RLA>));jS0&Nv@fEdro>yBM?LFhouiGlLTjVAPTxcZwD$iOo+VX zTM;JWZGym{C0<=NOC@DV@hS3zHu(5>LuV4z5&3=Kp>u4GX0b~pm;kT~wJ#xNt`H4n zT%kxxRzhAUrtjyqbPTu@OS0RSh-ENkvAN41`Oy`LV9YDS0}LkC{vn<&gC(*TbuFeM zUC!gpBomqWSIy7AO17X=E`ZdaQdw>M2f)qrgZK15(kwAM?KBZaJ} zD0+eM=>cI0gjreUAOr-h*Pa!Iynl3VLEBr5nwod4A9V*oR50)sW~U&apH-4^pTo9j z^8gc;gPUr=V4wmYN5&#lX%*Shq zngD%muXML$Y=eY!OGcA-w0FND5)GCSHU83|A@|O52Ek9}FMYefE6##R7=Hw>*hWs# zxNfuD3_m?a(&C*8ALrJ!9p{XeCx?+zyTj4eGEv(60Q1V!I$tMzP{cgwJR<&Lmq((x z&*o5qiS`8MOYCel^jTh#hCiy8uW{E{m~;>H9_X1;gmfzKS|BB2gvfD2goJmA1XvxD zbf4-*121%nB4u3wVerH~WbGkbVx&O7gu-e~+mnb!6MHl*l6tSMh2uHa(|i%Fe!}!O z7e}2x=8#EmH*`T8&wa)LBwk~yQuc*>g6E%-qAZH5k%U2}%V_BBdp?TG&NQE%=l3x6 z!H|T^bB)qMc%m8XBrD#?x8WqTH`Swv_Qt5NBYa;Yti2sly0Hv%4eZ} zd88UcOvz+qT?^heV~CgW%tw*>|56{AzF6>dUtb#A*|N+$-lVzSNiS*MPA_VI{=8$M z{pdxHNR!8FF1Q_RLCXc zI5`%~IEp3_BOKvBAh7PZ@Twak{1{#0=;sQUeC zaE_g!o+iD$>6m7fW8sD2@=&Jm$k$c>9v!eH^o;i#&*+ol(omxxT!@z}B5POzSQ-eP zx8^1}WnoARjz8avZxjgC6riQT2PRT;RsjNKXO z@#s!ni>IpG{HlBP1>NfdCEK#3rqXz64~g;r8h5V?d6Y}hCT;ne`jHCtY;_k=>93Wa)e zM+zKZ^c35j8-kbPECnp-`S^Hfy)hGA@9%9rKRvHq5&5p|@!!{RKFt?)I<9|XYkr6k z$TCBSg-epWZQA((Gt=>0vpG=JdGH)k1X!`qIvemP5gwJiBB6cz;e+ z6i?h&jN#7c6_OoaTpXCHv*j#JP3yU79W(GpK+5`{u*kXoR`3g{A)K`bHm#!JBJEw2eMg(y_+Hv*Q>ufZfX|=a3J~pqtEoEHePY zEPT-v@@hE{ka8&3A$*3pKwduP;-nKe))2$F?DQ1;h$FS$?B3j7T15`!yv?xNAYVc( zgL`(_9XtsVCdU@bd;skm9GWF7yA_ZDb#%5n(t`(Y8?@V0XAu3HKo6TwL>=@H$pvC= z#qO|Bnwj-h=_bp2*NSH19A9cml^fuPwAJ5V4nVhQybpc6h% z@L~bx5xOf1Wsuy-rnu-NNh0|7jXu#yRgN0 z1zX_!fcC4ge=|Uv`_qPBQ)Q6z3L7uf*K8zFtU=8tBl*22mJqt`!QF zQJF<+1#DUi$ELMQR(ora2o%VQ-XK=H^+IEn2!N*h64Z3j4hI4VZE=UWKIe09TA5w- zTz1cLegCfgBSYD_+}!!G1zwcG74=O$T+kV|SejLEP-n0&5OexeU~+h{8ZP1pIEohC zr1#s<@XhPBZ@o78`41e(Ycrm3vL9=r7k2F`U`^^aZ(pAmWt5lrXnln26Fj0!x)b&i zN(T;<7$DyTi@|4iAH8Gu<^!vFn=FBvY#0-|>=HF`w0pZ` zQd73$WV?*Hu@N2FY|=>?EYODYc6dKfP@+CZ;8SyZ>w9Nsh6hW<6d@!gSb`ArZ5)Ue zRKm-b$hv{7rT-u>2H7_11A$d>^iFaGn$dtzkj-l@)u|UV2{L&SjAbB|b(hC|+2#^> z)up&uD&?`eqs(Pt9GW}2Np>BgQ;(yiB&}*6 z`WFCI*nwyZK?uu=1Lifn&~kI zS>5gMxHMbFs)B>t{LE&@d*UEL@C{-f#L6Q$aLMMhaKJ%)1?}s=U%Ym!&8|mFu>v@| zzaD^|55Um;uF!m*6j8gcyyw2vs!k1hHq}z!Zui#Q<35~R3)P6xKo>FSAqHLbLg{ZB z`q+SMwdJy4H}Zi|R7=A{Ov?+rf6=A_>*2652Q`VZS?#v#+<>B{&RZ523=WHo#a9&Q zap=a?TIRt`uLS{-WN_mzB!f$K!h1o>{ffQ~%br_kkh#5YrE%fHg=j}O*k3CZiFW6wI=ecCy>q_F=5DM>A-5#fE%`p#DNvxmEnI2pf ziew-FW&AFOO$ZJ85R0q$^7CiKVk*AEuCrV&(B3yS%0pcW}L#`O8y7%(x$M~7i! z?9S~b(~H}}+nHWFB9d(kus_&tMmE^Nh84EmESd8}euD~l{8f!#TAWLS&~%||iUboGK`UUC2o+^_X^SkQkS3go+?O7!xpr9Wp z;T2Y){gmsT5VBe~G`e<3F}rqPfNi(4I_79YE3D)54fYh&FXD^bMk8O#5WIZXHm)8m zWh{!rk07tk?2_d`kvZUXk@rgwbZGo~8elV$Lt&2Vzz5-OfnIYR3Q$Q^CJotRa|7tW zdLeofNh5I6cF(8Ko+t_lJu(bGnoU8k*k#g24N-p1378(^gvL3awJtW5hcO9^2h(`kMM{JS zyMdcII0&+x>kuByx&j-K(WI6c-b@aAEe=*JKy$Dhm>@ypV)lIod9=>3o_j{4_2Idfw+Y1Ru%LUvX;M1?O#x+6 za#*2;>_Gjfwy%MqYGKyvN#EE^?>PUjA<9@@N~f4~VBgY(%NG)`?a)BAl3GkJ0>v`P zl5M?XGb?mwyPdR5gQ8%oGNE^DXpwHmBJb+5ScUSjkzKkCO_2W4VYV9j2lx4!`Uh+_ zC?8g|yUD^eOYSXL12!ulcPJ+di3X^PH-k+lofZcqk-VY$feum#>*R!~x6#v3?6CQ+u8<#v7J@UXkg&HL?A{dh@%3r^F=c4LJ=9 z++AT-Cp(ZL^y4-za@(Qs(`AiU_|~nk7^_zx|o6vDTq;!4oIc}XJ<~q&Z@9h$409o zRdW6e^!N4lblR&#eLJ>SyNACMyVRt^4lb~v{n?%g=oBqG6UZu3f_k$jqP+5*lA_pt zOa_Ab=qS&F`fdmZ9@ghC5ZHIv;5Y*s5QX;Ru}Ih*a-*%c9|Wj+Ov_SRXIXX)EYgbf zKW!}GwT7i=KIJ=M6PkWPvI)nfDd`^?$tk#%c)lb|LV(2qI}vL6fq@7tF@tT5s|+3K zm`j4LXXa8GMjbrF@b!abVGUiaHSDzN2DZGWweG6RV;FU>?AwTE)nL_4PSnP0q_~sM zu&>*$+emzEW!H7h?~d)a2aW09ft_ZqOj{=U~0x zj6#rD?tev6q>o>^V-fO7zKPbNua<%xg~0!G-*itkRY_IKB@!XL9{?<=w*1)4lIog$ zE<$!@F`1k9zMWb|<|>dJ>9m2`z9T!ABZnKSLBP*Yt9i+V!03LL;smFY--^f<9I!Be zz|Jfd+cEsHSpW%!DzQyOi4MHWwh7cVQpQc4H=AsjhvUpA#J9Bk{0ZdJ^k5G!z|={L{vEN885i2bbL^tumz%S!GTa*&L*CfXiB~2Zkw6L~Q9g@ZMY&o9nd72ocQz z-4G^(6DEX4rh^rFKlVE=1DjUz|;Ua<;j6E*tQ?M=Wjo>SC$)}U0S39k+)+z;aB-0pX{;*K2X?cC{8T*I=#R6 z&XzoV6e+cf(#6uN8Yd>u<9>K3mj%#0>eis&+o9iM;{r$?QW7Cli(jxP z3l;$EI*D!~_Ir*kA6u5MmE9MssZ{mGX7k2sH5iKps}Jpe&1-~Tl)jg8Un5c;o-b5o zc_;@4-^}sMfLsKtT}B}ym_AReW?=N#l*p{^>n#=X*?1I}hLKxMJ?IS7Xqt4&`V~nC zg$m`GS0*UFf-`uTEt0J7&!VTW*W(Vzyu1jB<*~xTg62eQ5wJ!J3x1DJcl#IE8C4A@ zifL3jGBq5@Rg%b6|A|veCN*dC2Oi(N&x2=0zC8T9lqdcQ^W{Yf-p2XzJTAUSieWV}YQd^@Mz3q87xC5O3(4ox)?Z7jJ2 z`le#hwH#r|ne%PL`o%oMJf(@g=gvYr<_j?v^2OqXsi}Y(iKu}oN)<;(zgx$O39q-V zhS8EEOiAmgjWFoXO^%0fD>PwyQb9fTbLnDNGiU0YL zd++@SJ5#^1es>+`b==!2p_7D7w8UtALko@s1jm7~fR;_Tc6Mn0?fde(@|yxNg6?Uq z_n@?^F^m2*oM;i`f<@b%U?i#};Iak3VG=b>G%6(q*`NXjy`z<{V_z8^!d_~Z#F*6* z9jhPns^fQ19m-aVuW8|#x!ZE6*PtRO*4q2%g4L*TK+OA*4vcUFs*KSDjp|dV=QXo# zH1B}@1AurTbkFh)%gZ;gGfzCxeC_kk^ZR}bH{XlB?I!Gfs)fV+ucR(QoS7zWHaL}NQ`TYLkeUDV1z zrxH7OQQCz(l}Q8wXixE(72OPeR7r+am%QjvQ8K9Qy4R~l5>`|W22e!iR?&^~NA>25 zg;-eg8goW`D<~BkxquEc69h|;&z+SxK`9sx@k$(`B-A>Nj}mXm6&0mK=?; z*JFYBGmxq8CxX8p+*MQ!(X;A)lk6kN>IN%E+(ao5>ivdX7AY`XpExqB==@%j#=TeZ9`6tW|@i*S(y} zn#`7R^zX;y5WPUKW1eUnPxIQCqBJ2PFq*NU!jv-IK}V>xI*pa%5jUJ^)}_JXL0ww8 z#H7Lg(nNWp0J4*ctVm1*Sy=;&l(mhE?37>_(Ee1E+&x4#lL`An@t|3L)j3XYKy|0D z>=^4&kGl{|L;V zIQ`+A$0P~Al(~1i5i`~$s*_Bwlm|uAB2KJEifXIWEMn(i8EC_f|3nv~pVd-P)n!?v z3NxfJg4$eBg_Hom7E*C>?>3)Xbv26S^*&Yedi<)YYp?^|N+_Moq`*+A5>XF$b*f6! zRn?DAJ$8U5;zOzeZ1Y-00$v92LL_3c7`A|5=FFG4tRg9pL1K>(>o4fvI`-3JMz$zU zM-AgIxV{#neGSgKaSda@uX&J?)W!OY<^#n1)>SbstKJv{$TF87J}5+@ju8#i0mnd< zj9g;0$Dk3GGS$nNjE@pKP|`%5n8E?xGQ((^XtYTG*0JUB@#SNr244RAzkhiZDj^>W zev$6Uc~k(dIx6}Qa)?UQh(}p0bYJkOKrje>6QbF;^W><}z8-u^d0}$dktik{%ag@) z`sl9Z7HYrdls%m`i$S#^|6N9H#PaAE@JF~hrgBVu=) zoIBD<6d_Z}vM6ULZg47e3FA~N(kgj+^ZDEv7Ilo8gbxq)PShq!#dI>DqqPM!2?uwb zEz+l{-Xkn^H(Q;{@!_u(W)mW;3 zFcbE;mfd>9kpdP(pC2_dW2!q4OvVC1Er>m!d7Z9++l6vgzX#>KUn!uic-^OkeSSyC zVbpmN4-mFfkMuRM1}^RsgTB^U0^piuk9_$qMV7jk?^R%8<+ zjB^rXV{OfTPMmK5#NY%NiN<-9lujo$c6?9Fdn6WRQa&5)iS>9~9IF}?*A6bz$`!5x z5)eB#=i2r0>%^EpQT8k^d&-GqFs!0jE1-shW4uU_xGq?9C|F`=9u9<|+GPet2C@;4 z2Zf2*k&NG~`LiQAKV}pT0KLCe#!L!hdh=-!4y+sQ? zgnL4yQJC8i?l3xH&_es;4q5={H*78{Bsz^5K~l7hf~5#UY(fike*3&OEueg@MGHH- zXE!ZSFa}N-gBI2qNnz^2P#6~|Lfy3RHytF9G|0lji6G1g!s_uvvLJy>M1^MmaPzgL zV5qM8b0b;5M)N9)R0V kfscHNe8lq_In&sTf1W&?wPcl#p~=c<8HGO2k4zJiMWt zZ9o@FsE{^0i-{um$|&!N)2yZ9EyN=M8S_aQJtYHapUX0jeB@aAhF_L5u~=qI_r_D@ z5ng1=D{v?MamArKJrTD9NHfnRG8t3G+{K;%p4v=f(yxQXqWJ?-0_|u_BeX8=PG_*k zV7wq8iy@K%l9tkXu!=_ZybcC#L3B}Uv%835w1kDhT?qX?_MR&c%4EVMyc@FD?LtQ9 zi4)(M8%!bP)#GvdJ>H-SbTaSY9AGts{!9AHqlmrCNk6-aqI{1~29W*%`V$SV z06mT#OV@*|K|1iPMhr@*h>!^|?saO+xMCo)ZXe zjR}Wc%gMs2h&$-c)r^1IJL|1m?RpYeDX3ZM;w+r3e7;yZ-$_^bOv0h~6h-xgl7i6; z4i5?{D>lDhNyRn&W12rVobziwJv*F*_sm=$v2S6^QVKcwz8Ji2u*(qZfc~?-b!SA1 z6u}ow|Af(|g6kt9X%ZR1 zB2+6SAti@|0Gw?w4UyLjUj|y&bC@Rk2?w~l{g9?HNsDNtO!H_dk|$KA(sUDa4Jd?I zHRjX;dLg}aH1txG+)`2g`}W1zyJy&fR~w>ZLz=hwnYpLxKb(WD@Y=O6us!T=;c|ag zDoG9?zdchDpjblRBsmwA3XN`yR_2CU~xH}sK+vz?^Zky`kY{H9>(+h4lv0%ir3md z@CRbjTcjz-UE&Q7Jr5I?Jf%YV7O-?AH%~iI2}u4EJR4^8IQ}pz#3)=SrV^8Cp8`f{ zm2i#>?nx&}IH|FdTY+N|5f!DP-=B{}gSyk6LWc*lnI1SyOFsd_86PX;IhEk|Tjnhm z)vwsye!I=71{51K4L0xfHquk9=(Ac>W`S+v#2;sL?5khRX8AusuTxy_i%9oA2Xbu< zotO<0JuIhNgbVIM8`W}>BB185W5&mr7kDC$A6Z*%X zN`bK006AUL^c*%oo5#O0U&4lLy@hhsEtO12g>w*mgp$I4kAaJ)D;*47Nd3AYl?-)- zp8FomHQ{QItOuF_urZ}DCDPE2z|OEC=L5<-*_EdJrbJQF<>ZqDOLAc>Dj6yl&1S6t zCeNWs_+)mdS_QDs5Cwv|M?>tTQ`I7dINqUdu`|VW9Pr^M4W4IkKrADlf3o{p<3O~R z?-z`N+D*!Q9Kt>}$I;d=@Jd=YjzFzI28?M`T52@XDM)56nz1$_C54>a>m@Rom*jBm?J49EF`pN* zc$AHje~Nl4nX(uGq5($#8|G8Er6i+8J9rlUhb0Aov%xv0v>>U#DM*ar!6^zH zGh}-LL;$5I64lvKc`bw^%4->5W_gmD3u&fyDaBHztpa!}(vk#bp{aLZC;&s~N%sSo zY-D8VzyaoWswi%?&D&gBzcn7s4PIZr`R4ldy?!9eCV;pajq_)_huhazU|FBwvgNrD z)h-)~JlS{6KJNKq#H2Up#&zodj2a@6fQHqvyJdkYP@rH@3S2XiaBu z!uVkwWAxC@sr4i8n8iIKrcYgH=ilp4LC8EC>rz3Q-vLiH#!52f3b>87^CwMi=uet@ z;ZQ2oc-OlcsnnqtK!W#RKhpiq$Dd^0d2@f#)T4_RTrha$$&*(OUU0$Uqc`5z_3YdD zlk$~Hg?uUqGVj2jRITsJ?&YN3#3cN zq--OlLV;{~woG?YOoCraxRc5oJqNU;&oD=DDY)z_mVL{?%Te`_4^KQbJ{SyU24DT^ zzI-s)H}x-S2v&c4o?n4)Y0@YVg>UJJCw}_G6I1o4>i8d1N^*hwH7Lga|GST0m{3pchqVUuuUZEw5dNN?{u_89p?h^Emz8-6p6w}tnD z-Y7O>V8@0?q)s;`22zxXhP8zji)BWI0Ce~67P;qOq+;?7FGhKL zj8uYLsz3%pB8JK8HX)ekeG4PCC#zAiLMKM5mhCYyQZqgj(wEB~hufD)yBuyc8U>!A z3lS^AMjcB=flrtWhgAwvg_FQ4jN%|+qau3c0U9dhX=obY^*$8>A`Jqdsv9v6f9L)j zkQ&n7#p?OqjiE*%7Y>3j2LLKF=F7~nB9_F z20PbG$*SAP@ngV8@3L#Yh&Sd?9ZvtI@X_$Hg*2F?@U>aJ96CCx!6FUk1IV}GYIuk< z17L{e`hR(#7))lq01n&`lec3%F$9TfYLjxfC=Eo0uZr&=5c!G;AZ7 zVS`BsK0whhMOBdK&iR48Bh6hDiHrR9rwKvKU=9X=nDHGVxBV4kdm)dVu)Vg;V>cdV z>jd^c;ZM1F_PY7x=KP4<^#SSP#)Y-soV1pm-(m^y@Zj6Fr&D%2R_L zc)s=9IoIIH)~)rlw)km6%1Z<2NB?^bcTXmr3OewGri%?&X2Lgc9?MxWui0ir&+Fc_ zsKo*$QcsK(28sj8d@`TQiUjJeMcpWYTFeDs)APxk{s2weE$5LoZ7%M{S<|H3m@=$i z8k6=&f7#Hn?=4_=ls8SiAWZ%=N{O@*` z3wq}%(2vt<-Q1M{z0>?>W8KyzK+}4)afhaXKlh>Ms}=eG286KL873_+&g`GvKRq?r zU&troB7?duG~hyP$B%Xh4;6vyaUDF=#+8i6H^+in-ATUm7T8bL^|{hksT0R|6JSsc=Lc0;=c!Me(+DrF`3a9mZ-$IqDo68- z<)h`&@NmcL`TpKWlCfl@w|~C#buCjs^ebdM3%vo!vavfVO}AHrJZHmVtz0$MG6btl^b_hXxNYp7WD;#-f-0G zve*CmeW650e+4*2&|V>kpsqJ~AmH`7yu8Aoqr1X-yBcFM{Zn>YAFfHjF9kgUADIbo zw2TyfhNA?%j0lcg?x^8wBqw_xtCMb9=?}L1>SeYbe1UC z$7b%3$o&LA9A#I3jm3RK6Chcy+hbX7*q%3id5_l!&OhMUAE| zM&SxtUXe}ut9bUS@$COrUmFEH+C7?Hdfk;rN~N3obi>z1nEy0S9%G)s#}eRU;SfPB ziXLO@%v_u=)JKz#rITP|5x>vvlrT$XAgLWnI){xByM}k@=a~Vo%Q|mG(-+kh2sjXN zaogs;aF^GgLLesK9q^!#C5Ux(y8_1pPM15B_;&rMEgs8Vor|G61fL`E+$s2=QI({_ zIkA1Os7#tk409=i}i`knY$!oOIZyLw){;oeo?^t&{35{{h|U^6&GzXswy_kg?Y1 z!*eGE&;97@-~P4N>n)~h0o~A?JOyhTQ9%iQ(7wdBe$Y~pDou-{rBP(77g(V^C8Q2Q z=5}a>M#4sGV%B>>TkZxd^GhhiP&J>Li=&Z~I~2)eA|W?gImL4-(zwI10`iVr&T!ZX z%uv724yo-zheId*wR^mtaBMCWPDTQ$xoF6vs-94EE)|F*!>PGg*yF9cJwd-;3kEg6 zA6w~jUbo*La66sufZq?mfHr+R#q*co1BJb0H5dSdkC{RVyJ#aHXgg;qOLb+u4-)x6 z*RcS@1&TQ${@==TXiZOdQ2u8rG(>XQ=Imal*W(J=?P?%7NVGGUN%w2Puoex2qv-(( zKZ24xsutISi43+tXu@N&Dv3zCKZN#Mi9{?ndf!wjuBl&k`HSv>fXk(qLuK8Gaa*MO zKm)%F8qkq&15AU)NFKRv0jd#%H=HM-Bb$_P#VLv^Nw@id{O6DQ5r=R&K#E9P3fD@c z!Hz@cqGTcHp~#zUTU)JBL8*nGW5(x(M>`Ex=SinMkA=g1#cOR=Ri)Nc$gNe8&zHXV z?8Rx1Cv)WN5mY=H9@8nSHh6YW!%0JDhg7KG*wgpn0gi(2oxgv!B%aUc^1z1aF+NPc zbkjlGYGYu0&+9Qq_35&7`!`_ObQo5A|9a1 z&q%FAEh;;O8J{oFctH^l#BRN5DCvP!X>rR1TLjL0PpTAm?)}gF*>1gLytjx9cX!%1 z5yd>M%YocsPy5Kv|=G1gA}%-OAX8R-iKe~X^)P{a^=#^ap5$)Gpd zD<1|G^pK5+DtiQv2wk zi3h+>#M6l3*b#Ca90Bg@U=S$;@gPJy^xObLIfpS6vcixsVdfBaFa=Z4bB^HkfFtz! zf@)s1JGE}MU?BoB*}{L?pU|dLt9DQ3BVCN)1SUWmB(5O#0MQKbgnyf#vt%Ib89UQk zzu>0&{hWG*2sKI7+Tx)RWZCw@Izj$x2?m=VfT!?tV)l6Q(@q?m*-RAK^Fsp}^sRzfN8Y=E9p(5}PUHfxAAV6WV$%75AW4IG)NS)c4T{ zu2rn=a2T-acE4ZusL95}#K_2e+~bMQkBm%AG?HqI?b_UlY`L6GxNV=yCo7d?n`TIF zplsizMq{i7W}zW`fsJ4R@nFnUgMer@6(TUSe1@kU6a@KEg#J+ME%x?Qli-V_L692Q zMfvSe;SOcWwB`vrauyGDJ@f)z)&(NsGREu9=G>3)5!);pgoltZ7TOw#Dz=7i!42?k zPx?rROPpW2?^Ld}JO03`4!Wng#0d?l5P;G>Em=t&c0pZ}*-XM}rDje@)`LQcp<ZG!FMvgEB% zYLSUKC?yxd)1K*h zQFf?-c&QXe?d`HB&-|*EKv}=;3Fwh*DiBh2zv^(i9d5K)4dIukocwY=5UhK=akK(Y z@L2dmTqpi8WPQH`r zeUR}27_ddYgAHZLEHg5gB6sAmfFC=SEiIuzqSqhv`aJ>UzIppe*8_PwkjL+FI)ie7 zojD_8>`qrGH$IG3cP?ig>fLZzcRBRxaMkAoho-eVg|+LE(1oc~4EQPakCGjr!obas zTqE8Nu!*QY6o|pL^_PZAx*ItS0VK@9U^D5hwGKLXC=?jJ4m&G9 zX|DrmF&K@p4(mpPF070fpTL*EG3{I1jF0WVwWdDE7i1Zo41HcjEC62&Psh|dTtWFv z^R)#z=ycYdKFq)FFjm7H({)&fELH+FC<)+?i*?{(NqCYst3j!h;H(INRl7(NYuU}T zBrP+dfOY8rm8bx(gL9H*en?mi8CVbRWj+|39=BzeML|92!HbyBg;uIQPcoYBqcwr6 zHr+p&@u9{;k9j;OBz`XEbGbxq1KFN8vS*QBd49DgDJiA<<3{a?$f`7GiF;&?j8@bZ z6hdE`n)0~xKr|N6U5d3KD=3ix#E<@$^}%%5@4}B?)q}cXNe$NjlF#Yd`#4{s+!g4& zC8O>Hsh{UncG6B`sa7b=1P=ugS%@=H*-6_&QAdTSna9%F5e5z6gN?TGKjsF!R(Z~* zfG4~B-TT=fDs+dAMB^Pqbxk7bv?Y-1uYzvL>pud*7bv4PC;mrG3$NJKFK011o>6G?l3 z{Dfht+9<);2TL-inA^)>t)gZ+EQO;2E5gX%u8b0aV3&r_Ary(34=q)K9=5_f!CpmK zSRPfWuIDd%@ zM1J-Tu#-v7)~I^sF)Gv1soYm!NRYo!@FCKWMZpWk2JXLQr3-GKm9i*J36_f8r77Wv zA<=j}3dA!gr;M_cU!AlfE!qnYp&Nf(kx5l$6D+PXDtB^)0ORIzM<&1e)k=l`Gv}A| zj5zrsK))j65~JL-5(SU-Zz16VxV6i%j)aB$p*ae{mfjkd0!|I|zz$a;6|mm`1;cKt>A~~8 z2hVpk8w1ONzdg)rKp>;Z(Yjfc2P#xhpuurJ;w&z>3(Y_HJEac`&?73)AQJy?B%p(A zNeF16t&*XTpJ>VF=3jCBls^l_jmCCVry;%##@A@bu6%1RTPl^7*&h9cgQ-;g?z`)# z)cB+^K5@_UtJUClS0+azydK0(*dM>!%a%|)6k*FKx5?%7N0wGr`i|hIZ)IiodvCwJ z=rYUZ^I5h`uXRg&W_D&KZn1cJ zB4~+hu_UHvW~UP(-W;zG`7tS@WUY zzcETB8^ine_ZNb}{_%fyCCCSE>U(1l{O64a(yrNf=&^r%}eF!wf8}Nut_!Ep*#z}1pq}+$SNJfSF;mTqDb(AIKvj8 zhVj&soW5{0)clKkcc1v6JpJC0(9ry2kF8g~H-ztwjKK3EHUGq2P-nD}$ zg>9W5cC^L?|9`&fQPvI^VkGsmB|BMN#5PoN)8#C+fCm%!g!?P^tO9Q3Vzo z|F@cF^UW{h*=w3F2CjW)>_dMPST+9sWY_!Nzw38an>XZ_2X^Q4y9bu@m;%sIRT|>s zD%($Ex)n!6lA1r1bjlf61|58yu@{;@%|(v0R?aS0b@SM zN8OPZBoG{gH^ZTn3aNxoQ-&NvT%L)!CPQIR7QQz0XND*n)(S z;nww(edqS>Lu%GJ9Es}am9>vZ$<^04*7c{A-k#T5Do?69*X^?Y#6ps zP!DJ6g(COKKuf_b0nr4&Adjo}QdmkMdAI7){gHP>^FS_f`Q6ltmfTzK(8+zQ_w^h_ zZ%3C0d*?FgVRlCTkJtkX(j)tyDTBd!(Td!HWB~Zp!E~tcD;=?R96{SxIx&x$VhbFo z7R$+1!nl%8A{KmNmE;Un8cSD82NR7lO!muH`I%VpO-}@PRev9orY8Cp`WH$?N-99$ zpvG!Wx8aSQG@X4|ZA=8!_45e4ksbxhpHEOl&;u1{7xFldLhxz!4-=(|zSriAR1kr2 zd3+#<(v(gOwe_hINW*tH6v&qQLKzq4D-(+5+%%)^+{2+rCF6EP;FJoc%Q3Gvm#WUp z&s0-6uQxW_d}Oqk4TN9x>*36N2GEm1J(QkLBgvKTGjne3%3p(aWN8li!RN6r#-xMN z9SslIxz&%n72i33m~^^6MOu!qg%(IFO<#84Np^3`Qdyvu^*f zKyNl5mD%BJthaA=uGSk@Y%3^vAI;~Yair17(R{YIKVORGa?w(LcRCXDMIydfB%KUJ z=v5^24S%p|u^f;shbL>XSS;G_R!fa8AXB#0Rx2hboXqlN_p7h%1@?8xrjBiZ2oKxpB}k%ds;=*-k5eJg#JOwA;E zi?{6BbxX0geZSj``=PT1={Pi#bWV@O0sI>DkOR^{qEbUZTuHz;(Xu}9Vse7& zxYuI?Qt=NaEexfUeQ;`gdV2hD)$d$gb^5D^JKwn-tM7cLEph1R(L)KFEw?AF-g>K= z-jlPPb1dllb3Tq!Yqzln5U{j68vOmWYj0-{O3&c^0w33_BxDv^UIpzK_=*??Lwavp zdB(s^-C3mfPU<;qrdP40f4o{=TY32cevdTT5^{RTT>q9)_KR#8L;n`{ zh=6^K>WBXE@Y`187hc94Xnql#<1|nqIf`t2g^7Tx=$t3Zpa!&;J}KF33#(2CaE_+! zG|?5QLexM%E@v75&}~SEEh(e7_wbE3ZbBXVR#sP6?%Rq$h(6YO`SX^QAL20->oRF1 zCf!*61p5-lnF17SN%~`GF^oO)$6U!c=UThSAQ}B&y@rj1Icoi(2m^??hnTb=w_-mmYoHwaa%tV6zSm>^U}d;Ss<8 zc03i6D8Bf2^0V-z#2R6=yaKAZw2wAC!2|$5Ri;2{i~HgGWy_=4(RlW%R4l0PeZvjE zzBh68@&3MDJ$?DY|Nh}{^RJp@EF#_^UB$jBUjfW*@D=#|Wh7I;QthtQgQX+V>^ni! zJ6%_wd*X@Po_OM_Z{6_ePv7t@e&4aRFS5^DBG{AZMgl1txC59f0!6TgIkW-3#BYHn zZ?gnOEddt!-uIsT-uLS4DfU$JlIA7+9uv67XLocDCmTgy;JwYiXZjoISNDBf$gTaK z^5Ym|%N`C`CL@y(OF*gIc+JyKU-Pba@!zQ#__S>^-~8rG^Ix0)I`a)Y?~cb230Ou0 zma%h&fqU$D91%W_38pvy{*Cmja~QbK+}Z-C#hP^0b8x~VF0}ud0#{`$7Vsy+41)p) zZ6C5~6*Fjq%5OvS2B$Ul@8rCS>A zLLOK`LnIiC(Uveq%Snu57Y*59$>xylP=@XHx*bE#gDs-e(0*#O^J&~(eBq+BSgVyV zaECLw>A*!KyuG6hA>XCH83kA8%ttnM(bQCLH6Bn7*u12Ur6N&NTjRRH=96T(aH?-G z8tKbbBDr`H-T^IHtqVQPP#!wx4UVfr#8hJ`-AR_?-#e@k+FX*}i*l(G( zkPMrUCdy&V0ImBd6jieZf_vRfZD!p-*K0c44zW}H*?v&nq(U?S83h>+f1EVLWl9OW z%7TPga6nk!Kqi(gCpaV)iFyMK+Zp4sBqxNj&KCdruMe}ItbF9<9L~X&hrwSy#Q96I z5rda}AKlGB)~3%7A##k8qDY{Cz5Sh2Kl#H`KdG~~vOj5(F9h=Ps(^tFt&~Y!wkeGmF zgJ%tctZF%Wda&6vA z=>p^rFR5EgDQ7d*61g;BOkhe#4HnPMSx}+*y&(Wh*%kMN7iJ@VH-7w)tUT2~E{k1h zsBV8?9LS;s2Z(i(*ahsL*n61bc?{D08lmA_L(9gX-v2iHhFsfTZcSDYPEg+Uy4QW@ zb+7yF&*BI7me|@;(9tiDzlXSPl&>o?9c78s)Z1#zaQ<3MO9jd}k_rr~Z?6}52OgIL zK$o#tD&Q|?W&fn2d31|I8-aNivs5zKaDeM+MopFJ<9-IW=RR)M_Hmo`gIlV=js$l`N-}-C>YTWQ=pCLO!0*BZtX_K&}Kl-}R%VtUna;X9H2d>7uN~<%Ex*0^#KK zrK)q^{x-P{$bax{zE*rpXDs~`3nse{9DwY;OIvo|$yILm9hZqqB6wX27j?Tkj)9nv znNaZ7Kk#AlcdUOj+46-Ap91qLJr1AH`^7VWPs6Cgb1-;upc$XU_nufq@`d%6tj05h z@DTJ2rOtA63e=^6dJWl3y)oGGxzBL;@y~DY1TQyfZRg;ld;xUJ?OzHOif5Q@J;OYI zhB|)+*uPWwX&!+*?TZS#grG{4lgf7t|aXSVif z5AuoYJ}x9bu>t*lkjI- z@bt*(J&DoGldF!8qfYK7m=e&^q*Elz)}P6stGL26zM4;QrVPgtcg~p$u+1{d0y@~tTo&&r(lCKi<*Uk>Wn@P^M zR9g*2?l!5cHlX&)B=SZHZt`9(Jiz%5>oAMpnL4pnvd4Ht(b7!wU&KN7VDr|ILY(whvacauUSRKmj{{LByx%hRK>N=) z-$J$$Ch?rmAw;20p~C<|9dqnXcEJkbg);CQB=)5IBjmrODBqK2h0|4o_6K!fvd&`T z$}$IICWi&Dq(}vk;zo6n;SgpF^%Uf&4A?Pa=vZK+dvX{`ODnsVedSaVLA-J> z=1>w}eDL(2o|bQ70Qo}Q8^MC9p^&P2Uw+RDyLY8IfhQz-Fy&By{5yUJm>O^XAthIN zCR>8@)_{ZzYTc#?P+7|C2nEQMLVo&j3*2aoef}o?TlRlFwY*dgu#dm|WAUm9g%5K~ zbMY+ZqU?A8-)py$El zG2$Fxer|FOjrT45K14~I--pI(cNE&s#IFGXZ+XpsH|N2+r*j^7yzBk^UYFqxkKujU zA?CaDyeIj2)sF9^^Td3wKTpiJ;<%IiEv@yXxZ1-Td{6gz;(PjA*U@|NJ?qb-Ip|n_ zDBH$5bH7>Zd--ueSL9El`f#+WBbB^Pj|VyJNKd{rq|{PV@Szd=*FVXx7th46m*nQ>;kP?r zxeInlKw9D2>y9wqT`)ad0T;)2r*`bZ>>#cpVs556p|mmHffM1wze`5?F6*;Q266%X z|Mxxj_B`D~ASH$qwPKp@*2e2owH(ppf$u|d+Og}Rkd49q| z{x}el?B@UJu^aah%Q<{0?3*<9fmCNnjiIg{%_$%};hY z*-T7EaTSzJ>|T)qZJp*Cu$co*5ulcc+)v`rlzhhco`oK0=X;bHa>x(65?HVJR(1kk zki@-ZS;#;*=MbJyfMB8*&`j@ty^Vd7eQD+8ADeTp!>OldQD4X;iJ;hEWMwIl2!i`hx>-2Eynx z5f6<7hn&zKDZwF22@XA#98giBXqm(T#T8@YQhtM};3&{{+P*C+4G{`5cY9K54yui2 zE{d%RE*?bzC1R@I_y(e?(M%RWSFi1W5{Mmj4E0SNzU=T+-_UR^R}N=l zN#KLRS2yQean4nfcu_(f79GJ-p9`) zIZwG_hMes>Pv{$0t@|F%>$}h6a*?mS!?8}z8f)J=PTzNJORg)e<6_T{T)wvbeI4?a z-xqxM^xC7qDt>|Ms@Ly-CP^s`Ers=POJUvLp|D;+Ufe7g3cMHO1v7Nob*CWyzKL4v zq9!AzT04mnzp$y+A|gurVI#Hn!D9!1;~<;$3au7+xn4uBZC<(Zw=2!BuOKI23AqIy z2X76)f7g(fsUCNrU$!~e0hjEwV4_Zv3Ex;HSM=X z%fj-)^3vk$%-Be^(bLGJf|XE3$QqSYa-MV{AZcK_p-@v}qZ_H|qJW6T$9;H4mp+sO zzy!ayrLU9bE_C?sv|hEf`A3IWB0lASH6HXwBEYZ+9!`ZX_%Da$n~dQ@z2|Da_Z)ry z7r)nAPUWM?evixL3FpV<+j~*bDgs5yeIj2uj`;ax*w-?aUS@{Bk&Df0Urw*wDI1Dg0Ww|3aXNLOIh1- z8@X3n-Y{}j8OlllWn+)b%>0*`8P>btojTjgJFIZu;;q5}_+~-RqT^0Hj2+qwy|>svDmIG^ z-8+d+mKW=@{k77;^1*a6SPT_WOsbIKM!0WBh+%O~Mpjc{l($46N03O$fq#aAkRXwk zqlVjg?I@1v?dOHS_FqGrN&wzys!OxkmzV7}?K@80=0J0C;D7`ok$|SAMpMy9ETw6x z8z4xG>1x=mY8tv(M)47$iuf7xdn3rKb~s`&2Y#qL(}7|$r&1Dxg7`6)vW5Z zTJ69}s#cQ`6&Vd)HCs(EhHJg zvPn!QEv4oFiG&1)$QXMmh1@ABFb$EE9m#k(1V3&dlnQ#_Tks%L42>u>kGvbe zGNDuvIZ=R-3aKt@)ux5Z#mQnS1nij}^b0NqR8KTmB$xyIAhULDh&^n1N-9w;7~aEn zhSwi_aJ`SbB$bvDOVlqQQbQ;85t9$_am>m}A~%W*-emRo zy7zy&qB^{K#x-408E#g0z2O?e}`Y8%8 zF&H`iV@D482DQWbgqm!3PldK&p>nu7p+ z9GV`c*TfF-`cKtgn$nXOOcYW;2tvyxhd+`D4dip0(}LBk3{E!Ye5pMbv7ZK;>izzYMKe@QQnp%Y3Ce zz2PEt$jG8Y;t(ZF&dl^yBFV!6Z6K3D7G+(2&+eg0BpQuWhIYSvll-2cY%Cs+WrtqA z3E$tm7I~!~S^E;gB?EjXZ1D^{)uLoZRBR@(gHKT9p!pEZYvFn?jl!iK2*Jsok4Ez@ z&o}v7{sCp)Q3@V?w~_OD-rwEYXgm3Cd1ZqyCt_>fg|R<~u`AMrH1_?^XwWW@CP$vM zn~}C{;W0hSRfs7u%i%;LLLZ?hYW*joF-~{z(1v7CYSPlYYvuIHH$Qmd#0T+}_|7GK z=O5ua%hCd$?}-BU-4n18ifusjSoPyX`_f4}+?wc?!cfH*i-rOyF+$%;sm#jcsw5NH z$P%Qk!?bhJ^xF{SyrNV1*Fo;hPw|94b{GgqE|)!YIAnLZlpx;o9KUp!vR}gAM2NVj zF&9#l(46?)=%K(dRn!{suQ}-9l<#JTjZHeI(8FOX!newG)3uApUJ|}2$?h7UA(PI^ zkNa_)>#SYJ+xA%d{Ht;PA=4Li&V9)Da!<#7>HEkYGp@%92|d6MnMyWO%N`>JcoHX0 zO9zp!khQ`N%b76 zzsGaHuhQWML+(_!503kD$oHbS|D{uJ#)Flu@PlDw^eOR5p|>v~9$1BLf3UH?T87Z4 z%smi_m7R8iU=;j+7tWTEn14M&0?G-5c5AB=#4aVA^^kHhHv@p;VSqkna4T3VC6^;s z3v}&WE|wH~hJmAwj|prO>a7P2Ah5ywyv6H{rh9tQQLlHF1@uft53p6gmSsrcjzXIG zT$x|#o!j|r~J{W6%whZK7{?xi@=5&MEe3sA62QW%w zZd&sVUk3MLtUKP}Ul4Qn8R&Hn(ze>ayGp^eL(nvM0hd) zCA#mFI3{~DE}vVY#?@KvChR#C3P7(R?_j5GMl@d!R_`t60C zL$t!}9C0o9+l`>+x5BT}ZI{e;*d^25b_qr4xyOl;U`InYUULnLUULn3omL>9@VziE zFn4dTtbk{hr2B=P-G?}&1IaSz&*{zv;-5O!v;sPL$?i1b~x-SvavR{#iyqa{>I?o zLHWz*D-#T$&kU-af+5Z0Yo1s+-q^SDP~$iao5n5Ojr{WW!*`dGuG#-gg!~H-^TIcF zx$rMwJl5kBbF~3j+h)6(65}%9N6cooo!anZE5#Vy$byBIpK_;gcPFL#I(ZTRJv=?S z(sDAi2l&UU|9t7eTQ)GXu{<@hBA;GABG7|rrv{|S#uzH?sLBpmF%&fB(Y(u1d4M{+ z6DYBB9(O`0V3h;(Jp9M)&X`s!pI3S`VZDxx!G6UrSg>@{J%lBT;6+rL{n`Xf0iHTd!g&NIG@|;=Nz{?KHR!qoX73- z_IYaw?pG21Uc2)K^ZRhTL%--cPJWoOgZ#bS=hJb!<0S$rlZ1H%j&=WfCMou~U$Q@bUth0!@c`=v3w{^#X=v1p_uj8D7vn zl|Os$;hRu3hgR@`Y-L|H9Pp@0Ws5!@9PH4Z3wlJi;ekYf@7waC=4#9&PtV{6s^wgl7FX=x0b_kZFFGuv$Fi5g&TvF3s`jq+ z-m3>*g!@Xqi9V~+NeEpVuhzS(*wCO8%v6JAKl9Aq1M9LZ=GXlk&>DZP@n4N!2jVs_ht20Aug;HEtUGMnCD1KiY` zL!Dqii)8@T_rQxorKq~<4!Yb(^O`OKOP9qX5zXh*Hpnvg#qZ&=Y)=h!gMJ75;L6MY ztJ3K050;DQI_FR2Rgrg{Y2|0 z^mROOgN#?6=)z0Uq8*=-LmUB5I*ZFEgelF04(cLbUJ>l?0$|qLXZ#FMpIWb+$ z`2Bn=hu7-JpH(oH6Z@YT!5GpYJu4UjHMj#p76~t$s6g5(N?ieM7B)Ho{msZp!cUWw z3q_Oaf>hAM{68nsos4vJF#uuo2<8@Q59aV>5} zhLpTY8!*#Gn%eM;^PTT}=UZvDLFYdZ9dJ2Fo9lqR0-2^L!?mW9Rhc2J zwh9awTsgp38^6Jlw5GUIj>ZVj?(0eiUDgF_8ooH;lkX1)(_LiD@b-JX0i6dP{YEg5 z2}e-I&lm1t^ z5v(O7#}jKw9gD1~D8*6&E&gn}znq{5;>=Js7mNGCH~tV>us%m3)?4cH=SEXr=!Hj^ zz25lD#*yAw0+e($;%Og&tQ&>5-6rYoTDY$S9y$h?2RREx-b}DiGBp`26oRihDO@Pz zEOeiVg&q_vlw7ZQuCU`Z1`C~DNxR#++R9DSn<(xWg$k#TipovNn%w%?L{netBCzn9 z)K2i+Bt`e^f{6knq->s?VUwh6CKg(z{f?V(NM6wVuyz)b5jXO@hmzesoOVW_wmb={ zb{7)c#gaM1%Ogc%z~PX;#kWkz&<=+tL?8X8A8Bv$g+$oxQ(mn%?(1HaOvYm2px1-? z&b|$HR|;u=t-*rB0a{?v$p`=j5)+7BU4JME41u(5jMhT-lmKh{3xm(Ho= zyNOKgwF;ckwcK+Q3d&gA{G~Ks95tz{$GQlNyNy%ZZGKQd@8wz|V&0 zhmXhPSEJEYiE;?RTh~wa5j`pi#6?~<@axb5l1fr3kqX8{h_!jQ=Wzo1R2h^;@l$mk zh1N!Lc^)4n0?_`$m^Xv?fMbf|xtGWBe7|!X53LJ+76NUWd_XBq%^0s5--G_XCU-OB z#smhq_K)Mn&=Y+QeVF#umY9t%gPs#)LlWyx^_E?J?M0jCZuzxmrdnh4?X(L%K(QY8 zDuaLn{zYb5LTm(45!=m3`5?&1ouGJ#CKeDciajj4fAOL&+o`VfLVsoiW{RFfcRI)V zWu@`6`7xKn6CAG1jGkJ~uIn3(L~lcnc=v?r_s@9{v@Xm73PwF#;y-9G&5ypb+`$R& zk0+wUgSfjt$U&IGx&0)*0(rO)fzV12aOQuc0~sLbK(jZz&}?tuW=!b-z5C7B8;;bE zeu3K?(Er~-Zu&UZM_59hO;kZ(F<%mZLJ!A5QqhH7((8&|1Q%YUD^KtyT4e!+a&hRD}QucTB zJEN1qvGcSi58TnaOw6c`w8lgsvR+Cdbp9-t_Mb zM>D+VAbzbf!Kl8cBaE7F9Q9uy9S)xTEcS^oET2TJv8aM%O{%Tvgy)WuXtmmlzB+Zo zI-#`I=TLsE`jH8Mj4}N+%_ZJjk-xn3OX(?QbNmoDc&xl0XAf%!yN&N*Kf)*MVbl_B z%(3_cKlM{~JR{nmmriYHj5f#f2L9+7!e6Jo5%3XC@8bPFr?yG7^-Fvic0ky>eok$y zufSIEs(|lRp#&5%0oe+ZQdcb%MZPDCG>^lx1mi#PfTWZR1{4Ph#X}tsR?|wv!y+n5 zq`aHyzO>|7bbPRTF}t{!?OA(})z2%=*zKdS#>#_hdwN!!{)=CnzJmN41Uw-ufkG_{ zrwP7)Az+R3oN3N;@=`t?r>%?LN184&nrcB<#C5o%3*}Xr3A%zSR@PUpz~4nbv$*U% zrBaX6>z^DP%T0db@ZnEP=EepmC#%C&Pbqor!GqTp21crrIR7nuPzuVY%iqAcV(>UV z!X)@Z+#ig?`^m`7N?>SmJ%HnfHIdXsWVaN~7$TSDYiFLkI5a#ww0QEF#;0u?Hnm^AxXtuAh-Rlec8X{(K1}s$ZF-GQM4#_m+QqI?u9M2jpMM;Cmh$H$1ZeAp^Po6M zO&j_-jUj-8tgZUWVIc}x0bFMZ9teM) zzheJOy4<{OF4uHs@be*_1-j(xMzj=kskh-l5HBF;<)7e;ezDo)PP& z<1@5w-p~8x>jpYNkJQw!ibLY#X=pw+)z;&R%PPCh_c)PW2vlpO>XAZYzY;!x;0pWP zU5!)Ke zR}X(@&z{4tSF6Z(U;hpda1A5C^*i;(6|>)|v(qMhNiYY&AOBAN1NdW68mRTfqcVIG zAtPI$scqttBwk{N>!ZoGVzLVzCYvHxiMAK@sog! z=oI*6|Le$0X8h{s3u;61fzd|Cuil2nNd4&e?Ql-f@L+SiBJiu?MO|wo3AdeX4x-IT z;@z@`!>8j{f46b|c^J4Sxmne*>vA*AK~SB86wx?h+oG0Z%|iHCG>+7qi0iJjl6K>T zjo0nEZsYkaRNeT-*qwKd-3rh^&*OkY;QKIm8@MjX1nPBxW9>R{jOzrqj#r!(4r{&w z>UeDMEYsQ%jd5I>+8snYI)79whry-jeS|-z#_?PXyVf{A51wF7cbKyHflv?AX?&UD zbL4v8_xp~bdOdX4kFjU)KB|xkk9;satK8ouTdeW|B6K&S1rBkjX$%-hQe27PTs2k4 zoU*OE0Iz&hEbZ?`zI?n&myiMXouhzbFs5h~SJy=)ZXE@~xr5fze--ck0C^+wW;Hu?U3SP8;~u4s3z zI<_4a0VExScdbVm36uOu^h5C^w1z8G)u6-574F+K9Jp^sBf?c%Y>SN_36McM_w$$*n)`1w(HdPRTH|{sKZAo3IjvC)jJk&T z^*`#@`5sAbjA}bGt!Xhg6kD@{KTkAEuS@NXjADIesxt4ix@HP~SxlG^N@Bnp8> zhd^U5eBgVly|4-z=yWaP%hd^;N(afK6G}h922KF0mSG4e82#5Ccyp4O=Hr%$%+hAoS+Qd)S#hMn_}>EA_-`N^TTd+KTwKpN_n@V} zegtv6ghQm6npVCGD@42&p$pfOj^Ya350~Iy8<8>6+uVzeaC=82EpN<6q6cjf^(P#l>!K{Dy^2 zdj0hW<)|DjG&}-e_##RF%zh)=QE?BuI|>HU!O)J#3LHhfE~mma12LMG6KH1JV-d>R zgA6Tkdx3scrV8;7-Ft6-EAws5)8EGLxBm0J_ZCh&t-ybSjvoXapS|>J1ZNcao|&+V z#Kd+Z%bG)S$S|yOkKIZ1iGHJvf6JB6I;)&}`d~4C;6T23kk+vZuchoP0Wv!nqR2AC zf&)`#7P}Q_frJkej>96) z!`oQlJF{wxg%>6r1j+0zDch0WhZn*Q7p5u&dz^+eF7Q>1U&u14RO7|eHsGu9NP*CX zKWqoej@}ETl}d!VQmJ_?eSEyySiqB1IK_H-8vzvgR4=T&bahZN^V@b`NBBOj?h zJyIL_khT`TaGWuX2fv`xJ@Je`Jx+Vz02%BIo75)7l zs%s4mCGj~4et`^WWO?yUiO&neytFJsgh+UtD2^AQc@e7-U|GS|UcBd?!d8}T{A_FE z4-0%H)=w+2iN=$(58|C$*%1!o7{LY@V+1R~C=1vqoj(DK%j$Xqj<8NJCR%TDUaXUr z_4YJhZ=#J|Yh$8O!u5~eB%c|_+5tl-3O@6LEAkg#oWJ4+0`pfCuDYsl#c3U3bu0r1 z&AFGPQSdupTui!`q-+ckfk1~)(uMM$2^SV5Ne_mC5sNLQUE+BAAZUwt&`OTCHk|M_H-cVHfjl%LEija_lpYqevY^q*!z!%^KK(Si z4Lca}saZP_D9@(`Uc(_{-)a2qnt%RM9nK%*Z@QV&xm7CG@}yv#$5oA~0|9y-*f1rH z3#RZ zIfTl^n8vkNNJsmrpSq4|M8E0^vWygS6;dGNAG|C$u|^c7H7@|?q@KlC*fyl zvtCcLj_+6E`&;l%RsI=dJb6F+NaJpHUT@=Zw&}_zPks``9nc&w&Y-r#H+Wrx|KGJ8 zG(bDlc3>ZCyq{gr-S~Tyc=(6b>JATYeR$0W?rZ$SRNaB&WdwNmC}M#^2>Q1P(gK1)JI`Qfb-#X=6bDw{tar6YLJG9nzaN7}qhk7QWr~?xv9*|L0tLe~q zw^rwYP24g6{@Od<(fBfc&E0|3M)Wel@oJ;YGpOyr`%=ej@0qlkhSLj*`^zs1NWcEA zQ;_!o0>un!I|zDnN&ku34&se6j(1er!Au`-SBpCcvUm@#?SOSL1)Cx1L58FqwQb0c zE-U1egggNS>{5ukrSjF5!_djv_Q9JMc0|>w2dX*n0`6po1YAtg{MX}AQ8u92jgI`U z$k<9Da=b7(Pb*c3+NtimroDJ&^*~=Th&-R(z*wO$8jMDRBl+@q4%^UCrkSf?gM+%hgidTb^D6hnn z$?!PB+QKZVj88?`i-ATa@T+{|<-oJd^{ZzCjo(%*PgGvtD9>+`=PQ-hv+~{Bjy_VU zV2ZK!4#QS{IoZmcSGU{BIgcWn(l3yAe|v2ql|;32%J<}ATTs2(4hE>mhakEj*cnM< z4#7>>asab|#H7flg%AX{d)iHAr3neqPD6u1q@$(e+EK4F2NgNld!QDlgQ4zxO1QUk z!;i44bYXzT%xgW!yca{@}1%CWIC8g1k=gxYbOHMh%XZV*I}P49(VbM>u%pR zcJP~if42XczO3KRzS;Qcu43Hdt-In^AbB*_=N9;+aQz+G+M$a(55H;MF5o)X|2fb5 zrK*|MuN(S8w8vd)PyHDBLZct8f14BT80Pnp9mVv%gLwWyU0;aj6QbV%;FIjhWyjM$ zg{+P|ZP#M&<~~oN9uxXpk2V+s?0*;or2m(|X?~@)`4yKonREg9s36`)^K0P#gu<^u zj83KK(i7|jlu!I}@OR1ry9Lkw&(UI~wf?aIMz zUtIj+w!1d^m90lU=a(Pk&&^2p@!Woz?x=&}4DEES89$9i`C0Vp`#x1io*Vw|ui)J| zyc@bBD-KeIjsc<_Wpa-zQ)#F~zK7S}we5?u%2xl;UGjteBjh{8r1#<1FTi6{;P0-7Aj1$mhIQydUR=J@`a^17B{okzx)xj0$q=i#9wTU#njO%`?WK^#gls zOFtOvC!J+S6>SBAA zo`?TNPMYQr453%}9Cl0wLOvXsR4fAy%(l?}nRx=PKr`;}_4OoI#q{N^~ zM!sm&Bne0bR!}sZBi}jUnb}fKj-;YE-%Hp;C>YO$oNnZBSr-bW(g@LRx$twRcQoyE zCej0m!Q3D!uX{%_4rd}Yn53^xF~@HKkhgmDY%0f~j;+{VD;@gt z(xF484I4JxH+kQ8C-1v&#kuDqEfwukhX3WmxX{`ElJ=}GV%%YAlZd>EVMb(10;d}B zDfpPD>J3W>2?2edqc@-gy?!PkH#J2i!*!3s9W>WHa$4hu1d2=k!rs9`D9$Lqo7WS` ztYjk3E_Y}XxrJ%0iz+NV@Iks-Ktm>2r&V^I?{;uU6MK`R2|~dnWP?`$EO%;a$89@c z)|^umz?`d;nbhA~9;^%&yY(=l5E2aaupW>_hWfmjd zyjdM<<9D;O@K_N;W{GCMmBuf{_~nT3ULic30UwdOu-6TU%;ST-m8{q8usKNEqAhAP zL$VFh?Lh9v7o^%48!2^1!_oj7pqh+U3ab&xk}E5w%!ya{!qLjyinMPEd|Zm%QC2F9 z22d*$jJjIc>j6*L_rv)bQBNrXGMAkf>oeV4}NP_rH`9ur} z;@8SZh~!5W33u-p6xRXoP=RiE6!VP`vO)(@iB=WH9f3e5o%7|OuES9ob(c$9M#s7{ z`L@eF704`^0L-Rb1_gsL$%~Lj{-aGES+Dt>;qG#NXC#k67S{aEM9U67Wsr-}hWnkN z%^%y|wMD=KY548U@R5wH`dK#llz~4T#GQu>zccGAZGLAA^#dj7IgA{V&}4u=abI2` z@abYF7AK6Bdlp$t4pF*C)_7Qr5wJ=Fd`B#xFG_)<*&nGFCNBb^dM8?R0FvK4JajF& z{=*A|9uqkR20=TpNoeE;*KkgBRuJ9praYMxEU%N+VV+;Fzs}xXZ){X$@!O<(*mdwX z4@#yyFS{tJPC9@Wo+)iZBw)ZoS?_J+TRABXgrs$uV%KddBz?h???*B3VE4T&;!Ac- zvnT3Dk9Hwi3JedpB?~<8208N`_(byRN2HRN*OE|P!`B%)q>lr)d`z_e^5Y#aOw5wT zB(mR|a(`0Xs|foRA>L1cgV&FKhQ@?5^^`p(Zi&c+$)ndS@v0&S-7 z4Am^Oxi06=Xy429ot|0xkLG8Hhv3dnI1fS2-rB|hvqEVgZ_#E28<(2rVf9u!=NqDN>5{m%u%{D9(st z9mF9zPC}37HYCdKac*S(II-vr`oobx*oVAEc5hgGPA*0rE|&wzllUJwl#95WPIm$_ zlRLpb4a_%gVpq;a9ggU%`4hke?Hl7fyLp^laDIX#t#a5j-VBB$^aANxLA#G`NNb=C zyP&se8@2ua*QkHbeA@Uq?W%KYa|%1e+49Yd@-d#Ud{24nA)m`PbNRk;32J6P3~r&< z%!Yn;S$hvpe6RYY!9LTtZyt$nr$Ewp?6tWe zUWKK2TMcn=mFV$;v( zY)IM1ISm{j&{aVyghJhvIe@r~N@zN#QMpVPLotG4H~)j*jsHF<%Siu6;Se^L&*usb zdfY>Cx&D2;(dn{5&**dod+xd`k>LL{T7k}3r4_wCf#4@}ozqI&b(`~Uj;9IueGz{Z z&#O7BsbBp%J>P!a=A=V8lctfM@CoR407w~m$?Yt8|X*WvYV#D?d$26 zxf|>?X1j(LyI2I_WEm+h6{TIZ)4FrnbSfST`F(C~=LmrI7pO8lwiW4mpA*UK?8p*< zSm-MXg|4n-G8)B177N9$d{;i1NoJynXd)60LXK3eAAXbdgN-v-KiSe_P`>WHF(5wzYiTW~AGZZ9!%*hY0aL2S0pfJpfA;TXaE=v$z&rF!EVlhuCE(h-J6Cg2)zVgPFnZ z3}r_fuP{d%?ObW|CjbdPq1BjCYtk4wGo2sP_DyL&luma@UxIB9thcqE9ccMd)SSHz zIWOJPBT5*R?nx5a1vsyD7+iRAv0Q>EJiOyI?ejwr$00@ zg8#7>a=p6zEHLkvPO5D{ie%)dRSuIcu^pTZHbbm^N`(dM?oK_^fFf^)a4A{*77}5R zVAuh-J@lajU0CoWb|~ChD6)*9bk4utdFSGtcgnXT^OEaR^-tk{0KXr}O71`*nq%vB z-J-+&Y(lmPU*Qk2udp)|lo5A7fziSy0e`id;jiYFCTgQ}foiE*tmLl-b%lHgN+XN1 zQ&qnxmL?S0(p7|bl1m8xcfsPf@pDj)zPJ9?`mLBhLx1&oysNYRiu^?=w@ifmUxG+8 zs#sA9gR8No9sSK)4_!1h(s+&8My4)0^j7St> z{iQSlDg^3jGY-X)fMR0GUaZ8(xQ-3?(*yV!Lir%po9zX!bkK41o_iY4u3ot&05#^V zx4K+`z?zk-3GI6%#B<9JNUNkvYaU{{NZ*3G8*Iy#hss#t1qr?ZV7P}tsg$<@Q$ram zuzT`EHD^+y8iXUNZJ;pt9v<~DhjE+o<>p% zXVXGoY-0z>U>51MgSqm(C%K*eK#bYbZi~g8ZoF#x^!AVoNqd|jtIcMEE-#c_*LZax zmkq`^o$lebvj^ZWv9IP)4{Loul8T=M;+G5txOXd-6wYj@=a;T!j9ZKWEs|uqEvl)a z^f>kxAjIL$G*`+q?I9=3{AjeztdFdC9Y$vwyp9k-3xCD!gd^lP;f5dxymeV}VrQpbYYYDCGNY5{{_3km3Mwxs!2tM(O@)~HDW_sL=K zFy&l8SwWi>Zap~e@W~``M7C4D^+2Z$tc|W&=@_GL+}b?jzy;}7NEbFDUC8CBM+R+tZqxL^j!9N4&Bbgq zzvOfQZPHup%z@D(F%i@c>J6w>r`5a6fwAKzlC&^s0D&nz#T<&MM#69h!sw}@k(#QR zn_IL1$>oTEV}gwwM+3oSCP#|~f?e6TNu0pVpN{^9loeQXeEj6|MB~R^qtbQLP>I{m zAz>uXyoEH zi%m=ytYXmE65$zQ2C}W=8LmfV2QX1Zz1342xALa^xO*e-wG)Um%^&aeZ$-?Xi?z zf6l{)M$hfSb2s6+6Z4yS&{Fao`HZsN^ZIk9ajQ5qkGqKsfMP9{1d(5mREj|y92TDg z5?_B>`I#F3rOk(%a`i$k#pcQj_d=G0`Ghl5+lVJ*BEQA%f zDc*fITw8yL-+d3(QAg$}oKMCZAx>`^a z<<&e_i3h@a!1h{mWr;qF6o3`NVDHea4A` z7q=*Kexm8}$Y{w=5ja-}ZbAo&A!jBM$-2BlSjAYw(A}kdfnYG+ef8BzDx{FS8nA+Q zEIlDxFuqktcXF>_a}h`fa> zqefFxWg3HDs)r4YpW36E@kEtgh{xe0#aUBc5*$`2%$nCnerB^TJu=IZ9>3e~!>{Dx zqO3&H(XLD^9VxM3u!N+8D30axM$+B+QJ>S2jK)9Xb-EdIJ40T-$GI^)HhgmRmTlDt z(uX?3{o5PgltXhCYd4Zn`n%VhcS!NOBdMNZD(dlfC48|=PvumnD;h;%3mi3ZP|kWC zTyH^i$MvS1PwM*78R$KAy3_QY;4K;G)PDrux*2J2ZP!4x0Fz899)s2d?%>64**Xt` z*$k_kVzDWQp$&yP#eziVh=%08$xtccg*)*FHUU@*4?C@G`zHq|jt~ou` z3aAv8&e8c9S+>Nx^@|Rt_xAfEkNm?%|M%*<>KD3vai_-@?n5=9aCCFr>v5%?^*4Se zdspE~D7HE7VY6rl5)$-_b(_Opj#@pnbv6bc@deaJk~tzkiEt9YG5CC-0P z0`Lb2Apde{d#RgeDhXGEA(t(ujh&BMO;#e}W?&@b~3fUO%V) z8mjgLGKI6cGk%A8Jl*gJ*<9Nc0`ygeM1>2e52#KqCRMRo4mnX*i%%-1w|z{-V5n=9 z#$_H8Y(8Y}9HT%W%!Qh|2mT!6(E@xQxTEecyKg=|I2$|V;N1Nmvst_6yMxG(CkAJa z{l3wd>R!QzB-4=2sk3zbZvS02RO=YMd1N5bbx!?dmdkXXRmecAO*s{w;PVrQw1;S~ zRFW!Lb6plxSw6;R340682^mQx#4XXB1arXzd&TC19-)|8q$Tb;vY;nP_&HJ311Zy zPXiH`2C7Iy!23U7U8JR~RFGVc;-H)HNy->uv@+QW_Eg-@;`Rz)RHp2-e*e;bbLP>= zw=!QEFn`(Boq3O~d!zrKtMjXJQ*-mXPOfeJTGKbS-|K1oGD(sz-&@#|fPv1@&KI4QCjN+; zn&x5Utkw>c;SI_(*8A)xCTV?F)41Pjv$qh3Bgjq#COXkZA=jnThDOfKXpcwj!6`e) z%sx+RdFA|KmkgPkzppy zt{$$B)Jxsuhb0ZMq2>T5%!8PPS>|IxA7HAO3b}x0QQ?~!t{ajDml)!)mnZxBGa+Z) z9tfvmU72Vqn2oOLUs3I&BC4mXT6s#cyOOTbW?bw0GbBc2Dzo9)3W}=& zUxtkNPTYpXQ=&$N zd^oJk9N2oGwq|V0_?B`h83)ow z*{EBW&RdeR1G@t2s4%F@5nAQJ4tS48ZL~*qj;MKWI-2l%?L$_N)9Zq_qQ@EW`2CS| zEbgc3)P88yGqHFemI@>yDWA*h2m~Eorx$IV0eI^lTCAUqPr2TU2}aL>{mu*uyI`_oS}`;+`w;}SK#SkdP= z3EJNy?XI1^l38r)*NKwAOhSB_f+<0T11yR2Ax=ZCp~>P$B`S{~LBEeBv}1mAI>n?@ zc5L1=zh`cCa=f>ks;BFiog_;dvomS-6IClGRwx1xvY<)MR%d~)9B2#Fl_SK5DdkV=<(yORDOd6Xu*dQu^$!|O=;;{l&- zjnxrMWh$tbfRsiFUo_-*b)^RKI{-P!z-MSR)9ySM$Hi zLJzHsNyEsx4jvQ&58@RSI`E*g3?2lf^5_Whppi|Zn@Y$l3$5xf8x}fck|w9rjet;W zQcs!}1CUKjNF-C7nk27Oq{hP~n2ECN<&h0hw{^3{;Ryv|(QZ$Gp(JPbNKZaQBp=H6 zjE$BGVOWBa(eC14B7~&iIKsFJ@pyqgd7K4S>MeyMnSc-HkVvF!Fo)HHnkl7;#CQpH z5F_F4-c=u8J6H-wmylFEn)UP~L*Xz!By!PUm}pqzF%>)cN}2eOqUCG0=xvhHNjO#R zm)=&pc-z(m#o+`!JJziQJu3^6U2!V*OA-4m%eG6wQv`K8QBBz5ba3jnfx1ca3q=6_ z$kJPIUXi7f7q=62@7}q6|Kk2F^PB5yW;lhPls-vNxL4;tohh6MoYy$jPLe8r7Zk2B zDM8>B80+luDe^(m>736|CpuT)5$yu@V_-&Z4;W1(f(zg&$eI|Upgyl9XZ7Lx^@T!z zGcG$uL-E+~oZok9ousTDtA)5`kJ$n+cl3Upw zwUPY0tbuB@8nD>{lkTeDM)M^NvLDHxk}CF(5v9Yg2y_p6mlT!W(T4Iv-@(ERF@+jm zVrIS+(c?i!rR~y(Ywjeo%F`=lBw$fBqg7KRrxPk{d7lf0Y@G8wHkcq=!a!>)z`2l1 z(s|hQl+Xn@op_RK4>~-E7)&TS5Y4i=e$poFI@`y$$3|nLgH;MiOvH~HgDG4UG^Mit3nRUAl4CRy#wdI&-*yf9(=vFvx!6r{;x zxsZnn7z!kWZsK6*vS+x{DS0e3g>J%o!HC+NSlqT~4%tM#GBsFJ4*mS+MyTe`f3C)8 zB0tyT@ChQ_MOC`~^QiXBi;IxC1J+g57nbYGxj&E<@|!Su2!EhF5 z1`v2{>+NbNa)oCkD+Q;tHbuyXFpgBED)jC#ZXB^|CTs3t+d=>u7f^S=P2B5e8BM&& z(dU>-dCj#4Ym0KI8+sfy&J?pG>?vepIQ8?WCyg_xP`;5hLDQgNd}O-gzS-$o8u-9) zn-yp3UBlJ@gAnDFx03UXF|-y{SrplW;(>THosQyfGlpeVbtcknX;a;7|nd@J0i2Xyu1((Q7u zQim18_Bn^d_*pid#t9sHfr^_=#Uu5B>Z6Zb?0-uAd-1pZ7qF|?mHBENpBgtdZptI3 za;dR&H}A)ReypM&wUae9cDs1|yu30i9^+$P`rguiC!}R*lHA!WC$$jJtNhRi^wt%#KPiq`qCeDXz&x0MHGzw5n({iPDvu;Iv! z@-r8CzB@aRK3d^${WrNAa1oxG;R3RtsJf+bI7Gu6X4j54F6i;GJFihoCkPgh^U;%bcA;K(oO<$_nJSL%HjzoF{pilseys=k7(@WOdU!OHIzmKf zKiGeHev_m5R3GriES3%jd0%*n+BPXe^|nn{V=-U27B#OX8WJMXSTr#w$@I4?gI^8}gbl73;i=xd7OrD@6ni)!p z4u*t37#dV2q`w9=(cCy}S*Qs4ypZx8Mib3OvgXR0avyti?Y#KA(a$3F_tsg_-*^ds z1#M`$bH5aVk3}fpA|DGV99111dV^jL+UNV`2Zwtv9J#Oe`qlHb5B@avXXkA6e&WN6GC8k*+~|J+)|*}R->83$bwIje zG1g$fCdL|uH%M4hr6LjjhdDzpx4?8^KWNUq) zpwK*%UEHHeEV6VxzRL0yXpT~|(QuR-t|`m}wq*VncoR7b-(1yVqrHv$I)kTgCO3eZ*=jM%b9gs#*^C zrr?E)u0$H&##Mz|*|e)PH>`2GJiPP>Twik1CT^o%olN*Kt`IOM<(v+#J%@RUhNdj5 zGOzShid4#;tkx(;BF0z2K?`ROeRqwEc9U}zT(fY6*A^Z39`pX2hXGX_vrcbSuf z&l5>ctAX$p&HUFvxRY>2r4s+k6pHi zCmW}-PagdZmGOL&{o$yB14?k_vd0!LYwJ(<1CMHT$b34CfORMFOL-qL6yf|Gm7>7} zhg9?ZE>Ge=eh4DRZ#o7wK0UPq6F0>*5vS#fROyM8a9Vc5 zO@A^*`VY9)=uu(-lzdB6Wu$5;336}l#Xure>`tYF@kNg-7memz9u!vXxwj5S3G&{4 z`)Jbd_XoOqXP$W`2XFjPFqV4;M$`}@nrK}6F|L2%ljPr?Go1)+jDmv0NYU%J37r0lAzNKgB#i+VD9^WyN;VU&tFC7ZyL1jS{6; z!^1-IfP$J>v-m;Eyg1Ls0=a`!SoDwcX>e<(uxKS;vI{?pm!U2u{kiP2T`$#Hcl{;& z)Ehshzifha6CL7Zfb$Q>hx5EQ4yPS(l5E6$Cks%S?luHry(+wSV= z2a1cu%kj_nJal>W^5tNLZb`$fjUwG)4?-Gt~iB7Wxs(Tneru-x?{uf zVIyA>uaQj_0NvM)EMdY-!^fn_Ybq~!ZPh8lDy;q0Ou_M-{>d>iFtuZkFaWC`>fGkL z2R2{T{3||^E=+?R;kbMa^Y7$eOW!sBS{xO%c2TK>sB6*;BiIG15XwcVjuvSuVJcM3 z<}})&fpSl_D^`k^#E6C295U##BSw8~GR;0?zkHHRP^g$ zu4V3N%4d~dH|%TYq63qCO|#+aeJ(It{R?x%`0Yeh#5H)3g09%j39{K?{GV^CC z&f0jkY=%?OpXL4-?av}6MfsxEzk~AicW(2f)`ssbO>HC@aqJsW&ozhQdesxiUq;rx zQg^DFt_u5}P0bgkXxn-lx1n{(Eqru_;`Zy;x=?Dk1tV5_&n+#9sdUX(F)Y(l1iI6>6GC| z!Rv2Z;Wulw!_Eoyi4As6n+@5Iz?m&OhKHgNH-w6nD~9HV=eqNe!RTPX=L);SHVdMm zVPq7w8kBBPuqxuL7^%+3`cqe z(PmJTU?m(N`DpD{)X1Z3Fg7>L*4RsGbFfyPG`Cn=Ts=KGF<31X^Vw7~LKWl3*|--o z$afYpRI90{_bs;W3I76I_tM1 z%Y&c3fBZlNRrx|?Y#aUE@VUS_5qH?+f!>hI73yt#7QdKF{qi#Y@-sMQh|Y3ep^Jsw z0UeX=5V2wf#W`>ewL5?^nX=CzSVoe1O2uw+!0So}e0a)>bQN)g40G2ybytlWPFp|| za?OcY;_=t=$(S#QJX^^he`%&#j;B)ba&_iQ7oTy)#mM2~^Cr5g@2PeryuNxeRvE0l zr#4uLCF?iUKa2gcf_eTr<~az9!=iLnZSN|^99zi&3N8u=AGBM^pn%1ykeZK)^aYq_ z*^NLuELAV&d(N_rq6i@=*XL%ZCWi+5drQSGlmkt~Lz!^K<&fZ(Ny&kG+GeYWE3;y% zRT;yWTgX<%`qk)y%#^AR4k&?bHBH`K_)K%U+=O#VFi}RWb>8s(08MIr`B|qsjh7Aj zAimeQdFkY(z0kGTT|-)|efu@+&(|O>W;@!&^tx?u=zxnhl<}a7-JlA-S1Xj@E*hqI zcPYkVlxUC+&_XjIFcKxk4(~9^HyGYjhgusZkn8;RG2_Fe<2f!Kd&l3My0-RGg+1PTaz55)@n8?5;&BkQhdW%2Smotn8j- zwd&vns>w%5MBj)-N-Ry^d*b+nxOdh@{_ILit_r4v3z0i$x2LmvEXyo|q?3*mQ1{w>#P z{w;>zoj(8H1&+Ba&G#gOUPvaIK88F+`-k49U2X#1(_Zp*9fghAPk**S?{%V7aLD6u`Ev6t_>Szk*WQ=6TJs-ST>J?A zz3^@XMmKPFi29A(|EL9f&ef5OQ)Dr%3HYg#?yZ z%`!z>V;}4(F*-~R_4k$5^{h)`y-Gz^q<~{FI1{7O%OujlqQXZbPL5no=lh}g%z+*6 zZ=&Hus4|$XmdD1*)$Cv;lz`IM7$e-FI0o#tY$=qAr0{>Jl(jkBzTEn&-nD%!8H**y zw!iDD^*Nv07;IfbhAn%;C9?&R{|d90+>o_l&46Y&9w5J0+%Kzg1GJa=bz}~+kY}OI zg{$iIe)e^sr0kj_TJqk2dZ9lAjbibkOCqjvpbtcEW{;pA< zTN&y;`k6OG!+eftF4ki%)^?tYrg{A9W#)1HF`lLVakg`DbFKG}yj`wSO!Ptf z2)>)>qwN{KM-WvRXUPHNt@%2?4!hT}o+WyJv~g%K2^$VOQEIKFxqn1>Q7jc*@0 zWo30}sJil$k?rH9kfPKtwL3z6^CO0-YGl4I(XV5@s{2lpPJ;Fwi{N9;*NOk| zyoBOCP5hyyUzI;JKTmu^&|UNO)_&>xF!08t4fs`qj@l*_YFX@KcqQZqNm|Jb42Tpa z>`Jx>rAZ$rL;QH~-wzLba#6ni^qI>jsRqVs=*WUAhCgt3JHU zGdJQ{_(7YVnOS-(Vihlt%C;ZiUfD+F6l``7JNlbhx`5xS*#3_s9lcw$0hhyF?BY1< z9=%(Q7Z&P%wU zT$gBavdIseV(4CmPu`2r+vTYy91iO=6fI5pAxMXkOr_xXDUPQp??O18(At?}_Dv(v z;!a>gfS-LQulk+q*PqhYzpQ)wr?}rc2EoVHJbynnjm@yZYcz8Q?zYaqz)i*W>rQhl z>vP-zkI$Lj)k;Ud(e8o%-vP_q6mmhg(*G__|GN$Pr*v#$`hPJya?v6l`YBlIo8^a$ujlrN(^fQ6;IC5@U)N_w(2)zkjLf7d$M7ZMFVDXpg zkda<4g;NTmIrBM0meWxN6RuD=9vlz&IfikGAJPvJtcnmAI>B@8h8_ab#>y#}w#l~g z>Z;R{Vf%vBA4nzgJfsfF_(U$BNCo`X1$#Jo+NxEjl8xn5$7r=sj^&aWzYo!qy)%1e zdJ!^*K)PfuRxVUw%UZd(XK^K0)Ei?Mr!f@rRAuZKW9TiXlb~Pd>cklMnZz6=(6k?! z&wJa zJlkx3@I8a5?T*B=saVF>Tj(RzR`1BV_pBR1K3l=p)c6i9p6OA{RC7F&BJGi$hws48 zp@T*}LFrN9IN(pGaGF>RrCdKOg90Z1y|wBxQ0Qq#`TB7Q`Zhh<{wrwNgvey zUSD?Tq}3LiC(_*&4p1PA)sCEVD?vMc@1j4R^=HF@(CWdI7X$)<#~nt7RCaFAmq>Nz zW2sOoi6UHf)IbPW?Qy>+8-f>1DxO1{qNq1i_c(LWn4ju&x$I86`@3Ufm=!S(_hKHB z5@ke&XA&@qHDtxX%>r{ABmogNrd& z+LykWFPL460v zMn#TDJ+U$mYHD7QMKk92a8g#etBJ(fi#daj=5iW|=Y-5fvK8t1eRz-Rlg0UqreD4e zATDRqr#62N-46Lf{D9e9XiKuKY_|JT8?v49essI5Zac;JCs4PPJ051Q6*j&b~u(Z*T{&^W5!To#UCAl1lF9v->g~E_8xEPO=b`v|dW$iZs7&p^?ST>D4YW~+vn1JW#U8rW#TRTX01ii!TY>Rcuri}-!Wo7ku3#~5N0wBVLO1caw7iwKbl%}mO7 z?l<#VeYB^yw?|PBd2T{MxS%L>eY8H<6?5Y!)-|Yqa%5r~&)g7`c15qt=HgIEtU@?EeizaXk&xZ2ymT$Y1V-avnLDmR5!bRpJ-%w@=37$uB1JIM*dStS@=mfW-q zk%Qemi9#XK(>>UqM?GlvCs{SqNIaXNh)z;@A*rVb-Hb&0R_)reYZbCrgd)9)()a~a zo2Herau*0#XQV7Fe33E%DX4JVtyyw&CN0AV* z!u2Q$>Oyl(ijyHMgxPQu!OT#mD5#Ab7G%Sv6m!8Ktd&wQ6U>A|mVhPT_iCxqp-L){ zmtv60q!HVKQb`GNIfRoiyKwPGqxEKf~uc zpsjLwV%_H!;%+y=2ihS$&oSUjsqkfw1)n{Rc-=P+-&4vbkDMweH30GXKofu*ry34z zuD|5p--(!*t0*_6h{`L3hNY4@e(n_b8u& zO5gT5551=c@2Qlh%Crpl%gCM|XO}zNyC$YFp%c5@j?%WlQN~6Gw|&%NAK!iOmYWam z9=BW8_HRAyia$MVYd^t14froq;dhF-Tyz*f-y~kZF!~l1@IF3_FA&)5c7VMG18L0P zc^P2e3)pvZ*zf5G`(D7lQ-z(!{!WpALOBIhg@!#wM%Qa~a7(5^e3Zcb(<=b(T0V%I zZ=pc|X_`Dswf{Cz1ZEd<{>pyX@L}mQ&d&UR2-X6X`)+-Evq(FJ2AQ;adT`UwreYx; zg+mc)0Xlf<3!qigp#!6>2W55BCdJ$FcQ)F``&`atR4=EjT5fwQlfETswXf@-i)lP# zY;I*^b1Q3`8+0^?`~3>+bEt2M_y(+UHTw{32nds6lJHVhFj$eS+oVtAI+ttWexDOR zK7U;QBtPnO_<{ogzr*Qt_yYq$pTkLXJHjKXZ1*am*8y|YtWsX}8o@>BlIYj`H4Kl2&8`Y?@2eYWCyg5CiAJm5B67vre7IJ~C! zTaWR6-nPU0wP$od+TLS#J*$ns1z*o=*IUNQub&`XyzQHW>$PRx&*#_le#$Gz7Kd#hujNZ^jFM?`xb+;Xh!eQ-gNU2J<1>z}rQqVW*Xt+7V8oF zuEEcw2Mqc`8_XSFvvNnCCt%}kcz@U@u|H~UmxpP2p4axQKH<$gh0`rK8K-ADm3HKL zI_{cyo;F_YEJh2N)8WXN`nXM zIDMY4dA_!2Ue)U=7s6V^{if?&A~de6FdKZanRjT{%Pwv0o(Nx5->LTvi~>r6Ny4n! zh})6;+l*hn4mG&dwvdN49MF6DS`+(M2brfLq(EbAEjR*gw(v#5T}ALq)0}F&w|Txy zZSl+-3W&2b9xc*YAmO@t#nHY3jaM~~hx1`hL)sh)Uez=|`W)g}t!*3KfrqPmolbY=IRWf=gE2N;hC`oX zF1UQrtX~l_oXS)5{pA?Eit%|l4nJ$gmx-TglVyfmoJNgzcjQAlUYhujHWnQ*rhZL$ z@5qPRp4E{GB%1o+yBz1^1ValS*Y^V*$L;b)``kA1Ax$)x3rU76U^+X$m| z3|KoR`2q9W#)k}fLC`1qHsmU83@z(gd#xE?Mn7WhH}yk0KY5x{qtN!je^Z<&1kR-g z)cYS$wShV%YWH=V$0od#|RAX~m<~4(E5iniP#%TWCh` zN0I?`IJp$2wKpkfnrMylL=zkqO=@WAU%;vIZGlhTzlJZ{Fc8D?F1h+t)6AZ!`r=y@reH4{CGI;UVc3KKB3`{pBg&BsYyi3jE_Gj z9Rp77d1C^b@UG%h<@Ig&q%%2RUtiMJPcwb$_y31>-_o@HXq@si;M2y5bz|bV&C(@b zxb1MZKi@XqQj?V0+>cIh+PL|6zO2D(JvO|}lByZrR*_ZbSxxZr=Z^_*Yd<;yn&ACM z4c=z_>iGY*cE5Rk+VBr}OuI$%cm(U$2xi&wbl5q}_}8`&t)J%c+@sRdKWXqbkB4Mf zK0g{i)U_)H{qy_qj^+GPYJFbqA9iPPzZoB@48zw;Grw=%H}rO(S53>n`@;^^w7<0S zd+ghSk2kl|*Sp5=pV!(g!;dw7&)YFOotOl_SKI4UZQunqD^(xL+Y2}#AerIS;n2pV z!J%otTK6a34*j;mp|#g%w*?N3pD%+Cou5B{Z2ao*YVD2(FK_oI;MMr`GVtnfi2Fo8 zI$el;QpK|_b+zE5={dlM?Fwp^o)`4!Mv}lz_#pi% z8^ZhpAN-_4@mJisCFo1%6Z}4Jr^?;SwB!8B)E}s!V}BYS*4~TV%G^$0?^?SLsPI89 zUA`UWg|`!MYW$kFKLLKt$B)&~v43q`8XUUD)>wy}|MPYo;LzHi0KevNwBSRZ2hLxY z$FGhz-VSgW^G2sYu5l3f(8Pll_?w;+&o}W&Z9a7>HU^}vPmTu@Kkqai9ZoU-oUds6 zyvEN3oH{$v*B|e{>A4PYYILmc2Rgt_{h0YVhf^D$y1sONGP}(BQRQ>@8twjZ__?5; zW`3>`oQA(9e%?&a&HP*-s3Sjj&uQ>1&(AU5j{ID7+s21=ylMR0c)kt)oS!e#k3JE` zc)`y%Y4A4VkLaHBr=uEwYG40sNW5Qzr`FPu~lOL1DbFs#-7EM+d14h0E#j~8pn0N#{Uo@?zPMRDJbsSXWuv+oG-SFsaclg9&2ej5%K2qV~<1xcylD|}BYU^F)U({dg{F%-H?MS7yq{D;xZ^sWC z)%g|R5$m&Eo>2LXSq}jGsqOU1H0IuD-x*$=zqJs71~2C)n9p{8L2F+6id53^27aVZ zpFV&5KKL)^1&}`t+7$RupBLKU=I68U>wcQYMZ*Uk8Q`iI)kbg>tk$KCs_&&13tzDx z0ukPiOaPRFm&e@PPfg(8+xRqlndiBTBTC~W?lnK7Fe`GJq2fB_FJZwNsBOWCeUU>FuA;w7iSc&o~=Tx_mLa2DY zJYE7m8bx75RJ{!NqtT4BUrXbNg797sdzqC{6W-|z#tWrFEQAlfi?3AETq2)Z33cN6 ze2N$e%E!oK0z^JWxZ+Y~k-tHXKf8o@DGHR@hhb-^2oz&!9?5Q(>`2yZwNtj>0vzy* z!R_qy#Yf~2vb2A*K~>9U&{a7r@eg|?aq6nC>&EX&i ze}~(F^o15XYG6`cK85EA3?r^kVF=U4-=RSL>tUUMJ(WB(X|NQfKjh+)C zDy3?19-v0AnWM->)umVu6>N1Wel3ZDl=$(7lKLk~un-yxi8`O+1ICZ_`bm~UmXRkQ zAAA_Et&p__b*w6aEO37h620Gxd_8IgA3UVxS$P&%sMJdM&aMY+h>t~8Y@!MjEC5xY zrHWC?zdVTy%m^fzxpVQ(x_tZ5i;?`tf=bI8K0SzkJMZ4 z-mwzu-+GbzfT|=b<{P0f3bXoR3Hb%t5{~zeZQ3~29}im_Utu>Y4sW{qU?J_ZTaKO` z2xQVZUoPPFM0!(^M5eT5bnO4~_9k$0Rdv4jJ@;1KTl>E6dv$g7n(8&(om403q>^-! z&PEc}Bmx0cHkCmKFrt8p;D(6ci10>X<_!)rI)WmOK4(!Li~}kzPltKVo5ANejDKYu z{z$6d_jk^{wRBe}k^krYJL#^fTX#9 zQeV9o2?O+^-uHsz`Gfam@D456C|e7?M7zB#le!>cc3!i82sAf{>IK z0o4F>LXrDg#rQBbNL?Hq!P&qkG!ZVL=q1KRAQPe|ouH2bvlgh3ynB>}!rAt@SO^$> zfF{fbqKXptMS^hv@&$^(?+e8g1<-sMi`AlrpZS*A8LjPp>rL0EF2Cvx8?r8NOmNpo z5}0)eb!$BJ)MPDK9w%nx!jvxJmS$!OC!Dj`0bn7j6RF)2+ zPxqr9BOwjw<5nb#h6ZtVArdkn9b4~RdmKAwn=y)%?kvVI_*}r33#aaO zcz%}!1w<7>pxMaNH0MmaC&ndd^ZfYkiQTxzShZR$T2Xn3xYJObxEO6`EOQoJp;VFF zIc+j#Cc1BGs=qHLU}~b_R5Bd#gqa-4W%|!9L-X(VP7Mr4!UNfII1BmXbRx@lZcb79 zkg0k0S(~64lYkn_z5!j#E*0xJOm%#`2*j%HLPbACsVJDc_|DEtXK0o<^sziJLP#Ua zd-vzqM{-M_V^1|2%?Z-WFeXPakM5#=Wrgm?3-$11Ogv53RFLj!=zg>8 zhNT}Hx*wh)uta^pA0jOf8N0aZUC^N!d-PpGS)%8B68hl=v>i3Pko;+u4?!3KMjGhp zCoueGD9mQrOsY|DPz~+Y|;v8!K3EKSxx!$`A6S` z3+9`DNqX=wbgjQeZgt7Y6)=P`^?FputhKjPP z0TxG9C=U|py(m%wxFJBDBJURie*`$EXoSjm8t^fyY_+%AUmNXTUtJ&ahK5QWD=H%L zVkD5tdRDcOX)02#G2d&1Ax*$QHA3a4kjR#cu^L;va|WOE|i;(;E&Z~0(8IU-;(ZJ$>jl-zcZZZ>q~@zA7t{l zN;!9OF+w=&5xd12iC8Tbi!Eg%wH9=G4t$eaeyRfjkoKbj6_&^?Y6ZU_<)!|5Ip>FD z=Wue2^#L@DYV%-spbYXUo|p2GNW=_;S7UX?9)Tx0Bj;RSiRlQfS6cA7WTYG;l!ma$ zv}7{jbtw}oN0L~3U11<2vWezXlo^hF!pBctF3VICn2rHCG3+vbi`xFza*hon6I;`9 zMd{c(aO{5UUCKB{5?zzOF2k~mA6dE)-~FCKxt&F6mUGl-G%N!PNXND{E8wm7;7nOM zLKi^9OES{RTWFvv`bO-w27)bAWejBt5wsT;Z5O;}4}jS&)J~&6cXakgdq(e1TMp() zmuQU*5_t(5fW`&eD)d7i7ZQesZm8ECX^l%ONgm^pPXNUpXbNGAWyxX*15*N!_KEz1 zs)qpVAAOY2?9B=*HvflWCV2ZtA0o8fUbQa$4{PA#}U{ieQ{O|`p z5J+2{PHQ^w0ofPuWlC=XuvFmNER6az+_^_z4Ws--1xC1No7bm2;Hyad#X5E}@u(^?mK`tCzV34*bJYDM&hF=3bW)>@YSvIQrRXhBRo!=ShK&`=gR`Z|dS zfhN&W%Lp>TpoeNlOcFk~?Pr&v_dV@rbPZ}EK8v+sv-Gwvf`(?5aAEQQr7Q8hHlzfM zL@m&9QUv*ivZV;d>jjJjA#I}0m4QvZ`m`hUU=?TrQxpB0tDEt-3NUF)q%xWXN`zQL zRuEK}i1;d^244qpshE6&SDXKxsLX52H+-&Wtgtr0#oQayYf2LRKK{jwrqeG8`enKL zOxteaL4A5{B!e3#;2Z$S1fh!{^bFBhSGLzUxt@c42mkdFlRZvnyN>|%x7sg=912yd z9t#vTQPp7%_S3Z)m#<%9neGVytkD^6dHxb)-5yBwb4FQN$}3IO%4DAHXK#y<{;Kt`1I{>KoE z0tEu>9b8pO#3%`~-XG~zQHJV>MEt!VwdS@Q%HF+VlO;ab7hpz^LFEIR91U*)u(Z9o3(KHnEp+ zzFA7v$)<|Zd4L1Eg=P#XzJRy{-VBQMQp?1%Og}yKK{OBY#<-Sj+R)he)j*NN<-7td z%$>@0WM=I!ViVdgZWWd3UZN4FKFFIwZ9nU_kd2+ajE?J#S$Qqlm8pfR`{BoxS$g)% zL}vM#-=;{0fY$6Nr^DJ~BWSG?4%fWy{?m<^Ag1FCG+4VI?eQ>rA#>c?$6XzyiiejaMiW5I6dlT+BU}c9qgDSYN}jQaKTd?CCEKZ7w9DfpRdC z@styea34x6T5OEjfLRiv_hj_J`=1;diw+gTm z0FyTqt>a|O-YoBqMwnEeMHz{{$U<}hkgQ=AChRZ)zp}c63h%gKw&fM9_=ZEb*TS+* z*sNpY;UM9Py}Cwc{aqwk>OnMiN3UL<`cyY9>TGSQaelo5Th{kuk88&68uJx_IeHpnV5#Y0b;A%X<^nnkdNzjkx*ynKEf#bL1h-$hW z-_r3(9Dj_CE63=#a!fz|2=22B_rV?bd5_?{T{sU{^3M<9^EUdd921|>u5HvV`YhT7 zU#{LR%#gnWO-h_5sd^kt0fL|b430UX2Hp}CXzTCi{r_&O=eYKIocOokv4phqF}DlO zI}YbZYKM>Zb;odv_U0&F58-Z5F<|5qoTu-aj?^9aA|WOEOGde812oO>gBS+9p!fPE z%@#_>GWl7*)wEMl?OwMx;tzY0vhNLkZ^`G*r#+sW-Ql-c?9Rlx{mmCaOWsbxIn0-$`s1Z+VE-dY-d7LxAC$RJZ;d4mU3Gl_{^M62O2po}fYO8x=Ym;t^-WLrxqzyS{&38D&|NjXn~yP2 zhiM#4qJNs>KK7^l___QzYEAKex9f;3(s6LRP7hw0lJ0x`vWt%=KMn&8Du}%H3t{_u z?H9z!IH#@8Uk+M!=<^1?KI+K-joeti7+k-HUNU*Zy=tKfqJET!NCK< z--!|+MKS)|`wjCLZQq2f)nKwAvwQPzhGf}>LSIp@%~Vx`@N>zH?-pQqv1nc^klbwE z+%?8{Q(ZwZ-mSWV*Dsga{evarTT~$h=U>c^0|(vy@5CRix=g&g%1C#! z@5);sMS@a}P=BS%>X&F>FlM))7MF~g^RR3wi*UTM9X6(Jm&l6*f?p1vvYD)kjFW+> zt*Y7)U}~$!P!3X4_l}Mf^5KxvF)=nWJvv>j;gZytanT+E1i3n_9sR#!i zXI1_Z<%hnkpK$lO&wOUxgAek*4WKv5HJQH7~V*GlO7pn3vNK=6HkD7 zl40*=UY>rbqY%BtBC5@^=Cg8cc?P8SNfCZ;r_Uox+ws`zDoi(MDx@=aS3~;u?lMMl zZe=kd>TB~>-21;mNNA=%Fzn0x*eCe0`&-A}hx6X8Y{q$?GLA{pkh`CU+%4Ig4}jsU-sju?2z{qVNgeZR#k4%`dRK?DlZ>(p<=a+N3Kn5PP+&0|K#ky8wSk zMzG(pT^#*T`4gjIr(Tqgbu^6goIx|y{#)WF=^oJb0JmlL+-J~|uGIX@^roZd<4iJQ zGbzD*><8?d@D}FlnL;9t`oSSSKw8%H>JBd4QS1Kn(KeCS32xne)#zgKRgU+<&ufp1BIc3 zjDpk!-SO_dJ{u_)QE+V_+OW8yrHDV|im-`;)BPcoQ>$hCuBhD+t88jMg~vkg6h6Kf zYCn!hQ}yv6%AkOVV2ES*dXyXd`0_u@ZIgrY?g+d=#e8@qGJ~$uKd;sLqdw z<EhIZc>d|3SC?X56d_E8V_u87VX?%j75~W4hI9AdIrF*CZ5vEcwe+Oh zo$7QAr>Y9Gr3m1Y}2pV z=7*J^Hh%m3s(WzZ0our1sg{9ci+k!ywYW!^2Y2oH_0q!)<)?H9x(By=oYscnhZH5d zhv}z${|-9*!?F$4S$~c-=2BygY5s%Ux4ciWK$F8UB_(L1q{N;CefpwqZ&-WJPuq0% z#SN_oG1NRd%-+grq|-B8_A8U@__p8vb{q3OoQ1*WJw;PH?t zHgk3G95(XAduH9&+Ptaphky9|r^(SOOAhIs>}T?Mc*jQ@V63{vAqJcFh7|V*4;+S! zME)f67Hi`U_T%RFfA~)PEi`^eeN0K;VK2!Vv=_wlQLGSKq*%8d;25ZVIHQAkygnJ0 zq+)q8JD!CW#|~t6HUEIUVOQqf?_>`)4rcGg+*74pxZfR8**XILeh2s(mNMy9$xD2_ z{0@vAxy^-Fm1Ge;|26)62jPPwKuzYYAia7K+j>!Yl&jgRm>CuWht(1E`plra(X2Ed zb5C|x^QSDeEBgs;QE%M6Y^?b-mk)ZMO(kj@(^M|idAig-3FNoH4S7G`%#?E_Jo2&K%oQIKtYI;{6yx; zD>K)94@A5-v+H}`$-e#V+3P^cd$R|7w$;+39mW`<5^H_fiP6J87E7ig22nuto>)DY zUY|*g>2#Ycx5hNv{1&?+7Hi(kCbKlMh3Q0Mx{$pW!`MX^+HFJlt!xkHf!jd4{Zh#~ zBYlCXjkN+3+@n1CNu;4%TVQ_Jx9z7G&u><)H%|B&-|DEKK2Ktj?+d1!=rF=bu zXkH!Xd$j?;tH5mO=S-VodpG3oW!oD^l3zs!#Ph*_9`ZmsIRD#iRBdU8%LyLbPId%L z0@_k@ByY^BkY7*^6LKwipt{j3xgM_vs?eT_4*kY)7kVIIUEK@~s7JB8CA3S--9r(NN z)_otl_~MIam&6#oANA4hr<@}Y&Em`|nd3^a&`9CDh zQ546}pnK(Ub}o(q-&mUFQfmlJM4J_C1hLf0M_PqIuxN%u&_ZLObT}=7l*zw3Pg6 zcE;ml%;%ZOw%_?Ph(5(1{q>jGWGb6YC9}rsgg@(V{l|EqotK~}+P#Q-qZ&IHcPF5; zxnfR`*(V@1$a72)}x$d|bqf__xl zB})@?Av;@QejofUc3T$Fv+i)baMe{VD+)>B&sAu~Ti!8L3iy)QOhGZLw%kl5iEVSk z>PjYElouekbf?H#ZG{EQXe$pHDCFX3sT8KR@)#=7Rx&yAuoc?Dk!pyh@*NyG=yxvd zUd%<8a*0~l-_uY3?XBypg^~56Q)as_Q+yMOr34y2Pk0k10_4lZ%kv#}5YujJcNr@+Vk+mN_!sme1~=tqQbWYQ7zr^4eS2wxmMJcjjThHrl6WQx|H5(XjK{9wbuw`}7)BqHejq1779 zP41m2`h3sGTl{WRrf8&tnRMT&ui)8aH~b^qS9N}y?#gRjk{uDYp!xs|g@QXJm<~@s z_fsz7u2nM}e$ys;YEH^!%h`YmzjKxzOEphhLyPyspM1&+H3xiHL@H@`XPR#iVFh1ndi+2uwc z=5SP03u5EV6^lvrZw{ETOkPUnO!Qy z4WSA|EQ(;8Y_t$7;F3rnl_j?gObaWhm*)iT3T~PG*DeY!fxH*oXOQ>4c8rUlA`!Sd z*ai7MoTgXe!Fj39<@z`^i>e60Uasf*APSq~_>+!nlJ`)1bD3y9mhWgUQ5Ndf$~JRa zi%cK9MLbUPa~H*YUc19#_nK9gJvPLG&Tx9vZ6m>CbB`j=q-3}HLbFKjG0A@aP(EG= zC$7EE=8VOhw&TR3?}zZZAMrVHX@A}A#_HqY=2+;?Z0Am1|F3PcKaU4AL6QoaJ)|pi zGnzZcj4#9-N0p=sY___D?cC1NBo|XW$=;8MGfy;_NJYXN)D;SHXQg+D=D9Vfw(wh_YC;am#7@*P6h{!oE{^DR z48t_%j$zIn){9e_vD8wXE%-Ou-yt%E}C<3~8=UD-Lv|8JJMD;<<)(E(w$?4`Df(qar zj1%uS*1EWK<*I(e(9qFu4Ba9>qW7D|4?_h#>lm`k^e%_QL9B~9F^t~2sfwH5hrY&H z+}yjb6g$lK=d1d+v_`kO`*OX$&h$xFJ{AmE$-{=Q9`X-`Fg)xSDTRDFaZxU>0c6t zW2B8hzi0C%Vp!3V(3{P>k|e0ASt@+s63`+^%Ps(OFlRq z!?(J-d}ta`f401{)pMF-qVF%PF;057`5bDE6Au3WH%|X@Dyxr^@KHXluZuJFDLaDT zq5HyW0h{p&3M|sge?j@>j>=e+G<8}Rp*sXTZYjbdpkIoL3qlrYcJUDyw*=LXDMm&DMXC!y@bB%=tJ3kt!toy)de>k?#_#At8BAz>* zizk}D0J8@4Ji&mJkq%4O)!i9pmNswdD+e8_35h5|UQv(?SOCh*F{mP3BC(4siUuWx zl#zHnx8ej1D<)+MLe)QJ!M0>0>BZq(R+1W9=Vk`0*~7WR$l46VvsMv{ORBN(9EUV0 zEh=0#d_m=UY5Dc03kEhKocYTF5 z{|d=xh@Hz((x6>Fb$nHJ;F*#JskYNA>ulr<#R8-%I`q?BXOLr-FTX7`-$$RlIb`-w{>j|<3Y9Z zRP)>TUaRXf^4dbk)R8Vj;1ZnFV_j2}RjeN&7NXYQ(V9VUlK3P=D*WPyLEROT9) zQK~X8yeZ%7OCe0)|B1M~PM_c9bGhI>@r3i4{{BopoRN!eM-j;vvNBkRc$IWGmnyrR z9((kGsNLhVcmw5`3-(&KS3^itv4^ASOg3H)`h3B@$%CvM3xwu_uF&3za=_crY=Qn= zR_m_*fQ{Vypx?R6cZvKlN5im{0n^OL!)({UEy5p&I5fXc@Cnj;$arJWOa%N(h>_)b zYq^9X$<@+Gc?5OTouF2c6+4S0qYSdK!5|hfm_*Oh>?oM5mmmHm>fU<&vA&4Y1RWjA z*wjQR>klB&6xNZBiphFu+$~YR&t}JTjyvrr85{Ox3+sd{4K;H8iG<$^yEppYj)fuL zYmZnMV;;)O;IEr;jy}h*FMkAc=pw|(Oh`NV460`{ve|@H9ljBs4uya;s-V-7tj^vBZ}g@Y8RH zV>WZeWOBw5cC%_vXT2VZO7ytGo?!2<-0q0H5VP66s^YSnovMx5tZt7VafqrZYIAs1 zlhbZ;>4$xuh}Feu;o@?h@`Vst!~`{j$Igf^5^DkGqmYHI*qv#_=+GJ=j<;iX#Bn;G zOe?B5AN1V}f6=#)qgRq@YYRM3@~v1=U>-h#7fCsWs2oY5l9ot$M$~n% zRJ2$VRqi@!bC*HEP&lvCFi6G)K4Y7k8A|7cQ>l>4Zg+)JJck0N#DHeAsllb7iu&*Y z_I#a+&O0rDIiSLvef8O(rUhrkU*e~E`1GHE_d_+2Baq@*53~OUU)y2nYC_DoWY1VF z4=KnOMAU! zqp!7GCJ9mWn+*fyu+O~PWOs+7`2v)Ek2g5%%9exE@kk;zFdU7=LVbf9w+xknetCB+ zl;|tQS|>QHTBupExXL&a>t6&WCOi%7h6US_!CyrFU^#_lw$!9q5liev?qUeZ-c$UB^59pC^*ZISVYQRkRwAI zz0Qo&pX!7n!M5HQ?Ea5EpJT7N6Ri*D`Hn(BJT-|P#r~0R4v%QW4y=ZE2yvIcaYY;b`X{9rG%%WQmg`v7J@cJD)>}KbPu8);QFE+h9CaPpmM{D%^$KG zUX(xHXq-a)X4e|_LENDC8rELtjB{?oxxhd&Vm@)7+2t$P0TfaLdT z2}=SOqFWkV!8Jd&he1Uo7j?`lt}Jf5@l)TuiMc#>n~ESyo89Aa*i`)39HRe(>*F2s z3S1xmh#zmzSoGy6{C{_`KY;)50z;>1`~NT{40=SRjI_Q!31k^ipVk$VOwCs?pP<=* z42PiKNLXI*VK0+1=~OZvgJ_PjC^^uC?nl`=ZFwLvcFQ&7a|dg$Ze2GNO{b$n>$bMu zeR})*fAvSUWPEUJCoAn78;mFU`{s}M`$yQJIqVf^Tt&{3WcWw!L)TXNM~=b-dlxV= zR`bwd&O=AIlSJ^4JyMNh-hhX0|MQ=)u|LP9PXI<>p__*gkKD;aM$9Mn*_|{iOWW&P zK@A1=+{HXoK|R>d6_u!mwHU*F0!Ce;A6`H}m<~7r%cWu=mrW)NB8oD&&~kXn(`q7m z^ICY)zcwvDn$7kHgO?N*-hS{j6uqlHl4*X06Sjk{W$iOWQE>QOc;$FtEx(hPo1GX9 z3D6TcU@+2{&2cknDlHHLjW8P8|7MrA;-Bmj01fP^Q!n9UJa>%m$>4LcQo=3f|MJ_| zPhb~vOM~@(g!stX0iIHw5O7b@QJfVAu7+@OaX1LCRZCXQ2w7@Btrlc=H2;)8vUvOL z?WZ;;zJq6s>CYIGF8LxtxG^ntb4bF*tS0LLjUXoyyRbqazVA3RSN=#sO@j7lwOHSv zpFmAPRGi7ga1vt~qzEEIKqAZzZ=et;g!&6!yOu`VxM1eH9DSc7-jlVHG*$|!?|w@i zNIJc4f578+!PTTWp)Sz-=u!}ycng#-@shm#_H@8zwb~x?~Vc#a5bgy(t-8oRT0?Yt0Bjk?|rqXnm34=pS zA@x$vT_tmOJpm0L|1arrq6tKD?p@lxtu|UJ40==uaU+MaMjE~#2hTB}weRe$9U!S5 zg2$}fd@8?A!^e&-gB=F)D_^$-B;sk=&?$cO74CzMO6w%uu@NCDz;u)oo|FNJim-do zF9n{2qwQMAS#}irBfy|^o`8Jcc#KJXrP#XoI%t7*61^Hh8i{a3E_r8II4IPD9+k48 z*izy+sQv2t{RG!ksZO(}cSpTZpu$WhLjZyadm^D^dW7CY!przsq@G|Yj-z}&g} zrmDjYrz_sK;oJ><38yn*05t(5RYnY{#QvVo<0Oy4&@H>fU)19SHz5*Opc1FZhGg95 z!JK!&ND6!?NDf;6c#7E6gr^VkC!+bjY8{jeO!0NU{e~VLJE;+4oeypDDk&l%?Iz@qjHJ!DocmVBMhH9avy8X(m-G>9NdMIEa|1 zRLk!m^h92i9y=Spe(?4i_0qZRRhVQ13rrt~X0}h9S13kfkzIockIR#)Oze+=Ee=e# z0*+JZh=A}SW|&%f_T&X)LB|%GYhd^2Mwiu#V-KKcdV_X=@8|;OE1Shtsd z!+s$DFR83~LGuoM%veil4bsmkX}4jtG;t=@Ad_(p)?32ABONOXG_$>gxZ>wjf?Z5d z3F|D(3*a_5scEUD7my5|d5U=4J2#upG1#hS_s;Dd8pzG$XCfgf%d${Jb-hIxUb=|a z8hv4%>L6b*!GbD%-CI-pP%;#DBUF4OJ>hivET*9t>`N9`ARdANB8c?Hq|@fKcsv#d zagNjKW*#fj60{zwodtkO(?@>xu5(5lmd%=}(iq!e*PMYs|IDAx^albBEC7`c_J{3Q z38H;<#1?F=M(ozcYE=+)7Pc+Y1K(=!VTWz2Q>R&v&^aJ54iCu+>qE8%OgJF-Ey%c3 zZjqqu!&zej0B8rHVaEZPXJ<%0Eo`3IF}tH&jIEEa7wTb~%stgZp3G6EFafeZfN}9p z*agF!%9Akr%rPAVi?*08^|7r;ZtY7(-Gq4KjwXvyuh|l=xIMl^WFp-s4)#Ue2;Ry> zBW@osG1t;KAExX3`jRo1*Xngt!d7*?#g(4e@+N-!IgdA^vRKCLs}lwZ@$L$}l)@sr zv50h=A@tHLvSFZK6X%Y>cquQoxK|IM)93g_(r)6`!D?#K;M55PJ&+P9D`1jE4zAowWZ+(aC9RtIAaYc3q| zdF)oGHF(d>hsE0a&RHn??OQcxdfXe8ok5rn$7;AX2xN2HRoy1u?~9OiTcG`ph5#Rsm{!rytn`&?UXbyoMt|Wh!Y?)Tnpi?z*+^->VIYFyL0_RLzs$up#e(*<&yfa;$gd7VqDf!$*+1gCEP<9}*|F z^?AjJBa@e3=DIgwLrzQA)EzeXHD!c*z%j1t!%65La1ZM6bOzcBEG)WLJiFq1EbP-d zBn(-+u|~l;n9VS0XdpA4oeuaMcC5!~mL|uD5Sa*B^&)wqGijv5C$a|Ii@!gUi^y!L z(O6mmnz7J=c}caPUo5^rpQ0?vd$6y2aV7K%tyen0q_YDm12iK&_%L#qZ^o*#R=yQL zWZ5Je+t+;hVN*ZS99Z*t#8ACSxdt)dHEy5n!7*=sj8I-M>!>&1)-1tGl?*Zzu$K|znteR#I{Q&pF zeP^W?fYMnIyTPlbNBHUV_9xWchUSZ)Me*i@fv#9X_AFpZ0sLjwy%L z>z@Wc&LSrJal~`093_u6FI;Xce@=c1tx`XaB%F0sGf;4w_pE23^^bd$Yavuw^XT%| zmj6WFx8j_;Cs=5r9+Gbeb;}qF`rbpYK%P%?`6F_lvI)5i>gQqaqh}#Y0iLQb`^RV8 zS2nM#vyWB>u545@%3S8P|Mo^Vu6d4Ma|jXH>gR18*MxDIe&KNQT{ZTxqN{mDjh*z- z^)4k8eeEmug0eaK+RumF=)>~U%O7FC(Vxxpbi(v(JUtv}3{=@i>&+{#bYJ;*?l&qM zGOv9jQ`N7La|raNXLnwMXX_XG*vVS+3RjVRtk!(jFkL@HkAAXXSGM5MF5IR=1{k)I zCqSWYTZzo`Pws?2fv`T-agHtHENqG)ULpOtsfPi+8SJ|Ud3Y+q04W*Mtml|w+a07x zi{?$t^Uaedpa1ly$0z9eRvrr7Hz^^)gN`DR6Z{9~DX9$|x2Nn5wg=DzQov_PTET+) zV}PTI#F?zOnDu6bS*gRQ#1(Q%TzM;-ZT{7#TDaD2glmz{!WLg%ZC_s5MmuTT?VgJ` z6zswn{Lk3nW2b@*Fem`*Zpsl8RKVQi&0{b^dhy$83^j;9ocV5Ue&J?JGb1mD=t0=g zera>Pj+qD(HHd=Uo)t+GvUUR4fQ+e!@S?Jd;Hy&Up?;qiyF4dwtUDfVHy#f1BjP3R z#jl26-iYh2`bE7j7nqBuV$q>;+GqUTi=a+!U1I4 zTvva~p#yt&?^@isV|!!U)-9Vi)i-XKomoExk78}z=!mez_i4({K#w8sIA4FlS}O(ShGkN@GxvYUxtqL_FG zWur{L#^=+2Q!8t=GEz$_?7_?O+ZGCqE%|L>8DUAG#Ult6CF9P>zZ}^ zKE!kFaWnXTcb!c8x}-7Y8zhVg6$vo57S(zJkyXrcNU~V?RIr?RDv&dv;}7}JP?E+cPxSgIjfVg}mGX6Y04yJ7a%2#OxF775OZ>~%X8 zyG^#A@Boe677Yg#INALtBB6ld%che`Jm!m^$fOcVjIr1u{wBsQ%HacbXY;0caN!)- za2k9#-eSaRf2EJi!ued5%8{F7K666gw(CjaW|~`?g`WS_$~1{cL~Rw-4xw$$%CR(DNcp9bS2IG}FIMUuZB8 z)W#;q1Td+vYhhbPAQAM>h=m(02K{>&B4$Fd>S)Sm)vS)8@%d~8%!FXL?b}ZOy(Jbb z<>5)6X$liy`Dha?)FEDxpF?42_(+$EYRnC>0Wj>@)ovB3-wLq5)>k< zh8@BtEck#8HsWI_%o5A*F^X7Lk0DO;qFn%1;X&gUNV~(;Qn^|J4xv4zYwUn_pG23r zLxF-g$ONEU14Y1@CQK`Q+loM$6cf}DDf*mTlfPZaMaY1%-2|M5(SXJ7otg$Rk<$_P zg%ZV?a>>{Gn}H0oXiiV=UN|XIQ@c{Y3HDp_}B;AsF8naGc<_h1w5S4Co6DSdovx$^mRWpc+Bb)3j-gypO2!5%dDK)*G@~ zlL+aCp=b_%WW+nRz2051xk=QUK~y8`NWcI{`jXSrDFjNCiiu3Xr|mGg?JgU@x?R@b zl~?8w3*~8qGV3nd-?(<~7{W6=zCya3D8_)PqFTI#`n8Sy*KM#_i4?TA2Jax29?sHp z@wq1A5|(QsE}`>#jtj-Vmmlx^UOE@ozf&q%Ho_dhaqO49l$otOx(7F*;%>`cem903 z;C}}B2eIy!_-+vaIUxCp)N0xx8nEg`sANqCd-YL8;u#Y{cZw}ovyJfUWA@Yfx`z(Em%eLwJ&Ejv*@Va2;PjS8(1u&3GTAbkFCyOWlh|u;B!lLQ zL@*#3Y~l1Gyuuf8?rmsqS^DtKM|}t`S_k#kY*w$e!`W=IUIS*5)nHZ8@)MTlHJNmp43^5BdY9jT`i30QZ^i4IM&O&7-*=whZU_Q{$Cw$;|8 zQS*C4?|fuviT?aJ85tOPUz=RHgxlBnj|Tq%pQ6R>u|o|VxCzh)1`iwp7Kwj4a4zCf zEL+JEdIJ_TZg%B9m+tJ${A}l7J=7k=dpd@zHH5v#?f$bGw>w+orgV;5s{;tZgd)1; zxWRVa9=Ef&=tw=0NWd@IHEv)aqKV@SG{GLTHE3(m=bZMCHGJ+wPB1o6>U|>vk)$zX zjK_-qZ}{4BguszXBC3UFFH8ac2Z|$%LOjn4Hg}3-A!{#_BB8dSLdvmR+t52sE?t3G zA^`oxz)psdQm?YD!`XZ&`Q|q-J@7!l;qwFnZe&oJcbfLtnFZy#xu_}ny*ae zgNSi3SyI#9k(~j=D}#%$k3`<`3$UwH>Lm#47}7a$2(UEdXkIHerQMw8Zo6&iw%g!5 zrYDg33Nn-8=c(_i<3SvtT0^g}Z^ECQhnE6~5J19X1uxntVxKk2O!B^Ln)+#epvUQXhvH+~=v_*zOdpj!(ae9e$ zPp^Fn9{Y;T8~UX={jhZWI^TJ-FuZ zVa_+lkN4)B!;Q;mU@vPNUd21DasD;ptTE2WMY&DBY57-JK~WcF`Bx;vaSrjui-e`4IaOe?os?`6)L-Z2kcLyc2>JsP%t8h3W_Gz9GR-l&OXlP|uphgJbN63- z;Nsnjo9AcOj}9lIA!NiE_CaDgPmAd$yQiJl8I0F-FwZc!4j$Fg3Y~>GFv+lEXlq8bzfMT0k{?`%!F#oIy4@x#{?E)JfFL-c6WvL1)1KmQA*t%#xmnKNbx{JU(q! z4O_8mPM}iRh#Rq?!9*tN54g2+ybid=yl{VOE{91`14uG<$E%yzFrSal&IeRAumOHj zWwsi30|E8YgOS*|$7XUKm&=nYji(pmK()Ahz?(}I2S*Drx8LQA<;LB-ezfw1XmmTy$C&;J|7^r3l(jeFgbrUrN4#il z*-Ot5`~=jhlX69WhL_8zvgssgVYnxr!rLUyR~?VyC~JNZ`4ewbu7u58ueceF=yF$9 zZh^#w=!Lt5EM#zaLMP?2SEVq_pufceD*18R$wyFq#C#I9c`%RoEP_+h#hwpkZLVT* zXnNXZvD+;+Q@?DnXXFLHFPz^~*|)Es66s9CaTW&~`L zL$WR1XLiAC4xmvGVxzjduRJ_hp6;8jHEfgqOcgF8kBUbej&`d3U+g_=qQL`xEAJZMN@A=paKM)=_aJy z$tLoOAfH&d96AMN!V$d4Jc>b<_O;?@7H1d9JdB9HTD&G=Y0ePEAfgqhqOP9IV+8z> zJ7>7+p|-YDI-^U-zKS4~NF zv(0R`ourM0%48rBYgkLMjZ(33S5>Zsn2tGlg$mqQIqm@Samb(XRhLTmPEsyC%`GU9 zHA7k6Q{(GK23iLD#Kz=Cveugva?n7=b26xfSla)U()5yF&kLD2xh=eovyX zDBgMFg$LGLbidK?I0CUzdCP9p*@}t}r@q2JJaM{371Y4Cd3O2Zs4dxmZ<1{D@7?*R zld@>Qv#NGA<}j140U430Z&J;d*_a79Xvl3ifk*_*z(aU}MH%`ZEXwivD6Z0Op^1O% zSzd#JvmH(j5!mfT+FcqloHjL-5kbE|#{&cVb%XTtiaNPC zBA^{^UNnJRz1~^o`uWeBzhW2aPdb(5yt|@i9Iv3vYsMk^L7*EFonL_*d(lAIu1~bu zp%=0lg6>RFi)7(LJTM`sRV#&jGC`o(A|cDdqkU;|d)mqyqJKm#F%IRq@lNSTDOF!B zCW^_KnIvA??>sJ_yWjL9Q@`8ix%u$16CLY9M?7j<=4aq-K3>0QY!D7Rv!-s|BwG-_Hca+Jm~}KP11DQ)AXw}y z&}}Za@k*ES5qiaVBL@w^lesJc*XAZ*`4}C^Hgb*MHE>NxelGaS<0vEI8O*`; zcv9RE_}wFTQpBu%*lBfIDM-!gG^@kc?H*29R6=CZELP1fXB3ykdB$+HuRzpiXV)Vj z4GZ)ob90x>YOZo0ptBrNe=h9SR9aJ8a{d9(w?od$dW>4vx(hwJa}11ix9gnI?sH6f zoMG2FL*3^XW7&1iVD~vapSA8R&H*2Fwz=oCM$Y1#;qG&Kwr8OGoSx6B_C5!4QS4uz zl?J4%zSvim0YRlFd*pbk8sC<}{sUEu0_Cxkk{b%4mSpUR*E5g+l-G9oTBjfmkV!cX zLq)MH6vrYBumNjp!_Un_!gj8&k+3_S#!%F*K6V<5QAe$@o~9$rHc_kh1&Wm;FF*q8 z0SeuLOg!$98+An7BXbp<~$4V$W9} zln7x`Iz{mZ;UM6RDy%~OC4ss_S*nEKfF5(tEbOxc0UXqLzJ%^~of)V^z1pJL=~{5^382U?NyX-9ZuN$k=+}OqHyN;x&u**s#z0*LsPS()kqvN%NSSH@#7V1 z7BEgaWlx8V!dSD)nsJW4m+3gi$a^iRzs7xd)+@n*@Mp{}zfsSL{SVaMxd-3k97Gu7 zTVWMDbr0Xd(!M^AF{6Bqsx&VhsvpS4Wj6Ls<_G5~ASM>UK%!~^WfZiz5zCq|5Rx60AO;ay0h@Dcyj)C} zVmq94T)+5WDim=$%p)c%uvVNdyVK%!W07->pa0=+pHJn%0|C$Ak9(wLAS)x=7tP0` zcAL!}DbLTB!*&}n?+XB2?3>=Vf2vYhGavT?LI+xX<1Tpk~`f}mac1Sod~bz)mTaxtLU&<>&fgO9Qdpo7GPzqs$h*%)kr?syVL z&Uupsspf0$BOmd)q9#mk`p19l;su}SC+c=6LecPerac~y-Q!1TV;AAVw)KpUgF`#? z3FR?2qIGFBB(w>va}Zq0> zarA?-DV#G7qTY#XFk*4K{1sp|`GecTPH{kSt~U;#=`;q?mzSSJ{aQ}%<~2foHm?!# z6MT6kat5Cy8R5i?UX9rey=}h3E(grxmQ8!U!!D;|A>)3=`KsfWT$Vp3*VsD|%_ype zksc`SH!A&J-CpgNHNfs8us~M^%UE5f;86q1Ll5MYRW*&s%8&pIa~O6oyznR0t(EXz zvRtzE6_hSb$$+EMXo(wa`@A;5`)Ic zVic+@im_DI{iP^6>yiUK9g0yDNc7&vHAZd|T#?W96*ROvb{;ju*}H&4l0@_|&>p-l zNMa!I&_V{Wd=lnrRE~QOBp+B*$BBnB!mBUfiWt>J^m&1Rkpzx6?43Q(JW$f|_<3xw z8;|249(sKJN>B}Uyh*k)8ow&%hqLq9ZvMaIv;CeR@%Oj~r@G4ThIW3E?PEt^%LTe3 z$&|;?`0Knz^#jGtin$eg zg8L|wVchD;3opXmPQCQ?uVZYNzqC9e&nSOvDqF5!M#K!_UarSq4Szq&=Y$P-MZdye zmh6-pEr)$)ep zvSw8m?FiyPc&p{4WC4V<^(OR*mIyfeM92r!90WkC=F1VQsacOmR;zZ*!8EJ3_uzqQ zKa;M#`ijdA+<5TD`i9zQ|NiR!RKk#8&eKV-w5)4Gx&YIJL_P~qclKwpwS^*TJoT28 zXB3}3WoqkS=jH4fhifQeaX15gzEH|Xf))pWh~o0M4m@#YS^Q;j7uhx4ahLAff@h7o zFLr4R22LEfg}Wd+f^iV9N$C=_i&9Jo?}nMt&P|ybtcOMgn06Hyy%NlwjVl^=NHToJ zudts&SI$f4N%z$qTNkhmhX_`=_$7GZeux|ua*=ck0F9c-@Olxq9g!o9oPj{$QuICf zx~`KYyWMsSUikU0;Efd*9jWJw1;Qq(Z@_lxyyAJQJ^_#`~m1j8?z4~Q@miiVMnV#ozLNo(MNgVKRb zB5+B5ywrh80w)yKW#ERuCJcY5_7eY0c53ohvWO ztdL7p=5B9%=tGU$ry?$wKOaqmG9FsJscnd5rnXh2t@X|M9CQY(xnNo>{f9f01+-6B z77)d3C<_-@D4G%_>kBkbf@QA_!OX?+5SdX>Rh<|9?&-YNm;O}T?*>F^YE`@ao=oxH z2D1acFJ!WY_rS*YogDVv&Ki0~lhMuvKK< zQj2p^&Kp8yR~UX09N?v;1*HBCY>Z_4t#^viz+dOtx zQZ6N9+a@EvVs2QryGN4f1(P=657m6|OB9obyFr(SmmQvJ0(s&wd9p&1%rE&v*%HO% z={;>l<535nv)er0==}UxG3^iB#(pmz@LFw+pg&z0X+GNkf46N8H{oVyvZYT;b?HET zFH&QM2C<-HrPr{{)2@XZ6-lf&aj%Vh6Pjy6&@YUR(2eCoq?U4G_p-r5>V%WjEoU7XOq?idvd<}9OGHgfsOHwBA#QvbcuALe(}&C;bt$wA&bS)tY8sCSz^mg z4rY-}7K|pMoMbq|F`}sAaXD(oQiuy)kke0UlCcd7B5nqTL&*1xB^}GDXo22YLmbm-9}r6r4kDtzn!j)<9`(Az zv3zdS?KJH+2f}>=a~lTw!treC&^f87mG!ar?VQ~;KR7s0N=IC76vaxqU_OjQqmjPh z^)u^hJ9dm$=No+ePoaI!%P*Qr&Jfjes`hb<7zIiS2t>oy`y#S%>k=|| zfGv$|d$JG-Q!YwKn_-4Qf)iXt6e4PZX%b?6?*QCVljGI;KpmI%C;Ephw8~IQ1^w%i z$hrcF#Z8!yK>S*;w@tUilKz3B3w}%}#df3%I;=K%oyqAQOs9ujfPjg(Dt#Wm`l%1~ zua)Y!1dZr7fPFCYqYU(VztNC;)zH4K^ zWwp6|angP?wo7sNQpL&fQrZVt=dBB2yZVz8?CALL#6UKRYGH1x9eR+{=?{g{usitD z*`-o>tk&m`fgw6^A2(4p+UN+E)7X*fVj58%VzDK;jPnfuNSHJDQadqLt+ba}!jCwU z6y6|n`@9jE)RM#PVePff{^hS8He0-x=iRQT)8mWury@?9vWYo7ak~ZCGq8rbN7e@; zr&(%!&h*mk#(2c7naw_D1SVpy!=orR7b0q+xoTeb`>(M5Am?|L?T2i@A4j}HuQ9%` zHO4Ub@-eo@s_g&57^4kG$A>V;u}A&)TgbC{H2 zLx_TjdrDDC0}xw5;la^u7R{Zbd7qcuEc4?-4kT^*(xU_MFpO0TkkOVknE7{bk9y+RLiXbP#G?Lgy$l@i&t+F zM<`&IAJIV$(}eK=GXsth%7uI$uaAOVsts}k+theHzv>KZ6OZVpLGcq+tkQ`%1rWrM z6w{qKAjMeB(Fz=DZ54&RILOJ!;jr)x*ek_e$i?E`u+6q~*OJ}7ZndS585X=#{hIZY{U>t_ZHO%raHBCd5tN;mJtofgTl+8Khba=fE z=g^QfAuo8n;oJ>3LzBLe`n+*1r)$@>lA_b&Cgg|uq0$}V`{u<8L(nkM#3lp5 zoBYd2vQv?3hhzW~52rUBv)BPLX4)GJpj59!7!28TJQk=1s~(rlZ}+Pv_%%>o*eL8# z8p8$xJ8c*$^mjT2=PDXLM^0q?9@Ss1D@dwLw#tLz&96>J-!|Q}r+dk{eDNg^5N@HPSyxzjnL@Xn|| z>`f-UVShA&cPYkFc>gIiHs#yw2}eAenRlOwy<)Q@5*C}?5@#%Ku{b^XxfAD}n9F;d z9dG|yTc5p?RnJ{07RS!N<(9)!#p3*h&8hIXh7_pmHRoQFwdpTJT*xo>8!o>hMm^7< zhwIHSM6~>Q+xqtt?r~wQ~=mJRAX;&)b0|h-;m}U8JapnKjv0}>WTS7HSZxs7X zi*?E8O%(yn=u2j*KmR%IWVP9>E>Gy^Kd)wzFl{2XO>UsgKLcl?E)SQ01B5|OD+0j1 zS|&cipi=gL4`EF+0ow}aD_&Ix_(FB;Ac1_%vKyN3K^4HykB`4`oP5lr7vaz2hGR{ve>#;-2E#J3(fAM|uG2J)*n68(QUiJjWfMV5=_em=q zkV!ihI(>H%4DeDrdM3EBGa=w@BX*6Tw`r=py1u_0PAvIdL$pKmFD1g|{)I@mJhC8v z_|#P+8C3X)W=81!!bmwB(fhCu{#IRok~G_pbT2<{*z64KwI|W#mHy+S==)vD4vzDt z5yl*0!+BBsJ*<_z@LQtRyQuhnFncwMz{~$A>W81o?8@M7@HXhzo3X}O{=!KJx46fo z7Z|%M?u3Nm#J$-9sAjh({9aUZ$Lp!1{6lL7*7q6dQXv{MU`3kf z*TR1Q&lVYUpB=aMsb`j_UibaSSA(7n9b+k!yI;(9k|$rQXa-f2fOEdvpEw;Wnz0QL)EGM zBYSEEpQ1Fb)hxcsj*+&WKC+|YvuM{g5WDCr)b@<*pQ;XZ(Ialii)ve5APs=3XQI5S zDiJFiVBbBq4z1R9ZX1kNt=uv+pVA)>+1K6+9K`UD&1uD6z>ts7Y0LKC(25Otcut2r zgd{NifpHYCdai@A8F>MH$h8NSa9>H}GwRjGtk5YCjjEDYKt@$$gs!P7`i)f5V>YDj z44ZfNBl3IWhN+2>;mVf&E!i~g1&2z}j_hPVx0{G)onRgz?=+xkMq8>evLBIZhM64- z!!goxn?$Tg6!W}gJK4^}b z(Z+eolURe!$9Rc-N0%PlI_LXRS$n?6c#;0iuU%V@#F|&)s~{igj^`p~2|v5CF9c0j!lZWA;s<*MX>YM$;hd{Iy)Y*f1`s|ZQY_KeQD>T z6~qSgkeyIB4B1IL?VXSI#~* z8tj>74ZhOmgQ)R#1u$7P=asD(%)61Jejy!`_LC;J^HCRuC`yYjySno!NBL6#7!z65 z0R1ab<6Lh8+#D3E8P)^r?yfiL&(B|U(L7oS9$S8x>n9cowPbM4>bJK^JFq1a zaG*}f8Bw4$v{WJ>MQh&A2qk7ZkvObah3fL!e=4)F*lT}f+&6{inI*!7LW4W-Ma`1A z)nM=QN0MJXtmHT3?|tn;wC8!fucy6^^s?u_nmlq?dGOx+hSz@5(GQQ5uV>l`_?%Ym zHmy98r}gM@q2UGj-41526J)zCd+@OQUw38SHZQ0*|F-O|Q&@+g=UsxfeGq+8p(!Hr z$c`M99WccsECE4k$l8Ddi=vLW!lcOHFd#Wof(`IgeY~7h*qfgWgL+^!poc!T?_(d^ z_r|5!i!Yu%EI;*wADo(q%TL{LhZvXH<#~BMbh4_n_b&k80TYs59-EAJP{ydfxd`{{ ztoITDz48B&6(>=Ir!^ERg^=J&VG=z43{f4VZ1d3ZUY1X6->~_S*Yg@K0^WO-5wxQ| zi?DdEVGh*`uo!b({txgW-`6?F>nP?v?dyI9y9R6k!miQA#=`g-I%-QN0}YHl95;J+ zY%f}&Q9>y@o9%@q67CybV0)T>Hj;_N{||d_17AgPE^t5l5fVs3zP}ITkOY!IfItEX z5Hv{CgG4L_0I9&P=p(Z9gLvr8CjQI5W}u z(AymtjlPB+8hwsjfW!09p*ho_d$A4bv}t&@^o=*%YwH`sx9XJXNL}mvNvN*f`4guu zow=*8P_)rGKkvT36^F8%F@Zb&{-Rcco(KNuSYfhEtDLGkPUuo?BD&y?X)e-zTZo#R zn&fN>XFA15N^~6S^?QPsUK+f|IKF+sf@_C=Z)9G(U_txvv!uY*D|r8TDRV;;^cv5x z``$u+0AYCyz5-+WXX3%)xHsXOu0erxzcNm^Dca7{v|CuoFD%4 zvNbmiXuCY-f7Lv_*@2 zsVT9EiLt3EzL70uoLz;C{FBOxiqlf_=iD$SD=9U%%Z9Kzyygj2#*WW48xw;9Vb$Nzg zk7itA`1PCH=zzy>2JA?_%`S>dijA_YC^iKv;AGc*pTRLk-TE_Te%c}~e@C93d z57&y8UKJW-QfHw(2z3tij&bHtN1r*KD2pl=9=AfD8|F;Y`zl}eeDbr$s-p_?eVMHL zcjCvMJu;g@Er0g&NAAYXed*JlL8ea6IDw5{(?0DvJ;He;I{rz6zcAGz^NV)8S+G%q{e+sz-n1FcBYNzj1Kh!(AI`}dBG><7s` zbj-cuOy}Ma+6*#u?_e{?q{FY&uU{5C?zrG(#>_ulFn#)}=bv9SefkA_tf%Gn=#1u8 zMB@}erOxZ0VTA8TNlCWqv^dFFHH{~Uvk6|M#|MKEj0s!g99}!Emse}yK9%*cAV!hcWe2a(bnPj+)D``=br1P z)&0g}owW9KNOB%V?#0RObAxfpVT=sHv^b$Ln5Q(}8}vwt*itug_?HE9qEa$bqUIE2 zrly*Kb;S!7?OvqDK z7&uu4_(Sa+I>7brpt(hgWu07HSyywsIdRf?)qJ5dn>w6e@tMxVNs*H#MmDo}4FgjB zOou&@CasN%H7D@XU_s!uyzQb(#OO;e5$D7hj3`f>&!-?4oWJ_Cl`D>1T3$A9-TZZA z!2EO3%#5_0gvspY%Oa)=!sDILdtRYCzVqg(^W6gj9(R91HnA*83GFktpu}@W4t*3# zrz>A?W}Y4xGTBC?Gx6!nbfW3LCH`4+bEYIFB_&Qt%VJ4}jTA zZ1l$3Y3YuBC#Uo@JC+>JRukgaEgM2hQl_Ru#IU=T}kBO|W@!Vg9T#eLPZ@ANk>H{JZ}8>pMcu^<1^Q^3gKs`AMvE&pr*KY4k?u zq`Q}YD_5@6v|%qFqO%p#Y~yY7Ni=!$v$6~)zuo-1{r1~u8lV`0`0pEJJr+-cq0jm6vaw{P-pLWl7#dzpMzTB~f@ zhwmG|egDqkox0lowvR|rap(s;`%0H)xmkC4x{=@i*RT89waj?vf_Vt=D9kchF^~`9 z^fRRh9g{Rm^9j|*RV_as4&0nX#DxD1uQoRG zo>pFRl>t>F8Dly7A$M%gXB0*@Sh9FPUdfhQXg?-;}hB`1Ja+ zWw}$&H;jy!#3Z&~Pc;laLrBG!lo*p?80Sx&y}IVRUs_Vgh>2Ik3KlIY;AJt!QH4vs z^xc|_($dGzDbI-EyP$$2c<^SLOAAt?qhd13&w0F5%UVI7u-6RGvZML^O$EMpCT zw3NuQ1^JOFAAX;IZEbCLUb6F&OLmr?^w3EsJw&>*q}RCD%)!U1jnB~}^>@q5|2+G@ zclc#vaoOFy&pkK%x9-!BD3tZ==X3VQWD_EdpRf_lLuDVWfB*gAYm7WynvZMv-{iN( zA>#le-6)w^soyc6-r{jKCse;!8QrT&w`oGmPSBl-@{^{;8PlhgO^dEG9!g#{{H!tU z$l-T>YowOFQ?^;lS}5PejsOWJ3SYu7eWv#WXHQXme~NQ^4m~30>)nuAi`%JlEn<=R z{K%_=ue}x=`u>tlo4)(Oz4v}F_qhgEObhA#t??7=)oaS9+p9C6h_Sa8_J%gSS}-lN z6$qPaVCwK6)l_T^aNYO?*A2Bb>N&nM*7}{UkBs#~m0}$6!3Xy~*3j@=2k#07U)!{4 z(-Q69k3BCDJjK)NX+kXf5S?W#9{%X=yLgWj*Cq<`Z7oFM`IO?cC+o?s_DeU7lA^PfNznaJj0VyWy)kaO6lra6s z`nhxF%&k9idV)?lQ5W9(*}vR&5=PsOyG4sWWAo~amhir8w7ZM+Q!0H!-}_Ud>%eM$ zQBh2QMMq)uNE1D5Up7voHi@qr!Qq}&o1M%Gjo`t};ontgzpgA6vK#HMUKHxDp6>Kl zc`!m@Pn^nH^##*?bEnRYi{TM>ruJ7u{lf5TO-qcC*$7UG?!>HbGtm{|tH$tl*7xRS zrpCm@#iVBDzU=Y7oDv%s7n>4tI`C!Wy_}a33Us|?v2j^1XYrDJ$kF;A-D4t2*o{7( z&cty^eB8sufp3;{s|haqr#qK@)*9z3cVc3CVxm1EbJpnA6Ome8CMhn~&VKSjzSB(SP|j9^Slf<`>K9pdG9m8(c2WRJo2B9o>!^_mR4nqCnPs>S9PSW?iyra<2{ngp4 zQXej)Bzs4sDGAv*bNM`v*?}1E;Pltu`9euvb^@CxN5v;ky=?fOyL29Jg7Yn|eutee zMI*b(ol$vOss0+OBO^?U*ROQcW!9n5GPu`HvW3OXFVeNn%a2cvHKU^!MPqKolCp*K ziuFyD!UD88+c4;UUI|J3WA%r`l!^4ZX5{nmGxR4k{azBDCg#DXe%`{L-2B`~c8B6Q zXbF!>*#M62WGelL+?&!9PFOxEqI9+uG=6Oat=Xj!la`;5kX}-hSCls^ZH0CJEZbU< z7iFIspJqK}TWMF<29}lt3a9njMS!wnSUp)1! zvyQyxh8wOq@~pE?eet&2#+Fal{$SF?S%ZxJNV8rNoVgSC(FC&%ylx$uJJAUmW==wL zG+Y>TN~l7cWl4Af<%T9BW!J9Zcbjgw;T)YoIY-}W3$0U^N!!eklPZ}EwInAgf!?RP zS8t;8g9+uVkKvY@yic0Sd1L-J{LoInWp*OYsEievl7+IwJht-Gkw8fbz0lDi9(EKl?U<>tmt7V+^_Xc9 z5m_gmdg_T;5#xpN+`Y}5d#IW2M5KL(``mrF?NGv@=0m&a0f+ZuW$#!t((!?i&hc$ z7u4iRZhm^c){rxArEm9+ts$)+PwfmpH8neX>YNn*%^C5T0W)Q0;mnzQ4H-3c%9N>5 zrkOmGfE13|HYPiY`J|C~C}$q)2Lw!T-g6x&h~V79Xmz)Cr;@(A4qQTO4@%_*EVDT>yqo4_2wMrPU=Xp!!4 zN(WY9zq4St(@?|n_u)k(b$U6}p$qr*KAe%ke#sLi#`{W-IzELl)sn;%f9A}jIJRj# z-DsS5cEt=<%bJvR#8u}lD`HoLnAx+ci>4*;p4Zg8(w_z;C^eIMX%=F81f>TdCX=*U%fvBHGR^-+jRp&0}#qrgD{Nrg0d2#&w;qugZk>ta3 zPa2u7SCB4wQeL@$HpO#K-lAs!Xq);`sq<|myS{LPHnNNpGBfl_myws5N0Rh}ggH@> zd|Rshf2Z*{!}28tpIdR4osg2ma3lwhHk;BMUrAb0cA|bSnLBr9@Pz7|j1_Hd$=MTQ zV<%=8FP>K(5uNCtUa#*Fee~YXj#)e_&q#YVF+T06)C4|;;XFF~ayfIjuVVY?eD_p- zBcX4u2sa{m&r%K@9sb7Q=QL;*NgXnG+ug*SY6V_{f~J^V=K^ zcYd=fKYT{`nY&|;uHo;z388zSIJ=0c43@G!i9N#%t(cT1Z-?H?KD3e*oK*5{EPvX> zvoiF8wngtroIP_aZZx62$l0}*&5)dz_(NYg)I{03Krkmt-#?#{m6Bv9+6g+)aE8JY zBhzM0+CN9ifx->3E=SX7WmYRtl zy=NxA;%DiSr8B2y2cpv#ElP`_Iw?=cHmwW3YxZ8(w2ns4S$N)EpRJadnY6np;;YQ? zY5O);X!rkI=Zq3S?#` zE(y2!k@KnFsp$C}{Z?kB^IPDXs;Hx!GU@R%`i)i8ZO$<(V;T34zDF9hiqu;6@zOo! zq&wD$ciOGK_ZezGBi}%jvbNX@W+rcLT#Veu_nC_&{)>*DXB<6l|IvL1{zbAs>>YS) zd7by#at^)1^WYoVE9AGKcl;0jHq?Yh%C7J2IBof3{mXR8t@Nj{SpR5uf}vQrH^DES zxoGF9*!ca3l-Ey=jhz`RUA(w7I5Rf({;a3?C9&ZZs!?j> zKIa)?hU8Rc$Lg}(q25dAA>vui3n&?6m#z=|%Er6aIxXN^lQLFk22)BGrUWyuvhRy1 z%3S{T@qWezZJo>e_?9oc`jn}?2IoVj!Vwvbb>8OY+B{8PL&^#Z z>nr`po>7@K&2Pxe0{^^e^OD&Jn0W@K?t~9yC-GrZM0mj>7K7#zK!Nx{d8YyNQHe7N zpxsn`c{J5nKD{h4ZE-NTI4!Yk`t&ScVp>|FFKc>Ybb5MpVnR%MdQ23Tge5C~XD0q` z<&wgw{`hzf-^LdoABagSd%G+xChTZ^yLIr6QwLXt>R`I3e3_o|g%;ErzaG4D|D$?f zr}uwvJ-jn~!e>_m>jcpF2Dt{ZW}n`B^^q70JVfv%1~ZotY-d7cg?3_L_ioF!v+NUC zkT20R0)t9x!dgGbXH*Dg3CxI8zQyWGfo zWO$*G_uhNMJM|wqy3fFqxQ(;_S{kdv(6gi!GD~aLku%@YF$i;RB_b)wx?WL&j9#5GUoR?B~bLOmBBag|;PJQvkQ_B_@6HmMJQf&jHd0Y$FWy47a1gtfyMR)?0}k`rd+ z%$!c8CPlGEsBY_&yC77v47d&-x=xs7OeoXIK^-vYWnt*J*!Zj5+FxXtGm3Nbr)MO` zuuM;?Z`P%WWh+=PBQh#3H97T*aq|nqXUDXT@+HSbC#U$bl9OW+W?vCKAxi&e=&bF5 zy@-B7Iilsv=UE|@@wmBiWzR%j%J%VUE;G{X>**FlN9KI7p_k{Z$}EkxSu=2)SZ7?0 zN-k50j8Rw^WWls>DQQAq8Gg|%gfaJ)Tf%0te4KNyaL%XpXF}(5q;EI!zJZ31zHbm( zOFfhR*wIe5!u z^(Gs9suBL=I+Byk>GrO`7Jf1D!^Pnj6J0mU@6S?3-a*VB@p;}xEG{ZLY4{C&FVR?< zUFP?f`S&|-9~$}2+lPm}iTHWSn(Zko_qoB>*B_9^9K=g~Q9zl(_G zvFPa`Cv+mmJ&6J5gzX)EgN{I4?5~V`$8`erx8t_e39*NqHa$A_x{S8&xqf=qo%#ab zf^RY&G9o84l^t4_+3X!|2=!ZO|E`YEx8Tf$=+bpOIB%xWvvGm5o{sZDv%Wjbn>#qv zS!hL_1*N)Jd+0N7?~Y%ev4EZPBgpse_?4Ez)8n*MeTw2dL(!g-^Bv82tLq$7z+&wQ z?8F$CF{Qxk&xlK8M?2^5CoZkC*-7<~lg#5?8lT{Q$e$1&cDVk3f%n-rS@Y?n&ec1q z+i1@AG#Y((o$}Af%bc4vH}r}7=sSayZ}f6c`E+j5c|}>Dnd@YwhVU&r?+cYo_a~;X z86|`C60bjfS~M@wMMqCdAMx=Sb&@}?^k*e`{-hN3mi(+#y@BL}l&L?PlA^EDq)hqQ zRIVz{m_*l#Zx~riXU2qoaP^%q&i)6^xKYQ=q2Edty%k=!_R-4NZ5Anc`w)8@`B-OPhXdaba5KQA?W- z8I6xru|##IZ+=BVc4E9|HY*`^^2EtTRtAfeU4MDq<$=KUS6*;=fiELI-Z0Y=r%ah1 znzqt=p4|k-zcG@Cl<9=yf7ge#YUG^#SdK(E2ZG+o3DWc=`evvaIrm)M$F7x)-j#GB#-f zqoheOJQ|KZe`2H=5y6IsT1}xfVi~BVvxK=@MG3J~5!)4pd&Rll%1UGN!oKpuYbkif zvfwSZX#I@V*NZB!P1wM)xu zr8xNw2$olFN#YPM>z)u`|=ymp;_LEhylD zrt^DQ=Hwghn@rU1dZ<2UGoE;oZ&P0)VElPb_j{yN`dP6Ci_v3p=!>Lm_lM*$T361H zb5XWbyIMYmC;WfGID(-slk^Fk=gTBdXDjsPUHBuU;T>)n4WH-BBexeH{>X^>b^2h5 zJa_%?j}iRCLyQrI48N^rU8eR-gGyPoJ5^$EN2LhWgAbs$1stndvsO zr-Zl99GS{x#O*SNd(3}c7B%sl9XpKD9li+LmzR~zC6H!pq$Z{1o;I;?VNz5?L}YYA zY~oOK&XmBeKwwu?)V!3q7<~gGV|w)DX=^7&u-8|V{!T`p&5c_xXX>0lXzUbvHWwaD zI8)YPYg1|*TXq;ToxB37lQoBTQ75TVQd#Ua4EIE%Gu({%@G0CP&XN;SL+3l%H*31{ zzUhKo-5y4(BXkulGj<&_En{-R?oe**L!6MaDQR-XltrOz={rQ~f>c_j&>UGJt1{{r zdD;Oosu|31c|WXU@AQIbjE2NbcBVBF3?8_Jce&0D{hatQ@!;Bc{*u5kUx_eg4F8%2 z@VlDX<)<1yomub|XQ$F**JSzwPQIGEv`*{#%{g%uf0HU8&;>`Sq`Uddk6f zhuJ9C?&2^C9CP)r^%}kU<;=0YdvI?=R5)A{IsYb4Vth&aCBgm?Dl}{itPbIXm5m7> zE9V~jKBt^3udaVgn$j`HUfF-A-!0o`=}g3)lfd_JyAHh>4s&&>?TV&x{pxC3_jtVg zym86MDyqYkb@TRyh3n0+LDQ?O+M#||hkM?>K$!Z~b*c9FRlgpO2d#+LUJg&Mc^84J zD-OTr?;fjraX3uF-8gR=uk3jKmEm-5ncOm-JVvjp|9|Rg-D+7Ctt&bhxMJsRe<-FuETTy=Tl)$i8HrJgwTE2>XXzn)J`ukPuf zY1MUQ^*p-r>Z)xTr*i7nhW#6H-E?|h-1J^o<5k`pHrB6sxVqiC)?>A!AdJuBcWqXg z@le^Z;cne%UbDf?)2)9!)^u7Y>UZU0J;&O1W57L!>XwCZ^YiBI=IO>IBkTIr^~$>8 zDudobFL-2CkK)Q`zKR|fh5c%;8$Q<6e8z@-o@0MFo#yj-=LTMv3} zO2UlQq3zXevsypuSDUHNLw^kWF9^G1)2h6Nxns-IO8t*;UdUW&Ca6Ok*;I^Hy zu4}Wps%vb#9((n>wx@-{5ADZYI7Y@RuYT1#Hq1SC%d5w(?y>F9l^tu#)G>N}V~*W) zpXO?PeOkQ6O&%lTwePdiex7*W=g>b^W~^SXOOAtL1iWaBUi^U)zkge%#}jG2vPUH?6jzDNq>3_V_jZ7-8Qg1^`+HHD3E<|dGXEQBK3WIvwNT5aVcFbU)b^~f>)PzG--*|@;R~lxJ^w0t z?ROzB&CfyebI;$!_-A-<+m*`XfVyLU+ZyJE>-l;ewEv`NTYL)Fm2qv>YYbybCrsq>LEu3imSof76|k6**| z*c%%^N?qoNkvTw)s0X9(T2ZzZw!fGNpv; z{Y33>{d(qL+e$9IeYDm8;Ym{anHiSu&dWO z#cAibZW;Ah@41>r@locd!hV%W=J-xrEw|Q#Zw#77&xOkBHAeNhG8&f)s^1%?$10Z$ zD&xj|maBQVGMY}?otEDXQ#-uJZn);9ZAjzvoV)hU!mm2Df28i%<8;D~1Wl)?-@Sf} zmHo71wc{}Tp5L1{otDW(^HaOWo?|y$<6N{pwOpE3UG~5lt^=;ghu-H{%j@b@JJhdX zp#9K8{oZ5J>DXuw{DAP+L9c)6YJXeXhPpam=0)Sj=Hce0uCfjES{MYCT?xsc?aEE7 z<S3pe|ejkVQ`s=zXtNn7l=ee%xTMDkL z{ua>RliH_a4Q*epPPL!oL%$d&PJbioK;88r4n2S@jPzmEcD{2ujf$RL6{QuYg`-bW6AGT(2M-pFQBh4Y+69R3kK zwP77$y<_uKTbyg$J-F9^x>_HKd;GO<`1-J`za6if%8otu>Tu&Vz4~1}-eWgh^U`o{ zoO`TsH-Rgou7s(;RXGj2A?)|zYP{DrEz@{;>HYEZa20a@U!i65mR;*Yam%g0`!9!O z+mM7h$9j$78sgNUUQ@=RY4x7LZ{BgW zFQ8@7aiGo>>YU+fj<3M&#?|Yl%Brh!bHaWN>qh2$+|zM&9Caan##O^_EBG~^Qv6Tg zej!W+u0M>PYemCcbWEUn+oVu!;>tU!5 zfv(fwC64vHW-}&w9M{PwEK?J9NvqGVoM%{?hw9QgQg@}t)jH8*FP}F|>&cr={o{pc zc(q4X?RC?Qgj23Q!qq;vURB1m_jFGhH|=;~pJlsyKE1AU?$PhM-h4kxUo+{Jhi!9h z^`_ZKoQAVP&ajRn9&7thSAV10uGJp^jn}aCa589^>iHzRV7inymg{+9vhrKpY|zK=Ik(I<=x{?%S(TYiYu$G=B0M4za-3I z@wAaX!nK|>T<<~3VKU)k{aq=C#c{p(B03&&AzrU9;<|*tpoGITycs4CwprbAP#JB< zYKQuju$#1v}-nBmTI_`#-h4WCmG%NwM4QV;YEi>UopzZczaK|(1-UV8h z>T0}>J=`*k=jzx?+okq7H-Vcmex0ZAbUNmfsjLNCrLdfDi(2uLXnI~|)y1ag!yHd358m?v2->aTq z?NimjWqKU;cj8_QT5grm`<%*qarJ8&#e_`ohjGKzjRf~t&yRbq+%UDv_50Kx&eIK3 z*9i~H>ABToxBYniYL^}>(?D%@kG*~k({d*RX+HK&NCjcrU>IHx`}O#>kl)dX%;9!( zthTw~S{Hh5P78-=o^G65Mr{LXhoW(*pyMSY?7Dpkx4u8kRsG|}W5Y=M@cPHdtG)W0 zQakj%c9Vi%`^n?#^@M9WtzWO4hW&4#_Knr+&G*y%RixE=>JGcAOX0WVxL@{!tDGCJ zuEyy#N&Rjf?r<wfx>X@E)uGtTFMf4zH{2La#;7gOfMcc5UZ+{V4aK_o`O7KaBpq z&kUpb1YFzx&;7r;_`f#r|9TrR<}oK1#{DhovDZKLcx>Ef#e3xs^Xq*>?>&0&*6WDQ znX0STJw>ladYlD4s@5LLgZCrKgoT~blhEe~MVRU|3c@>(% zXntBJ^Wh6n4H~EQ_j1^;$J!V3hfzD(;^a^dGCJ>|&utaGU+T5kd#&EcvC3;7N%gqp z)4bGA9UN*UEi1eY-_5a}E9FCu!}A!%w>ft1QG{uqEe7-)YoA}GU4 zqTt^I>p{ondM>n#YNOhF2B>{i$Ucp$=Udy;&2U;6m7VQDwL883Un9=Q!N) zkk*Bw`7R<(&(~pT3DdszGSKs>w%bqvnnqFo45$eoYna#X%BYPh>$>V!oqC)GdVF^H zSkowD`;yuQU3`!`HjVqn#eHI9!0mHqFc<nA)9UZpJyzG}9%G|>5Anvk*Mh^s!fE_&+D~!y+)f@xw}y|WQ^S0q z@rs0TWwi{h|G(>gEN|@7``bN0+$X+2GB&@D=^_0Upl!)pm!%xL^VF~6ckh#$Ue8gr zrU6&KhP$|7uItE+(eK8o+YMY#oac4!bwz)(N5e!=89i24+lk8lE#x}aAsv&1!=3xL z%DQ^g)$5R}OOI8Lws&9Hug8bg3%0f?Dl?AVDywPTH14(9ZRe_QEP5?dyy1HNQce%M z>eqPHr(-!Exb?2#Zho$e%BhSVkHrZe$99#|-=P=P<3-cD_YZaXJvnW1yBvlMcEsm7Y1N2U;D-bx+92>AU=Zl2;w7%pRf~11p6CGS)FVUNgZ1%OefwLu5;!FJd$a(X?q z!xk6>(yp!(IinUDf%1F-*)Je_W;#?r4Kx9|&LrKLq&ure;vuSOfLY4xJ)R>qV|E1?0XQ1zjRv z*(|bt3-rSdK>xL*`zrBYErK94!baE%+hCtaGx5#DHxu7n11-=Y^0jK%BXZp!92B{p zGG1Q=b<03_h45R*`<69O5B(x-J%G%uK^TGqBDaz6ZG_#P4!uA=?WDbf<2yD2 z_S`WD2UrZm2bE9@tpMqT{aW|@pln_7x8xye;4t05x*fB$^m;eG(#5*z>vt@ zq`jN8cUOztL)v>tdk^vV5PvUW_Y$_T1*o@;y?~AXv0G$Q6r=-bH=%n|09M0#=!9*s zPvk!GzOM+-ao=X>gY6<6jetxCGWTQC{Rc!Ipo|Yx0(m~r3f<5TJAn9aU_)mVx1|8eAqb6ty<0k93k(8zKNkaePzu%10L{<^2UXei?@__u`2tpmS0Wxn40s4N8zF%*H-6C&Bfggz9 zxdD1%JM0m8i@3MQ>n-wns}(i_>E0sUTL(qnjsfy|y9vHbhG^2bJzcWtPL{UUqU1MZ*Fp#Um@xIeYPAdvRGc&LC? zB7asIMfOz#`Rr?jPLcPq?foE-?k__ke2W`DE-A zBNKn-dgv1)D;?Ir7BPJBfZx{%OU^(d93IdguY< zrum@`c8ihI2&7@-IwQ9Qu$9wh-;u~3Nq8l;R-(J|fEdfLYZ)>};VvhBc@3az`F=5~8exwZM@IqS#}tckY^4|h z$`-)hK$jRRc8GD@M!-hKHO5NPti;BZ#I5YrC68e@92DdDWGE8jgaW|+6KdIT5`PeX z5I)-SdQV*qO=6rDCC2IKT#eir_|F&=;|u6H zlR8+lMU1n$V5=BsUDF6qxBpYz&*`1442ey13n&h4RY5s zi}BSOF`6m+brleVM%V~Ffd1==ffcfjluDDi-763NgBDAm6T1AWau(y4FJ* zbir0JzPVG3M@aVw=^hD)@n|<}XRD72*ek~4F=9MHnkUGo8+*Emdy=>(2VuV$Po)F? zrw)qoE$BhMryVxKHrOY|(}X>PEh8l3uLkrzyH$)W$Zy&00X_8fjBi)LDyWAR=zwnM zhn+zF&!hYKJlF^v_oBPE78=F)4tc!LAjVc32;Yj_)_yU*NBH-N|4-=i!4}vi#*5VL zi{$;%UcmhUZvOyKzJAK_!zd^c<7MPuChTRxev}O55P*7Ufz8kd$ovRBKVA>i-;aA? zrx>pYq(d>Rf+jJ3(k#X{n&pJ#J;zJV!VwFZ*PSmF@`AD5Me`&&=TS| z4PyLuwHUjI+eO?i;&!!*v70ozcZ%`5gJS%iJbqsx#(%{FdiJ!5@dxt%1L^*-9?16( z(Au-=Qh|W z#=fnvPmI5ycYi&Q?+57mpdB_tFKid%@6E7Zj04G#2iWxw^7#xMia8m*lkrd9CuSUJ;)stUecWa-b!y0mlhdfZl{!XoMC(UqTmbfqvK_ zW@4|HNy(50rBDT{pjOP}0wAyC0IUY`OeW9dR@exep%(^VP|TDT*Z|#tt*OMP5>KDb zOdSGjPos=!$fg|-Gra~H0Nc~CojG?ieH-i)Gb0}Suo~*170{P~z6|tbpd$kvnNg4q z1yBwFKu;Fwvq+y+43!XsPS_`=kFxqGtBmMgK$vHoII!kWOK+b2br89F>}c` z7unp^fP7vNR6sS<0P^%d&Ag4U8MXpx^LE32F{j&*4y2o22|*y;bka>H-SiIVfjxj7 zGfJTz$ZJL~Y!fpd9r@_UCvAQ$kS4zy$fLjq#ZU#Spbh$AP|U)32mrbY(N(xl%$YVM z19{9Od?s=;_lh}7U^Ngvi}bSypG9~PdW#4z>VZBnXQx9Ew7>>HW)3oQkeP$b9MaCk zrn!x(blfJWg!hSJ>{bHWfDdx!o zVy=o2^VBFYPtOzc3}n9G7jq3^XE%yjBY@6x>%}~e3O2uqMrm;ZGD~g~I z_KA6AC3K5KsI=c9yg zCjZBZ#eCc^<`aZ;>Xp^g#twi}_Lk91ydA6`<#b{ebKb_lx;* z6`=P=c~Av@C`SBXS#vgBltw7mdsRioum2T)4^CzVLNgM1Ia~pYX z!`5xYZQCd2Ps_!8)i37HR*ShEx$UIeJ^*`!4aLNKU1^36*eT}ED*^pK-y-G?WPgD@ zzrfC4<^l1)g25p`_Z#sLfW2b=dKJ_|3v2-L|8+m?0F6H==9|fYJ#Vf7@_ZA$Z*GBY zfZjLvi@DPVACy8BAiER2JJGvy1E6;&dUqnf6TNRC|5gED_gj>a`9bq7bicJx%(wlp z3f7DHP99VM$M4iaBeXyV^uc!6FXj;XhR`>Jz9IAtp>GI%L+BgY4aoea7>NH3_4Auf z=mpaMW(W?5`P(Q+2lVVh-!31NLKUn5%CoBl$a~io*akZR-Mjn5{M|k=e~*se`+>ZE zAAr@+0R6B-%soXw_#epQ52X1cVehU2?ARLw_$T82v`5VM1mc0T@3q24 z*b3-)k2?MHJ~8)2fgg$iz5AK~d-rVtbnnC7ef!0HKSs>IAo~|&|3aDmg3Mo#`3q(G z3wr)a++Wv-xgQ;WO9%4%+h*v4K|tmM?D>GW56J6-0MtMOAp7?`=z^_c9@q#yFaX&3 z4_nL+8{wds^uNu6?a(RaN7(QY`iIeVs8=lM5X;yomYEEB5P%)9TP!OIiXaGsuum+z z9eQ8@hG4%~5$Qm9M5kC2e1N_Q2gHi3hs{8`D1mrj>y@Z}*dx}&7$}BHsD)PO7Hbmv zCZQ{uu;}%0P^=g~R6!jy0d~jqi4{v8lcS&rg3t&puop&t&2l}3D8JrI`G3ERa=7a;HS4KO5Dh7AQ!4a8^c7mGf(mDvOX zfS#-(SP$J|`TP(BZ1in}gJMk~Y)UH-KV?v?smZV!up=8?+2v3tmcJ6}#hO+Pq@9Lr z4!UxSU@PntE3Z$i8R*Gh1LTq423(tYUP{L+5<#olp3D z!snBI{t)aFt0WmnQ$k!xpID{w&;T0%drJ3cu*`T&!cN#5xuNE~+NC)!c9T4kGY+AEZth2D; z>^A6u?PAr`ighkw=b`sJbeuON*7*Tg4V|zlc3i$i ztj0P({}mg>x)Ql7$^XjrVqF!48X%57uhoQnQyx?R;Z1}$bpSe=1_9ky`(X$Ui1p~l+VFPqSzgXAUfdATkVtp0=SJPo5^uPe@6|0%>W^^={LN(Ni^|f|D=4;5% zuePp>hn-?wzZ(vU)shV5V%^XQ{XpD}0(pR*8?oia2EdjZ$^S-VZrmeQYXIt@1vbMr zv2NM{~8wvZ5VzD;Wign)_K>vN{ysulVj;(-w_m>0paQ_~$9%uvNA0VE7zx9n| zsD~cdE>yI_LuQKZMSQ34fUIhgU%}5dQEEvAP5Z?;^ab z2|56M-%JO>zu5rT|IM9ZJ%a2brLZ14p&!uwDEU5${zs926g`h(>!TZ?2S~RWU7L#` z0F6NS<^k9*7Go3ZF~T1s&13C=&d1UBIN^`iLN{y&WS=O22G{`D^aQ%Qv8kK9yUDwI z6`-fP1$uxyx=HsWx}GGDCu^V$2!C=&tf$E5DZ-y3{3+5rwHeU)E%beh@Ncb$e%K>c z53)U#&1!Jr@t9uo|%KxlZVVA+f$41?c%Uao=tR^naW1=hLAE zTA>H_h}DZ+FLJ%@Feuh{1pH75&9EKziS+_Un2aaA+dfyem_9Z59*)?2F2=+2ju#Z>+gg<*eBKx zk^5l~+JUq$3;3Z1dSE;36YEFuPz+Uoo*&f%=jlh=fOG@oIZz3l*8%b!Xomryef^ko z`{N1-LIV)@<36!o5%2@yuMqZ14{R6fCxri`5^A6sI-w7Ci?xk>wjr}^k61q~f{kLm zD&Pm&%B!@KpQS^GSg$1m_PxGYte+G9bHa8si1mwNs1)m$jnEJ1{Z#=}Lnmy39dJOb z!Bs%|LG-*41?2f_(*HULd&PQ_yx;V}cHnqtvsiD%i1jvQekU37ARyLIt60C;Bi3(; z+eP|aHLwB5e>XaIqi=T`Y!mBu9RH4df7dS7@3Hy6dc@j8x;;fu1#6%YS^yn;x&S?Y zAl)A}L!VfGYy$H9V<+^&cGxf0yVT9Q8v&i~4!{r`5bICLP!0h=-+SnKkFfU&paNFG zUa|g+&Oej>&)B(dJz(Ga$i0uA_tEp0J{W{OV*M5S{)(=@lJ|aO_OFIE=mg~U?-%QD zeyE47Vtrr(`FudS576~@A5;Q5{yreqfl@%n0pbsko-vyBj|L#We<1&14505r;{I7D z)Y)Wl<*%M_@4!~RlyFir>ur1 zv8NI?Rb6ytBkMvG#mLU96?;DEOB%&4?E=y+=mGREKz^YQ z(6JC5Wqu&Pa%?Rh6nhbR7DoZ{OYkpA2J)=P18i9u52a8g_7TV*fxaV=KQbLE09%f% zhxKAt`k)eO0b7>gE^CEu*b3-9$_DZ{stC||6zPxJ2+-IuOROgq&=<<+5o$c+X2X~B>$D0wd*GnhtKxzDPOXPFK+mcDuoLzIGN+^O z^a4QtYV26u4&-x&0J_dhhbFPl@o6|f3wfqXCR1k$e~eqA5zhJ#`^Btt1w1F{Y4 z0ojIL*baMy-JgNHzJz_3H3I1_C*9?FK;D-Rh}~EKbSovo$X~q;u<^@L;0MxvIRG_4`meM>m)Ps~iG2++*C2CE zIiTa34PswQ*tO`rwidR+ezCt=1nqz=%{ySP*k6l*HnFd(gw?PfNPiu1*CBU3daoz! zdcv+Jzn0CgN9-F4fc$Rg75m0DfXvs4|2lE4=xp^t5o{OxraWi@^1g}qo5|1y`#(hNO@wbEk4@OKX^YtR<-rEA zJ5~Yt-yZ`3s2BSI{0|WSK!w=fr~&kSqf6}0Qoxo6k$aHv2U}n>^Z_gQqP9`1z!7y@Lw1k#}#NYh2$U2Q;K-z42PTcK0zN3iG7c(ECu*qb+q z{TOkKL+r=M|1tDFM*feH-(%$W_!_aF$b&7g4G4c?zu4WR=`MmQv7am!`zaq_!?&>E zTgZQl@E+1W?T6|Rj0fyzHi-Q!E`5LdS@L;yQ0y&1sDn1KpDTxUvA<2&x4XoC9$n9G z5<_Hix@=~*)gFoB4TgZU$gLvsUhGHQw{3jUtRP^CVNb+g4I#hoU(4Oy2{-w+m)?Nm zw`8GQ8TQ-Abcg*BvPtM+I5HDhhvK}jKMFrR2Pb?Y{(HjyN%BjB9+VRvYt1lkl;yHc z8suuZOxDUp(XD~%!!&5C7~6XE z{3(8qWg+_x&)v1@T&K-z+_{ude;t184wc$ZnC8ArPQul5w;1>EI=h^*=r6E=Sp6kw z+povfb8`{3bt37j$JjG^Mn9>hYSD5z8ddXoPCLE8spHVE>RhK*^0Dg_>{-FzeBAS} zP;U{Hll4^Tb!P=Pz%x)q31zM9s1>l;x0r&<@GmsF)=Emb$)>( zsb@>i+XY-Fv<<4pQJrgPsSVVG=2YvH{}g;$yPxMgk3CmfW7>-UpU$pqxsBtB_FyBp z?-Zj^_pj}#fbt}-kcXFdP#oZ z4p>R#Jh=D;`2|1vB_H57j4M*T}oz>C+_P1NJ1_`zF?6J2=O+ zMmoRFj%rEW68I3J{cltx!MDtbKZY>yUDo3#MnAh-6E)mVTZs>a!1sfT_7jPZ+8-y* zw?D>r@%GC;?2~@d%`_({7S_<#T=53!6`RM&DZq<6-+Bb7K5&;R%s!{p4Ya6Ov#WEi?}V#agheA1(Yw|7s{hy~z94NBGS zwGxR0mZ99ig&dEz#%2xof&{eO*0eDVnMI=J9|WyAgP9JcY)Tes*7JEkn)AF4!ITY2 zM>R?vmRY{c z%%hqw;f-b_X{hFh7?CU+Vzk0&B{ahz2uyg3M!Y(SU7y4@lXK{s+jNo9#qH?fgs3y) zVOs15K_d#tC zRkx7qCC;#YJdsB9Dn=11crZPb)ut73P?fWV$pIm0LdmX{2(1-W^cJIMOs56R!sMQ5 z{gcKx;Vt)YbOb-&Lx@Z(7Zi}h<93`#RH+eF9Gb9U0uIEuhqrJf0*xa=G{L=H^d?li zCb7_ja*Bix>QI~}y-+qoNt1A!LsRzlo*$nfy{{FnQW2XDVmQWz2{)#Y|)`}c5HAv4}Wv}1v^f1d)|&y+?sZr z=JtXeXSn^M9S?AO(T=m+K4Qm%+!k$kL;IgHAv|r#5*aV?X>rKz6VCO7uWO;xCtU0a z?`om61&tTav=c`CU7N~w_S=_(eG+;-3j4UVU>~;&u#ek3?BjM3_Hp|d?BjL`_Hp|q z*vD-F_HkRX<(fK3muwl*d?-=$jF598LQ5si*=3t973mVr<7FI$O=Rq;2hxgGEiUYz z$v`?f^msSK@mQwH8Aq23aoU)z`Y4JV#V7jQa~9`GTRx>Ue+sMVb*i5(6R19?YRlv5 z7n9qEWkGy;C-UB3zO)C?W_(8VQFRBWvOtTnjlT2DknC?-;FSev{lM{&I?Q^sgdli2f1 zat#+cYoE}AShN=k%H+|z2~qFaMF;WInHO4}Xrb~ubiKQq@_r{=AwS@pG`Sn%GU`W( zy|_W=Jilh*PL*pxDPA^aaBgoLlkS?eV^a5+v^%$dy^}LMo30f53EfHE4J$TXEjE#U zoMTO#^s{tBKufd?6|2f*PUA)G`3Mhat~Q<1*}_RH;pAz9Htcu^cMWI1%KZN=r8iGY zu>U8E+235p)~r=C*OxE3prhv|3h1lAjV$(Bdo@Fmq;cmHsOStQ;=WI@BdKPZ}s@)P|1E2$D7`8`-&A@rdR6Jg z=vzuJM&DL?G5U_ui_v$LUW~q{^kVdV_;{@sz}Hld$`HJ+;SIpM>~yA)i{1}#*8(!< z4Go#|rsA-GIX}eYYrR!}qxrk2PfaPq5B4z2r|dWWvuhWWvwEUGJ^;3)NHW z{Zd1wzojA5e}$Rrdc9w3$b{c$$b{d5d%d^b+p4G5`<;eN|GkDxzmJ*M^?HBMkO@r< znedL?8dguXlrdYWM6!yPCfsF#Tcqp(B^PSAe<<0rwx#&W+2tv?y?= zJo0>YBfFAa%+3#_hdM(qXP(QfXG)nz(rReL{b2TJ@@VvE@F-IjX)z4ir2By=_x|$O z`}kq%Un=o}aeoId3HN>UMWYfgasOdfbO!=6evF6ym3<5UdRo3;-|H~(mK6l$5kIq) iS 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%0Aw0hZvUv}G-f@iQa)fYtb+h0a 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 AR{#J2 literal 0 HcmV?d00001 diff --git a/include/TessesFramework/Common.hpp b/include/TessesFramework/Common.hpp index e19a84a..1c75c38 100644 --- a/include/TessesFramework/Common.hpp +++ b/include/TessesFramework/Common.hpp @@ -87,6 +87,17 @@ namespace Tesses::Framework } mtx.Unlock(); } + void Remove(std::function>)> cb) + { + for(auto index = this->items.begin(); index != this->items.end(); index++) + { + if(cb(*index)) + { + this->items.erase(index); + index--; + } + } + } }; extern EventList OnItteraton; diff --git a/include/TessesFramework/Http/HttpUtils.hpp b/include/TessesFramework/Http/HttpUtils.hpp index ba64ec7..5ac1be6 100644 --- a/include/TessesFramework/Http/HttpUtils.hpp +++ b/include/TessesFramework/Http/HttpUtils.hpp @@ -147,6 +147,7 @@ struct CaseInsensitiveLess { static std::string UrlPathDecode(std::string v); static std::string UrlPathEncode(std::string v, bool ignoreSpace=false); static std::string HtmlEncode(std::string v); + static std::string HtmlDecodeOnlyEntityNumber(std::string v); static std::vector SplitString(std::string text, std::string delimiter,std::size_t maxCnt = std::string::npos); static std::string Replace(std::string str, std::string find, std::string replace); static std::string StatusCodeString(StatusCode code); diff --git a/include/TessesFramework/SDL2/FontCache.hpp b/include/TessesFramework/SDL2/FontCache.hpp index 52e7d53..c7cb7e6 100644 --- a/include/TessesFramework/SDL2/FontCache.hpp +++ b/include/TessesFramework/SDL2/FontCache.hpp @@ -1,4 +1,5 @@ #pragma once + #if defined(TESSESFRAMEWORK_ENABLE_SDL2) #include #include @@ -11,17 +12,20 @@ class FontCache { std::array font_chrs; int mw,mh,ps; - void Load(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& color); + void Load(SDL_Renderer* renderer,TTF_Font* font); public: - FontCache(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& color); - FontCache(SDL_Renderer* renderer,std::string font,int sz,const SDL_Color& color); - FontCache(SDL_Renderer* renderer,const uint8_t* mem,size_t cnt,int sz,const SDL_Color& color); - FontCache(SDL_Renderer* renderer,const std::vector& v,int sz,const SDL_Color& color); - + FontCache(SDL_Renderer* renderer,TTF_Font* font); + FontCache(SDL_Renderer* renderer,std::string font,int sz); + FontCache(SDL_Renderer* renderer,const uint8_t* mem,size_t cnt,int sz); + FontCache(SDL_Renderer* renderer,const std::vector& v,int sz); + FontCache(SDL_Renderer* renderer,int sz); SDL_Texture* operator[](char c); + SDL_Texture* GetCharOfColor(char c, const SDL_Color& color); int MaxWidth(); int MaxHeight(); int PointSize(); + void CalculateSize(std::string text, int& x,int& y); + void Render(SDL_Renderer* renderer,int x,int y, std::string text, const SDL_Color& color); ~FontCache(); }; } diff --git a/include/TessesFramework/SDL2/GUI.hpp b/include/TessesFramework/SDL2/GUI.hpp new file mode 100644 index 0000000..dd1344e --- /dev/null +++ b/include/TessesFramework/SDL2/GUI.hpp @@ -0,0 +1,244 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include +#include "FontCache.hpp" +#include "../Filesystem/VFSFix.hpp" +#include "../Filesystem/VFS.hpp" +#include "../Common.hpp" +#include "../Serialization/Json.hpp" + +namespace Tesses::Framework::SDL2 +{ + class GUIPalette { + public: + GUIPalette(); + GUIPalette(bool isDarkMode, SDL_Color accent,int fontSize=24); + GUIPalette(SDL_Color accent, SDL_Color background, SDL_Color border_color, SDL_Color border_hover, SDL_Color border_active, SDL_Color border_hover_active, int fontSize=24); + SDL_Color accent; //color is used for font when not over accent background + SDL_Color background; + SDL_Color border_color; //color is used for font when over accent background + SDL_Color border_hover; + SDL_Color border_active; + SDL_Color border_hover_active; + int fontSize; + + SDL_Color& GetBorderColor(bool isHovering, bool isActive, bool isMouseDown); + }; + + class GUIEventArgs + { + public: + virtual std::string Type(); + virtual ~GUIEventArgs(); + }; + class View; + class GUIMouseButtonEventArgs : public GUIEventArgs + { + public: + Uint32 which; + int x; + int y; + Uint8 button; + std::string Type(); + }; + class GUIJsonViewNotFoundEventArgs : public GUIEventArgs + { + public: + std::string Type(); + View* destView; + Tesses::Framework::Serialization::Json::JObject jsonObject; + std::string typeString; + }; + class GUISDLEventEventArgs : public GUIEventArgs + { + public: + std::string Type(); + SDL_Event event; + }; + constexpr uint64_t VIEWFLAG_HOVER_STATE=(uint64_t)1 << 0; + constexpr uint64_t VIEWFLAG_MOUSEDOWN_STATE =(uint64_t)1<<1; + constexpr uint64_t VIEWFLAG_ISACTIVE=(uint64_t)1<<2; + constexpr uint64_t VIEWFLAG_TABSTOP=(uint64_t)1<<3; + constexpr uint64_t VIEWFLAG_INTERCEPT_TAB=(uint64_t)1<<4; + constexpr uint64_t VIEWFLAG_CHECKED=(uint64_t)1<<5; + class GUIPopup; + class GUIWindow; + class ContainerView; + class View { + protected: + std::string text; + std::string id; + uint64_t flags; + protected: + + View(); + View(std::string text); + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + virtual void OnDragDropFile(Tesses::Framework::Filesystem::VFSPath filePath,SDL_Rect myRect, SDL_Point dropLoc); + virtual void OnDragDropText(std::string text,SDL_Rect myRect, SDL_Point dropLoc); + virtual void OnEnter(GUIEventArgs& evt); + virtual void OnLeave(GUIEventArgs& evt); + virtual void OnMouseDown(GUIMouseButtonEventArgs& evt); + virtual void OnMouseUp(GUIMouseButtonEventArgs& evt); + virtual void OnClick(GUIEventArgs& evt); + virtual bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + virtual void OnSetParent(View* v); + + void CallOnDraw(View* view, SDL_Renderer* renderer, SDL_Rect& myRect) + { + view->OnDraw(renderer,myRect); + } + bool CallOnEvent(View* view,SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds) + { + return view->OnEvent(event,myBounds,visibleBounds); + } + + + ContainerView* parent; + + public: + bool GetViewFlag(uint64_t flag) + { + return (this->flags & flag) != 0; + } + void SetViewFlag(uint64_t flag, bool value) + { + if(value) + this->flags |= flag; + else + this->flags &= ~flag; + } + + EventList MouseUp; + EventList MouseDown; + EventList Click; + EventList Enter; + EventList Leave; + EventList SDLEvent; + virtual ~View(); + friend class GUIWindow; + virtual GUIWindow* GetWindow(); + virtual std::string GetText(); + virtual void SetText(std::string text); + virtual void SetId(std::string id); + virtual std::string GetId(); + virtual View* FindViewById(std::string id); + friend class ContainerView; + }; + class ContainerView : public View { + public: + virtual size_t ViewCount()=0; + virtual View* GetViewAt(size_t index)=0; + virtual View* FindViewById(std::string id); + protected: + ContainerView(); + ContainerView(std::string text); + + + + + void AssignChildParentToThis(View* view) + { + if(view != nullptr) + { + view->parent = this; + view->OnSetParent(this); + + } + } + }; + enum class TabNextResult { + KeepGoing, + TabNext, + Done + }; + class GUIPopup : public ContainerView { + View* child; + bool ownsChild; + protected: + void OnDraw(SDL_Renderer* renderer, SDL_Rect& myRect); + bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + public: + + size_t ViewCount(); + View* GetViewAt(size_t index); + GUIPopup(); + GUIPopup(SDL_Rect bounds); + GUIPopup(int x, int y,int w, int h); + SDL_Rect bounds; + + void SetView(View* view, bool owns=true); + ~GUIPopup(); + + friend class GUIWindow; + }; + class GUIWindow : public ContainerView + { + std::vector popups; + View* child; + bool ownsChild; + SDL_Window* window; + SDL_Renderer* renderer; + void Event(SDL_Event& event); + void Draw(); + void DeactivateAll(View* view); + void TabNext(View* view,TabNextResult& nr); + + protected: + void OnDraw(SDL_Renderer* renderer, SDL_Rect& myRect); + bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + + public: + EventList JsonViewNotFound; + size_t ViewCount(); + View* GetViewAt(size_t index); + FontCache* normal_font; + FontCache* monospaced_font; + GUIPalette palette; + GUIWindow(std::string title, int w, int h, Uint32 flags, const GUIPalette& palette); + void SetPalette(const GUIPalette& palette); + void SetView(View* view,bool owns=true); + + void ShowPopup(GUIPopup* popup); + void ShowPopup(GUIPopup& popup); + + void MakeActive(View* view); + void TabNext(); + GUIWindow* GetWindow(); + + ~GUIWindow(); + + friend class GUI; + friend class GUIPopup; + + void SetText(std::string text); + + void SetView(Tesses::Framework::Serialization::Json::JToken json); + + View* CreateViewFromJson(Tesses::Framework::Serialization::Json::JObject json); + }; + + + class GUI { + std::vector windows; + public: + void Update(); + friend class GUIWindow; + }; + extern GUI gui; + + class Clipper { + SDL_Rect theRect; + SDL_Renderer* renderer; + bool isClipped; + public: + Clipper(SDL_Renderer* renderer, SDL_Rect& myRect); + bool Clip(SDL_Rect rect); + ~Clipper(); + static void ClipRect(SDL_Rect& child, SDL_Rect& parent); + }; + + + +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/ParseColor.hpp b/include/TessesFramework/SDL2/ParseColor.hpp new file mode 100644 index 0000000..326a534 --- /dev/null +++ b/include/TessesFramework/SDL2/ParseColor.hpp @@ -0,0 +1,12 @@ +#pragma once + +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include +#include + +namespace Tesses::Framework::SDL2 +{ + bool TryParseSDLColor(std::string str, SDL_Color& col); +} + +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Stream.hpp b/include/TessesFramework/SDL2/Stream.hpp new file mode 100644 index 0000000..903ac86 --- /dev/null +++ b/include/TessesFramework/SDL2/Stream.hpp @@ -0,0 +1,9 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../Streams/Stream.hpp" +#include +namespace Tesses::Framework::SDL2 +{ + SDL_RWops* RwopsFromStream(Tesses::Framework::Streams::Stream* strm, bool owns=true); +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/AbsoluteView.hpp b/include/TessesFramework/SDL2/Views/AbsoluteView.hpp new file mode 100644 index 0000000..128ddb1 --- /dev/null +++ b/include/TessesFramework/SDL2/Views/AbsoluteView.hpp @@ -0,0 +1,33 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class AbsoluteView : public ContainerView { + std::vector,SDL_Rect>> views; + protected: + void OnDraw(SDL_Renderer* renderer, SDL_Rect& myRect); + bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + public: + size_t ViewCount(); + View* GetViewAt(size_t index); + AbsoluteView(); + void Add(SDL_Rect rect, View* view, bool owns=true); + void Set(View* view, SDL_Rect rect); + void Remove(View* view); + ~AbsoluteView(); + + }; + + /* class AbsoluteContainer : public View { + std::vector,SDL_Rect>> views; + public: + void Add(SDL_Rect rect, View* view, bool owns=true); + void Set(View* view, SDL_Rect rect); + void Remove(View* view); + + ~AbsoluteContainer(); + };*/ +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/ButtonView.hpp b/include/TessesFramework/SDL2/Views/ButtonView.hpp new file mode 100644 index 0000000..a18914c --- /dev/null +++ b/include/TessesFramework/SDL2/Views/ButtonView.hpp @@ -0,0 +1,18 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class ButtonView : public View { + protected: + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + virtual bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + + public: + ButtonView(); + ButtonView(std::string text); + + }; +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/CheckView.hpp b/include/TessesFramework/SDL2/Views/CheckView.hpp new file mode 100644 index 0000000..abbd872 --- /dev/null +++ b/include/TessesFramework/SDL2/Views/CheckView.hpp @@ -0,0 +1,25 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class CheckView : public View { + protected: + virtual void OnCheckChanged(GUIEventArgs& event); + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + virtual bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + + public: + CheckView(bool checked, std::string label); + CheckView(); + + virtual bool GetChecked(); + virtual void SetChecked(bool value); + + + + EventList CheckChanged; + }; +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/LabelView.hpp b/include/TessesFramework/SDL2/Views/LabelView.hpp new file mode 100644 index 0000000..112baa9 --- /dev/null +++ b/include/TessesFramework/SDL2/Views/LabelView.hpp @@ -0,0 +1,15 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class LabelView : public View { + protected: + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + public: + LabelView(); + LabelView(std::string text); + }; +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/ProgressView.hpp b/include/TessesFramework/SDL2/Views/ProgressView.hpp new file mode 100644 index 0000000..f371eda --- /dev/null +++ b/include/TessesFramework/SDL2/Views/ProgressView.hpp @@ -0,0 +1,17 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class ProgressView : public View + { + protected: + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + public: + ProgressView(); + ProgressView(double value); + double value; + }; +}; +#endif \ No newline at end of file diff --git a/include/TessesFramework/SDL2/Views/TextListView.hpp b/include/TessesFramework/SDL2/Views/TextListView.hpp new file mode 100644 index 0000000..9b62fae --- /dev/null +++ b/include/TessesFramework/SDL2/Views/TextListView.hpp @@ -0,0 +1,20 @@ +#pragma once +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "../GUI.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + class TextListView : public View { + + protected: + virtual void OnDraw(SDL_Renderer* renderer, SDL_Rect& r); + virtual bool OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds); + public: + TextListView(); + size_t firstIndex; + int selected; + std::vector items; + + }; +} +#endif \ No newline at end of file diff --git a/include/TessesFramework/Serialization/Json.hpp b/include/TessesFramework/Serialization/Json.hpp index 5a95c46..dedcde6 100644 --- a/include/TessesFramework/Serialization/Json.hpp +++ b/include/TessesFramework/Serialization/Json.hpp @@ -17,19 +17,7 @@ namespace Tesses::Framework::Serialization::Json class JOItem; - class JObject { - std::map map; - public: - JObject(); - JObject(std::initializer_list items); - void SetValue(std::string key, JToken item); - JToken GetValue(std::string key); - void Remove(std::string key); - std::map& GetMap(); - std::map::iterator begin(); - std::map::iterator end(); - }; - class JArray + class JArray { std::vector items; public: @@ -46,15 +34,36 @@ namespace Tesses::Framework::Serialization::Json std::vector::iterator begin(); std::vector::iterator end(); }; - class JOItem { + + + + + + class JObject { + std::map map; public: - JOItem(); - JOItem(std::string key, JToken value); - - std::string key; - JToken value; + JObject(); + JObject(std::initializer_list items); + void SetValue(std::string key, JToken item); + template + bool TryGetValueAsType(std::string key, T& value) + { + auto obj = GetValue(key); + if(std::holds_alternative(obj)) + { + value = std::get(obj); + return true; + } + return false; + } + + JToken GetValue(std::string key); + void Remove(std::string key); + std::map& GetMap(); + std::map::iterator begin(); + std::map::iterator end(); }; - template + template bool TryGetJToken(JToken json, T& item) { if(std::holds_alternative(json)) @@ -64,6 +73,16 @@ namespace Tesses::Framework::Serialization::Json } return false; } + class JOItem { + public: + JOItem(); + JOItem(std::string key, JToken value); + + std::string key; + JToken value; + }; + + class Json { diff --git a/include/TessesFramework/Streams/NetworkStream.hpp b/include/TessesFramework/Streams/NetworkStream.hpp index 85ce07c..5e67609 100644 --- a/include/TessesFramework/Streams/NetworkStream.hpp +++ b/include/TessesFramework/Streams/NetworkStream.hpp @@ -21,6 +21,13 @@ namespace Tesses::Framework::Streams bool IsValid(); void Close(); }; + enum class SocketType { + ST_IPv4_TCP, + ST_IPv4_UDP, + ST_IPv6_TCP, + ST_IPv6_UDP, + ST_UNIX + }; class NetworkStream : public Stream { int32_t sock; bool owns; @@ -30,7 +37,7 @@ namespace Tesses::Framework::Streams bool EndOfStream(); bool CanRead(); bool CanWrite(); - NetworkStream(bool ipV6,bool datagram); + NetworkStream(SocketType type); NetworkStream(std::string unixPath,bool isServer); NetworkStream(std::string ipOrFqdn, uint16_t port, bool datagram,bool broadcast,bool supportIPv6); NetworkStream(int32_t sock, bool owns); diff --git a/include/TessesFramework/Streams/PtyStream.hpp b/include/TessesFramework/Streams/PtyStream.hpp new file mode 100644 index 0000000..c8bb2b6 --- /dev/null +++ b/include/TessesFramework/Streams/PtyStream.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "Stream.hpp" +namespace Tesses::Framework::Streams +{ + struct WindowSize { + uint16_t Width; + uint16_t Height; + uint16_t Columns; + uint16_t Rows; + }; + class PtyStream : public Stream + { + int socket; + int64_t pid; + bool eos; + WindowSize wS; + + public: + PtyStream(WindowSize sz,std::string filename, std::vector args,std::vector env); + bool EndOfStream(); + bool CanRead(); + bool CanWrite(); + size_t Read(uint8_t* buff, size_t sz); + size_t Write(const uint8_t* buff, size_t sz); + void Resize(WindowSize sz); + WindowSize GetWindowSize(); + ~PtyStream(); + }; +} \ No newline at end of file diff --git a/include/TessesFramework/TessesFramework.hpp b/include/TessesFramework/TessesFramework.hpp index 463c1fc..c1c665e 100644 --- a/include/TessesFramework/TessesFramework.hpp +++ b/include/TessesFramework/TessesFramework.hpp @@ -14,6 +14,10 @@ #include "Streams/ByteWriter.hpp" #include "TextStreams/StreamReader.hpp" #include "TextStreams/StreamWriter.hpp" +#include "TextStreams/StdIOReader.hpp" +#include "TextStreams/StdIOWriter.hpp" +#include "TextStreams/StringReader.hpp" +#include "TextStreams/StringWriter.hpp" #include "Threading/Thread.hpp" #include "Threading/Mutex.hpp" #include "Threading/ThreadPool.hpp" @@ -28,4 +32,6 @@ #include "Mail/Smtp.hpp" #include "HiddenField.hpp" #include "Serialization/Json.hpp" -#include "SDL2/FontCache.hpp" \ No newline at end of file +#include "SDL2/FontCache.hpp" +#include "SDL2/Stream.hpp" +#include "SDL2/GUI.hpp" \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StdIOReader.hpp b/include/TessesFramework/TextStreams/StdIOReader.hpp new file mode 100644 index 0000000..abf6883 --- /dev/null +++ b/include/TessesFramework/TextStreams/StdIOReader.hpp @@ -0,0 +1,13 @@ +#include "TextReader.hpp" + + +namespace Tesses::Framework::TextStreams +{ + class ConsoleReader : public TextReader { + public: + ConsoleReader(); + bool ReadBlock(std::string& str,size_t sz); + }; + + ConsoleReader StdIn(); +} \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StdIOWriter.hpp b/include/TessesFramework/TextStreams/StdIOWriter.hpp new file mode 100644 index 0000000..3b4c293 --- /dev/null +++ b/include/TessesFramework/TextStreams/StdIOWriter.hpp @@ -0,0 +1,15 @@ +#include "TextWriter.hpp" + + +namespace Tesses::Framework::TextStreams +{ + class ConsoleWriter : public TextWriter { + bool isError; + public: + ConsoleWriter(bool isError=false); + void WriteData(const char* text, size_t len); + }; + + ConsoleWriter StdOut(); + ConsoleWriter StdErr(); +} \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StreamReader.hpp b/include/TessesFramework/TextStreams/StreamReader.hpp index bc97ee6..651d8c2 100644 --- a/include/TessesFramework/TextStreams/StreamReader.hpp +++ b/include/TessesFramework/TextStreams/StreamReader.hpp @@ -14,6 +14,7 @@ namespace Tesses::Framework::TextStreams StreamReader(Tesses::Framework::Streams::Stream* strm, bool owns); StreamReader(std::filesystem::path filename); bool ReadBlock(std::string& str,size_t sz); + bool Rewind(); ~StreamReader(); }; } \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StringReader.hpp b/include/TessesFramework/TextStreams/StringReader.hpp new file mode 100644 index 0000000..8bd8f7c --- /dev/null +++ b/include/TessesFramework/TextStreams/StringReader.hpp @@ -0,0 +1,15 @@ +#include "TextReader.hpp" + +namespace Tesses::Framework::TextStreams { + class StringReader : public TextReader { + std::string str; + size_t offset; + public: + StringReader(); + StringReader(std::string str); + size_t& GetOffset(); + std::string& GetString(); + bool Rewind(); + bool ReadBlock(std::string& str,size_t sz); + }; +} \ No newline at end of file diff --git a/include/TessesFramework/TextStreams/StringWriter.hpp b/include/TessesFramework/TextStreams/StringWriter.hpp new file mode 100644 index 0000000..b6c002d --- /dev/null +++ b/include/TessesFramework/TextStreams/StringWriter.hpp @@ -0,0 +1,15 @@ +#pragma once +#include "TextWriter.hpp" + +namespace Tesses::Framework::TextStreams +{ + class StringWriter : public TextWriter { + private: + std::string text; + public: + std::string& GetString(); + StringWriter(); + StringWriter(std::string str); + void WriteData(const char* text, size_t len); + }; +} diff --git a/include/TessesFramework/TextStreams/TextReader.hpp b/include/TessesFramework/TextStreams/TextReader.hpp index 521cbfd..96da392 100644 --- a/include/TessesFramework/TextStreams/TextReader.hpp +++ b/include/TessesFramework/TextStreams/TextReader.hpp @@ -6,6 +6,7 @@ namespace Tesses::Framework::TextStreams class TextReader { public: + virtual bool Rewind(); virtual bool ReadBlock(std::string& str,size_t sz)=0; int32_t ReadChar(); std::string ReadLine(); diff --git a/include/TessesFramework/TextStreams/TextWriter.hpp b/include/TessesFramework/TextStreams/TextWriter.hpp index 50bdc82..5c75351 100644 --- a/include/TessesFramework/TextStreams/TextWriter.hpp +++ b/include/TessesFramework/TextStreams/TextWriter.hpp @@ -3,14 +3,73 @@ namespace Tesses::Framework::TextStreams { + class NewLine {}; //dummy class class TextWriter { public: TextWriter(); std::string newline; virtual void WriteData(const char* text, size_t len)=0; - void Write(std::string txt); + void Write(int64_t n); + void Write(uint64_t n); + void Write(const void* ptr); + void Write(const char* ptr); + void Write(char c); + void Write(double d); + void Write(std::string text); + inline TextWriter& operator<<(int64_t n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(uint64_t n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(const void* n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(const char* n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(char n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(double n) + { + Write(n); + return *this; + } + inline TextWriter& operator<<(std::string n) + { + Write(n); + return *this; + } + + inline TextWriter& operator<<(NewLine nl) + { + WriteLine(); + return *this; + } + void WriteLine(std::string txt); + void WriteLine(int64_t n); + void WriteLine(uint64_t n); + void WriteLine(const void* ptr); + void WriteLine(const char* ptr); + void WriteLine(char c); + void WriteLine(double d); + void WriteLine(); + virtual ~TextWriter(); }; + + } \ No newline at end of file diff --git a/src/Date/Date.cpp b/src/Date/Date.cpp index 94aa52b..5d6ecb4 100644 --- a/src/Date/Date.cpp +++ b/src/Date/Date.cpp @@ -10,7 +10,7 @@ namespace Tesses::Framework::Date { int GetTimeZone() { - #if defined(__SWITCH__) || defined(_WIN32) || defined(GEKKO) + #if defined(__SWITCH__) || defined(_WIN32) || defined(GEKKO) || defined(__PS2__) return (int)(-_timezone); #else return (int)(-timezone); @@ -18,7 +18,7 @@ namespace Tesses::Framework::Date } bool TimeZoneSupportDST() { - #if defined(__SWITCH__) || defined(_WIN32) || defined(GEKKO) + #if defined(__SWITCH__) || defined(_WIN32) || defined(GEKKO) || defined(__PS2__) return _daylight == 1; #else return daylight == 1; @@ -56,9 +56,9 @@ namespace Tesses::Framework::Date secs /= 60; hour = secs % 24; - day = (int)(uint32_t)ymd.day(); - month = (int)(uint32_t)ymd.month(); - year = (int32_t)ymd.year(); + day = (int)(unsigned)ymd.day(); + month = (int)(unsigned)ymd.month(); + year = (int)ymd.year(); } DateTime::DateTime(int64_t epoch) { @@ -141,7 +141,7 @@ namespace Tesses::Framework::Date date::year_month_day ymd(epoch); - auto month = (uint32_t)ymd.month(); + auto month = (unsigned)ymd.month(); if(month > 3 && month < 11) { @@ -149,7 +149,7 @@ namespace Tesses::Framework::Date } else if(month == 3) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day > 14) isDST=true; else if(day >= 8 && day <= 14) { @@ -172,7 +172,7 @@ namespace Tesses::Framework::Date } else if(month == 11) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day >= 1 && day <= 7) { date::year_month_weekday ymw(epoch); @@ -220,7 +220,7 @@ namespace Tesses::Framework::Date date::year_month_day ymd(epoch); - auto month = (uint32_t)ymd.month(); + auto month = (unsigned)ymd.month(); if(month > 3 && month < 11) { @@ -228,7 +228,7 @@ namespace Tesses::Framework::Date } else if(month == 3) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day > 14) isDST=true; else if(day >= 8 && day <= 14) { @@ -251,7 +251,7 @@ namespace Tesses::Framework::Date } else if(month == 11) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day >= 1 && day <= 7) { date::year_month_weekday ymw(epoch); @@ -357,7 +357,7 @@ namespace Tesses::Framework::Date date::year_month_day ymd(epoch); - auto month = (uint32_t)ymd.month(); + auto month = (unsigned)ymd.month(); if(month > 3 && month < 11) { @@ -365,7 +365,7 @@ namespace Tesses::Framework::Date } else if(month == 3) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day > 14) isDST=true; else if(day >= 8 && day <= 14) { @@ -388,7 +388,7 @@ namespace Tesses::Framework::Date } else if(month == 11) { - auto day = (uint32_t)ymd.day(); + auto day = (unsigned)ymd.day(); if(day >= 1 && day <= 7) { date::year_month_weekday ymw(epoch); diff --git a/src/Http/ContentDisposition.cpp b/src/Http/ContentDisposition.cpp index f70f547..b8a3c44 100644 --- a/src/Http/ContentDisposition.cpp +++ b/src/Http/ContentDisposition.cpp @@ -36,7 +36,11 @@ namespace Tesses::Framework::Http p = p.substr(1, p.size()-2); } + p = HttpUtils::UrlPathDecode(p); + + + cd.filename = p; } else if(res2[0] == "name") diff --git a/src/Http/FileServer.cpp b/src/Http/FileServer.cpp index c23a299..5553109 100644 --- a/src/Http/FileServer.cpp +++ b/src/Http/FileServer.cpp @@ -75,7 +75,7 @@ namespace Tesses::Framework::Http if(this->allowListing) { std::string p = HttpUtils::HtmlEncode(ctx.originalPath); - std::string html = "Index of "; + std::string html = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>Index of "; html.append(p); html.append("

Index of "); html.append(p); diff --git a/src/Http/HttpServer.cpp b/src/Http/HttpServer.cpp index 85ff563..9de22d2 100644 --- a/src/Http/HttpServer.cpp +++ b/src/Http/HttpServer.cpp @@ -9,19 +9,18 @@ #include "TessesFramework/Crypto/MbedHelpers.hpp" #include "TessesFramework/Threading/Mutex.hpp" #include "TessesFramework/Common.hpp" +#include "TessesFramework/TextStreams/StdIOWriter.hpp" #include using FileStream = Tesses::Framework::Streams::FileStream; using Stream = Tesses::Framework::Streams::Stream; using SeekOrigin = Tesses::Framework::Streams::SeekOrigin; using MemoryStream = Tesses::Framework::Streams::MemoryStream; -using StreamReader = Tesses::Framework::TextStreams::StreamReader; -using StreamWriter = Tesses::Framework::TextStreams::StreamWriter; using TcpServer = Tesses::Framework::Streams::TcpServer; using NetworkStream = Tesses::Framework::Streams::NetworkStream; using BufferedStream = Tesses::Framework::Streams::BufferedStream; - +using namespace Tesses::Framework::TextStreams; namespace Tesses::Framework::Http { @@ -503,6 +502,7 @@ namespace Tesses::Framework::Http else { auto strm = cb(ct, cd1.filename, cd1.fieldName); + if(strm == nullptr) strm = new Stream(); bool retVal = parseUntillBoundaryEnd(&ctx->GetStream(),strm,boundary); delete strm; return retVal; @@ -635,13 +635,13 @@ namespace Tesses::Framework::Http { TF_LOG("Before printing interfaces"); - std::cout << "\x1B[34mInterfaces:\n"; + StdOut() << "\x1B[34mInterfaces:" << NewLine(); for(auto _ip : NetworkStream::GetIPs()) { - std::cout << "\x1B[32m"; - std::cout << _ip.first << ": "; - std::cout << "\x1B[35mhttp://"; - std::cout << _ip.second << ":" << std::to_string(this->GetPort()) << "/\n"; + StdOut() << "\x1B[32m" + << _ip.first << ": " + << "\x1B[35mhttp://" + << _ip.second << ":" << (uint64_t)this->GetPort() << "/" << NewLine(); } @@ -649,7 +649,7 @@ namespace Tesses::Framework::Http if(this->showARTL) { if(!svr->IsValid()) std::cout << "\x1B[31mError, we failed to bind or something\x1B[39m\n" << std::endl; - std::cout << "\x1B[31mAlmost Ready to Listen\x1B[39m\n"; + StdOut() << "\x1B[31mAlmost Ready to Listen\x1B[39m" << NewLine(); } TF_LOG("After printing interfaces"); diff --git a/src/Http/HttpUtils.cpp b/src/Http/HttpUtils.cpp index 8a0e3b1..11caaa7 100644 --- a/src/Http/HttpUtils.cpp +++ b/src/Http/HttpUtils.cpp @@ -516,6 +516,68 @@ namespace Tesses::Framework::Http { } return strs; } + std::string HttpUtils::HtmlDecodeOnlyEntityNumber(std::string v) + { + std::string buff={}; + int state = 0; + uint64_t n=0; + for(auto item : v) + { + switch(state) + { + case 0: + if(item == '&') state=1; + else buff.push_back(item); + break; + case 1: + if(item == '#') {state = 2; n=0;} + else {state=0; buff.push_back('&'); buff.push_back(item); } + break; + case 2: + if(item == ';') { + state = 0; + if(n <= 0x7F) + { + buff.push_back((char)n); + } + else if(n >= 0x80 && n <= 0x7FF) + { + uint8_t high = 0b11000000 | ((uint8_t)(n >> 6) & 0b00011111); + uint8_t low = 0b10000000 | ((uint8_t)(n) & 0b00111111); + buff.push_back((char)high); + buff.push_back((char)low); + } + else if(n >= 0x800 && n <= 0xFFFF) + { + uint8_t high = 0b11100000 | ((uint8_t)(n >> 12) & 0b00001111); + uint8_t low = 0b10000000 | ((uint8_t)(n >> 6) & 0b00111111); + uint8_t lowest = 0b10000000 | ((uint8_t)(n) & 0b00111111); + buff.push_back((char)high); + buff.push_back((char)low); + buff.push_back((char)lowest); + } + else if(n >= 0x010000 && n <= 0x10FFFF) + { + uint8_t highest = 0b11110000 | ((uint8_t)(n >> 18) & 0b00000111); + uint8_t high = 0b10000000 | ((uint8_t)(n >> 12) & 0b00111111); + uint8_t low = 0b10000000 | ((uint8_t)(n >> 6) & 0b00111111); + uint8_t lowest = 0b10000000 | ((uint8_t)(n) & 0b00111111); + buff.push_back((char)highest); + + buff.push_back((char)high); + buff.push_back((char)low); + buff.push_back((char)lowest); + } + } + else if(item >= '0' && item <= '9') + { + n *= 10; + n += item - '0'; + } + } + } + return buff; + } std::string HttpUtils::HtmlEncode(std::string html) { std::string myHtml = {}; diff --git a/src/SDL2/FontCache.cpp b/src/SDL2/FontCache.cpp index 69c3d56..46d1ede 100644 --- a/src/SDL2/FontCache.cpp +++ b/src/SDL2/FontCache.cpp @@ -1,7 +1,10 @@ #if defined(TESSESFRAMEWORK_ENABLE_SDL2) #include "TessesFramework/SDL2/FontCache.hpp" +#include "TessesFramework/Http/HttpUtils.hpp" +#include "TessesFramework/TanoheSans-Regular.h" +using HU= Tesses::Framework::Http::HttpUtils; namespace Tesses::Framework::SDL2 { -void FontCache::Load(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& color) +void FontCache::Load(SDL_Renderer* renderer,TTF_Font* font) { this->mw=0; this->mh=0; @@ -9,7 +12,7 @@ void FontCache::Load(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& colo for(size_t i = 0; i < this->font_chrs.size();i++) { - SDL_Surface* surf = TTF_RenderGlyph_Blended(font,(Uint16)(i+32),color); + SDL_Surface* surf = TTF_RenderGlyph_Blended(font,(Uint16)(i+32),{.r=255,.g=255,.b=255,.a=255}); if(surf->w > this->mw) mw = surf->w; if(surf->h > this->mh) mh = surf->h; this->font_chrs[i] = SDL_CreateTextureFromSurface(renderer,surf); @@ -17,35 +20,123 @@ void FontCache::Load(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& colo } } -FontCache::FontCache(SDL_Renderer* renderer,std::string font,int sz,const SDL_Color& color) +FontCache::FontCache(SDL_Renderer* renderer,std::string font,int sz) { TTF_Font* f = TTF_OpenFont(font.c_str(),sz); - Load(renderer,f,color); + Load(renderer,f); TTF_CloseFont(f); } -FontCache::FontCache(SDL_Renderer* renderer,const uint8_t* mem,size_t cnt,int sz,const SDL_Color& color) +FontCache::FontCache(SDL_Renderer* renderer,const uint8_t* mem,size_t cnt,int sz) { TTF_Font* f = TTF_OpenFontRW(SDL_RWFromConstMem(mem,cnt),1,sz); - Load(renderer,f,color); + Load(renderer,f); TTF_CloseFont(f); } -FontCache::FontCache(SDL_Renderer* renderer,const std::vector& v,int sz,const SDL_Color& color) : FontCache(renderer,v.data(),v.size(),sz,color) +FontCache::FontCache(SDL_Renderer* renderer,const std::vector& v,int sz) : FontCache(renderer,v.data(),v.size(),sz) { } -FontCache::FontCache(SDL_Renderer* renderer,TTF_Font* font,const SDL_Color& color) +FontCache::FontCache(SDL_Renderer* renderer,TTF_Font* font) { - this->Load(renderer,font,color); + this->Load(renderer,font); } +FontCache::FontCache(SDL_Renderer* renderer,int sz) : FontCache(renderer,TANOHESANSREGULAR,TANOHESANSREGULAR_SIZE,sz) +{ + +} +void FontCache::CalculateSize(std::string text, int& x,int& y) +{ + int myX = 0; + x=0; + y=0; + int maxH = MaxHeight(); + y=maxH; + for(auto c : text) + { + switch(c) + { + case '\n': + { + y += maxH; + if(myX > x) x = myX; + myX = 0; + } + break; + case '\t': + { + auto tex = operator[](' '); + int wi; + SDL_QueryTexture(tex,NULL,NULL,&wi,NULL); + + myX += wi * 4; + } + break; + default: + { + auto tex = operator[](c); + int wi; + int he; + SDL_QueryTexture(tex,NULL,NULL,&wi,&he); + + myX += wi; + } + break; + } + } + if(myX > x) x = myX; +} +void FontCache::Render(SDL_Renderer* renderer,int x,int y, std::string text,const SDL_Color& color) +{ + int myX = x; + int maxH = MaxHeight(); + for(auto c : text) + { + switch(c) + { + case '\n': + { + y += maxH; + myX = x; + } + break; + case '\t': + { + auto tex = GetCharOfColor(' ',color); + int wi; + SDL_QueryTexture(tex,NULL,NULL,&wi,NULL); + + myX += wi * 4; + } + break; + default: + { + auto tex = GetCharOfColor(c,color); + int wi; + int he; + SDL_QueryTexture(tex,NULL,NULL,&wi,&he); + SDL_Rect src={.x=0,.y=0,.w=wi,.h=he}; + + SDL_Rect dest={.x=myX,.y=y,.w=wi,.h=he}; + + myX += wi; + SDL_RenderCopy(renderer,tex,&src,&dest); + } + break; + + } + } +} +SDL_Texture* FontCache::GetCharOfColor(char c, const SDL_Color& color) +{ + auto res = (c >= 32 && c <= 126) ? this->font_chrs[c-32] : this->font_chrs[95]; + SDL_SetTextureColorMod(res,color.r,color.g,color.b); + return res; +} SDL_Texture* FontCache::operator[](char c) { - if(c >= 32 && c <= 126) - { - return this->font_chrs[c-32]; - } - return this->font_chrs[95]; + return GetCharOfColor(c,{.r=255,.g=255,.b=255,.a=255}); } FontCache::~FontCache() { @@ -65,5 +156,121 @@ int FontCache::PointSize() { return this->ps; } + +bool TryParseSDLColor(std::string str, SDL_Color& col) +{ + str = HU::Replace(str," ",""); + //rgba(255,255,255,1.0) + //rgb(197, 30, 30) + //#rgb + //#rgba + //#rrggbb + //#rrggbbaa + + if(str.size() >= 4 && str[0] == '#') + { + if(str.size() == 4) + { + auto r = HU::HexToNibble(str[1]); + r |= r << 4; + auto g = HU::HexToNibble(str[2]); + g |= g << 4; + auto b = HU::HexToNibble(str[3]); + b |= b << 4; + col.r = r; + col.g = g; + col.b = b; + col.a = 255; + return true; + } + else if(str.size() == 5) + { + auto r = HU::HexToNibble(str[1]); + r |= r << 4; + auto g = HU::HexToNibble(str[2]); + g |= g << 4; + auto b = HU::HexToNibble(str[3]); + b |= b << 4; + auto a = HU::HexToNibble(str[4]); + a |= a << 4; + col.r = r; + col.g = g; + col.b = b; + col.a = a; + return true; + } + else if(str.size() == 7) { + auto r = HU::HexToNibble(str[1]); + r |= HU::HexToNibble(str[2]) << 4; + auto g = HU::HexToNibble(str[3]); + g |= HU::HexToNibble(str[4]) << 4; + auto b = HU::HexToNibble(str[5]); + b |= HU::HexToNibble(str[6]) << 4; + + col.r = r; + col.g = g; + col.b = b; + col.a = 255; + return true; + } + else if(str.size() == 9) + { + auto r = HU::HexToNibble(str[1]); + r |= HU::HexToNibble(str[2]) << 4; + auto g = HU::HexToNibble(str[3]); + g |= HU::HexToNibble(str[4]) << 4; + auto b = HU::HexToNibble(str[5]); + b |= HU::HexToNibble(str[6]) << 4; + auto a = HU::HexToNibble(str[7]); + a |= HU::HexToNibble(str[8]) << 4; + + col.r = r; + col.g = g; + col.b = b; + col.a = a; + return true; + } + } + else if(str.size() > 4 && strncmp(str.c_str(),"rgb(",4) == 0 && str[str.size()-1] == ')') + { + str = HU::Replace(str.substr(4),")",""); + auto parts = HU::SplitString(str,","); + if(parts.size() != 3) return false; + try{ + auto r = std::stoul(parts[0]); + auto g = std::stoul(parts[1]); + auto b = std::stoul(parts[2]); + col.r = (Uint8)r; + col.g = (Uint8)g; + col.b = (Uint8)b; + col.a = 255; + } catch(...) { + return false; + } + + return true; + } + else if(str.size() > 5 && strncmp(str.c_str(),"rgba(",5) == 0 && str[str.size()-1] == ')') + { + str = HU::Replace(str.substr(5),")",""); + auto parts = HU::SplitString(str,","); + if(parts.size() != 4) return false; + try{ + auto r = std::stoul(parts[0]); + auto g = std::stoul(parts[1]); + auto b = std::stoul(parts[2]); + double a= std::stod(parts[3]); + col.r = (Uint8)r; + col.g = (Uint8)g; + col.b = (Uint8)b; + col.a = (Uint8)(a * 255); + } catch(...) { + return false; + } + return true; + } + return false; +} + } #endif \ No newline at end of file diff --git a/src/SDL2/GUI.cpp b/src/SDL2/GUI.cpp new file mode 100644 index 0000000..aa119ef --- /dev/null +++ b/src/SDL2/GUI.cpp @@ -0,0 +1,231 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/GUI.hpp" +#include +namespace Tesses::Framework::SDL2 +{ + GUI gui; + void GUI::Update() + { + if(this->windows.empty()) return; + for(auto index = this->windows.begin(); index != this->windows.end(); index++) + { + if(*index == nullptr) + { + this->windows.erase(index); + index--; + } + } + if(this->windows.empty()) return; + + + SDL_Event event; + while(SDL_PollEvent(&event)) + { + + for(auto win : this->windows) + { + if(win == nullptr) continue; + auto id = SDL_GetWindowID(win->window); + switch(event.type) + { + case SDL_EventType::SDL_WINDOWEVENT: + if(event.window.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_MOUSEBUTTONDOWN: + case SDL_EventType::SDL_MOUSEBUTTONUP: + if(event.button.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_MOUSEMOTION: + if(event.motion.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_MOUSEWHEEL: + if(event.wheel.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_KEYUP: + case SDL_EventType::SDL_KEYDOWN: + if(event.key.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_TEXTEDITING: + if(event.edit.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_TEXTEDITING_EXT: + if(event.editExt.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_TEXTINPUT: + if(event.text.windowID == id) + { + win->Event(event); + } + break; + case SDL_EventType::SDL_DROPBEGIN: + case SDL_EventType::SDL_DROPCOMPLETE: + case SDL_EventType::SDL_DROPFILE: + case SDL_EventType::SDL_DROPTEXT: + if(event.drop.windowID == id) + { + win->Event(event); + } + break; + default: + win->Event(event); + break; + } + + } + + if(event.type == SDL_QUIT) + { + TF_SetIsRunning(false); + break; + } + } + for(auto item : this->windows) + { + if(item != nullptr) + item->Draw(); + } + } + + + Clipper::Clipper(SDL_Renderer* renderer, SDL_Rect& myRect) + { + this->isClipped=SDL_RenderIsClipEnabled(renderer); + SDL_RenderGetClipRect(renderer,&this->theRect); + if(!this->isClipped) this->theRect = myRect; + this->renderer = renderer; + } + void Clipper::ClipRect(SDL_Rect& child, SDL_Rect& parent) + { + if(child.x < parent.x) + { + int rem = parent.x- child.x; + child.x += rem; + child.w -= rem; + } + if(child.y < parent.y) + { + int rem = parent.y- child.y; + child.y += rem; + child.h -= rem; + } + + if((child.x + child.w) > (parent.x + parent.w)) + child.w = (parent.x + parent.w) - child.x; + + if((child.y + child.h) > (parent.y + parent.h)) + child.h = (parent.y + parent.h) - child.y; + + } + bool Clipper::Clip(SDL_Rect rect) + { + ClipRect(rect,this->theRect); + if(rect.w <= 0 || rect.h <= 0) return false; + + SDL_RenderSetClipRect(renderer, &rect); + return true; + } + Clipper::~Clipper() + { + if(isClipped) SDL_RenderSetClipRect(renderer, &this->theRect); + else SDL_RenderSetClipRect(renderer, nullptr); + } + + GUIPalette::GUIPalette() + { + this->fontSize=24; + } + SDL_Color& GUIPalette::GetBorderColor(bool isHovering, bool isActive, bool isMouseDown) + { + bool isHovering2=isHovering ^ isMouseDown; + if(isHovering2 && isActive) + return this->border_hover_active; + if(isHovering2) + return this->border_hover; + if(isActive) + return this->border_active; + return this->border_color; + } + + GUIPalette::GUIPalette(SDL_Color accent, SDL_Color background, SDL_Color border_color, SDL_Color border_hover, SDL_Color border_active, SDL_Color border_hover_active, int fontSize) + { + this->accent=accent; + this->background = background; + this->border_color=border_color; + this->border_hover = border_hover; + this->border_active = border_active; + this->border_hover_active=border_hover_active; + this->fontSize = fontSize; + } + + std::string GUIEventArgs::Type() + { + return "Base"; + } + GUIEventArgs::~GUIEventArgs() + { + + } + std::string GUIMouseButtonEventArgs::Type() + { + return "MouseButton"; + } + std::string GUIJsonViewNotFoundEventArgs::Type() + { + return "JsonViewNotFound"; + } + std::string GUISDLEventEventArgs::Type() + { + return "SDLEvent"; + } + + GUIPalette::GUIPalette(bool isDarkMode, SDL_Color accent,int fontSize) + { + this->accent = accent; + this->fontSize = fontSize; + + if(isDarkMode) + { + this->background = {.r = 42,.g=42,.b=42,.a=255}; + this->border_color = {.r=0,.g=0,.b=0,.a=255}; + this->border_hover = {.r=92,.g=92,.b=92,.a=255}; + + this->border_active = {.r=200,.g=200,.b=200,.a=255}; + this->border_hover_active = {.r=(uint8_t)(255-accent.r),.g=(uint8_t)(255-accent.g),.b=(uint8_t)(255-accent.b),.a=255}; + + } + else + { + this->background = {.r=239,.g=239,.b=239,.a=255}; + this->border_color = {.r=0,.g=0,.b=0,.a=255}; + + this->border_active = {.r=92,.g=92,.b=92,.a=255}; + + this->border_hover = {.r=200,.g=200,.b=200,.a=255}; + + this->border_hover_active = {.r=(uint8_t)(255-accent.r),.g=(uint8_t)(255-accent.g),.b=(uint8_t)(255-accent.b),.a=255}; + } + } + +} +#endif \ No newline at end of file diff --git a/src/SDL2/GUIWindow.cpp b/src/SDL2/GUIWindow.cpp new file mode 100644 index 0000000..d80fbdf --- /dev/null +++ b/src/SDL2/GUIWindow.cpp @@ -0,0 +1,367 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/GUI.hpp" +#include "TessesFramework/aardvark-fixed-regular.h" +#include "TessesFramework/SDL2/Views/ButtonView.hpp" +#include "TessesFramework/SDL2/Views/LabelView.hpp" +#include "TessesFramework/SDL2/Views/CheckView.hpp" +#include "TessesFramework/SDL2/Views/ProgressView.hpp" +#include "TessesFramework/SDL2/Views/TextListView.hpp" +#include "TessesFramework/SDL2/Views/AbsoluteView.hpp" +#include "TessesFramework/SDL2/ParseColor.hpp" +namespace Tesses::Framework::SDL2 +{ + void GUIWindow::MakeActive(View* view) + { + if(!view->GetViewFlag(VIEWFLAG_TABSTOP)) return; + if(view->GetViewFlag(VIEWFLAG_ISACTIVE)) return; + DeactivateAll(this); + view->SetViewFlag(VIEWFLAG_ISACTIVE,true); + } + void GUIWindow::DeactivateAll(View* view) + { + view->SetViewFlag(VIEWFLAG_ISACTIVE,false); + auto cv = dynamic_cast(view); + if(cv != nullptr) + { + for(size_t i = 0; i < cv->ViewCount();i++) + { + DeactivateAll(cv->GetViewAt(i)); + } + } + } + void GUIWindow::TabNext(View* view,TabNextResult& nr) + { + if(nr == TabNextResult::Done) + return; + auto cv = dynamic_cast(view); + if(cv != nullptr) + { + for(size_t i = 0; i < cv->ViewCount();i++) + { + TabNext(cv->GetViewAt(i),nr); + if(nr == TabNextResult::Done) + return; + } + } + else + { + if(view->GetViewFlag(VIEWFLAG_ISACTIVE)) + { + if(view->GetViewFlag(VIEWFLAG_INTERCEPT_TAB)) + { + SDL_Rect r; + r.x=0; + r.y=0; + r.w=0; + r.h=0; + SDL_Event event; + event.type = SDL_KEYDOWN; + event.key.keysym.mod = SDL_Keymod::KMOD_NONE; + event.key.keysym.scancode = SDL_SCANCODE_TAB; + event.key.keysym.sym = SDL_KeyCode::SDLK_TAB; + view->CallOnEvent(view,event,r,r); + nr = TabNextResult::Done; + } + view->SetViewFlag(VIEWFLAG_ISACTIVE,false); + nr= TabNextResult::TabNext; + } + else if(view->GetViewFlag(VIEWFLAG_TABSTOP) && nr == TabNextResult::TabNext) + { + view->SetViewFlag(VIEWFLAG_ISACTIVE,true); + nr = TabNextResult::Done; + } + } + } + void GUIWindow::TabNext() + { + TabNextResult nr=TabNextResult::KeepGoing; + TabNext(this,nr); + if(nr != TabNextResult::Done) + { + nr = TabNextResult::TabNext; + TabNext(this,nr); + } + } + + void GUIWindow::SetView(View* view,bool owns) + { + if(this->ownsChild && this->child != view) + delete this->child; + this->child = view; + this->ownsChild = owns; + if(view != nullptr) + view->parent = this; + } + GUIWindow* GUIWindow::GetWindow() + { + return this; + } + size_t GUIWindow::ViewCount() + { + return this->child != nullptr ? 1 : 0; + } + View* GUIWindow::GetViewAt(size_t index) + { + if(index > 0) return nullptr; + return this->child; + } + void GUIWindow::Draw() + { + int w,h; + SDL_GetWindowSize(window,&w,&h); + SDL_Rect r={.x=0,.y=0,.w=w,.h=h}; + OnDraw(renderer,r); + } + void GUIWindow::Event(SDL_Event& event) + { + int w,h; + SDL_GetWindowSize(window,&w,&h); + SDL_Rect r={.x=0,.y=0,.w=w,.h=h}; + OnEvent(event,r,r); + } + void GUIWindow::OnDraw(SDL_Renderer* renderer, SDL_Rect& r) + { + SDL_SetRenderDrawColor(renderer,this->palette.background.r,this->palette.background.g,this->palette.background.b,this->palette.background.a); + SDL_RenderClear(renderer); + if(this->child != nullptr) + this->child->OnDraw(renderer,r); + SDL_RenderPresent(renderer); + } + bool GUIWindow::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& myVisibleBounds) + { + + if(event.type == SDL_EventType::SDL_KEYDOWN && event.key.keysym.sym ==SDL_KeyCode::SDLK_TAB) + { + GUISDLEventEventArgs sdle; + sdle.event = event; + this->SDLEvent.Invoke(this,sdle); + TabNext(); + return true; + } + if(this->child != nullptr) { GUISDLEventEventArgs sdle; + sdle.event = event; this->SDLEvent.Invoke(this,sdle); return this->child->OnEvent(event,myBounds,myVisibleBounds);} + return View::OnEvent(event,myBounds,myVisibleBounds); + } + GUIWindow::GUIWindow(std::string title, int w, int h, Uint32 flags, const GUIPalette& palette) : ContainerView(title) + { + this->window = SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,w,h,flags); + this->renderer = SDL_CreateRenderer(this->window,-1,SDL_RENDERER_ACCELERATED); + SDL_SetRenderDrawBlendMode(renderer,SDL_BlendMode::SDL_BLENDMODE_BLEND); + this->child=nullptr; + this->parent=nullptr; + this->ownsChild=false; + this->normal_font=nullptr; + this->monospaced_font=nullptr; + gui.windows.push_back(this); + this->SetPalette(palette); + } + void GUIWindow::SetText(std::string text) + { + this->text = text; + SDL_SetWindowTitle(this->window,text.c_str()); + } + + void GUIWindow::SetPalette(const GUIPalette& palette) + { + this->palette = palette; + if(this->normal_font != nullptr) + delete this->normal_font; + if(this->monospaced_font != nullptr) + delete this->monospaced_font; + this->normal_font = new FontCache(this->renderer,this->palette.fontSize); + this->monospaced_font = new FontCache(this->renderer,AARDVARKFIXEDREGULAR,AARDVARKFIXEDREGULAR_SIZE,this->palette.fontSize); + } + + GUIWindow::~GUIWindow() + { + if(this->ownsChild) + delete this->child; + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + + for(auto index = gui.windows.begin(); index < gui.windows.end(); index++) + { + if(*index == this) + { + *index = nullptr; + break; + } + } + } + void GUIWindow::SetView(Tesses::Framework::Serialization::Json::JToken item) + { + Tesses::Framework::Serialization::Json::JObject dict; + if(Tesses::Framework::Serialization::Json::TryGetJToken(item,dict)) + { + Tesses::Framework::Serialization::Json::JObject o; + Tesses::Framework::Serialization::Json::JObject sz; + Tesses::Framework::Serialization::Json::JObject pal0; + std::string title; + if(dict.TryGetValueAsType("Child",o)) + { + this->SetView(CreateViewFromJson(o)); + } + if(dict.TryGetValueAsType("Size",sz)) + { + int w0,h0; + + + SDL_GetWindowSize(this->window,&w0,&h0); + int64_t w=w0; + int64_t h=h0; + + sz.TryGetValueAsType("Width",w); + sz.TryGetValueAsType("Height",h); + + SDL_SetWindowSize(this->window,(int)w,(int)h); + } + if(dict.TryGetValueAsType("Palette",pal0)) + { + bool darkMode=true; + SDL_Color accent={.r=255,.g=0,.b=0,.a=255}; + std::string _str; + int64_t fontSize=20; + + pal0.TryGetValueAsType("IsDarkMode",darkMode); + pal0.TryGetValueAsType("FontSize",fontSize); + if(pal0.TryGetValueAsType("Accent",_str)) + TryParseSDLColor(_str,accent); + + GUIPalette pal(darkMode,accent,fontSize); + if(pal0.TryGetValueAsType("Background",_str)) + TryParseSDLColor(_str,pal.background); + if(pal0.TryGetValueAsType("Border",_str)) + TryParseSDLColor(_str,pal.border_color); + if(pal0.TryGetValueAsType("BorderActive",_str)) + TryParseSDLColor(_str,pal.border_active); + if(pal0.TryGetValueAsType("BorderHover",_str)) + TryParseSDLColor(_str,pal.border_hover); + if(pal0.TryGetValueAsType("BorderHoverActive",_str)) + TryParseSDLColor(_str,pal.border_hover_active); + this->SetPalette(pal); + } + if(dict.TryGetValueAsType("Title",title) || dict.TryGetValueAsType("Text",title)) + { + this->SetText(title); + } + } + } + + View* GUIWindow::CreateViewFromJson(Tesses::Framework::Serialization::Json::JObject json) + { + std::string type; + if(json.TryGetValueAsType("Type",type)) + { + std::string id={}; + std::string text={}; + bool active=false; + json.TryGetValueAsType("Id",id); + json.TryGetValueAsType("Text",text); + json.TryGetValueAsType("Active",active); + if(type == "ButtonView") + { + auto btn = new Views::ButtonView(text); + btn->SetId(id); + btn->SetViewFlag(VIEWFLAG_ISACTIVE,active); + return btn; + } + else if(type == "CheckView") + { + bool checked; + json.TryGetValueAsType("Checked",checked); + auto cv = new Views::CheckView(checked,text); + cv->SetId(id); + + cv->SetViewFlag(VIEWFLAG_ISACTIVE,active); + return cv; + } + else if(type == "LabelView") + { + auto lv = new Views::LabelView(text); + lv->SetId(id); + return lv; + } + else if(type == "ProgressView") + { + double v=0; + json.TryGetValueAsType("Value",v); + auto pv = new Views::ProgressView(v); + pv->SetId(id); + return pv; + } + else if(type == "TextListView") + { + std::vector items; + Tesses::Framework::Serialization::Json::JArray arr; + if(json.TryGetValueAsType("Items",arr)) + { + std::string str; + for(auto item : arr) + { + if(Tesses::Framework::Serialization::Json::TryGetJToken(item,str)) items.push_back(str); + } + } + int64_t index=-1; + int64_t first=0; + json.TryGetValueAsType("SelectedIndex",index); + json.TryGetValueAsType("FirstIndex",first); + + auto tlv = new Views::TextListView(); + + tlv->SetViewFlag(VIEWFLAG_ISACTIVE,active); + tlv->SetId(id); + tlv->items = items; + tlv->firstIndex = (size_t)first; + tlv->selected = (int)index; + return tlv; + } + else if(type == "AbsoluteView") + { + auto av = new Views::AbsoluteView(); + av->SetId(id); + Tesses::Framework::Serialization::Json::JArray arr; + if(json.TryGetValueAsType("Items",arr)) + { + for(auto item : arr) + { + Tesses::Framework::Serialization::Json::JObject dict; + if(Tesses::Framework::Serialization::Json::TryGetJToken(item,dict)) + { + Tesses::Framework::Serialization::Json::JObject boundsDict; + SDL_Rect r={.x=0,.y=0,.w=200,.h=200}; + + if(dict.TryGetValueAsType("Bounds",boundsDict)) + { + int64_t n; + if(boundsDict.TryGetValueAsType("X",n)) r.x = (int)n; + if(boundsDict.TryGetValueAsType("Y",n)) r.y = (int)n; + if(boundsDict.TryGetValueAsType("Width",n)) r.w = (int)n; + if(boundsDict.TryGetValueAsType("Height",n)) r.h = (int)n; + } + + auto myO = CreateViewFromJson(dict); + if(myO != nullptr) + { + av->Add(r,myO); + } + } + } + } + return av; + } + else { + GUIJsonViewNotFoundEventArgs e; + e.destView == nullptr; + e.jsonObject = json; + e.typeString = type; + + JsonViewNotFound.Invoke(this,e); + + return e.destView; + } + } + return nullptr; + } + +} +#endif \ No newline at end of file diff --git a/src/SDL2/Stream.cpp b/src/SDL2/Stream.cpp new file mode 100644 index 0000000..373de9d --- /dev/null +++ b/src/SDL2/Stream.cpp @@ -0,0 +1,77 @@ + +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) + +#include "TessesFramework/SDL2/Stream.hpp" +namespace Tesses::Framework::SDL2 { + +static SDLCALL size_t rwops_stream_read(struct SDL_RWops * context, void *ptr, + size_t size, size_t maxnum) +{ + if(context->hidden.unknown.data1 == nullptr) return 0; + auto ctx = static_cast(context->hidden.unknown.data1); + if(ctx->CanRead()) + return ctx->Read((uint8_t*)ptr,size*maxnum) / size; + return 0; +} +static SDLCALL size_t rwops_stream_write(struct SDL_RWops * context, const void *ptr, + size_t size, size_t maxnum) +{ + if(context->hidden.unknown.data1 == nullptr) return 0; + auto ctx = static_cast(context->hidden.unknown.data1); + if(ctx->CanWrite()) + return ctx->Write((const uint8_t*)ptr,size*maxnum) / size; + return 0; +} +static SDLCALL Sint64 rwops_stream_seek(struct SDL_RWops * context, Sint64 offset, + int whence) +{ + + if(context->hidden.unknown.data1 == nullptr) return -1; + auto ctx = static_cast(context->hidden.unknown.data1); + if(!ctx->CanSeek()) return -1; + + switch(whence) + { + case RW_SEEK_SET: + ctx->Seek(offset,Tesses::Framework::Streams::SeekOrigin::Begin); + break; + case RW_SEEK_CUR: + ctx->Seek(offset,Tesses::Framework::Streams::SeekOrigin::Current); + break; + case RW_SEEK_END: + ctx->Seek(offset,Tesses::Framework::Streams::SeekOrigin::End); + break; + } + + + return ctx->GetPosition(); +} +static SDLCALL Sint64 rwops_stream_size(struct SDL_RWops * context) +{ + if(context->hidden.unknown.data1 == nullptr) return -1; + auto ctx = static_cast(context->hidden.unknown.data1); + return ctx->GetLength(); +} +static SDLCALL int rwops_stream_close(struct SDL_RWops* context) +{ + if(context->hidden.unknown.data2 == nullptr) return 0; + delete static_cast(context->hidden.unknown.data1); + return 0; +} +SDL_RWops* RwopsFromStream(Tesses::Framework::Streams::Stream* strm, bool owns) +{ + auto rw=SDL_AllocRW(); + rw->type = SDL_RWOPS_UNKNOWN; + rw->hidden.unknown.data1 = static_cast(strm); + rw->hidden.unknown.data2 = (void*)(uintptr_t)(owns?1:0); + rw->read = rwops_stream_read; + rw->write = rwops_stream_write; + rw->seek = rwops_stream_seek; + rw->size = rwops_stream_size; + rw->close = rwops_stream_close; + + + return rw; +} +} +#endif \ No newline at end of file diff --git a/src/SDL2/View.cpp b/src/SDL2/View.cpp new file mode 100644 index 0000000..d1e7d5d --- /dev/null +++ b/src/SDL2/View.cpp @@ -0,0 +1,173 @@ +#include "TessesFramework/SDL2/GUI.hpp" +using namespace Tesses::Framework::Serialization::Json; +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/Views/ButtonView.hpp" +#include "TessesFramework/SDL2/Views/CheckView.hpp" +#include "TessesFramework/SDL2/Views/LabelView.hpp" +namespace Tesses::Framework::SDL2 +{ + ContainerView::ContainerView() : View() + { + this->flags = 0; + } + ContainerView::ContainerView(std::string text) : View(text) + { + this->flags = 0; + } + View::View() : View((std::string){}) + { + + } + View::View(std::string text) + { + this->text = text; + this->flags=VIEWFLAG_TABSTOP; + } + void View::SetText(std::string text) + { + this->text=text; + } + std::string View::GetText() + { + return this->text; + } + void View::OnMouseUp(GUIMouseButtonEventArgs& click) + { + + } + void View::OnMouseDown(GUIMouseButtonEventArgs& click) + { + + } + void View::OnClick(GUIEventArgs& click) + { + + } + GUIWindow* View::GetWindow() + { + if(this->parent ==nullptr) return nullptr; + return this->parent->GetWindow(); + } + void View::OnDragDropFile(Tesses::Framework::Filesystem::VFSPath filePath,SDL_Rect myRect, SDL_Point dropLoc) + { + + } + void View::OnDragDropText(std::string text,SDL_Rect myRect, SDL_Point dropLoc) + { + + } + + void View::OnEnter(GUIEventArgs& evt) + { + + } + void View::OnLeave(GUIEventArgs& evt) + { + + } + + + void View::OnDraw(SDL_Renderer* renderer, SDL_Rect& myRect) + { + + } + void View::OnSetParent(View* v) + { + + } + + bool View::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& myVisibleBounds) + { + GUISDLEventEventArgs sdle; + sdle.event = event; + this->SDLEvent.Invoke(this,sdle); + if(event.type == SDL_MOUSEBUTTONDOWN) + { + if(event.button.x >= myVisibleBounds.x && event.button.x < myVisibleBounds.x+myVisibleBounds.w && event.button.y >= myVisibleBounds.y && event.button.y < myVisibleBounds.y+myVisibleBounds.h) + { + GUIMouseButtonEventArgs cea; + cea.button = (int)event.button.button; + cea.x = event.button.x - myVisibleBounds.x; + cea.y = event.button.y - myVisibleBounds.y; + cea.which = event.button.which; + this->SetViewFlag(VIEWFLAG_MOUSEDOWN_STATE,true); + OnMouseDown(cea); + this->MouseDown.Invoke(this,cea); + } + } + if(event.type == SDL_MOUSEBUTTONUP) + { + if(this->GetViewFlag(VIEWFLAG_MOUSEDOWN_STATE)) + { + GUIMouseButtonEventArgs cea; + cea.button = (int)event.button.button; + cea.x = event.button.x - myVisibleBounds.x; + cea.y = event.button.y - myVisibleBounds.y; + cea.which = event.button.which; + this->SetViewFlag(VIEWFLAG_MOUSEDOWN_STATE,false); + OnMouseUp(cea); + this->MouseUp.Invoke(this,cea); + GUIEventArgs cea2; + OnClick(cea2); + this->Click.Invoke(this,cea); + return true; + } + + } + else if(event.type == SDL_MOUSEMOTION) + { + bool inside = event.motion.x >= myVisibleBounds.x && event.motion.x < myVisibleBounds.x+myVisibleBounds.w && event.motion.y >= myVisibleBounds.y && event.motion.y < myVisibleBounds.y+myVisibleBounds.h; + bool hoverFlag = this->GetViewFlag(VIEWFLAG_HOVER_STATE); + if(inside && !hoverFlag) + { + this->SetViewFlag(VIEWFLAG_HOVER_STATE,true); + GUIEventArgs e; + this->OnEnter(e); + this->Enter.Invoke(this,e); + } + else if(!inside && hoverFlag) + { + this->SetViewFlag(VIEWFLAG_HOVER_STATE,false); + GUIEventArgs e; + this->OnLeave(e); + this->Leave.Invoke(this,e); + } + } + return false; + } + + + std::string View::GetId() + { + return this->id; + } + void View::SetId(std::string id) + { + this->id = id; + } + View* View::FindViewById(std::string id) + { + if(this->GetId() == id) return this; + return nullptr; + } + + View* ContainerView::FindViewById(std::string id) + { + if(this->GetId() == id) return this; + for(size_t i = 0; i ViewCount(); i++) + { + auto v = this->GetViewAt(i); + auto v2 = v->FindViewById(id); + if(v2 != nullptr) return v2; + } + return nullptr; + } + + + View::~View() + { + + } + +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/AbsoluteView.cpp b/src/SDL2/Views/AbsoluteView.cpp new file mode 100644 index 0000000..2ed50c0 --- /dev/null +++ b/src/SDL2/Views/AbsoluteView.cpp @@ -0,0 +1,109 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/Views/AbsoluteView.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + void AbsoluteView::OnDraw(SDL_Renderer* renderer, SDL_Rect& myRect) + { + Clipper clipper(renderer,myRect); + SDL_Rect oldClip; + bool isClipped=SDL_RenderIsClipEnabled(renderer); + SDL_RenderGetClipRect(renderer,&oldClip); + if(!isClipped) oldClip = myRect; + + for(auto& ctrl : this->views) + { + SDL_Rect childRect = ctrl.second; + childRect.x += oldClip.x; + childRect.y += oldClip.y; + + + if(clipper.Clip(childRect)) + CallOnDraw(ctrl.first.first,renderer,childRect); + } + + } + bool AbsoluteView::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds) + { + bool handled=false; + + for(auto& item : this->views) + { + SDL_Rect theirBounds = item.second; + theirBounds.x += myBounds.x; + theirBounds.y += myBounds.y; + + SDL_Rect theirVisibleBounds = item.second; + theirVisibleBounds.x += visibleBounds.x; + theirVisibleBounds.y += visibleBounds.y; + Clipper::ClipRect(theirVisibleBounds, visibleBounds); + + + if(CallOnEvent(item.first.first,event,theirBounds, theirVisibleBounds)) + handled=true; + if(handled && event.type != SDL_MOUSEBUTTONUP && event.type != SDL_MOUSEMOTION) + { + GUISDLEventEventArgs sdle; + sdle.event = event; this->SDLEvent.Invoke(this,sdle); + return true; + } + } + + + if(handled) {GUISDLEventEventArgs sdle; + sdle.event = event; this->SDLEvent.Invoke(this,sdle);return true;} + return View::OnEvent(event,myBounds,visibleBounds); + } + size_t AbsoluteView::ViewCount() + { + return this->views.size(); + } + View* AbsoluteView::GetViewAt(size_t index) + { + return this->views.at(index).first.first; + } + AbsoluteView::AbsoluteView() : ContainerView() + { + + } + void AbsoluteView::Add(SDL_Rect rect, View* view, bool owns) + { + for(auto& item : this->views) + { + if(item.first.first == view) return; + } + this->AssignChildParentToThis(view); + this->views.push_back(std::pair,SDL_Rect>(std::pair(view,owns),rect)); + } + void AbsoluteView::Set(View* view, SDL_Rect rect) + { + for(auto& item : this->views) + { + if(item.first.first == view) + { + item.second = rect; + return; + } + } + } + void AbsoluteView::Remove(View* view) + { + for(auto index = this->views.begin(); index != this->views.end(); index++) + { + if(index->first.first == view) + { + if(index->first.second) delete index->first.first; + this->views.erase(index); + return; + } + } + } + AbsoluteView::~AbsoluteView() + { + for(auto& item : this->views) + { + if(item.first.second) delete item.first.first; + } + } +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/ButtonView.cpp b/src/SDL2/Views/ButtonView.cpp new file mode 100644 index 0000000..5212f2d --- /dev/null +++ b/src/SDL2/Views/ButtonView.cpp @@ -0,0 +1,77 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/Views/ButtonView.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + ButtonView::ButtonView() : View() + { + + } + ButtonView::ButtonView(std::string text) : View(text) + { + + } + bool ButtonView::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& myVisibleBounds) + { + if(this->GetViewFlag(VIEWFLAG_ISACTIVE)) + { + if(event.type == SDL_KEYUP) + { + switch(event.key.keysym.sym) + { + case SDL_KeyCode::SDLK_SPACE: + { + GUIEventArgs e; + this->OnClick(e); + this->Click.Invoke(this,e); + } break; + } + } + } + if(event.type == SDL_MOUSEBUTTONUP) + { + if(event.button.x >= myVisibleBounds.x && event.button.x < myVisibleBounds.x+myVisibleBounds.w && event.button.y >= myVisibleBounds.y && event.button.y < myVisibleBounds.y+myVisibleBounds.h) + { + this->GetWindow()->MakeActive(this); + } + } + return View::OnEvent(event,myBounds,myVisibleBounds); + } + void ButtonView::OnDraw(SDL_Renderer* renderer, SDL_Rect& r) + { + auto win = this->GetWindow(); + SDL_SetRenderDrawColor(renderer,win->palette.accent.r,win->palette.accent.g,win->palette.accent.b,win->palette.accent.a); + SDL_RenderFillRect(renderer,&r); + int textW; + int textH; + win->normal_font->CalculateSize(this->text,textW,textH); + + int x=(r.w/2)-(textW/2); + int y=(r.h/2)-(textH/2); + x+=r.x; + y+=r.y; + + auto isHovering = this->GetViewFlag(VIEWFLAG_HOVER_STATE); + auto isActive = this->GetViewFlag(VIEWFLAG_ISACTIVE); + auto isMouseDown = this->GetViewFlag(VIEWFLAG_MOUSEDOWN_STATE); + + SDL_Color& color = win->palette.GetBorderColor(isHovering,isActive,isMouseDown); + + win->normal_font->Render(renderer,x,y,this->text,color); + SDL_SetRenderDrawColor(renderer,color.r,color.g,color.b,color.a); + + SDL_Rect r2={.x=r.x,.y=r.y,.w=r.w,.h=r.h}; + for(size_t i=0;i < 4; i++) + { + SDL_RenderDrawRect(renderer,&r2); + r2.x++; + r2.y++; + r2.w-=2; + r2.h-=2; + } + + + } + +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/CheckView.cpp b/src/SDL2/Views/CheckView.cpp new file mode 100644 index 0000000..e241527 --- /dev/null +++ b/src/SDL2/Views/CheckView.cpp @@ -0,0 +1,122 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/Views/CheckView.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + void CheckView::OnCheckChanged(GUIEventArgs& event) + { + + } + void CheckView::OnDraw(SDL_Renderer* renderer, SDL_Rect& r) + { + auto win = this->GetWindow(); + + const int checkSz=32; + + SDL_Rect checkBoxRect={.x=r.x,.y=r.y+((r.h/2)-(checkSz/2)),.w=checkSz,.h=checkSz}; + + int textW; + int textH; + win->normal_font->CalculateSize(this->text,textW,textH); + + //we only need the y + + int x = r.x+checkSz+8; + int y = r.y+((r.h/2)-(textH/2)); + + win->normal_font->Render(renderer,x,y,text,win->palette.accent); + + + + if(this->GetViewFlag(VIEWFLAG_CHECKED)) + { + SDL_SetRenderDrawColor(renderer,win->palette.accent.r,win->palette.accent.g,win->palette.accent.b,win->palette.accent.a); + + //x=0,y=0.5, x=0.5, y=1 + + int x1=checkBoxRect.x+4; + int y1=checkBoxRect.y+4+((checkSz-8)/2); + int x2=checkBoxRect.x+4+((checkSz-8)/2); + int y2=checkBoxRect.y+4+(checkSz-8); + + int x3=checkBoxRect.x+4+(checkSz-8); + int y3=checkBoxRect.y+4; + + for(int i = 0; i < 4; i++) + { + SDL_RenderDrawLine(renderer,x1,y1-i,x2,y2-i); + SDL_RenderDrawLine(renderer,x2-i,y2,x3-i,y3); + } + } + + auto isHovering = this->GetViewFlag(VIEWFLAG_HOVER_STATE); + auto isActive = this->GetViewFlag(VIEWFLAG_ISACTIVE); + auto isMouseDown = this->GetViewFlag(VIEWFLAG_MOUSEDOWN_STATE); + + SDL_Color& color = win->palette.GetBorderColor(isHovering,isActive,isMouseDown); + + SDL_SetRenderDrawColor(renderer,color.r,color.g,color.b,color.a); + + for(int i = 0; i < 4; i++) + { + SDL_RenderDrawRect(renderer,&checkBoxRect); + checkBoxRect.x++; + checkBoxRect.y++; + checkBoxRect.w-=2; + checkBoxRect.h-=2; + } + } + bool CheckView::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds) + { + if(this->GetViewFlag(VIEWFLAG_ISACTIVE)) + { + if(event.type == SDL_KEYUP) + { + switch(event.key.keysym.sym) + { + case SDL_KeyCode::SDLK_SPACE: + { + GUIEventArgs e; + + this->SetViewFlag(VIEWFLAG_CHECKED,!this->GetViewFlag(VIEWFLAG_CHECKED)); + this->OnClick(e); + this->Click.Invoke(this,e); + this->OnCheckChanged(e); + this->CheckChanged.Invoke(this,e); + } break; + } + } + } + if(event.type == SDL_MOUSEBUTTONUP) + { + if(event.button.x >= visibleBounds.x && event.button.x < visibleBounds.x+visibleBounds.w && event.button.y >= visibleBounds.y && event.button.y < visibleBounds.y+visibleBounds.h) + { + this->GetWindow()->MakeActive(this); + this->SetViewFlag(VIEWFLAG_CHECKED,!this->GetViewFlag(VIEWFLAG_CHECKED)); + GUIEventArgs e; + this->OnCheckChanged(e); + this->CheckChanged.Invoke(this,e); + } + } + return View::OnEvent(event,myBounds,visibleBounds); + } + + CheckView::CheckView(bool checked, std::string label) : View(label) + { + this->SetViewFlag(VIEWFLAG_CHECKED,checked); + } + CheckView::CheckView() : View() + { + this->SetViewFlag(VIEWFLAG_CHECKED,false); + } + + bool CheckView::GetChecked() + { + return this->GetViewFlag(VIEWFLAG_CHECKED); + } + void CheckView::SetChecked(bool value) + { + this->SetViewFlag(VIEWFLAG_CHECKED,true); + } +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/LabelView.cpp b/src/SDL2/Views/LabelView.cpp new file mode 100644 index 0000000..f4a760f --- /dev/null +++ b/src/SDL2/Views/LabelView.cpp @@ -0,0 +1,20 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) +#include "TessesFramework/SDL2/Views/LabelView.hpp" +namespace Tesses::Framework::SDL2::Views +{ + void LabelView::OnDraw(SDL_Renderer* renderer, SDL_Rect& r) + { + auto win =this->GetWindow(); + win->normal_font->Render(renderer,r.x+4,r.y+4,text,win->palette.accent); + } + + LabelView::LabelView() : View() + { + this->flags &= ~VIEWFLAG_TABSTOP; + } + LabelView::LabelView(std::string text) : View(text) + { + this->flags &= ~VIEWFLAG_TABSTOP; + } +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/ProgressView.cpp b/src/SDL2/Views/ProgressView.cpp new file mode 100644 index 0000000..472f2f4 --- /dev/null +++ b/src/SDL2/Views/ProgressView.cpp @@ -0,0 +1,39 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) + +#include "TessesFramework/SDL2/Views/ProgressView.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + ProgressView::ProgressView() : ProgressView(0.0) + { + + } + ProgressView::ProgressView(double v) : View() + { + this->value = v; + this->SetViewFlag(VIEWFLAG_TABSTOP,false); + } + void ProgressView::OnDraw(SDL_Renderer* renderer, SDL_Rect& rect) + { + auto win = this->GetWindow(); + + + SDL_SetRenderDrawColor(renderer,win->palette.border_color.r,win->palette.border_color.g,win->palette.border_color.b,win->palette.border_color.a); + + SDL_Rect r2={.x=rect.x,.y=rect.y,.w=rect.w,.h=rect.h}; + for(size_t i=0;i < 4; i++) + { + SDL_RenderDrawRect(renderer,&r2); + r2.x++; + r2.y++; + r2.w-=2; + r2.h-=2; + } + + auto res = (int)((rect.w-8)*(this->value/100.0)); + r2={.x=rect.x+4,.y=rect.y+4,.w=res,.h=rect.h-8}; + SDL_SetRenderDrawColor(renderer,win->palette.accent.r,win->palette.accent.g,win->palette.accent.b,win->palette.accent.a); + SDL_RenderFillRect(renderer,&r2); + } +} +#endif \ No newline at end of file diff --git a/src/SDL2/Views/TextListView.cpp b/src/SDL2/Views/TextListView.cpp new file mode 100644 index 0000000..cd2e961 --- /dev/null +++ b/src/SDL2/Views/TextListView.cpp @@ -0,0 +1,140 @@ +#if defined(TESSESFRAMEWORK_ENABLE_SDL2) + +#include "TessesFramework/SDL2/Views/TextListView.hpp" + +namespace Tesses::Framework::SDL2::Views +{ + TextListView::TextListView() : View() + { + this->firstIndex=0; + this->selected=-1; + } + bool TextListView::OnEvent(SDL_Event& event, SDL_Rect& myBounds, SDL_Rect& visibleBounds) + { + auto win = this->GetWindow(); + auto item_height = win->normal_font->MaxHeight()+8; + auto no_items = (myBounds.h-8) / item_height; + + if(this->items.size() > no_items) + { + + if(this->items.size() - this->firstIndex < no_items) + { + this->firstIndex = this->items.size() - no_items; + } + + } + else { + this->firstIndex=0; + + no_items = (int)this->items.size(); + } + if(event.type == SDL_KEYDOWN) + { + if(this->GetViewFlag(VIEWFLAG_ISACTIVE)) + { + switch(event.key.keysym.sym) + { + case SDLK_HOME: + this->selected=0; + this->firstIndex=0; + break; + case SDLK_END: + this->selected = (int)(this->items.size()-1); + this->firstIndex = (this->selected/no_items) * no_items; + + break; + case SDLK_DOWN: + this->selected++; + if(this->selected < -1 || this->selected >= this->items.size()) + { + this->selected=0; + } + this->firstIndex = (this->selected/no_items) * no_items; + break; + case SDLK_UP: + this->selected--; + if(this->selected < 0 || this->selected >= this->items.size()) + { + this->selected = (int)(this->items.size()-1); + } + + this->firstIndex = (this->selected/no_items) * no_items; + + break; + } + } + } + if(event.type == SDL_MOUSEBUTTONUP && event.button.x >= (visibleBounds.x+4) && event.button.x < (visibleBounds.x+visibleBounds.w)-8 && event.button.y >= (visibleBounds.y+4) && event.button.y < (visibleBounds.y+visibleBounds.h)-8) + { + win->MakeActive(this); + auto myRealY=event.button.y - (myBounds.y+4); + auto yThing = myRealY / item_height; + + if(yThing < no_items) + { + auto high= yThing+this->firstIndex; + this->selected = (int)high; + } + + } + return View::OnEvent(event,myBounds,visibleBounds); + } + + void TextListView::OnDraw(SDL_Renderer* renderer,SDL_Rect& rect) + { + auto win = this->GetWindow(); + auto item_height = win->normal_font->MaxHeight()+8; + auto no_items = (rect.h-8) / item_height; + auto isHovering = this->GetViewFlag(VIEWFLAG_HOVER_STATE); + auto isActive = this->GetViewFlag(VIEWFLAG_ISACTIVE); + auto isMouseDown = this->GetViewFlag(VIEWFLAG_MOUSEDOWN_STATE); + + SDL_Color& color = win->palette.GetBorderColor(isHovering,isActive,isMouseDown); + + SDL_SetRenderDrawColor(renderer,color.r,color.g,color.b,color.a); + + + + + + if(this->items.size() > no_items) + { + + if(this->items.size() - this->firstIndex < no_items) + { + this->firstIndex = this->items.size() - no_items; + } + } + else { + this->firstIndex=0; + no_items = (int)this->items.size(); + } + + SDL_Rect r2={.x=rect.x,.y=rect.y,.w=rect.w,.h=rect.h}; + for(size_t i=0;i < 4; i++) + { + SDL_RenderDrawRect(renderer,&r2); + r2.x++; + r2.y++; + r2.w-=2; + r2.h-=2; + } + + for(int i = 0; i < no_items; i++) + { + int realI = i+(int)firstIndex; + if(realI == this->selected) + { + SDL_SetRenderDrawColor(renderer,win->palette.accent.r,win->palette.accent.g,win->palette.accent.b,win->palette.accent.a); + SDL_Rect r2={.x=rect.x+4,.y=rect.y+4+(item_height*i),.w=rect.w-8,.h=item_height}; + SDL_RenderFillRect(renderer,&r2); + win->normal_font->Render(renderer,rect.x+12,(rect.y+12)+(item_height*i),this->items[realI],color); + } + else { + win->normal_font->Render(renderer,rect.x+12,(rect.y+12)+(item_height*i),this->items[realI],win->palette.accent); + } + } + } +} +#endif \ No newline at end of file diff --git a/src/Streams/NetworkStream.cpp b/src/Streams/NetworkStream.cpp index 01424f1..17c16b7 100644 --- a/src/Streams/NetworkStream.cpp +++ b/src/Streams/NetworkStream.cpp @@ -43,7 +43,7 @@ extern "C" { #if defined(GEKKO) extern "C" uint32_t if_config( char *local_ip, char *netmask, char *gateway,bool use_dhcp, int max_retries); -#elif !defined(_WIN32) && !defined(__ANDROID__) && !defined(__SWITCH__) +#elif !defined(_WIN32) && !defined(__ANDROID__) && !defined(__SWITCH__) && !defined(__PS2__) #include #endif @@ -117,7 +117,7 @@ namespace Tesses::Framework::Streams { free(addresses); - #elif defined(__ANDROID__) || defined(__SWITCH__) + #elif defined(__ANDROID__) || defined(__SWITCH__) || defined(__PS2__) #else struct ifaddrs *ifAddrStruct = NULL; @@ -181,7 +181,12 @@ namespace Tesses::Framework::Streams { { memset(addr,0,sizeof(struct sockaddr_storage)); uint8_t ip[16]; + + #if defined(__PS2__) + if(inet_aton(str.c_str(),ip) == 1) + #else if(inet_pton(AF_INET,str.c_str(),ip)==1) + #endif { struct sockaddr_in* inAddr = (struct sockaddr_in*)addr; inAddr->sin_family = AF_INET; @@ -521,25 +526,46 @@ namespace Tesses::Framework::Streams { { return this->success; } - NetworkStream::NetworkStream(bool ipV6,bool datagram) + NetworkStream::NetworkStream(SocketType type) { this->endOfStream=false; this->owns = true; this->success=false; - if(ipV6) + switch(type) { - #if defined(AF_INET6) - this->sock = NETWORK_SOCKET(AF_INET6, datagram ? SOCK_DGRAM : SOCK_STREAM, 0); - if(this->sock >= 0) this->success=true; - #endif - } - else - { - #if defined(AF_INET) - this->sock = NETWORK_SOCKET(AF_INET, datagram ? SOCK_DGRAM : SOCK_STREAM, 0); - if(this->sock >= 0) this->success=true; + case SocketType::ST_IPv4_TCP: + #if defined(AF_INET) + this->sock = NETWORK_SOCKET(AF_INET,SOCK_STREAM, 0); + + #endif + break; + case SocketType::ST_IPv4_UDP: + #if defined(AF_INET) + this->sock = NETWORK_SOCKET(AF_INET,SOCK_DGRAM, 0); + + #endif + break; + + case SocketType::ST_IPv6_TCP: + #if defined(AF_INET6) + this->sock = NETWORK_SOCKET(AF_INET6,SOCK_STREAM, 0); + + #endif + break; + case SocketType::ST_IPv6_UDP: + #if defined(AF_INET6) + this->sock = NETWORK_SOCKET(AF_INET6,SOCK_DGRAM, 0); + + #endif + break; + case SocketType::ST_UNIX: + #if defined(AF_UNIX) + this->sock = NETWORK_SOCKET(AF_UNIX,SOCK_DGRAM, 0); + #endif + break; } + if(this->sock >= 0) this->success=true; } NetworkStream::NetworkStream(std::string ipOrFqdn, uint16_t port, bool datagram, bool broadcast, bool supportIPv6) { @@ -672,7 +698,7 @@ namespace Tesses::Framework::Streams { ip = StringifyIP((struct sockaddr*)&storage); port = getPort((struct sockaddr*)&storage); - return new NetworkStream(s,true); + return new NetworkStream((int32_t)s,(bool)true); } size_t NetworkStream::Read(uint8_t* buff, size_t sz) { @@ -797,7 +823,7 @@ bool NetworkStream::CanWrite() { return false; } -NetworkStream::NetworkStream(bool ipV6,bool datagram) +NetworkStream::NetworkStream(SocketType type) { } diff --git a/src/Streams/PtyStream.cpp b/src/Streams/PtyStream.cpp new file mode 100644 index 0000000..35dfbc0 --- /dev/null +++ b/src/Streams/PtyStream.cpp @@ -0,0 +1,132 @@ +#include "TessesFramework/Streams/PtyStream.hpp" +#if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) +#include +#include +#include +#include + + +#endif +namespace Tesses::Framework::Streams { + PtyStream::PtyStream(WindowSize windowSize,std::string filename, std::vector args, std::vector env) + { + #if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) + this->wS = windowSize; + this->eos=false; + winsize sz; + sz.ws_col =(unsigned short)windowSize.Columns; + sz.ws_row = (unsigned short)windowSize.Rows; + sz.ws_xpixel = (unsigned short)windowSize.Width; + sz.ws_ypixel = (unsigned short)windowSize.Height; + termios ios; + cfmakeraw(&ios); + + pid= forkpty(&this->socket,NULL,&ios,&sz); + if(pid == -1) + { + this->eos=true; + } + if(pid == 0) + { + char** argv = new char*[args.size()+1]; + argv[args.size()]=NULL; + char** envp = new char*[env.size()+1]; + envp[env.size()]=NULL; + + for(size_t i = 0; i < args.size();i++) + { + argv[i] = (char*)args[i].c_str(); + } + for(size_t i = 0; i < env.size();i++) + { + envp[i] = (char*)env[i].c_str(); + } + + if(execve(filename.c_str(),argv,envp) == -1) + { + perror("execve returned -1"); + exit(1); + } + } + int flags = fcntl(this->socket, F_GETFL, 0); + if(flags == -1) { + perror("fcntl F_GETFL"); + this->eos=true; + return; + } + flags |= O_NONBLOCK; + + flags=fcntl(this->socket,F_SETFL,flags); + if(flags == -1) { + perror("fcntl F_SETFL"); + + this->eos=true; + return; + } + #endif + } + bool PtyStream::EndOfStream() + { + return this->eos; + } + bool PtyStream::CanRead() + { + return true; + } + bool PtyStream::CanWrite() + { + return true; + } + size_t PtyStream::Read(uint8_t* buff, size_t sz) + { + if(this->eos) return 0; + #if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) + auto res = read(this->socket, buff,sz); + + if(res == -1) + { + if(errno != EAGAIN && errno != EWOULDBLOCK) + this->eos=true; + return 0; + } + return (size_t)res; + #else + return 0; + #endif + } + size_t PtyStream::Write(const uint8_t* buff, size_t sz) + { + #if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) + auto res = write(this->socket, buff,sz); + return res; + #else + return 0; + #endif + } + WindowSize PtyStream::GetWindowSize() + { + return this->wS; + } + void PtyStream::Resize(WindowSize windowSize) + { + #if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) + this->wS = windowSize; + winsize sz; + sz.ws_col =(unsigned short)windowSize.Columns; + sz.ws_row = (unsigned short)windowSize.Rows; + sz.ws_xpixel = (unsigned short)windowSize.Width; + sz.ws_ypixel = (unsigned short)windowSize.Height; + + ioctl(this->socket,TIOCSWINSZ,&sz); + #endif + } + PtyStream::~PtyStream() + { + this->eos=true; + #if !defined(GEKKO) && !defined(__PS2__) && !defined(_WIN32) + close(this->socket); + + kill((pid_t)this->pid,SIGHUP); + #endif + } +} \ No newline at end of file diff --git a/src/TF_Init.cpp b/src/TF_Init.cpp index 25a4bc9..bf6bc45 100644 --- a/src/TF_Init.cpp +++ b/src/TF_Init.cpp @@ -2,6 +2,7 @@ #include "TessesFramework/Streams/NetworkStream.hpp" #include #include +#include #if defined(_WIN32) #include #undef min @@ -35,6 +36,9 @@ static GXRModeObj *rmode = NULL; #endif #if defined(TESSESFRAMEWORK_ENABLE_SDL2) #include +#include +#include +#include "TessesFramework/SDL2/GUI.hpp" #endif namespace Tesses::Framework @@ -87,6 +91,7 @@ namespace Tesses::Framework #if defined(TESSESFRAMEWORK_ENABLE_THREADING) && (defined(GEKKO) || defined(__SWITCH__)) Tesses::Framework::Threading::LookForFinishedThreads(); #endif + if(!isRunningSig) isRunning=false; #if defined(GEKKO) @@ -115,6 +120,9 @@ namespace Tesses::Framework } #endif + #if defined(TESSESFRAMEWORK_ENABLE_SDL2) + Tesses::Framework::SDL2::gui.Update(); + #endif } void TF_SetIsRunning(bool _isRunning) { @@ -135,6 +143,14 @@ namespace Tesses::Framework #if defined(TESSESFRAMEWORK_ENABLE_SDL2) //SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS,"1"); SDL_Init(SDL_INIT_EVERYTHING); + TTF_Init(); + int r = IMG_INIT_JPG | IMG_INIT_PNG | IMG_INIT_TIF | IMG_INIT_WEBP | IMG_INIT_JXL |IMG_INIT_AVIF; + if(IMG_Init( + r + ) != r) + { + std::cout << "IMG_Init: " << IMG_GetError() << std::endl; + } #endif tzset(); diff --git a/src/TextStreams/StdIOReader.cpp b/src/TextStreams/StdIOReader.cpp new file mode 100644 index 0000000..d210862 --- /dev/null +++ b/src/TextStreams/StdIOReader.cpp @@ -0,0 +1,36 @@ +#include "TessesFramework/TextStreams/StdIOReader.hpp" + + +namespace Tesses::Framework::TextStreams +{ + ConsoleReader::ConsoleReader() + { + + } + bool ConsoleReader::ReadBlock(std::string& str,size_t len) + { + #if defined(_WIN32) + uint8_t* buff = new uint8_t[len]; + #else + uint8_t buff[len]; + #endif + size_t read=0; + size_t readTotal=0; + uint8_t* buffOff=buff; + do { + read=fread(buffOff,1,len,stdin); + if(read != 0) {readTotal+= read;len-=read; buffOff+=read;} + } while(read != 0); + if(readTotal == 0) return false; + str.append((const char*)buff, readTotal); + #if defined(_WIN32) + delete buff; + #endif + return true; + } + + ConsoleReader StdIn() + { + return ConsoleReader(); + } +} \ No newline at end of file diff --git a/src/TextStreams/StdIOWriter.cpp b/src/TextStreams/StdIOWriter.cpp new file mode 100644 index 0000000..12bfcf4 --- /dev/null +++ b/src/TextStreams/StdIOWriter.cpp @@ -0,0 +1,42 @@ +#include "TessesFramework/TextStreams/StdIOWriter.hpp" +#if defined(__PS2__) +#include +#else +#include +#endif +namespace Tesses::Framework::TextStreams +{ + ConsoleWriter::ConsoleWriter(bool isError) : TextWriter() + { + this->isError=isError; + } + + void ConsoleWriter::WriteData(const char* text, size_t len) + { + #if defined(__PS2__) + char lenThing[10];//%.2048s + while(len > 0) { + int b = std::min((int)2047,(int)len); + snprintf(lenThing,18,"%%.%is",b); + + scr_printf(lenThing,text); + + len -= b; + text += b; + } + #else + if(isError) + fwrite(text,1,len,stderr); + else + fwrite(text,1,len,stdout); + #endif + } + ConsoleWriter StdOut() + { + return ConsoleWriter(false); + } + ConsoleWriter StdErr() + { + return ConsoleWriter(true); + } +} \ No newline at end of file diff --git a/src/TextStreams/StreamReader.cpp b/src/TextStreams/StreamReader.cpp index 544eaf7..ee1da18 100644 --- a/src/TextStreams/StreamReader.cpp +++ b/src/TextStreams/StreamReader.cpp @@ -11,6 +11,15 @@ namespace Tesses::Framework::TextStreams { StreamReader::StreamReader(std::filesystem::path path) : StreamReader(new FileStream(path,"rb"),true) { + } + bool StreamReader::Rewind() + { + if(this->strm->CanSeek()) + { + this->strm->Seek((int64_t)0,Tesses::Framework::Streams::SeekOrigin::Begin); + return true; + } + return false; } StreamReader::StreamReader(Stream* strm, bool owns) : TextReader() { diff --git a/src/TextStreams/StringReader.cpp b/src/TextStreams/StringReader.cpp new file mode 100644 index 0000000..5f466e9 --- /dev/null +++ b/src/TextStreams/StringReader.cpp @@ -0,0 +1,38 @@ +#include "TessesFramework/TextStreams/StringReader.hpp" + +namespace Tesses::Framework::TextStreams { + StringReader::StringReader() + { + this->offset=0; + this->str=""; + } + StringReader::StringReader(std::string str) + { + this->offset=0; + this->str=str; + } + size_t& StringReader::GetOffset() + { + return this->offset; + } + std::string& StringReader::GetString() + { + return this->str; + } + bool StringReader::Rewind() + { + this->offset=0; + return true; + } + bool StringReader::ReadBlock(std::string& str,size_t sz) + { + if(this->offset < this->str.size()) + { + size_t len = std::min(sz,this->str.size()-this->offset); + str.insert(str.size(),this->str.data()+this->offset,len); + offset+=len; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/TextStreams/StringWriter.cpp b/src/TextStreams/StringWriter.cpp new file mode 100644 index 0000000..ddf30fe --- /dev/null +++ b/src/TextStreams/StringWriter.cpp @@ -0,0 +1,21 @@ +#include "TessesFramework/TextStreams/StringWriter.hpp" + +namespace Tesses::Framework::TextStreams +{ + std::string& StringWriter::GetString() + { + return this->text; + } + StringWriter::StringWriter() : TextWriter() + { + + } + StringWriter::StringWriter(std::string str) : TextWriter() + { + this->text = str; + } + void StringWriter::WriteData(const char* text, size_t len) + { + this->text.append(text,len); + } +} \ No newline at end of file diff --git a/src/TextStreams/TextReader.cpp b/src/TextStreams/TextReader.cpp index 8546023..d9cf42e 100644 --- a/src/TextStreams/TextReader.cpp +++ b/src/TextStreams/TextReader.cpp @@ -2,6 +2,10 @@ namespace Tesses::Framework::TextStreams { + bool TextReader::Rewind() + { + return false; + } int32_t TextReader::ReadChar() { std::string txt; diff --git a/src/TextStreams/TextWriter.cpp b/src/TextStreams/TextWriter.cpp index d27b335..5431280 100644 --- a/src/TextStreams/TextWriter.cpp +++ b/src/TextStreams/TextWriter.cpp @@ -1,7 +1,91 @@ #include "TessesFramework/TextStreams/TextWriter.hpp" +#include "TessesFramework/Http/HttpUtils.hpp" namespace Tesses::Framework::TextStreams { + void TextWriter::Write(int64_t n) + { + std::string text = std::to_string(n); + WriteData(text.c_str(),text.size()); + } + void TextWriter::Write(uint64_t n) + { + std::string text = std::to_string(n); + WriteData(text.c_str(),text.size()); + } + + void TextWriter::Write(const void* ptr) + { + std::string text = "0x"; + uintptr_t ptr2 = (uintptr_t)ptr; + + for(size_t i = 1; i <= sizeof(ptr); i++) + { + uint8_t v = (uint8_t)(ptr2 >> (int)((sizeof(ptr) - i) * 8)); + text.push_back(Tesses::Framework::Http::HttpUtils::NibbleToHex(v >> 4)); + text.push_back(Tesses::Framework::Http::HttpUtils::NibbleToHex(v)); + } + WriteData(text.c_str(),text.size()); + } + void TextWriter::Write(const char* ptr) + { + WriteData(ptr,strlen(ptr)); + } + void TextWriter::Write(char c) + { + WriteData(&c,1); + } + void TextWriter::Write(double d) + { + std::string text = std::to_string(d); + WriteData(text.c_str(),text.size()); + } + + + void TextWriter::WriteLine(int64_t n) + { + std::string text = std::to_string(n); + text.append(newline); + WriteData(text.c_str(),text.size()); + } + void TextWriter::WriteLine(uint64_t n) + { + std::string text = std::to_string(n); + text.append(newline); + WriteData(text.c_str(),text.size()); + } + void TextWriter::WriteLine(const void* ptr) + { + std::string text = "0x"; + uintptr_t ptr2 = (uintptr_t)ptr; + + for(size_t i = 1; i <= sizeof(ptr); i++) + { + uint8_t v = (uint8_t)(ptr2 >> (int)((sizeof(ptr) - i) * 8)); + text.push_back(Tesses::Framework::Http::HttpUtils::NibbleToHex(v >> 4)); + text.push_back(Tesses::Framework::Http::HttpUtils::NibbleToHex(v)); + } + text.append(newline); + WriteData(text.c_str(),text.size()); + } + void TextWriter::WriteLine(const char* ptr) + { + std::string text = ptr; + text.append(newline); + WriteData(text.c_str(),text.size()); + } + void TextWriter::WriteLine(char c) + { + std::string text = {c}; + text.append(newline); + WriteData(text.c_str(),text.size()); + } + void TextWriter::WriteLine(double d) + { + std::string text = std::to_string(d); + text.append(newline); + WriteData(text.c_str(),text.size()); + } TextWriter::TextWriter() { #if defined(WIN32) || defined(_WIN32)