From 3473c953b5c4d247c81e36ecd246855c9a6ed3fb Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Sun, 19 Feb 2023 21:02:08 +0100 Subject: [PATCH] Wrote a test for shared library linking --- src/GC/Makefile | 31 ++++++++--- src/GC/include/heap.hpp | 17 +++--- src/GC/lib/heap.cpp | 106 ++++++++++++++++++------------------ src/GC/lib/heap.o | Bin 0 -> 137120 bytes src/GC/lib/libheap.so | Bin 0 -> 82728 bytes src/GC/tests/extern_lib.cpp | 52 ++++++++++++++++++ src/GC/tests/h_test.cpp | 2 +- 7 files changed, 139 insertions(+), 69 deletions(-) create mode 100644 src/GC/lib/heap.o create mode 100755 src/GC/lib/libheap.so create mode 100644 src/GC/tests/extern_lib.cpp diff --git a/src/GC/Makefile b/src/GC/Makefile index 6ca9320..b99d2a4 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,17 +1,23 @@ mkfile_path = $(abspath $(lastword $(MAKEFILE_LIST))) current_dir = $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) -PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include -CC = clang++ -PWD = /home/virre/dev/systemF/org/language/src/GC/include -CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I -VGFLAGS = --leak-check=full --show-leak-kinds=all +CC = clang++ + +PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include +LIB_INCL = -I/home/virre/dev/systemF/org/language/src/GC/include +LIB_SO = -L/home/virre/dev/systemF/org/language/src/GC/lib/libheap.so + +CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I +VGFLAGS = --leak-check=full --show-leak-kinds=all +STDFLAGS = -std=gnu++20 -stdlib=libc++ +WFLAGS = -Wall -Wextra +DBGFLAGS = -g heap: - $(CC) $(CFLAGS)$(PWD) lib/heap.cpp + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) lib/heap.cpp h_test: rm -f tests/h_test.out - $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out h_test_vg: make h_test @@ -23,8 +29,15 @@ h_test_dbg: linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) tests/linker.cpp lib/heap.cpp -o tests/linker.out linker_vg: make linker - valgrind $(VGFLAGS) tests/linker.out \ No newline at end of file + valgrind $(VGFLAGS) tests/linker.out + +extern_lib: + rm -f lib/heap.o + rm -f lib/libheap.so + $(CC) $(STDFLAGS) -c -fPIC -o lib/heap.o lib/heap.cpp + $(CC) $(STDFLAGS) -shared -o lib/libheap.so lib/heap.o + $(CC) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 0962c9f..d0f805d 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -29,11 +29,11 @@ namespace GC { m_allocated_size = 0; } - void collect(); - void sweep(); - uintptr_t *try_recycle_chunks(size_t size); - void free(); - void free_overlap(); + void collect(Heap *heap); + void sweep(Heap *heap); + uintptr_t *try_recycle_chunks(Heap *heap, size_t size); + void free(Heap *heap); + void free_overlap(Heap *heap); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); void print_line(Chunk *chunk); void print_worklist(std::vector list); @@ -61,9 +61,12 @@ namespace GC { std::free((char *)m_heap); } - void init(); void *alloc(size_t size); + void init(); + + // DEBUG ONLY + void check_init(); + void collect(uint flags); void print_contents(); - void collect(uint flags); // DEBUG ONLY }; } \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index d6ac52d..a222833 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -7,7 +7,7 @@ #include #include -#include "heap.hpp" +#include "../include/heap.hpp" using namespace std; namespace GC { @@ -18,6 +18,13 @@ namespace GC { * this address points to the stack frame of the compiled * LLVM executable after linking. (NOT CONFIRMED) */ + void Heap::check_init() { + auto heap = Heap::the(); + cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + cout << "GC stack_start:\t" << stack_start << endl; + } + void Heap::init() { Heap *heap = Heap::the(); heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); @@ -43,13 +50,13 @@ namespace GC { } if (heap->m_size + size > HEAP_SIZE) { - collect(); + collect(heap); // If collect failed, crash with OOM error assert(heap->m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); } // If a chunk was recycled, return the old chunk address - uintptr_t *reused_chunk = try_recycle_chunks(size); + uintptr_t *reused_chunk = try_recycle_chunks(heap, size); if (reused_chunk != nullptr) { return (void *)reused_chunk; } @@ -58,18 +65,17 @@ namespace GC { // then create a new chunk auto new_chunk = new Chunk; new_chunk->size = size; - new_chunk->start = (uintptr_t *)m_heap + m_size; + new_chunk->start = (uintptr_t *)(heap->m_heap + m_size); - m_size += size; + heap->m_size += size; - m_allocated_chunks.push_back(new_chunk); + heap->m_allocated_chunks.push_back(new_chunk); // new_chunk should probably be a unique pointer, if that isn't implicit already return new_chunk->start; } - uintptr_t *Heap::try_recycle_chunks(size_t size) { - auto heap = Heap::the(); + uintptr_t *Heap::try_recycle_chunks(Heap *heap, size_t size) { // Check if there are any freed chunks large enough for current request for (size_t i = 0; i < heap->m_freed_chunks.size(); i++) { auto cp = heap->m_freed_chunks.at(i); @@ -92,16 +98,16 @@ namespace GC { else if (cp->size == size) { // Reuse the whole chunk - m_freed_chunks.erase(m_freed_chunks.begin() + i); - m_allocated_chunks.push_back(cp); + heap->m_freed_chunks.erase(m_freed_chunks.begin() + i); + heap->m_allocated_chunks.push_back(cp); return cp->start; } } + return nullptr; } - void Heap::collect() { + void Heap::collect(Heap *heap) { // Get the adress of the current stack frame - auto heap = Heap::the(); uintptr_t *stack_end; @@ -111,38 +117,38 @@ namespace GC { else stack_end = (uintptr_t *)0; // temporary - auto work_list = m_allocated_chunks; + auto work_list = heap->m_allocated_chunks; mark(stack_start, stack_end, work_list); - sweep(); + sweep(heap); - free(); + free(heap); } - void Heap::free() { - if (m_freed_chunks.size() > FREE_THRESH) { - while (m_freed_chunks.size()) { - auto chunk = m_freed_chunks.back(); - m_freed_chunks.pop_back(); + void Heap::free(Heap *heap) { + if (heap->m_freed_chunks.size() > FREE_THRESH) { + while (heap->m_freed_chunks.size()) { + auto chunk = heap->m_freed_chunks.back(); + heap->m_freed_chunks.pop_back(); delete chunk; } } else { - free_overlap(); + free_overlap(heap); } } - void Heap::free_overlap() { + void Heap::free_overlap(Heap *heap) { std::vector filtered; size_t i = 0; - filtered.push_back(m_freed_chunks.at(i++)); - for (; i < m_freed_chunks.size(); i++) { + filtered.push_back(heap->m_freed_chunks.at(i++)); + for (; i < heap->m_freed_chunks.size(); i++) { auto prev = filtered.back(); - auto next = m_freed_chunks.at(i); + auto next = heap->m_freed_chunks.at(i); if (next->start > (prev->start + prev->size)) { filtered.push_back(next); } } - m_freed_chunks.swap(filtered); + heap->m_freed_chunks.swap(filtered); } void Heap::collect(uint flags) { @@ -155,16 +161,20 @@ namespace GC { if (flags & FREE) cout << "\n - FREE"; cout << endl; + + auto heap = Heap::the(); + // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); cout << "Stack start:\t" << stack_start << endl; + uintptr_t *stack_end; - const uintptr_t *stack_end = (uintptr_t *) stack_start - 40; // dummy value - - // denna segfaultar om arg för __b_f_a är > 2 - // reinterpret_cast(__builtin_frame_address(10)); + if (heap->m_stack_end != nullptr) + stack_end = heap->m_stack_end; + else + stack_end = (uintptr_t *) stack_start - 40; // dummy value - auto work_list = m_allocated_chunks; + auto work_list = heap->m_allocated_chunks; // print_worklist(work_list); if (flags & MARK) { @@ -172,31 +182,22 @@ namespace GC { } if (flags & SWEEP) { - sweep(); + sweep(heap); } if (flags & FREE) { - free(); + free(heap); } - - //release free chunks - // if (flags & FREE) { - // while (m_freed_chunks.size()) { - // auto chunk_pointer = m_freed_chunks.back(); - // m_freed_chunks.pop_back(); - // delete chunk_pointer; // deletes chunk object, doesn't free heap memory to the OS - // } - // } } // Not optimal for now, it doesn't have to loop over all objects // but mark needs some refinements before this can be optimised - void Heap::sweep() { - for (auto it = m_allocated_chunks.begin(); it != m_allocated_chunks.end();) { + void Heap::sweep(Heap *heap) { + for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { auto chunk = *it; if (!chunk->marked) { - m_freed_chunks.push_back(chunk); - it = m_allocated_chunks.erase(it); + heap->m_freed_chunks.push_back(chunk); + it = heap->m_allocated_chunks.erase(it); } else { ++it; @@ -240,17 +241,18 @@ namespace GC { } void Heap::print_contents() { - if (m_allocated_chunks.size()) { - cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << endl; - for (auto chunk : m_allocated_chunks) { + auto heap = Heap::the(); + if (heap->m_allocated_chunks.size()) { + cout << "\nALLOCATED CHUNKS #" << heap->m_allocated_chunks.size() << endl; + for (auto chunk : heap->m_allocated_chunks) { print_line(chunk); } } else { cout << "NO ALLOCATIONS\n" << endl; } - if (m_freed_chunks.size()) { - cout << "\nFREED CHUNKS #" << m_freed_chunks.size() << endl; - for (auto fchunk : m_freed_chunks) { + if (heap->m_freed_chunks.size()) { + cout << "\nFREED CHUNKS #" << heap->m_freed_chunks.size() << endl; + for (auto fchunk : heap->m_freed_chunks) { print_line(fchunk); } } else { diff --git a/src/GC/lib/heap.o b/src/GC/lib/heap.o new file mode 100644 index 0000000000000000000000000000000000000000..2f2a154ff8b4dc0a38c5b68f34e79b2532e61b68 GIT binary patch literal 137120 zcmb<-^>JfjWMqH=Mg}_u1P><4!0;d+A?g4Yc3_y##K;ip(fQP)`Hg}{XYG#{AaRdQ z*AE`uwqRzjDTsm!ANS}6$rMPy`6$vaJUU%p;L=$70;{IxBMPyH(?CFvU%mxo7tB2Z zsP5@};nB?jw!hOu!lU_!KH@aT5n@L+a*;bF_bz{tSgmIpSb_Jl`w=>v!r-5^CC z93ITRFANWOH2wss>u^2J-_FIrz_5X_!}a(}kcnNc$5$}&x3V%YFuVj4@*tCXk;8eH zIar7nq#SHESffWb#5RxaP*@kN-hP?~rEj*;dH z2?qWaL68T*smMVBlw4kNfCP@aLaizN;L&_c!K1hKghyv>15B{N0~Exat{ooTt{?*^ zc=Xn8082u{Cv<{GcWH-5ckK+1USDJxm^!djcj*UYO|>&TP(^xcp=qY^2*@+BhdnwE zc3$x4^j*>Ey5yxO$e~CAa5sQl3pUrIyLJVb0ZPtksOh=!%>uA~XcFxVg#=1xYsLTn z|2>Yo-T*~8BqCc2KtkQMFFcx$TY$|2$0S79@&teLa&XFo$a{2`-him-X7K0)#S#cR z2zXe#KHzV=3bGRtcLE;Tt`9sqT~8n-knX);+dEwkcy#-o@aT3u;L+(J-~rYEN)=F} z4nAP^U<9QlkTfXKyzpo~VByi(ngMbs!jY~kK(6uVg@%Ghr|Slf-r5}=y`>ur4|E=a zI&&{rS9j?S2*1;Hfd|yD9=)XpAc7D9?CJ0224qixyxCd}7J+yMltLh`OF(m72h?>P z5IZ_uLCI)_M{nr_WY>Xpb(hY7DQbYa4u@luLAe;BUJM zP6eRyn8Bm@0lP=@4+j3$RUkolYT64n3|u<22K@j3AL^%r9^GKB2PiQWgLHI5Rbov` z9H3MKNfZto;8LX9Q^4ckLuL=g6CU8S<9foQ+xLTqH6wpJAJ{mEtE^oQ@HhVjc?+DP z96$!`02%a+fsw!UK3D>3vFn9n42)3cff7XN4UgX11u%gXpa=rxH;>*@NDlLWyBLz& zJ-WAo{R%2`K&1;Pa=Tq8cyzW}fWi}$C^}mmK+Il9GU?pw0S}Pwy^xUI3Q;>1tggEk zt^g9X5RG6by^I989a0wbf^utTYYxI}h!T6;2_yO6|Nme!!33mmJn#cl>%No)rJ2Sf zptKNs*rR(d$Z)WEX=v%C`3!7=!K^X*AE`e2Nb}u4l1L2OJ9JZ24Zt}?E#POQfLth zD~dW@U%cc5nFX`xWgIA^FzS!yHwI{x#{;N0phaNw4-x*hBv_!L%Q5h`ID%|}x)|yp zP>J{gRVg?nfHLV12L2YX!@6rB1?bBa|NsAg38_zOAHb^ykLDu=;4F(;o;SZKfV;OB zYJ$gcS5U+;z-;vBF1_H<`N8A=0Z_>daZ{)33TUjCuJC|q1dD(PQ10-66p5fXh58*_ zkuLye*Cild!t{B7BW(w=eK1>Qz>J##QMAFM+jRrD3h(ya;nD5M;n5ws!=pP$z~kT} zW)H@TAj8`Xp@xG>Y_LIKLtaXOgdwTj_e7`b5rn(V5b@!9!J`>m@LhOm4vJxDOd!$@ z+|kWP3P5QaTG^&e0Jq-|?T60NFW}M=oQ07aM_?CqyMAeYzz8bqT7*H)!fd93RWK1$ z!Gcc(mS!T@c5v>3wP`Ti=Fxc^(J1UZ?t$E@1f@Ha7SIciZg30e#!Ei1KU^PpupR*A z{!Z5$9^IucpzR;gu&i&OEw9LDe0o@|xh$>kBC~ zAu_P)`K30(7{G3TgsV76VRtR4(FG|zz$SwUuqsH{ z;!)+%TMO}+2fV2T7wLwU`)Szv1K?T_GtR*w@A{#OL4}cj8>Ep35<-puP~3p3r2-DH zmvBl8;F3l*4BGub>8~KlFK{0OR<3q}ItK_2s9t*j&lK>oI3EzD~5W8TKFL#4V zbR}HQMa!UImqQC&0{)x<4Hc+rP`3lGKP@0FC}@cXu06XEoE@Ot;L!_h5W|xM)Su9N z(p|d(;?E5p-KEer4=l@&^!F}VB%_5Zs;y;25`W(x*>XyFPG0M{}S{$ z0f^q^agR<=qXm*?!I>Y@wS;Kuq3*%QthS!YA3=9na|1-)k9AaW%IK;&Jhl$||lV~q9!#-y1KTHfSnf2iA zMG6m4?*Y_=aR;@yVVMimfqMaJqqhiwa|B2MtV4{g)uRx5801Q*`Jf(2x9<;+ZbuH# z;DP1|kApv$Au8bM2c!nv`G?sLi4RCvf!i=IK+TLMXtN8FaKK&rZU%4%0@|m5L=(hv zM0_}aK+7q}P|F36=3}tv1dqKyRiX@kz#ItmKPWwc(#Z#pZgZ%Y;e#atkdT7tfT{<@ z7h=2$l1ac7e=lqp4w91K@c_{cjSo zSBTyf9>>8pcpP^Cjma>0G#?NEH$~xtGq7ycc^u+DQ2E|l`og0(^f^=j+@^*00J=+0 zc=Xmn0}eJa0xc%sCb@3#Xs+GBz~ANvNt2)v1W4%yQ@H}%Kk7E{=nepNK9M9*+NB3N zUH8DPdkGo?gYyuK<|7Hw5kcML+;SGu_P&k7I6PpkGz>*%I_JPWoat=iL16u%d z8kj~(KR>|bQfKW0kK^nhIgjJ+(6~D;;Bnmb16ZuL^n*ul=zDM!LA=lnYiNLz2F&$f zx9jr;AiEu80MtH2`vz1Ng6xEio_T=ES#Yib58pu>Sa3_gT|sCNdUV%bfVT;dRNMfS zrC=9&bl2WMRsrvbL7Wb5w7^^p3U5J1wkAf_NsI_rL){ArPgr>bbF0aJP!sV0ys$@& zZ)pB4hk5~#-H|ge*nD_=G9X7KD7et#o5Q2|AcsdM2SOQGfAbrN`ygTY!Q;3)D9th; z`ti{I6F5xvgGQ9WEJ*400hFy_+4Q)B0LWT|k1)({J`QaTLedgcJ^+#bOF`oZpk~O8 zU7#umVpDf5e1z@*D28F82Ru5Dd31+DiWx|xfJSGV4}dBg&`<-UJMGbYBmgmjdZE+x z47}S2N(5ljz;zpkJ8KSuj~&Pl5Dax6q&*6Yzs_3dh#a`F;1)qvH5_@J^ zcyzjRKtw+vhIFABA2d<~Za)Nof*I~3uzwKaHQ;6$q!@#C8)20_#62rKI(=t=8(fIi z0BEMb04cjbI_97eUPxqv@-=AitUL6EN4M_*AJ8;buj>Y%ZVsPL9u@E~R;P;!yp(?6 z0SZ!Bw-1u3LCxI{kjX97T4@EO0SFd^mWv1nL%OgqMz<%n+-=WlhsR#4H1WNcr%O}tr zb?66=-df0v47|$^EptFqoDU!qqma1_Pzm+`68^CE3aGqA)CV6xWiBXVTQl-cIsk6r zKpg{B4|WPv2;@GG;|Ko#|NkE>0_Kxi-tGWt|NsAgJ!<{3A5>U@EdvczLB22Efx_p7M<=-Gc!4xd4Jy?j)f~7y>JA0X?h|MaKo@{O+AL7>k;4yD z9+qA~eIQ6Z22OjRNCfLgmWQ-$Q00;R5Ar)CV?ezM?(2fb7TQ3APvFD`N;@70pEK_R zb%-D$&=3LJ*Zf9cKSHMSIH)lUQ3W;~BYlD#3dKT zEiHI4{sT6}1TDW{jUlMxp!pT#9FOMO9|HW-(X%t8e*sI6pfUjLVpv*-#0k`?U<&G9 zc>F-TiBN|w52_!L)qv$e@dJvxZXEp`n0w&$3x@fS`AU#mJ7M!>;I1C5hJ$b*U2{k$ z5LAU9K(tDrkquD?Z^GSxv@%X0)IkFlq7E|t-~%2suLVu4JOF1!P!c=%fZ3A~Y9Dw$ z5*%9a^18sI*Hr+VUqJb-)Axc8XlACf_5{Cx>jQpG*A4svt{3<s>YO{jM0#Ft!fF*Ev_=4jSG-l)r?%;vk z*ooARhB^-t|M2*5Ks2F ziYX-bcGiOXA|Mg4`$6FY3QtJfJpjcWN_fN5D=567j8dE$O@hA(g_~jp))+XeH(nbT|4+SAi|vw_yrl@iyHU^ zTsQD*f{R{AdVsABf#rYj{4!{GeFZcbe((S#pH5$pS6+ZeOTpurzCS!VeL;=n2Ogci zpk+Lu1tTXw@!aVPneXj%-2s{!@gS-#-R-&p(ys*tBou?gW3aiW@l60|rAg=B6W}@1 zy%#_fIK#F=W>HJg0u0n>2hD(kQa>m}z*XJ?=z=ovup?wf+;@QwC=lSi{BDSO-M$Ar zI(s2Ymq6Vs@Ujo^Vi@R>oo?S79-Y0Ag(MsvoxPB?B%n1fkaZ{Bdm$oQL90t3xu>%g zw8X@tb1GsfrdAtv_LHhA=Itq0B8^@26|bPM=&ilFy|z?EXF z1V|aEtnO@8fG`_8I$Jp)%npyvRsk?`FGSr|h?=Po`CgD5)ODa`LXfcR)d1<}oN54~ zxL z09nwx6>MGaRFEK4T`M?#8;^h@9hQ%w$rDl@g8SE?{IUbwA4SP4;HbXH@sXA3XN`1N51xeM=z{`2la))V{2&s z2aV5y3oB^-bOB-!Z0QbW1!MpXNNE06fK2Csyz#@MGZfTl`2ip21LqTH69uXs6dqvv zz+(-azBi!u9)K2#8$6&3f;_rIH+XdWLVb(r4%E>FczA>6C&)2Bbb$wAkqxLn?+Y4% z0QIPmYhTbr0JIAX?lW7kX2ANfQ2&9(A18Qp*3Q6@pg>gMXF zt=F0%i`t;hfF)N*eub;|01c4;01ec@)Pc-{u|b+Zd=JokLucs=Xc_}8Fb3C~Aa!7Q zaQ+8PE|K<@-fyWEFVe<))1_o3f)PI1quRv`SP#dco z6gRLX-q6g3Xb&LF>x4xaI1x~5yaZH!K>IV`0`mcQI26=%wssWYZ?OjVXQ18!@&o} zP{I!)kD3(0Mu7FBw+E5?kC5;N6>u*+4nAYv1@8xfoeN3!=;K@pT&6I$g3ZS?57LB% zm-%RYK=6nas9g)rL9jj`SQIP*u@&KdO!Gl%A$B0C1!;h~2NE8T@Pf`=V+k*)JbYFS zX`BmW76_x5hbw&H?dRGbpz&*%A3$UDBZpKc7(ihRiYFL`szKe)cZJ01ZJKhoD@5NSUsFM-PvP}G3he~_*?*nP0^evlfFJHcx+ zz;z>}+YMU6-(rGVrh*oJf_HWN@aTjNDM1E8Ak&-RXneU3RG5OAu%N;pH0_5{u!7?& zn6(5;d_l%v!0rLH0}v}SK(j;8xdcc*ow)uy$bQ&75@J3UWEiBM51zCE8Q5J4@6dZ- z>&YX97pUawVT|uh= zVc`bt^LHNf=&juj)3n2*GZZv+4)O`S^$VJO28}~O0~xf|ySH|QM{g;7w*#c(3hK*2 z#$w?EMWD=sXb*t$3&g#k-7?+K)%~FP9Pmg1LO=3YF31S1;RPN{0G9)x$bydbU=MSs zen@=-FWVq>4U+jt?gP(vfR+Y8%Q95Ap_m6tpRlqEcl`u1A5#86+fJ}xe*w-Yh#m{9 zFazfe304E-yn*CiP=B7BW8#bL7RI(8~b`$ zKzngOE3QEE$B-O|B`r9_9)`5PA?*u@eV`?hpbv-VuU^yK158?JFsE|jSzv)J)gh6fvVX%E*|AV@l55Q9c z;9vtc(?Nv`v{?wM6;ON%(v6lL!EOeRFN3OHumZ68nC=CoM`(CM>I?8tY^N)<$OAWD zZh)3bv_V%@z_J9aW+-GLnjCLm=XtQdpLyUTH!!^$zZeaP*pPEc5Y*7$(3GH8&P z==Ft`fZ)BHpb-@g5AZ4s4-St`9~BOd zZU+I6P8Ste_Yb;3u_YGVx&h}^(AHe2A>Fkd*cOn1wgZ4xTY-Ai4?LiY$si+O&`6lk z={g0pofI5%FV#VY_d=IhLDG_I16l2%YD70jdqa-R(}$f-Q(PI0@Dd&i|l%2p-o4t$_yjU%~!D?mWQK7sx(v`ja3s z{Yg-k{(5~8=@~Q%CE(E=$l=imTC?jZ0NPc2%s~Q@{2=uY>Rx@&$lMR`Qa#-3!64-k zB)>o>I6!;S1w6VzD~aGm;0f^RAg~y;qym*akSgwjN4M_{pKjQUBcwQixCh)`2Zt?a zLIpC((pigRJQut*161>Zs%1p22`a51O?AYQVbB&7$QDBM_=JWRtnNb8d(ikslkar> z04WUM9Z0Yac&Pwd3kzC%%&H437ho2mng>dE6&(8z>pa26z|?|hsCsz&Y6By9AzFv) zd;UJq-UrZ$2JgXc>2iG!Dx5vEK`V@59s$J=N-czL9%yDBl5RU)Uw{pN!O-FQjK3FV z_%o>C&mf~`=#?VaJZSm`m90=dwC@PYsjiTOBEdPL92Wr-KL+AX!4LD>rbpH!z zH8{A!!=?~i_kDnr4&dz&pwWN0LU1ekg$L@U6HvfHG1R@N^OeZsDc#Wh1JIZOs|Tk~ zl>85BKY$8qSeqI)sSfTBLahQ*Q2n6v1nv(*!X9ckth_+7AFDii`v97Mk-{Hbk-+(| z@CKE6@IC@~)B#$(L8gGgi#DcU8EgQ6K^1gO}AEX9XpYH$jHFDUMC-3}J$ za@`Iee~Sf84??s+`(B`^?gXto1eNXV9^DQvJQyLX=3vc$Zr2T}pwk7Ke<<*`!cVFI zo&C}2x&V1W7HHlOG|d3ofe9*9UO=|OgQ_|3HX(@F9-Xxlz=7G}Iv?yl(2@X;Zr=`% z?$8F%WI&hee2?zh9WMO)piK+NaS&j&9^H_mAwV-#u*pcc=O70jAp2t2bo!KGBX}y zmIkeS2d82Lfs~%X`yas8f%-a7+dzBNLC3?uibin1Pk>beRxX0|gA!J^>kr6|(F34l z3%39)4@rM69iVeaASDZEFblE-;6jJ%d2o@)-wIk(1}-K*$FJ-KCppk4jxTsz4-|FX z@YXPR(s_pm=um_{5m4F&O(}P~?f{JdcDn9>B(LMHJ3#ILH)x>UKhP-};5{;ZphZcb z!V|P`8#Ji~@wm0?2L2Y%LOS?{4@g4)@luzOfdLXG&9yri`1^K(Z7towzc2K>M=xk% z3vs>x^sE7hU%)93Vmj=I5YUo;Xg=z6ZGe~xYGhfv?%;0$Z39QQ{kSWrnZ@u@5o9Se zaZKoR?EzT~Hu~jk1_p-Xt{q_i_ClBUce{499^h{Q)dXNWUS=ZgFb7T1K7a%lblVVe zkboBUKxff#2MK5sBG_P1q6F1lV5dNQ4XPQD61hh=H1~q{>CIwdV3@_kdWnf)KGR1~ zO++`p%;_^ex0W zprP>Y(hvOmpxdJm`&^J(Fi`Wr{s9>S(F!fgu=oh99^@ZT#RY0_bbCm6fLjQlez%7N zXk-c&R!HszjX#0wQ1D`Q(3lAFIys1?;JO`VKFka#A3TvQZ}8*=-Czn41*dsPISH@&LG#Y8FQ8EdH4o%oM0pM>m~9yN5mV8KSr4r0!JSY@ zn+Cgl=W&nb` zRP6=+eWl;Q=?->+8AuOUpv(0*q+DazyjhHSPFsq7i>PP{3%!9 z##sa*t4HK-utVIP6>{T?OA?c_<5TletT-9mofRP5;*!Lo5-UyykJQ8hD+TAoyuADp zg~Xhk{A7ik)Z$`=l8nSW1p_BN1;2cSq{@=iVu)m7NotB7RFi*ciGqKcf^TYWeo-Yu zMrvY#u3c_?ab{Jjg0=#fvawb0aCHob5B7|5RZvq?P=eToqEU$?944Y4IhR3@)xtq3#OK{ysjg&LLcGK926eRtgMU3c3oujzQjF zMsT>RYXF$#7Ub&65DfA>$j@Nk`X&}-r>20k1cUsqkeE^g=44i-S}8CnIB_vJXO!k; zD=$%@9Y@j>Z0K65$fk1tf0)`=dS=2_4M}(=3?Li*@h~QEW%Kh znp~1!1WyxShD&NvW@4T~a!z7ix4fw4k>QJROH zV*(=sgA4-%gXEe(gd?9o8XqbEoSQ>2p9*{T#14AXKi2{>nE@1?z0O`L2 zl^0}UV1V1t%)`*kZe;hl zA>8)^D({Od&*TAC017(^Hjo4Zg9eC##ceWJ8tgv{s5~z7BcSr2wlF;GAjX6BS3u=) z`ELeP9#`D&fXaim;K9xJM!4?=RNfNV{Ur$bA5eK*;U@t;VuFDIm-{TB^0?d=0hPxU zz7 z6S(`BAcYeszeGUgQR*gW-YJ2~MI*-z6Qtk+rM)RodC-|^aI=FDe%}I>$CbCPK;?18 z-501luCNmU&G9lYFyN|pOrY|(%nyOeuSD_R60iqA{wsmXXQ9YLDn^j}6sSCCGzsqi z7_fG5-q`|`2lYJR^1cZ9D^Ph{?S?N<`Nb&q&jT9(vR?!=BE`VK0H$DR(-kZYw%-IS z!N33-UxM2YX*Pl7L!k1YRiSYCNQC|psC+Go{S{yZAp5644OrY|hRl;!nWnkw){127aLw0{A zLcRnl4?gA#<~}ArumX_%Q=sxV{STGLW&ahZJb0=eW_~5uc(D7vK;=Q>VQ}|HBjiPR zKn`bM039X=myborn?U7p#y?aZT*SiccSPtffy(1bA5)<6xWZ=(R32Bm`3h7XSN{G2 zl?Tmi!u^+qaGwac(qdr1Rkxc!<#CliAy9c-_Lo5Aag`rapz`2k3JX7^{I>-vkE{H= z0+q+r?)w6j$K^f|aHYn;fXja-P}N z>ldK%;BE7;uq#Ex?FXnlF24!zL()F3de;Cd4>ks7KBU?M=dA#!Jg&4=0F}p8w@iS_ z<4W5bpz^rPzW|lT)#v^Im7fdpCd~azGr$1^DtiRL4Jrl(TxE*^0r>!^Jg&N>04fhU z*99K8d0^|o;Wq&)k84a}15_Sc+5x%$0#qJ!{{h_mEQI+Vpz=859~?0Z44x?A;{rAS zWWE7Z9#{AWK;=PaoWkvAf;a%AzW^$a%Y74|^0>_30F}q-f2cez|9ybU;~H}j05>Wa z7;vQ@1E@T%x+4H854HxDzL5It1yFfhW!nU(yajUj7lVTzoIW-{<#DxbEyNHbCV; zr&q(%R}R>D;PANsmB&@~e}Ky4a=!p{Ku`zS|LF+x4WRP4`t$)%d0cI)0;qgCviVGq zK_5`~PJqheO5Yox^0@530F}p;zCS?aarMgtK$FW1xW_yUpz=7=KU5xkS~4tsFx7(t z5ahoCs64LpHvuY-t8KIaDi7LC0gwNDudNMt9>&8Dvzst-vE`zTbhfRP1bo3Sj=t>ZfIw3{|22^!dQPh=y6frO`aA2tWg`y5Nm!-;tW*)N$Xg&&T zG01I4pyq-4FDUkc=6%4bAntnuRp*CpFS7$^oCB;9WFF{ZFObp*1~hw_K!c@VWnllp z=CWpCsOv@XM+#`HoPmKs9K#1J~b2pyuIn*Au8bsPB(r4tV?sVi3q(JkYrv&>SnOI#6Q) zq0R)V4%FU8Q3smKfG7i}57=B5XayUJIwsJ#B}5^}-WI5Np#B?*I?&iPL>bt;HBfaw zF~aRNO1xizsv~3`Y%U8l-i%^z2HZHXy((Zy28M?i`DQLkzVU&o1J$EoCaj!5L_gTP z60jr#g8)W;U_!|cbD-)#?M^TgW*(CR+<~CEmLp(E1_sdBD3}RX2bws91|S1up(tny z2QGbpg9o`8`MSw#XE=%y6^}@J45{rTC(m2WrN!K zp#C~Y-kX5|Ty}%P8N>&*6F}EE1VYt<#uP)KY|y+tNDZiL1ks>A7bstW*r5G9pgs(U zod8u2x{wLPPl58&7#J8p?M#puXz3=1&Sqd>0F_Z7Ht6z1&^Q2yUC6+|09w%jVuR`o z(9JewP;)?6(Nr=pFjPVLpgaqTe~{XG1_lPu{d^!cXdOl~R1IisxDCn%<;hMcyPJW5 zp$E$DV_;zDhq6I)q?4fRDGUq@Q=#nXP3{x`ws@$}eJMU;y1f2r|1A zDpt6Y4;7!t$iOfO%AUf=z%Uicp3ca?Faye-#mK-g8_J%`$iOfU%3i?8z_1X?Ud+hA zu!NC;VJVakx}I|dlnuI%5oGTgMh1qpP_gxlpj%-f>30)U4Akb^3T1C+WMJ3r%*eoS z1&&a^=0m}abrN2PwZ;T8K-=XZEj0_CFplr~(tiMq9e~?3%7#J8qn1O+T8Pv{z zve}pz7}%j~P9_EhE-0G^O7lT!P}>Bw1`cGDFjP#GiGe{3%9dbaV335erI{EQKz+eECH-ge8 zObiUBObiTWP`(8d1A`?K1A`Tm4_a3S(r?Gaz+ev*bA-~)ObiSzP_`SC_JGn}ObiU( zP_{1<1A`xw9RQ_+m>3v>q3lp79S)@0~Abh7>3}jfsIF z9m>vRVqnOEvU8Xi7;>TPd?p5l0w}u(N`v|grBHS`l&*x*)l3WwpmlK||JOmq8lZF& zlx|^SU}$AxU}%H#JD3<4I-%@tDBa7%z|aR}PhetTm}f~y~NIc5e-jcM|rJU$670Un=YU|^V@4iSg(VKm50W(H6T7Q{lu%nYCwEvlFj zsG)^L9Hfew0o3vZu~0EH1E>{@DhA>)Lsqnbm~bo!btib-f`Nen)IJ4C9!i6_AJnb` z@j?A^5IqMf4r&L1_|Pd;hN&tL^`N#6NF3CL2GJnQ%mAHy0&$?&Bo)NK6bFeiGk{v` zAQmcSW&pL`QN=(!W(H7e9>hY$%#f8DsDhxf1TxEmMI6-P#}H;oz-BWu1E^<#VhotW%mC_XfSGXO7pQTLMI5AnnE})z0kKdq zGi0V8MesD(odOJ?z6pv1INU(J7<5qv24;AwLC7ryn*&Qt2yqaLnE}-M0kKdqGXtnM zgeq1KHV0GO3YrcpC2kN2^ELs$9vH50ku^@hCr8oG3>TYISWnv71aHp zHXz6xn0gSKnE}+>1+h>uGXu8J2c<($FBnxVh{wzT>J@`n2>civkC@^h70e8v-ZO}W zikTTey=hdjCa^h};viMb44_^&h=q!o89+U7R51{bnE})z2eD8wGXtoHjw%M?F*AUA z>mU{?W@Z5O+)>3qJZ1(^PaecV#mo%g!UI(hoZrEj4~sac*N-90z{~)vEl}l{89*Zf zsA3=&j~R5y5{Q9>J;3!NXhZ=?5Xxj`0F5v}IY<;Uc*Fro z0Ce3Y*sGwC2vl(pkC_29G67;Ca6UBMc0toKJ3@+qnE^CMmV4xB#M~Mo*v|B#M~EE$Ku7{mCNl$QR0zsJ zqL>*#qeMsoP$n}2Xv7H0L86!$K%+-U0#GJ11FV*X3P34l2GGb7l!HVuGk`{!kOZJi zW(LrR6O@BQF*AThpO6HgOlAhqXcUx#L@_gfMy8MipiE{4&?ps@gG4biz*+-Hg5dHE zG=haH2I4U@fJU@HEL6FQL6PO5uW@Z45m_gXcBr^ln?h6Am1FSWJtQu5rf=1O)#Xvk}@a!Ilg^HOO zK%;G_Vjvzf18C$8#6rc)44_dsR51{bnE^B^2Vx=cF>rl~DGpM>%m5m_1F=vsGXrQO z4^<4rV`c!2?15OQn3(}I%7-cj;xRLTM*Ki5RLsl(8UaKV1M!#{KqG=67Aj_DfVH~N z#X%#6sA3=L{u>lkC_29vIt_KVrB-=C?l#Eh{wzT8gT@%P%$$D zX!H?P48&swk4A!62>csdKY~Un5n?bFGXt!32or(O%nYCrOb8p9WM%-3W+IC~*vt%| z(M<>&nPdi!b|Q-~FmQt10~!TI6$kN{89<|=AQmcSW&n+lqKbid%nYE>QVn)&*gGP{1#Xvk}2GD3S zh=q!o89*b;sA3=h=q!o89*c5sA3=LKr02+A*u~0EH185{3RSd*qW&n-KgIK7TnE^CHk17V@F*ATh>p?73 z%*+59y+;)T@t7Gvqxm2fDrRN?jqan0fq2XepwWI13l%dnfJXjN#Xvk}2GA@3h=q!o z89=iFsA3=TCqk${}VKXy; zW;h^h7)Gk|8TKrB?u z%mA9fLKOq?n87nzAQl2|0_R82Ocz27#$sjw&3wUl2$~r@6Ncb}SmI!FKr>_@9x7&L z0L_@8ih+2{44@e_5DOJEgJ;xG#lC>k6=EE`c_0=lW@Z4*?xBi-c+3o-nLZE;6*Dt{X8usc zKs;s!&`cnRg^HOOK(m6VVjvzf189a2#6rc)44@f9R51{bnE^C=2x6gPW(Lq~BB~gO z$IJklT?DaEF*5^brV&*P#A9Xv%{qcusF;}nGz*C;2I4U@fMz8@EL6oTVxeMY2GC3?su+mJ%mA7>1+h>uGXrQQ6;%wxV+PNx zf>;O~4Nm`{8CQfDjK$0Vnt_G!5HvFbXf_tXhq0I$K(n(j9)f0O0L|1Q_#hT&1V9LB zz7;lddWH$KKNm573R=$$QhzI&0n02S14EG(1A`J1Y}NvLW)A}cc%%_|t^s5Q2%ETq z)Wc?b7~nGv_v1n0h7=6KMa3DE2^h{wPHn`gNrkKH|snL+MH%xi$pP+?#I zkDy|6kGdvybN++;g;d^x)*6Cb@KXuoPDFVQTJH%Guh0dFBjO#j&JHBLR|mWK%NVhX zgGMAk@d7$E5TqZx-++OEVYLba14tY;atS`0h=GBjG#VoA0G%NRt;GWAo2rK0{GZAY z^$F1Rub}lCAoW)RLGDM)3&Una0z5$ChU^oI5Z-7QD_{<;%1_p0okU5C?XwcefkiA+eAaTTeG;F3PRRAOo zOEnDend4t-AaTU(FL-|+0|UeMI8ZtPtvUsnikO#QkpNN;TCoZdhoyhe{#qp_#Jm`I zp9cd2L$fi+9K^gBXk9u;=Q<;hIAWd)w0;mIepnP_K4M$~v_=*rE(&%(VtfGRvPX#^ z^@#BVSa|w)fy5F0eb|g|IXE5>;|ZX3ry%oX{Xyyx;{dQ6*a{X$j01qy*@DzhPzR|; z^s`_g=nQs0qMrp@ckxXEq#iME0t=tFAa^45zhLviTO&c?gXn+3=EK*ygTxX2EaaK@4IXc>SOf6Rh-t?!5<< z&(M5l04=&f`#nHf{N+IAAl4zkW=wNH@xla4Wso(!AoY?_pzuVr!$E7XLE>-hLFORF z`C;+344h67^Qy3P;*tzfk7#eh!cE-{Bn~TGp!+95>uuGc#dn+_7!;|AFa zE0q!PB^m(|2M=C?l!5m+fEYi(=^Wh225}+hB7ycjae~w%=D}h91+`$6m=N>Mp4cJQ{2!*c4n&BIePc*@oc-FUUQhRtLy7ggXzhfW#5=9k6hd0=It<^CPhO zq8F4tk>=B3>3KOg{1Nl!+z@LRwt)SMn3spuckS9BdlB>0p#4f9Er<9);)wZWSop6E z1BoN%i(xBH-h;&v^YSq90En0GNN@fZJDyd3jhlW^V#2 z_h6+I^gJ=px-D?|hM1QJpCiV=z%UzJ&LHN;Vd*E59TaYed2pC}UV-aD#5_K1rJX9M z{lJ8n$A`7Arn6uVhYdK=2^$XeN5T0Qu^s@{(q+*Dxf8J-0G3}uz~YGY05JDE;t2oa z;B| zd^${=8!V2PPY0i^#lXPuI2fcJF`o|FGX=^ot+pU>ST6*6o(yPTra34*Am-U&_4~FU zkb19u`AafA&;IQ^ar3FYF zF%J%FKg)vCAz~gJwl3HjTwfsO!C~Q??g=snG2ab~mtIJ_3zS_!&W5jy^mGHMN6dr6 z{JRk>j+h6B_2@wR_LP_q^X#B~e;@-_1%S*!%xlBa+a6_*IAR{z7NnSgfk7BtJ|pI5 zVfo871*9G^4-VST3exh>5ENgCd2N{b1t4)IP-_aL3VKc=0|P@WSR6604XeN2%7e^D z%tyoWqmDjE95EjaYi~D$#S!z-Fne!;^ATb`8s^`rU~$BJG%SB<Z2Q6C9`%WcFwFU2CVsQP7m>-1I*N?#AjF=yU#p6B~kUJ6cgRmN+1swi}c|Fj6UQjsP1NZk4 z^MJ4(jv=_egP8Awzf$O2C1i1|BMyW%9cT?E>N1+oot zRse`40ve}cLd?g(;;|c?&Jpu*u=cG9c-#gt9|wz<-dIrhAm-y>_0eB&zW_1s1}j%* zfcpiAc{fJ*I?$~^uyj>asszQ5c5;85x{Ej zI2dAH3FhDP;C3Too(NXHF@fU?F;4`G7h7=tLdrb_T!VPKO1QwqB zAaN$dJOwO&Z3g8#q<*-k0a*GVCm{44=BD6^H#7C*amRDgP7-n<%{p& z^o*EagP9`<7Dvpl!TjqFPUndEHJJEjusCRR0+ef^=NvIGFw}tK5iwr|8_(AR=P$&3 z8LS-=2X;SVz6@5r-C_gz3o%~?vo{7Tj+hsNi5r6EFPISXUoii!;sTk2m|ug5tAoW6 z^Jp;f8({Y%=EY#?@E#NP{ObUo$3e_n!P>V!!R;KxycMh-QNxiA55;3Qe+~|D&|Rk3 z^4(P&?X+F#3=E1)pxug)_<~M9FdR(BZZE7~4%*KHYPJ6P4*{@oCeVxrXkR%@92TFT zX&KN|3rrlA-a+QrGcqv1#9`y6AaPLZ7bXttPk_t;?Nx_~!$yEX>Yb3xf$fw*cMoht z5o8WX56m3cNGwPU**&n4H;_28dtmK%kU7ZifsM$4)FZnG)=mV8BZnL4Tm(?aql?2v zsLuG}Q1(h){_x}bN0zK;m+5NDdAV@v3JGr1eCXl_z?u4CF1QG}J4q)bk_Q->* z0GR_CI);h2L(Kt+gVF{}d@_;;uN<`yq*gRwKjgorfe2>UF}z4hXhB$7C?ziuIkmm#I|*GS@^SyWiO zGeRpAkUK%=aKOaXki?P0-x*09IeY?;#F4`%3rQTb764}cLL_nIc-)Ia9CoJx$eo~3 z0+=~3kknTr`Ii|wUkFkU+M5bfFNGuy8dZRayCR8$&K`k@XCR3qr>i<7apdrsizJTh zuWd-;$nHOfB#vypIJAKWazC>9W=P`5=_d(EybdWGvXR7*)mI^jBd4pmP;vBnZ3$Ey zRE&b=1YqH_5-JXICvv^EA1aP+&M~Ms$Q)1`6K2k7s5rVg5251d=DdK4gUkWR!OVFJ z6-PIR8B`fFK<2HH+do`TagaHnwjRtJeyBLQIbu+8ke$fp$U?Fi-Imq?6 zI+8eYd&3ecj&8mKR2*bJs4oR`rz=z(WIl5E2O^0hw~L~o;vjR7-I)Lt2bqKH&iP2< z$mQE<9O6%r#F5Lr&q(6P=}->TSb^4S$l~@$;>h)QDv~&IJzjw%j%-dB4)MuI;>hWL zGgKTs{C7dcLE#2kBLEBk{ZMgGxFLuCB_wfB8w{rY4pbau4rt5|CjJmAj&9CJByr?; z{0$WcnFDH*!^~j-HS(b0iR>N$ByrH_C``Q+R2*auXp9FYE)Nw)caJ7i9HbsO{eb$3 zu=XBu`iX?92bqIhPo*J=BiB>qNaD!#R4O0Dvlmsi=g5lcYhMFAgM?8Zx&P> zWInQg^P%D(bCCVpf+UWdP9`FWBd3!^NaD!pWCxNsaymJKBo5l81@rG!Byr?$eg+js z54X2aage`2b09EtK0(Dn{z4A7KTvUydgO3m2Gv49MZYha`?1&hk)kboZ!1 z#X;tS*4)9|qYV{DcaIH{II{U3NaD!x7z7munUC!LaHu%Qd}R0MAc-T#V{jvSABk;IYX@f=hfJ>0HB#XDr`+cyLbs%xjY$i-S^7sj| z`LKCKkbjZIVe?}kbCBD^u$3nuapZbX733IbIpcxUo&?nqASsY~&}=5mJ;>@o=Mcig zVe=#)_1;M4fYK_=9MJ41Og(Je8l)by`V=M(8(#v6gU%#`iG$8Ig_)CpWInPv$mtx} zUeGKj%pBNy4UqYua}HtRpm2nl587P|6NjzW2B`;~2@Mm^04aus8)&u^CJs8^6eI;w z4>~syCJs8o6egaIhE2pw+f8bCCTDI*Sn|4qF!nG6!_#4outyWGU30 zpw+xEao9RFkb2NLjxcf93O$f`E|NQ8^MN37&}v?odgO67&>4_0ab*7@$IBul_keZ{ z!_@Cb5-&uu7j!l$ND5>xXmv46J#0l8NE~$5BuxA(NHNsE$m&^;#*$Wd#HXk-` z39=V71_(0;xjaD@2bFa&bCB~FY`zX;4zf71y~ySukHzAmhs=S}lOh ze9-x#Fmc$t0mz(QB=>{*k{~aD#F4`R*?iDy0hl?+;SV~q6efR~HsLFRzYS%s;G&1Ztdk^Nha zWDc@_LFY1qq(JIHW7IHnVCyD8;-FO%Fmccs$uRZE;;@xYpEW)2fa4(FLj=79QWFn5Ahcfi!c)+K@513G&aCXQTRgYLnG zi6h4gXcY%cJQ8F$G+sdG*22WW+bf~s^O4*GTZsy?7qof=rXJQl0f~doyoHG)*YC*b z2ig6Lkj#h8dxOkD7Kg1zKo^JY$N-6hR;|G7g{?RRiG$AFg^7dC%m#TGB#vAz!B#w? zi-XR(hN(v`-(V}2LF$pi0XDw_5=Sdq)9yClGHjfPo&z(r-Am>NW>M59dSor{Iw}Q@+hKa-4fgtfcNai5- zFF>o{VCs>}^LByc4NWJ0gV-dw1DhAfMgDG_=9$7!PFy%!yzQ~ z$mS!5CvyD`Iz0ns4s!eF2$DI-=?Ao{3#J~~J)m>7v56l?G6&f`$oU1?UeGQum^sMp zZO~cWFmdSc066_1$1iLh3Mk%BA=wLycTjkOcAvq_ft4E|@iR#3k^5iB@r&$V(5^I? zIiN8vP<(;xJ%?ltY&{@I9JE^vrXD#wLFbIa#F66>xj&0+??oi@k<}yD%gE|MyWwEw zBbQ6a;;{9AAa^3yr?7QKAaP{%;ULdK(=&2;4!WxXB!#XXwnGObj%+?`-yTRDbjCW& zoyh%D&|Eo8968*O-Gkg7Ll#FaZ;|bV?Hd5ui>w|t4geBIR*&2cM^+EpX#!G@?0)3( z8M*xi+u;RLe-$Ynk=u2k-H0&%B8y)~QjffT1GK9VrXF?=6v%wg+4L}R*vfX0IOsGO zm^i4<4vVkbNalm`GE5w_3KXUuwgMAm&Rrz+$ngbQ9STzqD_244?<1*)?WhHbgI0~g z)FX#KXzw*l9JZqkq#kst3``uhLk(RVwoex%j_gk4a_=#cdtmD&LFz$k-eBf~#wuaq z06M!LoA@&%b71@AK;|IV8-x%>gG z{)L&3Jg$Nq{>bimi)1fy`3XwfFmsU06VP1@FmdGYK{g-RU&!?WY@ISFoI$4y!OTH! z?|npa4|4qoTD=TYkL-TX-cy)3vb~^H%`kCfe<6=sBAfFS$zEjj$n6JW+Ml3R(=dC9 zX?KC{u7IhBl@Fl$_Xm=DklS6L)z>if^lW#5?$v0Hq($-5xM=klPjiklcfuFObtGay|vEPKTL;>>f}j1164Ke}PVy zf{7!m2kqs8i6hsu$o*X8@fqa&i#$GtoPUwWKat&!oX(N!U*vp>ERO6R)!UtI#bk`tE963B$nGowmk;m;py8~eA zgOKb6-QfZgM;Os2?VCs?6 zIWLlWWPgEnCBW1po6nD=9$6f;W*?>=dHe@CJs{^t-JAdf48&PsvV zi#(n$gyc?Se}Q&Yz|%D zkEbEe;~M2=yUWdFkM zr3IM-x~ByMY0z;d_cQ?VCr#&4{RR;$b95+OJw!P;>hJcXw5UseB^wA++RRW zp9)CsL{6W`^$2LJ3=~8l_aOHdkn<^M*AmQLWN{@V^O3^=IUbS62awYV^7sSjv=f;5 z$oWnM$$aE;40H+#Og*xH)sWP~_9KA&g*?uTTn>OvM}e7x++G6Rw*?bN9%n|*cgXWl z$n_@dW(SbH$m6BR?F8iZ33B;^T#kX-d9ZlVMDiDM_=8U0g1Hk}9CSw*OdL7fkmqfY z%YS5XOphOF!i9_Z7}tqxm1`q^7txf?Ho)TbY~h&J!nn} zCJs8?5he~Ai-w6Kn-A&>z{HW&gT^jk;>hI;sILtZN6r_>@o0|ZFWC4S$iK+yk^4uW zU4bxng6;~1nGd@A4JHmd!2o0q=(I_gIP4?=khnFHy`cLlv6%x}s{j)R?K*^+16oUi zO&l~f2opzk52!B*6SqaO7u0rwi6e&_a`_3`)d;f}xt)(3KFH}Gbk`kBJ#u>(bY>h( z9Jw4oUS|S7e}aJle7Yt~J+e7YNbW~&M}c-t!qg+rvw-f|gNY-@yDO48$n7G~E=ZVq zXFU&L{g6|4%#&dQ;!^OpgaFy;>i6k&>h||apZYA&@M}uII{Vm z`vS3v`{QsAvN*DTLAx@snG=Y^9MCDF*wlmWDuju{_Njr=e+ZH}u=xd$IB1t8Og(bH zBMeDBay<*$O$k#EJ68i_4zf6M`v*ClgU+J>rGHR85P@Vqa=ixHl?gK+xjqHmvj`JM z4*zH*b3kT;Flf3FbQdFt4Z^VUAG8h)gh65;3`@5lG3b^EkTCoPD3CaGs{vRXbf+?i z0TPGJVS)GyKm-E=s0$6ou=5>Z?K+Tp5Qgz#Cq#k7Kp1vjBLm3cP;+2@1Q`uGQ3RwG zHpT)H2d%jU(I9bH*n;?=HC-SYBo3>iL444hEQkh)!}0=%51PXT(I9cy*dT}xntKA# zAaPh(0pf$kY(X?g9E4%#K7u_Dbw5ZPcJ3pn%?48sOOqfzsEh*9AhobK0`U_-0#I{c zbu>sEc2X-y8a8GK5?=rkfU1Y>Ee44nKoWKAUq2T}n(N99Fh~#9>!^g2D|prvMUHfKDWX#9?DxAaNTcaoAc8ka!G|IINEb60boL zhs`yB#OEN1!`3K*#P=YH!`5zr#P1-9!^ZGI;(w6DVROD9aT(}-H<0^beOQpV4U%{w zNC1jK`@TU;kb2l!CJ?^{Nj>b08IbrKByq$kd<+bGki=nYT0rXWAc@1~l0f3HeR&{z zVSNFRxD0e397r5C7XuQvK@x|}eSpMcki>IA0#ICoBo1p!gQVsliNnV5LE?Lm#9?&} zNc;|xIO6m|28KUK;;^|$ka`(t;SO>?Y)lU%Zi6Han@a+T#~_K9f&`$r0!bV;CkT?7 zfg}!_y8(&sKoWOPS84J2{cSP)432a-7A^hE{+320>razAYC zB1pXjk~nOv1|%MVBn~@^3nX5FBo14%2NIuwB;F1ZfZ`oU;;^$|K~gu6#9?DHAn_ka z;;=bHkhlbNVLHhDur*g8aSJ5z9*_VOM<9v!Ld8H-1(G=EEJ2VM2+u$gp9B(s;vGoh zurX(l)D0wY*jjXu_zxs;*jOA$Tmos|6KstrNZbNR9C3Of149IoIP9!7kb2mDF;FcivKMiRBLjm4k~nNF z0Z4rWk~nM)BuKmhNgQ?-HAozE9u9~GnU6S~l7V3dl6u7Hiwq1mki=nqQjq>1NaCwO z0#GagU9bW&A92bh1A_&U_*$r15EX$Wz78Y+#T7{6h*K6B7-k@eZ-A-=QCpD2VQUvb z;#ZKww}J$q_zRNwHmDeg5`j(xg4~Zd4V8hx1W9~1NFfx5Ac^mRih-ySByq%Ps|*ZN zki=nYQ$gxs`&K~q!q&8d#IGQ!hqb9e;$M)&VQV2k;v&$)LqO&rPL*U}FhLSO22u#c zAxPq|HL)P65+v~xAOR?zf+P+*`y3>-1xXxn+9U(R6(n)k+2J7dUy#JlfCQje1lkz@ zxgT+QBm;v9lK4faS`Zb2B#t;$l7XQFN>MArwzR62Af!15sO$#1W@ZGB8|05{Io3 z1*!jnBz_$v0L3EEP7BEWh*LTl7)+4FVP}Sbw1gmu-vS9haS4(*=qx6vFvAoi@jEa< z1_p*LNaBc7Kp7aWAc@2FM1Zt?K@x|Jv4g}#pq(p_`(b@Ikhlqw_!E!-6o(**BTn&U zU?@Qne+g9!qCn@6gJ_WXZ$S(w-h!n59aIcNT|p9ut+@q>e?b!e01|*=5ojk6Wd0YZ z7>F`K5{JzlfW$+P#9?EYAn_6;@$Vo3D4v2O{sSroqP8H3BTffpV7P)L{uiVWioYO< z|AUHwC=qC9736-zX`&1aCP?D2zB5RD2$DD>v`-BZFF_JVoIc9HFa=4R8A<&XByrfD z7mztuki=nU(SXFiAc?afnIi)2RD;|PTMG?RZ-OKa8><9~haib_BAHWyBn~_42Bdxp zk~rejQwD}DNaD!1d|p8khuwV+GUp4DIO5b(1_lvm=O5&L*w`sZy$O;yY|S=E9CY3? zhz6-goRZ4GP=cgh4#{6rki_MY#J3=c!^S{B=3YS(S42|(1xXxn+A0Hs2y}o6+8YDI7bJ0LS01FC;V+UnwCfBOmw_J02J#mO!^X2zk;I`*60mv~Byng| zgT;N3#Gye57SBNv2bmAMkEIkz9ArLh>}(2>IBZV}$e_7M;;=DikoX=Xagh12`y!4a ziG$3Ct&@0yBo3Qv1DW#{NgOt33KHjmIs#-iY;G4ME{Y@$8`}qon;?mU^fW;GW41`* zAosw=wqlUPVPn@Ib5fDSVQcU};w?zxusIQscrTJTY_Aqbd<~K~Y)%R!z7y+qCsH*TiXNT%RnO!B;F4afMQi7aoE^1 zNXi9C95zM`68A+CN1Q^>z>tF^z6_)gic68ik#CKkf+W5Xsuo1eMG{Ax`p&?x1xXxn z3j+hgULCXhHUk~nOx79_5NB>oU2 z0L7+A;*X$WASwh&{3%EPier()5w|=rFw`K4BW_D!U}!}We+@MQL@hxQhs|k%#MdH; ze*y_W@fjp>*qOT^sjEohzd!;|`~^uIaSA#E!(SwE9;EV920B;|3Qxo->kJI4NaFlR z>Rph;VRu!5toB6`hwb?SiRU1R!`7&S#7mLHVRPjm@hM2+rbzbAMG{AxYR=(+#GZOm~@XG2Ldm!gQDA8q;;AUrfK5jxqgV`p5L0=^N7z zrk_l0%$@VCrF>%G}S~$lS*~jd?or4CaZmnGZ3qXP(bIk9h&}QRWlO zCz;POpJP7He1Z8G^F`+4%nO+pGcRFoU|!0+jQKM2CFU#4SDCLdUuV9-e2e)e^IhiK z%y*dYG2dr?!2FQ;5%Y8A$IMTepD{0IUdg5f%zlzC+08A zpP64Ve`S8i^o{v3(<7#*Oi!4eF+FGc&HRVCk>xM*Kj#0;%`7b}tt{;U6FX&=*Jrrpe^nSU_fU}1=lPp(LeFUcs%FK5szNv$Z+i;waPE-{XeH?)ZNEJ-c$ zFDUl(3ywE5k9W>VEH2JWcFai+$j`}4u5@)ZGL4TfOU%hkNi0c?&n!tTiZ4n{OD#&x zOHOq%FEcbZFfcIi3hnN-W7Q@(c*@Gjew}bsR1iNUCjdl2U1VsSlvtdZ9G_oYQk0sQ>zNEP+AujIu_(TzC^567*fZJH z)itNsHNYE5mqliNaePu@ajLO#e0*_gNqkabN>XM?d}3Zod~$wXab^nG;ovZE1?w|% zcQ)}zO)M}pNX|%2&W_K_%Pc{aF~JlvG$|;`%qsyIS(2JpQtVpBpjVWdlZY0oW@V|# zVE-d|-!C}cGBGD7KN%b{!N&2fuC5jZ`33PwiOJaziy=`$TmYD+<&+j@fb2(&P(!q! zGEU7;1F1rBr8mSTqMezWSP@^GS(OShC_OnjKD8n_wV))vBrz!`6_l1JF%QLIut+g3 z$-rqDnwt11KdANaG+>sVT9T8W400`s=@4HVn#9K!7vyA?#3z-erKJ{mA}3N%LdJ+D z7bB2S*gQ^|i71YPdCM7O89aXyml({7Q}arSDqRd=>B!J1Cp9mYBvo{HUgXks*?mHCiJ!)ZKPD#PY}16Nl(?k8YAs3k^8e)h>U zaP>*T?*t-(ki0qvTBZ==1_Hr=lKF@+kC30pH4xt5F-^-!OfM!_ND^DY85zVwdJE9@ z0i+dy+jvNLkryq7mf-9ZU!0L&R1#m1pP5&ZT0|qOj3HLh))EVdB{}(d>BM@6*mwce zaXG1pgoB6V7OrVBhPkLkrXj%sw*V#5&~zKd$Cno+7J&PYXuZM$RE^l079@MeGCn>P z)bUHiV>UEXlHQ;s#&AfEAU0l!F%jzA0W{JqIVm+gGY=)2vBVa!E;J=z8i^hz(l|>< zcO^5w7<*sE)g&!5Cx=>oG&GBkPf0Brn zL4_%b1vuSOl#*1MhN2XkTL`8CQ%rNvtRy-dLE|PU4uTm3DI<(5;-SMSnfZC~>7|K9 zDF{AzRE`LnOhAK4n2F8R)zARa(#=UNL5$Xc`oE+)g0e(u3U(hZw_uAQB0LQqK?C*s z67%x%OF*NODXBR92}^{8sxcGL7$Vl_f|-D)DkD|1H%bc~Q#U06gJ{Dc58mMQ8KJOA z!JdSO2pBY-DE@+E15iAo4?7-DX^ELRsf5FnuJK~L48k=f#@Mg)a(RwJT|#3iI8W>s})UB5=#P#?|BPmCz_tA8s<~>lOE-ybXzN9F#EHg1DJ~Pb|Gzf`W zr+}tZ&`iPNTw*AwCK;868|=XqcFjnVtul_>KpO=9TB73+m-$=4GcA>E;)J3b|qiJs-W|k|Kuq zsF1MW64d!Okf0}qpk8`WerW+iMrvY#UUESJbe0}mMS>c$kU7@O{5+^cT2X2$qG!NR zTvC*in#T|yl~sorYS(pyfbA18iw3DA+U}Gy;J=VHugk#}|~A#DkV{BqoCvk`$*FmZqYt zBf;JzbpobfQZvam{5QakWBDv1=}ao=<#y zK#*%lNMyWQsGoC)r@vo(JZLQmY#oFtIJ1CMqUHxsTxJ%>=a;1xfy?OBl=!s#BG76E zMB#>>07+~RgT{p6g9>@6<RupFxW#(n$HXG75CN?Gv4Z+K_Kx;RUhkDRM z0%9nx#AE>u^F(|GkQ$VRps9RF^@`M|%w>p=Pb@A@Eh>ozbvMyhr5Tz+hG`*7z>-SS za17R(78jJ3AdN@|cqiweRfbUaf`SL<38bRhM0`4M z4vb=$jn`2=h?J4TpqH0llB(zK7phxal9-$g%5kuKVxF9zlarcU;+h2#g~Tty3E+7h z*DSO^K~rT>oLW*08bL!?iCqW5aZ~Ijp=Mz86>5ftsfD0$jW4MzNOjH3gtnHjuMC1V zhQM8S!aFi6Aa|?E-QpxTS|Yz6KHmxAag1bHUjP5k2H} z`px1YYZP;nQ9J`%$w{7}$jt+g!Dvxs0&SeYmR<%VyBZq6#qts9B?!BtauAc!;1&?t z;zUrJ2h?IhA5;keRqST*0p8e6MNdIykY#MHVD;$n1gcXY=^dXoa1~}~n3JELnGBik zb~b{ThoyEzjIBZ}hG;+p1_5^vr5%g4@HTB~ML|(KqyvCvDHdG_+mO>Fnm*itMwE6m zYf*bY$Vm(wG8n3n9fqzN95LXPhUkd|lyET8lW{?5iEA>V5Qi53rpchf#WUH}v^+B< z6{*HRPhe2>1PeMW=3om$3XCf*DJn@!V$dtD%mvXThC@!VYZBIC0#u(tyM_4$sYRfH zV3f9#rx$up*VWZEpvgtNe5yY8+)`iD!qdcn8{8bULfH~Dshm`r9-opFpP2`4 zL?t6!1j-gp<)OQ&Qp9!M6e=B2ANn%61|es^Do#9M*t(-ALA8@fD>O zSRe&kYEfcwYCLMFQEI*s$b86LeWh2HC3&_652$Y4_?g)8??&LO9c%IAy2q@dO>{zDxs+5Dbg)P%eG(xP}XBZ*0`d~ zO@b06cts{swd?7USLW&p_6Lzhf`(^sbt$3iW(`nAZ9Rj{;z_gv-*6OsX)dxaf=%I8 zV2ONC+APfj_Xt5-gi33k_D=lEb}=wPT{aJ&h46@7?7e25XKLF^hIVi+InhNB)f zj*o}=B0f34pfWzc2Afd)Q1Xq_8T6R<^mumy4qhQM;2BRJPN5uaRw zPz?rUU3ghUM7l6XPZt*P{=qn`H-i*Ai1-GXkE4hpoPy2cgUwNb0G59(K{+Sbk@z5> zECkHZL%=-VAD8WhM)C0_`QXv2)MB*35`sQ11D6h_kgN$wy`W|^!o2v5)SQCUB2cz< zHH!xic)^o6A{TgrQ;sVvQR8wdXxj<6bb-%ILY6C{#2yiiDo}!Q18o+j)kjpq>o0$5&jAw1^&5a}gWE(0*R9CH8D*Vgw2X z&<^X&#GK5k)D+0#Fz|Q;sPK)?OpDLUha?4*Fv8i;1O*M2ECX5*?HX(m59-;tx`r6W z2Z3h}K}{_Tr@?A;w1y9I-HkjE8f=2zRtpG;4*=DQplQiqb5I427>a`QYA8#9Ch;hX zAA*8S<3W?U;6O%=L=)7ALn+a~#RhVHnV48yWMr6G3~n%jHn&3-ab+guq=K^?q=GCi zGPHoH0i6<%4z6%PNe^CymO(21KyLM^c8WkXy=8j9hdn1vTd;8mz#KYN055onV#=|vaFIk2dN<}RA9rbp^t zf=U#OtWD5z$}&HA6+MOlKlfKmm`XU_>s-TwQ}f?SD{L6O^KY&9O(cu>tNv z8e_;A#XTNG2g|XAWoljuVzw8@JT!p?Dp)fpXpsSF z$51#Mx#s2un_-U{P1pJf@v9Qb_UIOK|O_N z>Ja58aAU{Fz*jfNwv$}$6IBG0ZLpBZ7^TfIbvnlOt1a%$-z66=!4UT`@ zIg(fxBFw_#AW*`^?6D9P$z`xk4I&){5ppw4tV4}B%2O>Q%_DpTjt4YLP#Q@As9TAU zD+y3b#55kguEN#tM6DD8LO|^Sti=~v9fMNSgPYuty2K2p0a#W;;v3_2wSXN$1P>NZ z&=7B#t7~qMcQ6(ok~kM)Y+jrST1OL~pNDABK}J$R2S|Z;HDu-^rjB8@gPP!2?MICu zlz>H#9}`l_bc~?JR(6|!`a4)74wL~P=?ik652T{NW++A(jmJ>98;}}yC}x6It-E3? zkntF579U>#I<6=$B|g8jq@WaORt?8OQBbjAiEXbFxX%Y}<$zaP2$PHJ(nXKpUauHzu@ z++btuX&U7KB+pz|*C6kZ_+VoY!kS!-bCI^3qp2rxO$2mTmb0O25ZHAvzd*VU#8zfT z=Ad<0@M&;Ry96|7Q5;`@yiD8`w4fKOhlsTYG$IZjZUfnXh((Ic1r6hYHn~DJrk5s{ zpigH)osK&v5bFbCZNiqyN#0!u+CT~(P{i#cEcOuV6(UThJiLgogaR*E!l&X9i3vP! zjh0GbIU90b0m||P)cP4bEa8ePnS$o{iEVTwySjo}8b;Vl3{Xc2QWZfeEV%PQqmhJ1 zOyNCE1JLw9h#{$#pwwc);M&U7HN*hauEA*-Vh2cm5hS1GBaWW~IU8r+7*v5_DU`u2 zD)2CU8D#hpr`0B)9y+McLvCQXy1FESYfH3r0VyRxkpZb#(9K5=C;aA^C#IAoqHO&@ z(Vvq8UW9_j9mcS}9k{_kdYS+QG`6ZV*eo90cXV}i1@A@*F^I?4%>xa6K@%rRISq&4{n=5JZuh{TqeuI6xoNxV`vQpzuNlbSQ1}$Up4~fSeRfLXy0Cg~sih7X0QP)AaYU8HRM!B%;CSd{64qKB)KW*w zWst>!sA(%1=@d+)6b70u0*!g4q@raYO6)>S0oYdf;jtDqDd6)RdAnwy1&I&rJWJvN z1JzZaHX`0O5NH){2)Nod1vM=|olMv^98d{nXqu7U|-pH&dF)t-Q zH$E{rIkmVL+%|$}OiXvh8XYDDMX69^1K?4eY!3ObQ*MQQ!CF;5` z6Oilk^FaIgz|-5omY|kA#soH2hgg;tr^crxCL^8x3aUKdn@gar67VE8^b~DZ2EC-> zV$dEWSf)2L$OWz1F9EfF!8sPz;R0>l%t=Mq0h&}Yh&Rei0jq-KbGTJtVYE}{(RWB= zA0tEBlI0rU1{w(gHBPYlm)PF1ky(5^Xt@DslrBCwvnaVVC$R{6x;n@g@t|G<%3N2l zaeNRc5o1r2#M)~LUd9hkyx;->b<`Eq3w6bAiJ>L7aYF22hMd1abvi~!2ZI*q;%zq5 zz&0$+rQA$-XrN^jaA>=P|u#> z9R?_A!IolRR`W2kO(6^B!08;8O-ynVi?Uqcs z!qC_fdfJMfA)IB&fUeBU0z=5q0Jw1a26Jw7N!^$7@A`dGsYA%GKJd!XJJug0#^lR znPAvyWDHkjj3H@igdt>TWCYg$XJJu>snOC9L(CLY$jHPHX1);?Swpxi5{p5vC?9m5 z8|e5TLp?)i2>=#x3D+x1P1B2yPp_zmFGwva&d*EC$tM5`U=$SusZ~&%QG-QmB6%u zX^uiL#Q?Jpq~DeiVi!mTWG9GT#KZu;K9vn*I7k4B9iSSK?*Io$L4`p~FrLcL0+Km^R)AT|i&^1lSs|Ilm289?^iWAT5E z7Iy!CfLe@vhakv4s4$2L#_3wv{htB7R2r5}LH2VpFfgF|AD8=8pzepM2kCdh;{KcQ z*xhdcO%%}U^1yBd5$Nv6Wxo#8e&q0T#A3gmD|Y(>p!UP=YXsR1!szyEx?&H%8PM>9 z=?D2AbVWHVJYebHRTE-ATJm9-0kt13`-1Zt$Q>|@%l{Tw{2zqH|K|fC_M_(?2Izg# zQ80_3G`jy!1!DLA11$ar8Hw(HT<&*)x*w(<6n+s{-0v!k-Tet5%NQ6Kpx0DFUC#h7 zPhbML?Dv7%kDPuYvDmMog5CZGsQqCui=Z@m_{pna4?hj)`qTm{DH2bCD#2ZSll0l#r^RD*xla%y-ytZ zj#f|vHSF$Z zI04aw?0(Q)yTrP`28;V+u(*F?9Cr7AfV$rl;tV*6?*27#*xfII#r>fBd5Lv@2h{yA z`#|v*jK%%`+_Agg0D7N0^4;bjPr%Fru|fE!J9hUQK-~|!0~%yMC@rG9-_8SKKYIJY z0(u`i)EOYFz?j(f!wf9`55?mDbutk9(aZk;sQp%8TM-1h|5wUj_kYGoh#utnPYX-? z;WN~JbpQ82?MJtdSpTnp`X3hFpzyE4;{Shw*!{l%YCrT^d5C8ih_633KJnIZz{GLYAA6wghlM{V{Ayu#F+k&- zfq~(NEOz&QfVw{d+3{H1|5+Al7MlA{K;4g=evGlCA6q$y{pjh(0~&EK_rsh)Z2CEa z#s76!{4ar{{78V>KMQ6tlty=tFply=;1oo|2M7gj|C?j+e-zYybpQW>+D~rzaR=&u zSg|1k&b@y~D?tQ_7?1f@S~EdIxpeqUg5 ze;F3{uNKGdeg~-g)gjJ+lj!bWCXU_x5?I_1y62tP{PzXwewccY|0}S#KTHg}`wO7% zhjt@yx*u2g{lQ{?B^LXO`LNqR0ct<2oPjw2J^XOl&r$@@ft>zavDiPC8N2-(p!UZ= zjDeHr_RnC(9)AYV_(Lv#TuDfO0$AJ+FRPKt&n$lI?iYXt9Q1l{obFHM$L{_LsQaPD zfXfe%UtsA8CXOroWuWedg%>FO#bXJ74rA=@H-K8u1$Q}w0W%N6V_;x5#_s+JQ1`EZ zDg@c@jV1gGq4uMfe|ws(b;Rmw62aErCII#PF1Jr(Lh%?|Mdi=9< zVE4bnS%?;BFoM%>Fc$ygO1~aZ_ruaV$o*5XxL<=CyZbLd-47bGfw%-hqPriL{Q+3) z@5N&OdPVH^KY-egKCViv{Si?6k>jr)i~aM%vD>cz>Z~&`Fc7N$W`$#qzX&Yx2O3L) z#Rn{2afM$B7WX$|asL7d?CuYMx}Q+_Ia>m|`wOtRKbC~_R{(WC%)g-Y*N4UZtX|mN zUjTJKx#_P0i~SR@*l#F>-Tnrs{m^6xN&Hya@3`Wx0gL_9u-MNZf!+QEQ2SNjHbWT1 zrvDD8{mAKmIu`ps;b=cyfZ9)}{CX>fJ^gfGNk3^Mq@O8J_ampD8CcxU#ECupK0w`1 zZu*%6wI4bBCStMQ1;_Xm12o_!LZS^$qQ{>-j`6Dn(C|xu>ICJVY!bq61s3;D!s7mR z9OM5BpzeoG13_JZ+5d0CG5*hR4x$Cw{dpv~e+w4(PsZYYEga*w1<-+SP0-{X#3^7B zJ^WR1jNc|e-Jb!~4+?)!mjIR?366Nhp4E4P~i4M36}78gZ3ZL+fO`l5RK^e5j%cx0gL}N+w*OTD>A6VQ!2aEgb{II+K0o473#vd#Fu)Ck(BFML> z<2OwtxSypMq8~Z^tij^`bvWEF0B!gYa{o#k?w7#g{#Fv)FM!4UtFXAg9Y_1m0qTBe zH3SI^EbXr*FYMuOfW`eCB)DG&i~F;%xc>u=_ICo*{ZI<0`(NW|e|unYe>Vy4*TCZb z)mYrW5J&!PfI6HT?s5nNJ^#+Zk$)4gxWA7C_nTmGe<>FCb3xY+pw}N0pzbHs{$tg| zo_;Ez?uV6Mpz;UQmP4;UaFw49Slqt>i~C=OVK09cK;7>P33fP%9{x|lu)BW+)cwfi z=M)mc-v{b`n14b3--gBg-Z;vi4^a1Oz+Dbupt~Pe_=Q02M=t+1VzEC9NBUI&P4+S{ zFc3<=sW{T_0W9G+lZ5a~fVv+!{I+9p|79HRH-NgI7ZPl6lGyOefZC57ew(n^?}uyr zA8J3L^4Al``2P(o;Wv+j@GF73A36MXU~zvUj{aW))cu6=Kd$swgT?;MSnL;K!=8T& zp!TE37dju8{Vh=YVd_EoZ!H%4owTvr-vG5g8J=<=448Qk9s`4|Hum!412q1S$DfyC ziN8{){pjuICs6y*?IX7TFa_#=i~rMfu=}4u5#mEj2n8q6-IJ(;-TyN#L9`&3 z|0}WhA6NV>z~cUOSlqt{$NYx_)cw$66yg{x?Vs&9=08qA-H%-UuOY$xYp}TgAQtzh z;~4)=fV!Vh`H_TU{QChG_pc|x{X3xUM=n1OVR3&2j{a8z)cxd^9|xfJBd6c>SnOYp zqyC=&wVzP^zX(VD{{u_-ftDo0!UL8raHZcfSlmAsi~GGIvFE=BQ1{!wQ!a#op8s4U zvFAU5%MkU*`ENT3@qYu0`{!eEzXFc=2L&aF{h&1m5Eg_)cfYhEcK16#-46?AQ2D)! z1ouC|;{JJ9-0y~~{{eMBq4L8KNB<)Ni~IMI;QkL-+`j;e`#0j4KW`w?{cHHJhkpSU z_k-556Py13K-~{h4~oCTSls^%I{%8^|5yNZKe_V@!;A;&j31bLTLTweL3vzzW{YVXv`7je$bL8V%@KT#r-F-xL;lYd;Awb z-5(9I90{X`zmx)Y_j_D{XhIHu(3AwR?l*wCAEq7@e`m3{f4>TL_g{dzAG(YM;utLL zA6)To0kt1F{hq^O|36*q_J4rd52bM0|5F!x_)UO@A1s}M{12*qlkH$d$t6#stg*yH~O zmhihvLiiP6asNUr?q4E;-Te!o?g#a`;F%9g{+};`-Tfb+?g!QRApM~Ddq9HwYp}R~ zF&6i?*|cV#{@*y_{{z&1=r$aZ?Vo|g{st`eKeNXke*&P*3JeSkg!Z4{ z^8W&;{mA)uDHi*G;;8=up!P3@`y9eRPd{I9?4LRTO+U!vH*ZKtKWm`wM@~P>u()5} z0DJhs7EW2VD&7h{Q68n{GGt!{wrAA|Hv7;`vaivuZ1`RPNK)(U1#j> z@4({zZzQMD+a9lpD#e&51O-tJ045@(Po9+{R^Zdir6&;rp`3iC(+%114sBPU~xY; z3E{7S#r?OjxPL%@k?BQ>L#r=FFxZecoepq;c>c2Z!+HGuK2IOV*ev7_M76Ef7k%EpWOaK0~Y(AW3eB!z60C(-wROt(a$A9k3U@g@4#aJ zV=VS3dSXvM51{rF>c8N!e*)BgGv5H_pip`{sgG|q1||hW3bdexWaD<)PCgfTaLy4N4(g>ZvxbQLgS}* zd9jC|1D5d9B_aGaU~&ISEbbRk!tVYJQ1?Tdu{gtzUkSVWBe1yNfCTsN!Q%cESlqvd z1-ttnK-~{3|6v|L&%fJQu)Dtii~Eg9aQ_J`?tg*B{YwI{yI%n6a6KEzXOZ= z%}8+n6{!1R;RVXSud%p)Q!;kFPZyx}6UzVB46*y4;TFWj$mJ*K{5e>8 z2ouLuetp2={{0mBd@36Q(9EbY_ z3?bo1?)WE58ALxU{ebL$iN*eOW$f{<0JYy1Vho&wnFkX{QpO(t2GH<>Mgw^N5a|2? zSa`tVe-+ez^z@$qwIAI+V$;6})c?ro|2-D}KbObu{{pD}gyz2=LCy`tF5pAAs=!@>^|nwa~4cZgyye=MNxN3K6W=f4o^{t~GBVdWjD{Q8E){qLdc z&oSCRQ1=sB|NaWc`u7Z|`;q5QLE(q)ekJJobM*Sp1aw#zmi`{G^f9wgz|R+7WaeBdV~2NM&C)qp8h64-B0NJz3YkC z)1Lzt_k;FwqsJev@^=mv_a|Wqe|{Y2Z(e}9pHTh5h2#9q0;v08`45!-vq=d56;Ssh z=O0k~!NMIz^WZxF)&vs&gxXK+IL^QAfVv-f{bL>$_oqVbN6$YoQ2Sx-hqwkB*DwyA z@$(%}|0Cz06fE)QhGYL}0n~m%>%Sdw>_24yEtW!?e=5S_e_ZMB2-N+s^a_gqG%W5H z_s5=pHbC7^?*4@{Q2UX?FCB~h^*HQ50JWdc_)V2RG)~dR&n2*gAL#r&Sa`tl1+MVB z0d+r2Jt+KsV{v~Kj{5Hd)cxeH-+KVHA36N~V6lHKj`BkQy6~9L_~8m1<%a>5@T(yq z{k_5Ben!|?3rOd;sp6PFbbz{_Q2Z<4m_PKu;{JLP-2VgWe&qNEl`*h#4@MuuG5%cu zbwBhN4tR-!ULN5}e+=aiEim<<^!FD_{9nhBe4&0jur#9sbo+=F-+R?dOa zPd5qf*TCX_W-R$P#S(k?Ge9doLhg^Z#P0qEEba%L{{_pBFn{3+e-kY3XTjqBX=d2n z?*Mf_q4kp!&9J+F2Gsq?>t8_UKN0JG2Q2Pq#o~Tj9P1Z8K-~{*MnVz;mi~kVj`a%~ z_aRzf;S5SYp!0`_b-xc5_p@VhzaozHvj!Fr`w88@A!Cm{{2j2kA9Q{hvF?w+;(kyc z308i==pZNT>8AkdenS0sUnlJDkHF%7(D^^ax<3Vr`?;`$Kfg70_fLSjA36;Mi3}|1 zhszqf`wOtRAGH6ISoarTaX$wZ_lx3Ke|G@tenR~x0UYb^I{;=a%f9(Nv zKg^w=_yg^qC)WKtpzepM2k95a;{Ini)}JLn-A``(AAs7A9RIvn?BC~$BmF_`CshCJ z^u?Zk60n5d782TzXRx@RAB+3{;5ND_ruhK(l2O^5>|f0=yV+6Zvbt$ zliPoNgT;Q(_$ka@7~Q3gJ^TWo_7hrvh%5fSV6i_FOaIFj$M{VF)P8cuZ~kDhA2j|7 z^EZrsj${0A0@Qx8=l`Jtr^w|;4i^8f$8r9~0;v6j+8?WMoWHRGntqY%577R9Sb8Ls z{{*nOA2j|83pW^TVS_#WJb=0%I*kL%ei-X_jBT*zzZ+2Z!`unVKcM~p#JXPw>VBAd zkp5gO;lBcU{|I{fPXT)H3AyJ#s9>=_AB+9daO}TxfZ9)P`qP2hkDUGru-Ly2$M{VE z)c*PKn1e9T+b=6|jNg2K#vgM38?^r&79X&9#Z`V-K-~|s4-|ieSll0snZi+=}b{G;su$I|{?1GOJL{&k=UkKFr18le7%jsJAOOAigxvCX1=N06c!TVh!eakSX!(bc|Dg6mgAo>882N9CH1_;w01ZFn@)xvz z78V|`@RP=I|6u{tewh1V4uI7gFg~vIvjggXn0+As%V6<;B#!;>4N&``+X!LSVfY`H z{RgnvFN?+g7##P1Y=GJiJqCqj`%ggaN6tTTSnQvVe5J2*muEFD6@N%Zs-i(~wF1=Rh>^QS+t)E~Iq z{{V~o6|lI!7svSh2B`Z9jsJAu7{BLu0`W2|oI&9aT7N)n_`iX=9~NF9{fb!J-w(aN z6}|kp0Chif8XMvmEb|Xt9@x{50@VG;=?66bitheTQ2WvAZw@Djl`!{1cu>1w96ar} zKT!W8=N~03{y&W4{8I&}{e<%GJ{;$tWlTkJb=0%x(pBE7%cS%Ulg=VN9+F;K;4g=e?k2(V%;Bu#r>LC z!oNNSd;U>yfjF5^{aqD<-Te!o?uUglDEvYF2V&iyfyMn=SlnNMOub3#^U}y9Ot(tK;2Jn{;R=ae-oDS%MQo>(*mgd_aj(BzfyMtGSmN)H7WVS%1Jr(4_`~djg(r-^ zR||Xj)$kmm0;V72e?2D5^RM1Q?ML^&f;&V%x_!j@e+Sh6u{11wMSp30gb{zYE8ld(QYQHn#*#EQO1;oY3>CXa- z|1+WXqx=5?)P7j}K}>_Dbr=Uv|M3CT|H$c2A4~k7#Bu+`1E~Gv&R@TP+K*g*8(^{j z503o@3|H;pAi=Kf5LHpQ32Hb1!KKW7rckE05rA36L$=^vKw zV6>YMcK08Ex}V(fX8|nsTVe^n#klSdfZ9*)_^Slee&qPG!eak*9QVfwctgSu>I?`6 zOZj^V$Ng~z(D*}6|6U}-p9&WDTVrv5FOK>v0qTB2>#sU+oIhIubw6_X3A!s4mY!hg z5?B5;fVv;19+ZA ziU{oacLkR43nC%@U7+qq4nG$x?mvLz{Dlut_mkWI@xfxhI~Myt;^_Y}_&`F8T>C?y z_9Mri2NwHJ1pZ7Ki%-pzbF({!6gf?}jD(s&MQ-On}-?ZvVRmYCm%N zbH!r+VIJ)DX93iHe@Hfflj!BgJ|67l2gfUj7UcRPnS}W3z~X*yEbcGERsTcXuL*Gm zoJ4njp%8ZW2SDAAoPW|taQ_r6?)SmsehnPspC6#^Cv<*@GLG@j3@q-?B*Fa)u(%&o zf5P$&jE=yOegvQ$A42OFf^npu2B`aC^%to8$|1r1Yp}TA4@>x8!Eyhk1JwP5%HQ*B z*wfDjsQZ!APd*9m-vM<$a`_dA#r;dTu;j>Q+jjR8`Pz_0q zu=)~I{(4~QenR(e$l<2XcAkTlcU`an|Q2WuxzZO94hq)i(8)#V# zRPWx(RLkq~kTjk;wI52NwV1ia!~s`;qfc z7#8<`#&Q1A1E~AS-9M%RwI4bB9I@EXi6j3AKpUQf)}OH87=PLU4L{`ix0i(QGr;10 zb1d%PiR1h(2dMiAm7iO1oZoc;i~A>FasPsJNcuzHXA%vyAGGHml9C`KsH_07U^K4u zV*~X+a{6(`lK<=CA#)<2wLKtnVfaG;gay+N;X%~G*dRI#bpEB!f6zA31`r>HVftZw z7!7kbjE~FxE>QO)r$12t5mxWP=q=FjBiH@w)3N8@7g*wNI+plT0{I_lpDWB?KcL|k z4ikXVF#p5o!_e_3s5G4N4}>#O7%+V>L2JnPVF6n4!w>+~zXPoUf*zk{(D6g)a!Z)8 z3=E*lx)>N3en2-6f$ERhSp5H9gMon=OZ@);UDm?Dz;FTTV32;0;ZQD!3C4SM89>_# W!E9tA02==npc}|Q`fRYQe*^$yer1UO literal 0 HcmV?d00001 diff --git a/src/GC/lib/libheap.so b/src/GC/lib/libheap.so new file mode 100755 index 0000000000000000000000000000000000000000..83a12f5ef67d8631d46ad720d2011d668f3603a9 GIT binary patch literal 82728 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 XgiZegD~Jo3ArwS0)UR+30|Ns93Oj=B literal 0 HcmV?d00001 diff --git a/src/GC/tests/extern_lib.cpp b/src/GC/tests/extern_lib.cpp new file mode 100644 index 0000000..5f3e0c7 --- /dev/null +++ b/src/GC/tests/extern_lib.cpp @@ -0,0 +1,52 @@ +#include +#include + +#include "heap.hpp" + +// using namespace std; + +// GC::Heap *singleton_test(); +// void init_gc(GC::Heap *heap); +// void frame_test(GC::Heap *heap); + +GC::Heap *singleton_test() { + std::cout << "TESTING SINGLETON INSTANCES" << std::endl; + std::cout << "===========================" << std::endl; + std::cout << "Call 1:\t" << GC::Heap::the() << std::endl; + GC::Heap *heap = GC::Heap::the(); + std::cout << "Call 2:\t" << heap << std::endl; + std::cout << "===========================" << std::endl; + return heap; +} + +void init_gc(GC::Heap *heap){ + std::cout << "\n\n INITIALIZING THE HEAP" << std::endl; + std::cout << "===========================" << std::endl; + heap->init(); + std::cout << "===========================" << std::endl; +} + +void frame_test(GC::Heap *heap) { + std::cout << "\n\n TESTING FRAME ADDRESSES" << std::endl; + std::cout << "===========================" << std::endl; + +#pragma clang diagnostic ignored "-Wframe-address" + auto curr_frame = reinterpret_cast(__builtin_frame_address(0)); + std::cout << "Current stack frame:\t" << curr_frame << std::endl; +#pragma clang diagnostic ignored "-Wframe-address" + auto prev_frame = reinterpret_cast(__builtin_frame_address(1)); + std::cout << "Previous stack frame:\t" << prev_frame << std::endl; + + heap->check_init(); + + std::cout << "===========================" << std::endl; +} + +int main() { + auto heap = singleton_test(); + + init_gc(heap); + frame_test(heap); + + return 0; +} \ No newline at end of file diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 76e2434..774f091 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -1,6 +1,6 @@ #include "../include/heap.hpp" -GC::Heap *gc = GC::Heap::the2(); +GC::Heap *gc = GC::Heap::the(); void init() {