From 9567a056977a86da70a82dfb01448d111873469d Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 20 Feb 2026 16:58:07 -0500 Subject: [PATCH] progress --- attempt_1/duffle.amd64.win32.h | 4 + attempt_1/main.c | 198 +++++++++++++++++++-------------- edit_mode_snapshot.png | Bin 0 -> 20727 bytes 3 files changed, 118 insertions(+), 84 deletions(-) create mode 100644 edit_mode_snapshot.png diff --git a/attempt_1/duffle.amd64.win32.h b/attempt_1/duffle.amd64.win32.h index 7416cfb..eeb0198 100644 --- a/attempt_1/duffle.amd64.win32.h +++ b/attempt_1/duffle.amd64.win32.h @@ -608,6 +608,10 @@ WinAPI void* ms_get_stock_object(S4 i) asm("GetStockObject"); WinAPI void* ms_create_font_a(S4 cHeight, S4 cWidth, S4 cEscapement, S4 cOrientation, S4 cWeight, U4 bItalic, U4 bUnderline, U4 bStrikeOut, U4 iCharSet, U4 iOutPrecision, U4 iClipPrecision, U4 iQuality, U4 iPitchAndFamily, char const* pszFaceName) asm("CreateFontA"); WinAPI void* ms_select_object(void* hdc, void* h) asm("SelectObject"); WinAPI S4 ms_rectangle(void* hdc, S4 left, S4 top, S4 right, S4 bottom) asm("Rectangle"); +WinAPI S4 ms_set_bk_mode(void* hdc, S4 mode) asm("SetBkMode"); +WinAPI void* ms_create_solid_brush(U4 color) asm("CreateSolidBrush"); +WinAPI S4 ms_delete_object(void* ho) asm("DeleteObject"); +WinAPI S2 ms_get_async_key_state(S4 vKey) asm("GetAsyncKeyState"); #define MS_MEM_COMMIT 0x00001000 #define MS_MEM_RESERVE 0x00002000 diff --git a/attempt_1/main.c b/attempt_1/main.c index 2d395e3..849a999 100644 --- a/attempt_1/main.c +++ b/attempt_1/main.c @@ -6,14 +6,16 @@ #include "duffle.amd64.win32.h" // --- Semantic Tags (Using X-Macros & Enum_) --- +// Colors translated from Cozy-and-WIndy: +// 0x00bbggrr Win32 format typedef Enum_(U4, STag) { #define Tag_Entries() \ - X(Define, "Define", 0x003333FF, ":") /* RED */ \ - X(Call, "Call", 0x0033FF33, "~") /* GREEN */ \ - X(Data, "Data", 0x00FFFF33, "$") /* CYAN */ \ - X(Imm, "Imm", 0x0033FFFF, "^") /* YELLOW */ \ - X(Comment, "Comment", 0x00888888, ".") /* DIM */ \ - X(Format, "Format", 0x00444444, " ") /* INVISIBLE/FORMAT */ + X(Define, "Define", 0x0018AEFF, ":") /* Orange-ish (Language.Type) */ \ + X(Call, "Call", 0x00D6A454, "~") /* Soft Blue (Language.Class) */ \ + X(Data, "Data", 0x0094BAA1, "$") /* Muted Green (Language.Number) */ \ + X(Imm, "Imm", 0x004AA4C2, "^") /* Sand/Yellow (Language.Keyword) */ \ + X(Comment, "Comment", 0x00AAAAAA, ".") /* Grey (Language.Comment) */ \ + X(Format, "Format", 0x003A2F3B, " ") /* Current Line BG for invisibles */ #define X(n, s, c, p) tmpl(STag, n), Tag_Entries() @@ -287,6 +289,8 @@ IA_ void compile_and_run_tape(void) { #define MS_VK_PRIOR 0x21 #define MS_VK_NEXT 0x22 +#define MS_VK_SHIFT 0x10 + // --- Window Procedure --- S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { U8 tape_count = tape_arena.used / sizeof(U4); @@ -294,12 +298,14 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { switch (msg) { case MS_WM_CHAR: { + if (editor_mode != MODE_EDIT) return 0; + U4 t = tape_ptr[cursor_idx]; U4 tag = UNPACK_TAG(t); U4 val = UNPACK_VAL(t); U1 c = (U1)wparam; - // Skip control characters in WM_CHAR (handled in KEYDOWN) + // Skip control characters and the 'E' that triggered the mode if (c < 32) break; if (tag == STag_Data) { @@ -340,7 +346,7 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { if (wparam == 0x45 && editor_mode == MODE_NAV) { // 'E' editor_mode = MODE_EDIT; ms_invalidate_rect(hwnd, NULL, true); - return 0; + return 0; // Consume the keypress so it doesn't trigger WM_CHAR } if (wparam == 0x1B && editor_mode == MODE_EDIT) { // ESC editor_mode = MODE_NAV; @@ -415,34 +421,48 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { U4 tag = (UNPACK_TAG(t) + 1) % STag_Count; tape_ptr[cursor_idx] = PACK_TOKEN(tag, UNPACK_VAL(t)); } else if (wparam == MS_VK_BACK) { - // Delete Token and move cursor left, shifting BOTH arenas + // Delete Token + // Shift: delete AT cursor | Regular: delete TO THE LEFT + U8 delete_idx = cursor_idx; + B4 is_shift = (ms_get_async_key_state(MS_VK_SHIFT) & 0x8000) != 0; + + if (!is_shift) { + if (cursor_idx > 0) { + delete_idx = cursor_idx - 1; + cursor_idx--; + } else return 0; + } + if (tape_count > 0) { U8*r anno_ptr = C_(U8*r, anno_arena.start); - for (U8 i = cursor_idx; i < tape_count - 1; i++) { + for (U8 i = delete_idx; i < tape_count - 1; i++) { tape_ptr[i] = tape_ptr[i+1]; anno_ptr[i] = anno_ptr[i+1]; } tape_arena.used -= sizeof(U4); anno_arena.used -= sizeof(U8); - if (cursor_idx > 0) cursor_idx--; } } else if (wparam == MS_VK_SPACE || wparam == MS_VK_RETURN) { - // Insert New Token (Pre-append at cursor), shifting BOTH arenas + // Insert New Token + // Shift: insert AFTER cursor | Regular: insert BEFORE cursor + B4 is_shift = (ms_get_async_key_state(MS_VK_SHIFT) & 0x8000) != 0; + U8 insert_idx = cursor_idx; + if (is_shift) insert_idx++; + if (tape_arena.used + sizeof(U4) <= tape_arena.capacity && anno_arena.used + sizeof(U8) <= anno_arena.capacity) { U8*r anno_ptr = C_(U8*r, anno_arena.start); - for (U8 i = tape_count; i > cursor_idx; i--) { + for (U8 i = tape_count; i > insert_idx; i--) { tape_ptr[i] = tape_ptr[i-1]; anno_ptr[i] = anno_ptr[i-1]; } if (wparam == MS_VK_RETURN) { - tape_ptr[cursor_idx] = PACK_TOKEN(STag_Format, 0xA); // Newline - anno_ptr[cursor_idx] = 0; - cursor_idx++; // Move past newline + tape_ptr[insert_idx] = PACK_TOKEN(STag_Format, 0xA); + anno_ptr[insert_idx] = 0; } else { - tape_ptr[cursor_idx] = PACK_TOKEN(STag_Comment, ID2(' ',' ')); - anno_ptr[cursor_idx] = 0; - cursor_idx++; // Move past space + tape_ptr[insert_idx] = PACK_TOKEN(STag_Comment, ID2(' ',' ')); + anno_ptr[insert_idx] = 0; } + if (is_shift) cursor_idx++; tape_arena.used += sizeof(U4); anno_arena.used += sizeof(U8); } @@ -463,7 +483,15 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { void* hFont = ms_create_font_a(20, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, "Consolas"); void* hOldFont = ms_select_object(hdc, hFont); - ms_set_bk_color(hdc, 0x001E1E1E); + ms_set_bk_mode(hdc, 1); // TRANSPARENT text background + + void* hBgBrush = ms_create_solid_brush(0x00222222); + ms_select_object(hdc, hBgBrush); + ms_rectangle(hdc, -1, -1, 3000, 3000); + + void* hBrushEdit = ms_create_solid_brush(0x008E563B); + void* hBrushNav = ms_create_solid_brush(0x00262F3B); + S4 start_x = 40, start_y = 60, spacing_x = 110, spacing_y = 35; S4 x = start_x, y = start_y; @@ -479,8 +507,7 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { S4 render_y = y - scroll_y_offset; if (i == cursor_idx && render_y >= 30 && render_y < 500) { - void* hBrush = ms_get_stock_object(editor_mode == MODE_EDIT ? 0 : 2); // WHITE_BRUSH : GRAY_BRUSH - ms_select_object(hdc, hBrush); + ms_select_object(hdc, editor_mode == MODE_EDIT ? hBrushEdit : hBrushNav); ms_rectangle(hdc, x - 5, render_y - 2, x + 95, render_y + 22); } @@ -496,16 +523,16 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { x = start_x; y += spacing_y; } else { - U4 color = tag_colors[tag]; - const char* prefix = tag_prefixes[tag]; - - ms_set_text_color(hdc, color); - if (editor_mode == MODE_EDIT && i == cursor_idx) { - ms_set_text_color(hdc, 0x00000000); // Black text on white cursor - } - - char val_str[9]; - if (tag == STag_Data) { + U4 color = tag_colors[tag]; + const char* prefix = tag_prefixes[tag]; + + ms_set_text_color(hdc, color); + if (editor_mode == MODE_EDIT && i == cursor_idx) { + // Better visibility in Edit Mode: White text on White-ish cursor + ms_set_text_color(hdc, 0x001E1E1E); + } + + char val_str[9]; if (tag == STag_Data) { u64_to_hex(val, val_str, 6); val_str[6] = '\0'; } else { @@ -541,66 +568,69 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) { } // Draw a solid background behind the HUD to cover scrolling text - void* hBlackBrush = ms_get_stock_object(4); // BLACK_BRUSH - ms_select_object(hdc, hBlackBrush); - ms_rectangle(hdc, 0, 500, 1100, 750); - ms_rectangle(hdc, 0, 0, 1100, 40); + void* hHudBrush = ms_create_solid_brush(0x00141E23); + ms_select_object(hdc, hHudBrush); + ms_rectangle(hdc, -1, 500, 3000, 3000); + ms_rectangle(hdc, -1, -1, 3000, 40); ms_set_text_color(hdc, 0x00AAAAAA); ms_text_out_a(hdc, 40, 10, "x86-64 Machine Code Emitter | 2-Reg Stack | [F5] Toggle Run Mode | [PgUp/PgDn] Scroll", 85); // Render VM State ms_set_text_color(hdc, 0x00FFFFFF); - char jit_str[64] = "Mode: Incremental | JIT Size: 0x000 bytes"; - if (run_full) mem_copy(u8_(jit_str + 6), u8_("Full "), 11); - u64_to_hex(code_arena.used, jit_str + 32, 3); - ms_text_out_a(hdc, 40, 520, jit_str, 41); + char jit_str[64] = "Mode: Incremental | JIT Size: 0x000 bytes"; + if (run_full) mem_copy(u8_(jit_str + 6), u8_("Full "), 11); + u64_to_hex(code_arena.used, jit_str + 32, 3); + ms_text_out_a(hdc, 40, 520, jit_str, 41); + + char state_str[64] = "RAX: 00000000 | RDX: 00000000"; + u64_to_hex(vm_rax, state_str + 5, 8); + u64_to_hex(vm_rdx, state_str + 21, 8); + ms_set_text_color(hdc, 0x0094BAA1); // Number green + ms_text_out_a(hdc, 40, 550, state_str, 29); - char state_str[64] = "RAX: 00000000 | RDX: 00000000"; - u64_to_hex(vm_rax, state_str + 5, 8); - u64_to_hex(vm_rdx, state_str + 21, 8); - ms_set_text_color(hdc, 0x0033FF33); - ms_text_out_a(hdc, 40, 550, state_str, 29); - - // HUD: Display Current Token Meaning - if (tape_count > 0 && cursor_idx < tape_count) { - U4 cur_tag = UNPACK_TAG(tape_ptr[cursor_idx]); - const char* tag_name = tag_names[cur_tag]; - U4 cur_color = tag_colors[cur_tag]; - - char semantics_str[64] = "Current Tag: "; - U4 name_len = 0; - while (tag_name[name_len]) { - semantics_str[13 + name_len] = tag_name[name_len]; - name_len++; - } - semantics_str[13 + name_len] = '\0'; - - ms_set_text_color(hdc, cur_color); - ms_text_out_a(hdc, 40, 580, semantics_str, 13 + name_len); - } - - ms_set_text_color(hdc, 0x00FFFFFF); - ms_text_out_a(hdc, 400, 520, "Global Memory (Contiguous Array):", 33); - for (int i=0; i<4; i++) { - char glob_str[32] = "[0]: 00000000"; - glob_str[1] = '0' + i; - u64_to_hex(vm_globals[i], glob_str + 5, 8); - ms_set_text_color(hdc, 0x00FFFF33); - ms_text_out_a(hdc, 400, 550 + (i * 25), glob_str, 13); - } - - // Print Log - ms_set_text_color(hdc, 0x00FFFFFF); - ms_text_out_a(hdc, 750, 520, "Print Log:", 10); - for (int i=0; i 0 && cursor_idx < tape_count) { + U4 cur_tag = UNPACK_TAG(tape_ptr[cursor_idx]); + const char* tag_name = tag_names[cur_tag]; + U4 cur_color = tag_colors[cur_tag]; + + char semantics_str[64] = "Current Tag: "; + U4 name_len = 0; + while (tag_name[name_len]) { + semantics_str[13 + name_len] = tag_name[name_len]; + name_len++; + } + semantics_str[13 + name_len] = '\0'; + + ms_set_text_color(hdc, cur_color); + ms_text_out_a(hdc, 40, 580, semantics_str, 13 + name_len); + } + + ms_set_text_color(hdc, 0x00C8C8C8); + ms_text_out_a(hdc, 400, 520, "Global Memory (Contiguous Array):", 33); + for (int i=0; i<4; i++) { + char glob_str[32] = "[0]: 00000000"; + glob_str[1] = '0' + i; + u64_to_hex(vm_globals[i], glob_str + 5, 8); + ms_set_text_color(hdc, 0x00D6A454); // Soft blue + ms_text_out_a(hdc, 400, 550 + (i * 25), glob_str, 13); + } + + // Print Log + ms_set_text_color(hdc, 0x00C8C8C8); + ms_text_out_a(hdc, 750, 520, "Print Log:", 10); + for (int i=0; i=4C zz~eX9Np?PXx4KiSJkSiU@6))xy0UWKuCzT*oV8ISxSB7NJ@4F3Lfzh;XSMabLB>jF zVsDh_Ls>PC^LGc7R9Nr8r>^l(Qh)@L_PNpNr81Qtv!z)h2K5)zqf=2V3KTGVVE3~I z&87Y_z}e*}wbsOx96udMRjN#TZ46ep_v-eqkK!|g+eg{M3R#vJFNcO47{QgJrKUNs z-0W!A^MC29@UM{^B}!njLS^pzv1iQB&W4SSALE~%!^sE?V2IDy03xD9V`HVk`J)Ox zjs(?NCy`2wM2hN#pA-!UQW#@$bhMP;A5>F)-;j=;Z(nu7vL7TdBahjnN$~Akr@w#?)gYZ zS)dW3zxZqpiY6T&s&K|oKsA7?{@xmWZT0GNf=q?pa)%_8JWp7wqYE=}BNIRe>(Tk1pVvybHpN zLQS2huvs}TO(t%o%OJ{JU=UCi>y<3ExFF*>{A_yZ_EyKE_4eJ`Ne5^c2pVe2dfdoU zl8Q{RIH>u&V>e)~M$u$W{K?48<=7u=dh*kK=mf}(uNTpLWy$EO6J*LIn4 zkbf%#01*ZdGGARv`n5m7I>yMdwRJVgFQZtUnzcOyA4^ z>4BL|?q#OUU(&XvZR@3Oy5T8YA&^a&YL_YXlw&7t0HFKpFPo`6!ENF2r)D$IYgF~z zvt#lcq%)948;@~_$MQ@*9b{{JmpWjLhE^eX`bo*1>+6H{QQR>c*Xgk0LDvJX3Js(8 zVlu18kt|q?k!JNZ<9ry3E;y(K1d200IOq@;qApO%E#)|%HJ|brbrogp8Ff>(+7vCk zR_)F15frp<*;0amJ=@R1!@r<+R#FenJ@gzlzYFnT$(-D5XqhV_;&J# zvCK$Z`2r#!+&^JMD(O;c{}iuuo9`HXh`iDDFXHa4>2KUXVE}VU0oZcOflq7 zq;puVv@P#}V#g<|P+n1t;cY1JBY{&~RX|Yiy>KXYp>A}Yt+j`5!^P6kPWeELr;n8q zgl6)#Mf(-dcNai=Bxb=9ieR|ixqA)4{}#|Go9lDh?C{(jj06FJ)weKJLFDDNDP0WU zu<=>C@`3aGl05(=ZLUa5O3K57yT$-HN0#aJGD1nq=txc;g2z<_?5NxQO5&*_>w6KA zpVejaM&iZiRR+NZM(3;B#-|Hn#wQDCEn6+J1zD#0(|jluAnqP6L#?<2I2h45mDuZp zDvlY@9srna3rUD?3pkYzUq9twgHPhf9nEc+9wlfS6$I;#EBVAh+M}vtRDH7AnRc@LZi=8Szig$E;9G$^+3@U>+{@h-hd~Sn%gVBbSSDg?uo$R$V3TjaCs#JY1|k ztS-#Jgjs=5oBr=1@c!Wk)EaWPKOp(P_ z4ot1~{JQWg@OSwtV&c;0>xH!DP~AQn?RR4-j9q~0RW<~@b7z~aV5xjpS)i>Y8=-Q6 zLEx#CZ8sxP>73a>4sTDiblOGmq$aG^%ZOY6-R6Q$Q~~fuXl%TA+>j{01#mVd_$mB2 z9PZ{5%juZ#WdZDUfp9pzJSNW6=(K&H1VCU3kagKSSD13R>(In+6U&JmSZ;#5f#z&& zZMTr%ae1w=9iDtUczK@xb5$Z#)Zs>U28T` zfvSSp+-oVA9-t*GkSG%H&53HZk@}=eY(V`e;`wChV@y}^uOm{=BM7g8gmU2B5~hiB z7$ILf!f|x`yIk-atnvdQ9cj;K+h6bW8sU~!bTjo6^f)=a-q0GXssqx)_wl}dpJU7} zbHpD`r2l|zy^h3T#YKdpQ`2{{?+Mej2WH-SJXxN7;?Fjj#Ki~dU|;_wX^@;+Z@$2{ zq&vh^-yhid;pW+6-twr6ximQcj+8%WiwJrw`Go<#c=kAJGBBs!*sjexyeL(wWA|n!gD#2(om@M7Z2b zS6m5NP=xEiMi*HkWUxKe80l*o)XT%ln-!w)#}m||LPN#l=BsN1s#WLewr8a*26QhC zsb3zjNhghqV#I*;InqPgBmyl&rUkPJAoFXQn)(uvRsb%N8m%|2Dj;Y*#!?p8>nN35 zERGSICXGx#H@KfksbajHTJf=*BrqE{V zRDUO%U?L%m2Y7nyd2Tp36d`s=DUIh8FJfR~D=W@mi>0AUve@TvsWafS9Hx6*(V>mFd0n z&eU97EXuflIo^fMaq2SMMPIjnhtB&3j0V=4v%i=%U>fFJwkWw8kj9YB%i}B6Y?DWh z7H3ocLK+`*mmZ34l`LRv21JF=kGkO=#<1ajDSkq=DjU7Y3~mA$Iz5OTU!TZ#c z10~A^ysPpl)tJE1@4AV|l`>0XiT*m7HrH=7(Yc(l7DzfA(W3q;f>2L8gRj~C(aIn^GaA>o5~mBy4+cRwA;9$&n8YF~3*z#T zB;x$Z)%7F!vZ)`qXsbu{sNb4XSBt!wt& z-Mj=ql*v5HM`LLLBFVbjK3&~#>>cKcZU<%ugl1wuQ8v1<10K+kL(I~mYv+GjMLtZX z(vyIA@`Kc%#UB6*#vHZy<0{C@cae?Zw7u%v2C=DuBs2IxZOwD~F3;tHg+|6Ep5kcU zpDhda1b~t3akWz`TM)>?iVNIHdj`@4i^pxNQA@>3r=pHaIq3cbQk!EkNnJ{%R1Ep? zzLE#YzNg%P&V>cgNFYYN0@PW6pd#`!=J3<)<*d20BBNDo77y*?W4C9Y_oL(@tj;Ah}c6K z;3tEj3SEr=$BA!;f1Bm|KNsP6cqudk0>z+%+mUWMj{7C6_e4kD_cgW0+zke_}AJLV>1=GETYpvk@hr53#6wWM2w<5PDGR!<+*-kRwGB}osZ1(0!RCmEv;u6Fz#zEFckJs( z5B-hCc84z#hgyAb(W^tge)=>H94EiAn=|;oSU`iQh7n9tg-^-ZfHck$HYPa$JDr=v zp`^|T2EIWc zrdqJvkNKf&c57K5^qAW>m0FY2(+xVaQ;vD;HrGd*337NJFy9~3${|#+;{m2KWij5r zR2FmyUcw5ahxFg*IPmRbg$tT7?aZKns?Y$cbMwLbm8B$P0T}dJ>}R(z`Wa|0p!unz z#_t7#_W=!Sb?k8_Tgoh8;e&n{D!`!JfhW^Kv=6~h!c)hbckzW1o;4z^j^JkVn;=8n zMzgV3+$9}-%#%{0ylfgLsUFQ0WWQ1-!;Nzp+vDsdXBonVg!*x^E^mz!89rMKODuCF zIuUmH9Uzc!5@Kb)m_3RsFY6z}abyTPh+K!v1@jXEg#Zw4(Sy$|@X_baEu;+E68$Ur z4g9r{Fy-!o!M_%n&r%qGQNl9abukjlT>u!~cf}9DIDUm;mQ6+o0D%wqZzO;*vI$Yd z2Lj;N|2D8d7l$Z}VXxy5A_3pseM|^_F!~t}VRA));Q@uZ-r>6-fLK zorq>}FiJq+Mn}(0u2xiM{UJgqV!QF%dKteH z?Uj{N%8eCbnQk>lMdDMM&%|18eZ3G0ed{sUG062J0V*wmXd{siEy^LP*6&A?JQf^l zTuGO~zXBE3p%v_e7Cf=!mQByEw;ya&E>~x6&%M9zH>cCT4#x9JW}_QPg$lj_`7_m0 zZ99#?&(knXch2UZyHlcs7f~@n-Q+|8V8s2r1VMu)3uLOAm1NpvktWzj5o5*!k%w@9 zGAQyAURD`vhj7#8QNJYKrsY7^6R=dJ=iyMK_!}{QcPkRTO?SQ|pGbccW+61Pt565G zly~5+BKLHp2XS8O^MEk7U&GsHV|A&TCNJB_U z)SV)72w@kmX}vm9+l_80E6$Vjd_1ZQ?)UMZvl}UmhR?6oj2V)?k8{WJB=>K!FZlcHY-;P-AbuQ6*R8d=>rpL4S!*;BUwp*rM25U`*ml#{TS>S-9?bE zpBJX^K-PY~lz35X<&`#BwL5cH_qZ=?Y^jP)KPYu}vwq)c|L9bzD@T*BJkUW0@VteA z{#wJyypIbSs!!R<$Ml@yBTU9}!(rC6*cl) zZljT~^R}2-89Za|bgBGGpEtt>$GfW((U%Qu)!`PqCs8&par%gU?aPEo@`s16?8D8I zK-=Ac$P+}6#@aGy0KCk5%hvi0g7J!BY9^-T?=2 z#f|mH?VN&G=f}vZRKxKFa~Xq=E^T!*mP<9lZHMHJfLteWZ1-t|QisRG#(^F-t(>|K2S!upy1(*ayrZL@@7bEFNk!Si+U@Ky+OgrvleFa5NTCu&^Vdh&e=rJ*wZ+;XSrcc{ z@$gUl>>%{uCfxi>1+y9&jGqD8W$(`XD24Ly^P|ebY$#TsZptIvD#ycWInZy!WZF^{ zl0ikg5b!}g&t;!j`vqRMhTxlz_U>@W-;BTCrqD^Fwl*r;=XeM*GXKU)N-!AOcq7ff zKdZioNXZr+B3%Kbd$R^k98m|Y}fFi85qjA zq)KLK(-?i(_WkIVi(I)sS=20wi;X!v=veMliqB-C>M+U-wdSpCk9gPL+1)DIY%&!P z7zGw%g^P=vi;Oa2CWHp90&PW4C=z~kSy-2>076^=|BX6+$9ERFB zv9Kt0)-RH!&alEK&KGx&Hl9(%0+yn#dmVE{dgWcF>zNeA#NBLJJX*HbE*d12l(^4U5{#_x@xKmx7y0w${yb1~b?OVSVpUbJL49BCW&PYVcKFn^qpv^+kv zr{oJgWeN!<8iDiM7bnabk$q?L?jgwW-|C{P5f%_g!zD7FNSWd!SfeFx8CD=NiLwUe zo^pcyC}zCOPdfG(*_Yjih{RtIx5!kIK*{Z+uh_C;MA|%BB^?k|A_X^(0T7)HvaNRX z#Neb1lm{FYmTmM@2o3dvaiR3i|NVMx{rWPdk|7a-qRHv*-{HMjV?GRZAl@ndnTJX#FaA3gaF9(dRu zMW{kt>+CVruot&xnc#ZjCmBkiP^h$8ZMqwOes#Qp)sPVp_emH8PTz@jADh%tbU)mwb0rqUYu8i*tE z3`GbWh4pTqMZSNXn-UR?#?yP)Z{7sI74e}+3cZYkz^gnMdKT}8I{&W-A#!D%7rWzZ zXn|*mgwAq}dkvQDz`iMYN(emJ-a zSL^ASKy&XTB)!}U>h2OV!%>bpPX(PE*La7~L_#980A|yL9LvH(QmIp1DdghL49e_f z>|L`f%}a2v;RI<(<#LTjZ%Lll))4sn^vlG{7Qt1u*L7YOfQ?wO)M#((?K*^YOt9ly z3f8u~8x=^L(7JnbMo}h2w2h~OPZq7QT=t63(33i|LS95dp&)RV>t58cOwQAD)OcJMk1ujO7Q1+NP-}? zE4@-a14fX3{_6Zr5vPOnyzuhRaRzv-&hvuT~c58!!cZ;m_J>;Ua&Z4tEEiH;JJ)$Y+r@9J$8V`&vC^kkwz>!y^WdYO2=aJ!2rb% z34)o1-A#=7zSgUk2BkFG-gF>N&7`D_Yfq7*=^Om3l%6P@HoH_ zhJPOmU>{YkP;Ic;I9skAY{=6=ufm{ZK<1$vQm{@^JI>3CS+9VQE1nOKeRwYp6fV8O z7i-^1w5FQJK~kTI060%2Lyex1A0qLn4v1{{E1}8;oqHt55uq|lE0yHi@XIIDnaxun zH4P9#gp%Pe1xnDw+jMqd?cLxTHLK&BelsemQuZ2rw9H9U?fDiIE>DoFzT4Z^nM9*r zxeN9)Wy{|Zy-Ve3Ht;#wj*aA$2XJdZGB?jiK-GFTURU8IMKcTe<-^-v@SA0^>5ugg z6LHz;==muq*kBzVIJA=9|HT4srHH4wI-CSq#a32EDz6@@Kg%?mT+SN{t@h=8r9q`V zOC_^Vl(<`ORKir=qohd`O=ligKc@4Q+f`JQAuFtON_lxWfi~TbH>^LZf_RiGUyj~E zF3Wi{3$IO?^1Qj#ced~bmBhjSt+4376<$hPmbg#wTQXT?bjL(J2B;+uZY3`Z!w zyi}_{-iy>Q=~QceP=wtUy*okyX&eZ&8HQ|ccO)p4m*1k1*uooG!y1XQQnmE3;OMpD zwlh~QcW(^h-YDD;Fv6P=)rWhLBYY4pnmmWwv~p-q{@bsAB&}3{e`3yi#^vfZ*#T8m z`SZwmn2%)!WbpW5IpsmeI${GT9(r55o+X+HOfetNf{gTCv)J zI?EZ~T@v@IgXi(=Oa0=C_&i*+hbKocFwgtIlJS`~)*e{ntkH6GvZwQc-bnR;x9!4#zZZdHWH7 zz&}#INj8I%tfs1jHZ~kY){w$?mDqT;9VxC1wKh7RZnbK068PjzV5o6=KX zRH+e9op(k?n;%y--ESu=#V37^Ou^gU>Qy;nK)7;+ z8LqkIk@h^1?K)<=*PjAlbZjlu3(ON?bfL=gCemm7wMKXV8Hbt1NCbALa~1` z!%RhX75x|`Y=p?rIb6oD=EmaZ=IGEH?`F!E+gey`tNwE^;foZ_+}1J)>+_RHGY)Yn zUy@kI>miQhvr%t%;Fk)G_Eopaq0vCaS+V(^s}EBfT2LCM$RxCL{V+mX+*QIs|QqOMFf4IlySLeyD+El~##;%F{HnxWV(>HR5*U9Cz z-<8B`RNS7{!O$!Te`kLx(GnJ-5t06|Q>)eLaLIa-j)rwDc3nSvwIXoD6OTzyfYmQtcRHSPgW8+|)v> zUq>ifSbuX02qt03Dd*EMtQKfQW*S=w;Ojx;!YI4zo(x88U3xs5<6M`C`#lDe*+?4% z4gvSHKxt=}aeH#KAoosJT$K!K!8D8frrM?Kn)~9ywkE@oacx{?uy_p zG3yaW$*}lPHkveqTx|UdqmNeG-6y?hBRteU@i^5{m43R65-10q&RgxwZ6FB9C+Z-s zdiM~Y({HC7L9)eVasV$zTCaBhazpszeiKk%pG~8HKzPn(I#4PI28(_(lWdzC{9rNB z0Z_G(mN%Mq+0JNtch&vl<>8o9_o$T7_#T4nWNdTt$SxMerPL+=D+*%vz8x%)DN@TtUJnJ<33d5kLsS$W1$@}oC)+eRw^TVa@haDkR^HA&FX z7};wKO5sKL3gyws`b8QR-2`X#Y4=A0zTH;5-t=3~CaWb+?4L`Ncf(6x|Ch(#NF{Dp zi;bCYm#9=uIZX}s;Y2?{Hf*)PVDL6Rho@>ZM0s?)fvn!ULmf;0CNO*JzigVyb!*TX z1j@h6av8?w#BJhss1QfEojmLLw=i$5v)j=0W+{6dkJfY2@>0dlna|ccXKHJyi$a9m z+^<&hS87t{c)}g*%BIl`algeJNadP)da;w#2E9E_^77g-M&m6P9A@beX=8F!ITsd8 ze>5Cu-fnH3+=Er{(x5DgyVOW7PMoXH#i14!&M3rpT-M^KFwFByw>)57SroEWu3>?( zShS4g&ClVa$#5w?4LF{!);8~5ACL2{F9s_#)2Z6q=1t?x)SXTNum~#a=GTEJu3S_` z6&ygF)SWJOdT-*Ut213Ka@J6lNL;xsDpk0Mg7)+w5ki)zY}zncXl5^xpP0W+9w2yG zYWbvl5f2Ko&$$VjF9WI39y{|>so}eQ- zaV)d*jknOb+}HL4Eu#{>vSf_6u~M7M`NFSX5{>pRE7|q?r&b{n3H$5MyS9h2AUQwt zj3~p20!jx)(@~F@l&O`?qa-|R<$(Bg?vH)2&|6e505NKvmyI>{Q1hr&+g!y&C%4g( zz}o|A^@r`7e5ivl*UR2=?}HiJ--d^s+RXrO<*L;l*Kd7rteFemg(?L&>g~GSHPMN* zGMab8zG;Jt7%NAP1wZ`S2NIlO`Ob6D!CbK&RlqTcqcQ{;> zwg4cYd||DFEN#5j3vI%ZNi-R}CLastU9*2sV(+(7z!(4OGn6a@$H_GFdg+1=l&RTw zJf*dEnx_Gljw)z9M5QUIDeQm%^yfb-7a5CxUrd>QLEi}&3qt{ zUmmwUjx@X&@jo7OG+ZmTKlSzo#9Ctb(Gj#U<3y$L^dU;AQvUW^d}l4Nw3FSlatXgo zp!^EGo!ir`;V+c=|3Wd_Z6Re;SXzAZDRK_OtagnRMo1lC{eOY*wA7|Vv`il{AS6+Z))uK4z~O|%gX)= zaAYP#iz=j&)%Kaxca<@GQRT2S3Bq=+1n+-l)+&u+IYF#(?f2P@cM)G_CVf3jec)Qz zLx|K_AhJS8S$nVA^zu0)Yv@=h87UiM%;hwE7CkGFDSsF&BWLQvHW=m3k%!+Jr9?9t zfuORI4HUkn*#VfpB=Ib6NjgAk3bJKlu=@jP_ z=t&5W?{{bkD!6fc$#(EU2peX$Dc}-;ejRV*@Z} zk7m2=nejtQ&%!#ySgab#D36bRq80B{1R2qZ<4rW(l z?IknL4wOtpnuEazW!({)T%JlRJ3fwUG=OX#2Qq^@H*0KrTO6@iELT0>DmAPyjEwwC z*lt)S&t4?FJ=_V4Yq(F(Xg=@iH`Y~NKgH&+(`^pEqAqg#KZ++J^qp4(h5tv~!0`bv zhMkf^e6vP?LRrQ{J{bANleAH=U#t;4;3B~nFXX6d@avm{!UmoyZN>j8&@u+v{jL@2 znnm~`ijEmWuK(ktXux$vY?D%K6tR!MzWe*02z=2}js(%~|5z;9*)Lv6e%2Uy(Ep1> zn&1a$UlI8l-7-S<$G_2px^TZpttEfNlP^x{n`v75Uv)1w;NHI?-KZ}f%U&wxyZ=`U zS&XmtilEHj9MzXL?BFg9Dr4js+}`Ni|9Gkk|F7ncDNqr>|Kv}8i!+(j8IQsh{ie+_ z0>7#!Q)wem|5ZPJacE($6EGq{-_m{T;cXJXq)iB*{!jbWZ|zr&u?NHd)z^NLWK@RJ zm4)~|wqNt}$^9-MC!U7;H+DS^;23$mC&<>*f1DdK&^}{WZd(rCe}?y63I1m2SP$9s z{}ufGR`qZzOdG-X23!{kp$O*7mc=l&5e7p4=7#cZT9AXVu`koAtb7&e|(FyPc zO9W1e@T@heZ_8x^epS2R1AU!jE_fPfjQ^RH;wuNGOu!#VsB0I#%Ll>t-DTiyrXA4$CF(is9r_&&frU5VE`j~57U)=p0V=NS4PTZ9 zKqvwL!cCFG?EKp_b(hRt1WPa%hh+M(W2!|QKnK?AYHcA|;2Zc8D1W&bk`NO7fdNGq z>suG!Fruwk43hV|=-{m+&vxtlTak@4eAA0m0V>c@wCI$usTaFTY{|NB$N_Y z9)gbo%I;BK28KD6u3Jd(=&-2Js4#Hkv=WLfZ!l-RlzJ!E5wt!G-su^Ca+0Q z4J@XcNCfhc5fyoDeqT~N1tBkaQ$AHGO{pS9DtMRYr$CWKCP z#QP{r26n)lt0Rr7cza{dQ6e4vNhBbNr$7#`OBXX(kw#IXX>vL-KPnB6`3iK8-&%XN@mF7&ii7;}H2q zq)u|P?)I7O`41fM?cUtMi&79<+ilo8HGi$2hV1#6+1?>dpwS3lHpB;#5vi)3mi)h1 zKo<@}SXHl&Ozg+ZRKN%K`D>+^-zqdF;2>0ao{x;Idr=hnG;8-ACExWjUS*;W&>t=E zB738L%ns`i=5P{TvTkyieWXT*OTg{q2ji&|<*JrYQ2g-b$=5&7Y_#>fBtJQ@eOG9*TR?oz;x~#T<0>HouXs)k-x#y{tLY2?GI5!|HC`; zZ!A}Dt7iQg>MLWw--pwsKVk>A)`$K-tVQ~UKO|#>!S4)!ue6fyn*hfc(7=WX=;+%V zB|p9ZZ{C;VA@sYRPg>{;W2FBoVI%#g3%}1Qr7^OVhiuq)H2|S5El|Y-IVRT`U)RR6 zAossP*B}5@Optf07khib0Syc()T6t5!F|JWOv_p0s8K0aHT*$+ukCDdc=1WqjXd8mk#dDUpk6)qmGCLlgU!aqVx zMOYe>zYK93(n7|5*z*joCS6h%>9PWOIYc;zziiwKK53WzjJ|o?2TP6%*r|n-g?zf# zZ$~2?~mr5)d1)Q=RY>7%~ zsL*?tD#Z|wOdD{NrMJRdJV)~-MLV`5APB-t>XwDw? zUAc(Rao!rWUzAQ^FqwM-i9_V|tY=jWj_wae|*<-^r)8KgoJl_+w{+{TaOKqc3fb1B56Wlw`Fu4MU#tTOGHlZi6Vzc1n zg7c8gNF#b;c-T<|PM)Ip%>zg)&B2wJ-pTgo*>c;5ensTQdnN`VwX6}grqkBgb6V2F z`HBl&8u;nM5fMqBv=9sE7O|~O<57itf9yD`bDnvQ`=A5D>Y3i5k~_`k zSbiH38Lnpws}87Bb0BX<%sB`LNg<%1p|)vv(63pi^ifWyvyZjQ zz5Ia9<7Pgs;FC0OLp-+F=Ic?7;2Ma1N=r(>X!SpvV;|e`8GFu3>K%ufOwTm}%#&n& zn-0!5H_;K$_b69wKs~uR206KeK>Y<28N6;A?X_QKN_@?#7VA5!?$Mww}1A@ z5w1`!{=y4a9_w@%z^aJ@OMeF=_ zXph0X1uQm}G6bOkaK@q&#!pk-=)s}!izaq3S;@qO@Vt})&0ThbUANi3yx4w^j&IAF z2;FTBfJeFY>UX--^R*e(i2o3ib|KILozz_EH1!cFCLqQqo{|=77~FD+G#1Rkyq0h} zr_OV>Ry!D=q_`ZIuI#sQR(x5{?$IZ7(U*$5k2}4yCWp5vWt<7&Aau!oc(Q_+)eoPE z=Mr$qY3ZI(=)+cJ)E7VytA0WT1EM^h&7dZOfdH!d zlq>-8RMJ+**{E=_HbE}0Ai(P__49)1@@t=NNz1#^B~!O@jhc;K3F#N?*vLKOI$Y@8 z8i62ZFF_jOYW4RYp5?ACRJ^_`7yQWq@4W8nL+Nd0xguN>^{EVj4;;B1Hbp9oGTqa# zasSLoU)*x!(jj+1LU4YQiG|ElTjo7$dQ`|>ck{eNiN6C$ zyLIHBW)L^jeI)a%npP!0i8(_TIw5Rr{ybQ zadHt9gWVjzZM$*gxl$5i7$QiUJDiL0Q5Px?ND^FSTJ39Pum>$5L7?l`2Hk<)WEa@S z8^pbADxqVerF=df+D-pNw}q~;V|ER*m>(2ZSSZBlD9-}Qqx}_ji6$%4ohPR*aT(6T zGhmUy`)-0@*39BqG~w;-ey``+5%lx~HDA}l|NJqXr-E2%YHGWpmxa~|*+Tz8;+|^s=8PYI{fC#DwWdRe2xW;F#@w*a69@=JzEW-5OK5A=d z2&Efq0*c|D_pQ=Rjy)ud&f2AE#p_{kG;)<$PfmYOtSnC?K14#|+Cs*1M&dk5;U}*9rNiQJF|)3Vnpxc@>fp;de*z~B!8V3Kv=DMHQeRx9y2vXG9mGn zIFgGPKU$>Mg!Z5#Gi zdEhHA$`Kx%@}5FVEU?C39pgy^k@t4jWzz)!!z9I62eU5z@-qLB%;k^_6s(_MD)7olR()GC_;PX3G-16yMdp+^!sMed(<<3TO%qVf1)JcmeKUE&OPU zjjeou!dc+7cpJT@bPxUMczj)Zm9yyb&p%;uAO69f9js{g10p6KA0p)j1d1ZX$gL`-XD+Kw|=JDS8TSvU*Xqg zBacHU(Yvf7r}h^k1Zt^+n3Ib!F+|q7a>`%^QL{tY$HDGuoCTOK!2;BF1m&v^W&v&h z%x@TX1frJc^hOHfaX4{U_a*eFJo34go~Dv;23X|dAT8J1YROV|Gx^Mk#FJikl9OQ? z2HVW6zP^Pqu|A|r=@z*hsl)5gdOlcDy6x2D_8hWg^V!3{qgEw(3W;IXp7S)|HH?Q3$Jy|2s|-XXG+jxn;0HIU6dKE>H0p~OP`oGyF> zZaP|&L9aRA}18B zeBRX@yxg@t>%}NHV{2`Mk{CnMLMXWM%;-f4W+_s!v4sa7^F}}E>Nz+yeo|Hwm)vs+ zJ1Og>sGo&z9&#J}ypqY}fzdFkCq+5RB%K5p)05-qogTMT_^`hJylbqVI0Et{1ga3` zqxOzTO-&qsW+knN1b5%%^8s^b56LcD$O9tyc2B?KH7+bbcN(-#z!kqJoUiEwe9{9) z5+1)o6j^rYHOeAZRc_J!d5A{L1|~X>3Fv64OF~^Sa(we3;vg-2HK71wAc+551>9hO zXwPL35=mTE0BH1oj+RiDG&~(w?veH1bz%nSUIg$gxPK0VX0Q)IZd1jtGl>71Ws!a* zGUt;{P(*zfd}TeqGzNUdRV0h>|8v-cvUa}REjHudzW?(=AikWIL|K0Aet161ejE5|0kQzeIg>KtzhNFlx~^!2TRx77 zLE(siOKM~y)^wRcV;$xQiw_Z$bwm703uZxA$=2H)yR8i6MEp30H@9-UH z<|Dapp3i^>#Mw_}K=D9c?W&gnEkF<;Fw{}OXIB3g3%G7~P)5v{GBmw*HHLK+C{G{E zZ0p&Mkl0w5TTNjnzlr<{=AT7Kwcv|5eC zv*!-bCdWS=m$rASo9{~?5bz-2=-_cWkM|Xai*n&)MP{YSgya$VqA`ViIB3UB8VAf* z&r<$cI!ypgLuGxo(SQ4UeJ#0RRpTndW|_wKs>WLx`m-HtKKWtHoU!O*pkJEDh1=_6 zZy=M_jIF)gN1D=7glQpl%(}(MwC80wHr?;{kC(-k3}r(bjZaq{b@?A&{}HM z6#V+Qd?NV&`9XyA)1Qwv9&UQMa2iqJ;@v3yO}bF}^fE z5Li_`Ac(s?;5;I=zxZYHRZzh|d!Cy1)&d8ADidL~t;|U##J0cktsHV*TJt74@-#Og zLtl(K;kq|r9XaR$GVR;7z>a4c9tZT@m3}&bRg=?tZ~DG!{Ms{;&mjwDNk#^9qbk1q zJHBLlc75zlvDw0}Kq@k4uq>70d^r6m%II)+bf;&dq)585C z24R~oMo@%AIMU&H_Suj=Qio7|+yAvr^spDG>q;eTHO~i84*#!}^NMQnS=YEy6f0ds zK#(F`YJ>zL8iGRT5J04hAkBhw3>~Bs5D=-6-pdXkiV!*osDT)oB|zvsf^#VcZ*%$k6W^UeD?|d`g^UQB%bUoKzU%Q|ArORq*L#z-n^&+l$ZXIjcr}B(ASp0m$ z!8XleXX@0L^&8`7)Gfc6uU<|$(qGtj&&gWJGLrBO1mr;1M^uLL@uPvw zajc|(ss!jNNJ7xSt&F&vzfEF&*A^ZH$?QDw;^c(^b+dTjmKc4=MC=sjzvS>w4EQ@60)GaeoFe=)I8{6sW2-Khq z%&mE7L<}F!)bs%`JH|y<*+p|K`z1mAR&P)aP6>kI8z}kqSdyzo!>6E25x6XKcA$p& zF04;dY=FT#2?f8za)F(TU4rurgY}KT+`&yqIDqvSmd}{#SVYgR|1VQw+UhMsH6{6` z|EDQQ6=Z^!KFi#PK-p$H z(;e2Y`r49v)Ao)Os~406S^4#oP3Y%eYa)gGFIf}Kt-(jGBZq;K##)BqFosCSZRSfi^zmxE&$=y_^1(Y%zk(%7V9I(kLkNgJW^a?x$ z7iX1nS7r~4C2tlrUj)=7)hLSuw9O){4C-{)xJM781*E;0qTcuc=8F4LQ=N8jEH<@Q zQXL4-E$Q^bp~jXBS}0MpoPy)|#7P~7dBBPe<$8eYdiBBEmDqy&dDlLEG(6e0nE`lf zW~Eoo#;D58psL_$dj=KSA35@Q>~KUKlNOxV-lS?4qikPsK9~9fU|8-`O8^txP3)eU zn67_K>QSM{5idTNaardWD?=t1Rp_fAEN(Gs+T?JIBR8-VnD#=zU{BBJDJ+Ui&t7kt z34+hHv^4M4@Dj@R{v%J}q)2jUzx}O>^{y{YK&QCe|332U@2g!}Hjk}8s2F!_1flhX z%`S4AlOmFF9Kw$du^F3Y4vE$XA&3SvIn81j#%dNdB&sf4PCZyT7aDi)1Ov17)XSZW z-3Nd6q8yNt=)5~?oa9_J(^B+>G$Dl|4fRhN6vvohWbz83v0Nh1U^M0Ys(U>yq>*U$ z388c9EU|rn)7_Sz^H!_$aET%gDaeTAXWN=pH*fb-yZdzNdXwu_5g$sg!|zg3NM%?w zXsY^qXKG%|n`L<`D9*va!zU&4qz?#M8Jc2eVz{eMpobvX+rKY8gUx@P)MYG~FOn*4 zGQ_p@Fe?gIJ@j?+!&JVC?B_&h8O0B%K~EwhnTx%{Z7R9D8agtUL|XuqLc{DrsL&%d zAL1u2Na@QuRM00PgW6o$;R4KhzBcyudESBC?E?4eZPLiJ)#2obJj7C5@ObuqLXMo< z@3=XOwg8b|&T_{WJ5Km)O`RnGAy6Ff-M6J7QBpH-b1ps(QExL}L$I5&Nw68y)+yCS zq9V8shXXhqo_wgl`|j$cv+mzpOH7jKmRS;-m5h12CUd=B{3F5LSXYa#rw-6Geaej! z=zf=vk5M#ACtkIs@=GeG>kj6MQAY_l$N+#~7|Jl@NZ)pF(aJ6Xh0sBw=^;_e>kE`? z2V}NGruK;Eg9~d7yqc2hRr}K$KO5`L7!}(bdXEiy&W3cQ3bus5IG0JKL8dZ^nAZ^@ z=W;Kj5^c%SNv=`}NmpJbwEYWh4R=XRGlOirA?Qb*TfO{E=vIaQ>kk1_EBtPU#U>-( zKgi2QTItYrooy1ivdIs9AdM=_lGv`a=D|gT$#dsk+BzSLlaCS>e50LtlaFzzGY+Eo zSO1U1U&204I93gsl5DOG8tg_EJ^mmjnlT-=h8^A6eNo%s@%odkkd(tW=J6_o$4c3* zO;rxYahKRZxpd8{U$7e$rm=m!+G1x9#(odOO?V*N{2nc)A#8Q3!Q7_MuRqN?$jcD- z8_-*8dNp3R>4um3Uef-IjUQ((A%b}U#bYWlrQzp2x1w}GMAss~es6!onxedt)^j#9 z@eHMz3?s%@Zz7k>k;S6cJk3Ny&_@bvFfdUcACRu!^!^OyT4+g;VYHO~EojIsL4Vuz zy6Nd@MW9t-&|=ny-d-jCyRg=}i$OynH|rfaR)XmdyA}_A>pbcwC*Qk*{q$K9of2Xx zj#jfRb`^Z77x_A$zTQYWSzLY{pHbzNsV_q)216%n<5b$(WOE z;klqw$31DR7(g=_0O#xOQq-;lGr>iv87X5ASUy6c)SMWAt-%WUBmiq*(X@kTFhmzp z(fHh6_k(OabJr+I(aw?JM8RCzQzO^m)0FJzW-4QEwL8h{U?u($)OkG%<{|cVw1gxu z`8wWqE<6a(8hih&0FnK37I<^kxf@gT?rq*O$+Ig+G<7B2%sU{djCH;No-I8Go7)9* z9-hGj&+UoiMwB7@nuPMoRf$W6Bs3UF5gn`FrbcX z>n1If-BXEoGIyWf)jzO-aaRpNzIs&LclW55&u;NfdpfJs?hwg%hg=wQlXC3|U}=s) zhAU$iQTaWr>4B4cikEiH;vMiWRCp$bDf%8n=?( z**W`Un~_k2+DXPt{XE&sOL$m;no^}|$%P*|MDPi5bs%MZn1605%EzSl=|U(d;3Z{O zjvOl8etF*)hVe(JA^XIjfAyl@Z>P9GYjRRjE`~10?4~c=Q^ykyeKQL0(&Q;W8dw(M zg-mEkJkmR_-SV=GZeqO_Ww|3kO-Y84U=7t z33eV;HNNdtS8X#p;}j)`+&1=RY}`&TYS}4B$Z$qHdTqo{y~@j?yEekfMKINSoL4$f z99DC^%tS`K{&y2-*vLjs8Xpp_+IYvDtx=&`=aup8@K-mA4CpWtGAmzJQdAlgV(=*g zSbpOe6|8Xg3nsV{-Qy&~X*0&kaaMq})Xrzp_1^2U|g45qj=93P1LjjRHrl?MD;juH%XRmsG*vbHH zaUjQOwV&12nANeZX8OCBbYh<>% zG%r_Jr{pQIf8$B-!}hj^V(~W*zbVuhesgu!LN>TZlx#o@r+lE8oy+91m>b;bKXK6eWKtH*hqItWPe_itm0pt7lv5}OeYI7tjsL(UiQy}^+-h~8u@}JgmUxfol0lt8_HxEd9Wt&Vas1qkmTGa71BGRn-Vw-F)fcH; z`ni14qL~ycUovu5B56iEN=!D&k1qKSi1!luhr_p$kc{&TzTVPwqdbBWZ<#u~yUA+Q lkQ7SqAtixYI6;d|e+;@ibVEd@wT#+wOiM!#S_QEU{Wqy?tpfl6 literal 0 HcmV?d00001