From 0576d2dfa1323669901fac6ae4be51a63886801e Mon Sep 17 00:00:00 2001 From: devisn <39122981+devisn@users.noreply.github.com> Date: Thu, 11 Jun 2020 20:34:34 +0300 Subject: [PATCH] a recipe for the ZX Spectrum (#105) * Add files via upload * a monolithic build recipe for ZX Spectrum * emulation and emulated tapes in README.md --- kernel/zxspectrum/jumps.asm | 30 ++ kernel/zxspectrum/kbd.asm | 15 + kernel/zxspectrum/tapeblk.asm | 222 ++++++++++ kernel/zxspectrum/vid.asm | 58 +++ recipes/zxspectrum/Apps.tap | Bin 0 -> 149760 bytes recipes/zxspectrum/Boot.tap | Bin 0 -> 15220 bytes recipes/zxspectrum/Hardware.tap | Bin 0 -> 66560 bytes recipes/zxspectrum/Kernel.tap | Bin 0 -> 133120 bytes recipes/zxspectrum/README.md | 138 ++++++ recipes/zxspectrum/glue.asm | 263 ++++++++++++ recipes/zxspectrum/mono_ed_glue.asm | 46 ++ recipes/zxspectrum/mono_zasm_glue.asm | 90 ++++ recipes/zxspectrum/tapeutil.asm | 594 ++++++++++++++++++++++++++ recipes/zxspectrum/user.h | 44 ++ 14 files changed, 1500 insertions(+) create mode 100644 kernel/zxspectrum/jumps.asm create mode 100644 kernel/zxspectrum/kbd.asm create mode 100644 kernel/zxspectrum/tapeblk.asm create mode 100644 kernel/zxspectrum/vid.asm create mode 100644 recipes/zxspectrum/Apps.tap create mode 100644 recipes/zxspectrum/Boot.tap create mode 100644 recipes/zxspectrum/Hardware.tap create mode 100644 recipes/zxspectrum/Kernel.tap create mode 100644 recipes/zxspectrum/README.md create mode 100644 recipes/zxspectrum/glue.asm create mode 100644 recipes/zxspectrum/mono_ed_glue.asm create mode 100644 recipes/zxspectrum/mono_zasm_glue.asm create mode 100644 recipes/zxspectrum/tapeutil.asm create mode 100644 recipes/zxspectrum/user.h diff --git a/kernel/zxspectrum/jumps.asm b/kernel/zxspectrum/jumps.asm new file mode 100644 index 0000000..de70c46 --- /dev/null +++ b/kernel/zxspectrum/jumps.asm @@ -0,0 +1,30 @@ +; *** JUMP TABLE *** +; include the addresses of the actual table into user.h for userspace utilities + + jp strncmp + jp upcase + jp findchar + jp parseHex + jp parseDecimal + jp blkSel + jp blkSet + jp fsFindFN + jp fsOpen + jp fsGetB + jp fsPutB + jp fsSetSize + jp fsOn + jp fsIter + jp fsAlloc + jp fsHandle + jp fsblkTell + jp printstr + jp printnstr + jp printcrlf + jp stdioPutC + jp stdioGetC + jp stdioReadLine + jp _blkGetB + jp _blkPutB + jp _blkSeek + jp _blkTell diff --git a/kernel/zxspectrum/kbd.asm b/kernel/zxspectrum/kbd.asm new file mode 100644 index 0000000..3453b6d --- /dev/null +++ b/kernel/zxspectrum/kbd.asm @@ -0,0 +1,15 @@ +; the ZX Spectrum BASIC firmware scans the keyboard for ASCII codes on clock interrupts +; this routine just waits for a key and reads its value + +k_getc: +;ei +push hl +ld hl, 23611 ; ZXS_FLAGS +res 5, (hl) +.loop: +bit 5, (hl) ; pressed? +jr z, .loop +ld hl, 23560 ; ZXS_LASTK +ld a, (hl) +pop hl +ret diff --git a/kernel/zxspectrum/tapeblk.asm b/kernel/zxspectrum/tapeblk.asm new file mode 100644 index 0000000..fd39559 --- /dev/null +++ b/kernel/zxspectrum/tapeblk.asm @@ -0,0 +1,222 @@ +; tape blkdev read-only +; to be included as a kernel module. +; In the glue.asm devices list the PutB pointer has to be unsetZ + +; defines: +; tap_buffer = 256-byte tape loading buffer in RAM +; buf_pos = read position in the buffer +; crossing the buffer boundaries require loading or rewinding+loading +; tap_pos = previous read position of the block device, +; then the difference btw current and previous positions, both in EDLH format as throughout the kernel code + +tapeblk_init: +; initialized CFS and a placeholder 1-block, 1-byte file in the buffer +; the tape fs is not default, has to be mounted +ld hl, .plh +ld de, tap_buffer +ld bc, 6 +ldir +ret +.plh: +.db "CFS",1,1,0,'@' + +tapeGetB: +; it gets the new position in DE/HL, has to return value in A +push bc +push ix + +; First of all, is the difference between positions negative or positive? +push hl ; store the position +push de +ld ix, tap_pos ; previous + +push de ; working copy, higher bytes +ld e, (ix+2) ; lower bytes of previous position +ld d, (ix+3) +scf +ccf +sbc hl,de +ld (ix+6), l +ld (ix+7), h +pop hl +ld e, (ix+0) ; higher bytes +ld d, (ix+1) +sbc hl,de +ld (ix+4), l +ld (ix+5), h +jp nc, .tblk_posdif + +.tblk_negdif: +; at this point we have the negative difference +pop de ; restore the current position +pop hl +; store it as 'the previous' +ld (ix+0), e +ld (ix+1), d +ld (ix+2), l +ld (ix+3), h + +; let's set the buffer position while we're here +ld a, (buf_pos) +add a, (ix+6) ; l +; the difference bytes are negative, so e.g. add 255 = sub 1 +ld (buf_pos), a +; no carry would mean underflow in this case +jp nc, .tblk_rewind +; we now have a chance that the higher bytes are FF (due to lower CY) +xor a +dec a +and (ix+7) +and (ix+4) +and (ix+5) +cp 255 +jp z, .tblk_readbyte ; a negative difference within the buffer + +; we have to rewind the tape and load back to the current position, +; so it's safe to discard the difference and treat the current position as the positive difference + +.tblk_rewind: +; as we will rewind to zero, at least one additional block is to be loaded +xor a +inc h +cp h +jr nz, .tblk_store +inc de +.tblk_store: +ld (ix+4), e ; diff +ld (ix+5), d +ld (ix+6), l ; diff +ld (ix+7), h + +; purple border means 'rewind the tape and press enter' +di +ld a, 3 +out (254), a +.tblk_key: +ld a, 191 ; waiting for enter +in a,(254) +rra +jr c, .tblk_key +ei +jr .tblk_skip +; we don't have to set the buffer position, done it already + +.tblk_posdif: +; at this point we have the difference and know it is positive +pop de ; restore the current position +pop hl +; store it as 'the previous' +ld (ix+0), e +ld (ix+1), d +ld (ix+2), l +ld (ix+3), h + +.tblk_buffer: +; setting the buffer position for the positive difference +ld a, (buf_pos) +add a, (ix+6) ; l +ld (buf_pos), a +jr nc, .tblk_skip + +; now we increase the higher difference bytes due to overflow +xor a +inc (ix+7) ; h +cp (ix+7) +jr nz, .tblk_skip +inc (ix+4) ; e +cp (ix+4) +jr nz, .tblk_skip +inc (ix+5) ; d + +.tblk_skip: +; Now, how many tape blocks do we have to load before the target block appears in the buffer? +; it is shown by the 3 higher bytes of the difference +; We've just set them up for the positive difference case. + +; For the negative difference case, the L-byte has to be equal to the buf_pos we set earlier + +; (ix+7) H, (ix+4) E, (ix+5) D is now the counter for blocks to be loaded +; if it's 0, the block is already at the buffer and we don't have to load anything +xor a +or (ix+7) +or (ix+4) +or (ix+5) +jp z, .tblk_readbyte + +; well, let's play the tape +ld a, (ix+5) +ld b,a ; this is the outer cycle +inc b ; as we will djnz +ld a, (ix+7) +ld l, a ; lower byte of the inner counter +ld a, (ix+4) +ld h, a ; higher byte +dec hl ; as we know at this point that at least one block is to be loaded +ld c, 0 ; it's a 16-bit cycle flag used below +xor a +or h +or l +jp z, .tblk_load +ld c, 1 ; hl=nonzero + +.tblk_load: +push bc ; counters +push hl +ld ix, tap_buffer ; we don't need the ix value anymore +ld de, 256 +ld a, 255 +call t_load +pop hl +pop bc + +; counter +xor a +dec hl +or h +or l +jr nz, .tblk_ccheck +ld c, 0 ; on the next cycle, b has to be decremented +jr .tblk_load +.tblk_ccheck: +xor a +or c +jp nz, .tblk_load +inc c ; next 16-bit cycle +djnz .tblk_load + +.tblk_readbyte: +ld hl, tap_buffer +ld b, 0 +ld a, (buf_pos) +ld c, a +add hl,bc +ld a, (hl) ; here it is! +pop ix +pop bc +cp a +ret + +t_load: +push iy +ld iy, IYBAS +scf +; one can not call directly, as RST8 is then called upon break +inc d +ex af,af' +dec d +di +ld a, 15 +out (254), a +call 1378 ; jump into LD-BYTES +t_ldret: +ld a, (23624) ; restore border +and 0x38 +rrca +rrca +rrca +out (254),a +pop iy +ei +ret + +;end \ No newline at end of file diff --git a/kernel/zxspectrum/vid.asm b/kernel/zxspectrum/vid.asm new file mode 100644 index 0000000..f3ef9c7 --- /dev/null +++ b/kernel/zxspectrum/vid.asm @@ -0,0 +1,58 @@ +v_init: +call 3435 ; ZXS_CLS +ld a, 2 +call 5633 ; ZXS_STRM, current stream = 1, main screen +ret + +; the ZX Spectrum BASIC firmware puts the character in A into the current output stream by RST 16 + +v_putc: +; save all +push hl +push bc +push de +push af +push ix +push iy +ld iy, IYBAS ; restore IY for BASIC +; main +push af ; char +push bc ; curflag +push de ; coords +ld a, 22 ; AT_CTRL, screen position, 22x32 +rst 16 +pop de +ld a, d +push de +rst 16 +pop de +ld a, e +rst 16 +pop bc +xor a +cp c +jp z, .char +ld a, 18 ; FLASH_CTRL +rst 16 +xor a +inc a ; on +rst 16 +pop af +rst 16 +ld a, 18 ; FLASH_CTRL +rst 16 +xor a ; off +rst 16 +jp .rest +.char: +pop af +rst 16 +; restore and return +.rest: +pop iy +pop ix +pop af +pop de +pop bc +pop hl +ret diff --git a/recipes/zxspectrum/Apps.tap b/recipes/zxspectrum/Apps.tap new file mode 100644 index 0000000000000000000000000000000000000000..4855e1e2d1f0e5ae383236ecb6d673504db82a8c GIT binary patch literal 149760 zcmdqKe{7{$n%^}uyPL!gll(h9{9>GiMba@u9r+OFxI)=0(m zz1QWtb$zerUc0NRl|KRq0tsZ5A1Fj9Lg81GkR?Bs->|@<6(kWM5+WgFgOWu+2!tdG zBqR~Ae7@i3ocBHNwO!pa+q2rxv)k?azUMvXInQ~1KhHVmD_{Qk^?Un2@Q1$A@4fzH zc-~*?Oi#Yl{^#B5)mLAw_WIvBA58iu{n6P}59Z&k9v=>$zTZDvOMgB*um9Zd_n)Sx z2mRrYKaZyO2BY4+9sjv|+8_Ck^!3p+eS0+B@1N}tKJD}NbTVM5vq}E5I~gAF_w=kc z81MBvz3stB&HS6s*XQ4zUmA?M)wT0!f3kFZZJw6`eD{<7WHRV=4u}1!J04AI@E>%Z z4^GZcsvrHzmw$eAesb8KRO6#+NVn6fGaQbe^?TJ|RGl67tHbl7BRZX50ts`Q8;{o> z-Fy6C^`q^roz4BZx#j0?FE2Bi09O~|^GP-BPC94ZVdyN~x)AM78j?j6iM+TYx(e`OeZuMftlZ?zXX>JQ@M&7F;=G3YB= zuRqvmTBlE2&ATVPqB-cU`%a&>TAzT2Xx;+#?tGhyKl|5Dg9CWs2Y>kwoQy}~*Dqy= z%X#6etYT({{I@7N|1EaNe~TaVcV>wATO1L8i6!E%+(XS2dYrkU{#$IJA1%J9ABZvd z@zwdSrqxKy!O!vJNd@Juyxrvot5^wr{~b7}(d{RX*LOEI_5I7ZNpCYdeLhx-F)!n# z+sn)9?s8^oe^zo+SDz&)VW(!s!BBi?;ZSo?eqa{+YQa-q{c&(m-z z^3%**Vl1A$l(UL&5^JR|F6XVHd1kKE{tE6YKFI8qKDd;>ehwUL6yMZL_SN||mwolS zX0y*`#9tyU{%FX9`9CoCDJyunc6_(eJ5K&?Q)T6iQ>EO(5CjII8@JwwwqcI<$S}yjx zWC%X&SH1D*`dLy}{`}eTn8Bu~q;6lGob*q|lNXCTsh;(#Q6K1}t^(`?=h;{QoS&YK zCoACKtdjgnUvxX8YQjw2`O$#BJJqz0UggQ)q`y?{j~A<>aq4j~4?>3$Y?_>V3xMy@ zZhU?Q#@ui`8omgSB>I-BUB6;Z{i$X(J?l))s`C+g&7-Gbg|_JK08Ra5+!;y-3%x~y zYA~(N#=`#K$*B6IgQXJ>hQn(5;^c5VoN9t+$DK1k23pPYxbsP$x%?GyFnQLQ^q4qS zK!4Qb+l2v^#N@ntHo&B)UkpZ1z{jw2*cXWOb=)~cvQO!7*g5M@ZUms)YT%U)i=-o) zsx!gPV1=tQ@O#F(cnY19e)X)wg1NiFRDbke7`#Kl391F!%^Eb@EG2MD)isHpYgG^P z4R}B4)5$T`4R#Uq$f$kcLqpPE?;Nx1iN`(~Or~e1%4+(1!NE8WR!>*d%J6Bg|$>Er(!c~X=95@&}$t<&|53e(d<%syJr&)`7Ff-}lLw)RD zRj+^4kszD)&(5GQXwdkWoWnjbMt=%R9>aH-#u(Jq;fpf}j8QTFUeWqov@kO3BFbup zO(y%3;rI|yAc2#t{z?DI01|u=n)u_@{RfZtHs6;WzrJ%IEB@%{bB*#7;J~6GjWis0 z8R(MUw~OwVpWm{vpUoPOlCW5f#N**%R8w4tB`Az#7XehK_gQ61lCxZv;On5E3sF1i?j3@zEWq}9SkmWmr7R( z&q-wWGT%w>UpL7lC&YGR%j^r$@wdRiH9hZ42D42YV=##s_gc7QFEs|sZ(5Gl!R`mO zb)LMm#uxGsXXB@Z@3ghE-?UF3&wOB2QGBwowYRz6e3W{a`KVSUvXRQU8-{Z7n&;+6 z5BDBFT;1E>ob#(4JKMXHebZ^0tPt6MemW^Y+5Z+Cn*Gokt{G5**o&`%B=cvfkC~5Z zb9Tm>{ho~3e;FL$H~z}k=j}Hd1+$@)uoH1lG*O}j^pkw@fF~*W@NWITS zWd8fIm`%1L)uuKin@B^7t^9d#fa{#%D{uCROVsg|TAqD(v6Y?OFVgT7_+OyqsqSV? z&z}MZzaaC|onEv*KdCPNeh-7SEzq*_Srarm zFO9R%pT7VjRH(kv3YAP8er`)tU456PXgOJ#+qJ=n9eQ!H--RVwc5E!xJ!6VS&&VqN z(cfWWwj+(%9{uWH00*fBLMmeT`I8iVEX>lTy9=R5TNaIFn)_&(rsczImzK{O+blnI zueD{$)0dj2t*_dV%FB(@_~3s42h}wXl`Ygf(&Z*59#BN2wvF`+xfO;hYn@zC;dr`ID=s`#nHA4kMYh|9Eq3gl{s`w<#aNBGU=SirzXsD((fqzkmIJr8yv~1I-hg~IKvEw|FMYcs;J-)K{h4$ z=ol4I3_`IES12rtqN+1>)mmT6MJyneM;2n zlYs-@3Qn;aeb)aZKYh|CdfCHv0m+1K&WD{zijNZ%J2@SuWcM?VehNi7GCHoFjv%dP z$Nk6+j}*U9tf~ph>Wed8E098zRY`zEmj;zUj#~U$aG+LzblRT`Uj#kuo+_jaZNC7f zZeQVAB0JB_9TVP91t|*4)76W%UJ_L?Xt{bRuN4n zrj$NgP@HOc`G$f`grU2~$`4Gc&E0$8sC<_4;suhIatQU3$S-;?QvLLT%B*Sv{u|(c z2RVpi3ZF zqF6)}&=qm%@dzA{hB`f;An221ybqU=1cUUSIvVPch>qS93oG^>5qIZGa+pXlarkgZ zc10P1lr0)4n-Jt2+!8uL!o7mxkND??qpTx;??e-kXIR%*wc=2AOPved5*SLKya>J* z<`p$ZnxstBXX=2<l9|GK0OS&2rKo=JL#om>;3-o)=My^UaJTO zZ;&KEL0pudcfb0R83%I_*J+QP5#e`dt#>Q8GF&P4Q+B+< z-yPQPELBQGtgybR&s4isetC-p$s@MMyLG#Mvn5lq?DN)JdZ(Bw(etC}DzvmpTy_`kYZC3X( z8T5@R@>`Aomz%MLJHI`q5MrW_5_klX@fr^*K=N-Rc`0ltI(#WRYwbhNst9$S7tJ7Q9gmTQ+ws+S**mxTp zY<|;&?>;(synFBQ+U}#B4Yz!wY?vB7+Sz~f@Zs*>!KNX+EeN-ED=>n61cnyG|9(yVz4fHc-R< z=H>^FSJ(D;w;vsBqDW_m#jo$}?tQqrw=p-ja@pIp)%6eJ^{q=^Z@#~^v$M7H{@mOw zCAxE&D02|t3|Lzq1I^sq-vik^O7dXu%ZeUeoWGuUuzUL|Zg{+d5%G9m<55_V)}B{p zEI-zB((Cm%n+I4=0xyad%IA+)x8XrSGt2{c@y?yGXq|Wa0{?+PsdM9JWCb>MD@zD_#B-Q^04pNmDU)k69H@Av!T%9&m zF?pWB{ned~?SzZDJN09Uw4GhR*Noqsd3^Bro+J%#?)(yClz%qp;8*;~U!Gmvi?l!? z8>Qj)8~3v8vvxQ|=$%mubdF!9K$_hdVj6^{sz;;Y;Aw>2qT(=g2hJ2;*CKefL!@6a zmS^goh$SgD)l21O_=JZqq>v`l(+-gs)f6p8#aNd*Iuw=rv#O$C<>VB*6q^~ZRB8%m zYl=&0b2Zh(SYy=u!*|3aH%_x&gkjBdlfBYo)3;&IV78 z2^ICb9q@rKNrZ6HKaFBPRsN-sYGrLG8N0?Fp&a5qsPrMaYKRN2>aOQM4-UZjlu!|q z7OwJi=+KKT`0HLBr@`0pBS%wJW3|d8fp}wco>v>2cjxC$&!@+8oum0V9?W$Xt3EZ- zletlMv0B1?#>b%;soR-MUc6ULpAM*08+GUB_}83t&8SBY!`>WN>Cn}f_{`D#Xgof> zi_qiSQ_9$&j86BdnL6N$obfd%^O|C^3PH@z@k`44DuC~A>*dk^1P+dfXG{a6>S)*@ zBGQ%PrvZ{NvvTL=Aw)}Ggebh5YTsCXs7S#WX6W~pgn|3p83R3F0Nr!F#cH{j zl8|ytKv=IeJ^k090#0{)`l4F6zfBY^aO$E>Y>VfVI*#x(wHRm5D3q1|HBi--AB_q9 zoeX5V-QVU@%d;@t9rumRPI}kHhRHS<2%n){h3zECW^jP5Q2u9pKIP| z*?WDgKp1ZF36n%FL@PrNHHqS0*9a;nL@)$G)n@CXv>bH&JUU&Np572lbMH={bx!%i zRfNhfRD^74gcII#P4e(oYn&F8>F0043urn2q$#52`ki2&C%Ep>U)KRX`xs)enO z93@qa9v~_iFor)zRftRlY!P%GIA*}gNlb`7=xXbu`S{OPCNzzuM@Aj5<40<18Y`d) z0T?E_vcDqd1V~SNI7IQ_ck3g`QKS<6j-Saf&K+Sf>XB@W;|2 zgr`yJ3zVkY*ghRXyHNs-Ne;(Szdq_s$*|nu^8-m-i~RAC;^&8viy5G`;ET?XwHPVi z2vS_@+@}bYb6ISsvj*8z9pt}53YecGSE=hua%>w07!?+lmbJ>`!<46o)obMI=* z=7Wy`5|o(w=0=}F4Dj7bYDG8EZQ1Igaq`!}0e<5T9Dl_b$U1RcS_u)3x9^yD^|9`@ zwjy;!4o3C3%c7gkC*uLsf^MW9*>vK<-H5U|(WSuXqfwx#5MaV-os13ps&FG^b*9Ru`O&`{bg`am&Tj; zA*4PrE96g9K0viL4+T*2KMfH6=etD4kyxPnu+t0G8h&fFV2{ueNB%Y0C+8bQT!4mL z#|R>h-K)NHK0ZTq_RqSIZfl%-4_tG+@`lFwrZyzh869k=H1#705apeM-MFs7=*~8Q zQwf=-*WGX4+cxOg+0c~kZEY)_xJd<3wqsZDRo|^P&J&jE2Q!Wp#GVXG-UIrcQ2eY_2_e|FJxAoS<75iL@lf@8jQpHh5v~ z*ZzvKTB1E5K8XZ_1rp}aw7Sm!!1DEPpIxsONMVp}kqvueelY!TAI|Nb&e0@z)GP`% zmfxv0#%k}A4tqtU%wZm<2|wJIDrXpta#Ve|58*(NA{Yrk9-+@~j*o7l`yr;K`LnS{ z!ji%Q3w0bi0tjXXMmm@mEO^e9td@1A%%cK544~M$CJ3lVz`10tNvmVmX&|lRIy(`x ziJ&3qX5!l2q}fE$(9-HAQvg%orZq7HpWb}NKLUj zTQtp1BTw&nMwhf(&B&9w%| zG%my1L$FmSS3%aKSEBAT+r|2?nq^BWrOFbfr`c}Nys=ptYy@s)?1rm^hJhlMnj4!2xz0R$c5G)Z$6aV%VX_*r4XEM5Ai`VNm|b zxHmX@VURwygS9x%$O8T2$n!>F0d|oYC52~(a!9aV7L0yLCX<5f&E8<=)Rwo!EjYL9Ont`n6)j87-(!q#{PrdwdSJT@6 zo8VyX5K-8Fj)w}<93ju2i%)6qB$g zk2r%v57-Li!3G2}?C3l}x8t5L{V|2nY<+`sLQs`3Xw3vyLcpFw)YDvO32xh{kYrw! zEXhU_EUz$3fR6AuNw$L#K)Gh7ea85m!ol}2=b1@o>Xr;_%d7b%D*}c@){)fr1~kjc zo_C?j(SJ|=hKmlE81Q|4VQ2IGYHj_-%@wf5Z2J6Q(rf{hX9&KrOD#6Rp29>JTRc+9 z3Iw~gXTq{SWJp93?XOhodwVgjyDq?_T1*JzyuQbCSlAM%Kig{;N&{7_m` z%f-5vE7Ue5{x1FX&p-$A7k>IHMcRL6E{KjXi6$M5;XTd=aQBO9tuq~TCA&AYDRMH9 z#yeNFloBlux3%k)SDy@^N4P`nHYtfq-k8<^*^o9lv&fN`(nHl0uq!gmj-~mYyGWEP z*B>&tdGj09@RMP+BG#-}sAI<&Vz6V4m7*NSj^9|uE%iQ$=5TUX&7I^i4F3=~u*rSs z{xG^c3c@SH@>(^#QN5nyJ_(Ai-Mm>q!BB+R83a%P3NfJ?6UJ$#+12}7yoa&_h8_i6 zIdB(>v|57TdVRi&iQ{!k`0?;;LXn&CWGh1kT;;$VeFn|u(3HeSbQ7>>LMG&@?}_KW zSQ)RU)bwu$2Z2kdoIm*Hm~Rfd`U~FUk!P4?6L!n1Vop|qKNpU%SZ)|N)_Q@k!;Se9 z78gfg-7uJ)B9umd@-1tfn}cdL7KU>QsSODy)^W!Xkro&*Hxo}v4=N;?Uh!UrNc?0t zcvUjG)RrMrXXtwNr}nYH3v++L{z9shoM{wJ&n4Avbp{-=kEJ63&)@snLrG+q?lz+8 zA#5zLh7B#}77lSmq9b_lSkzt3Hy_CDKwQne<&|Js7`x3|NX3ps1lUJtA%#FBEw@H^ z?PsjdQfwEye)D>EI_NINC(Rs9Z}-7LGV+3lT`ub3~XFNcj)I!C-W5IzmYcUMuQ#i2I3*ahAXZBbtV!xr44K zPbfZ}VsY|H8g}r!9yUO8=+)@Bzs)DWjZlVxWfw|51|85gi&*9ule@kQB}x=Pl`-QB zG}-&H(Wi6K6-&arz32kSHWatxfoz|e|>8!vT(4f2Dg#c>HRiv z(5v2(2`@mr_!{UN?|7|y9mhQDbf669&{%7cGE*=OFE`bDi77ie_rvhYZu1HSB8b&O zwmxbMqaUpYat^WaDgu!nH^o>J-jr_ZBp>7(?<{&UPV-EwJK;@Z8b;fQioB2_O_IZb znbeV{dngyf?~hILks?#73dH@#;2@BebcWa(#qX=hTdNK8scKBNk&g25iM#)f4fTsQLCnpKwA11~G%d7Y^P# zK`0p9E2p_MbVe(@G>8<_hfzJlSZg!3px9Zg!VY6(e53_*1$DiAzECb8&r zB9YLkzE1Ldxq8jRiKAKdVOo^e#1@oR9#!A?x{M))*5t&xs@|lF$cc8+>_t0*!jL6W zRv8hW(~-ZXAkJUk28zU14^@}u?`q~jBCSg0lBMYke7>7rh1^=2x6}#-Y9zOIv-w;N zA2;I&w?G;8kIqiWE1Qw#|6R$0$)tlcoB4O*{NT*=qcI4)a1fa=R(I_fkNOU=(>aoi zl!%ugvI@Aew=AwM#ek)`> zju!atsj)Ha+WNC(N-97YaR<7B$4m961%f>%#Pi`Cmw-osI1Efc#?z2-y)@k=#Q1yz z97I%&jF-`eAwn0d2PI`w8KO0KF}L`5r+HlBn2!rXAuj{YO70zE)e@E?OpCr4VySmH zca2AQ*?|?g#T3<7*TieeVm}w(;1%pX&CPc|n0c8N>F(#MPWmH32fyq$|4@79L`eu? zD=WB+y`T&Mr@1(vAlZnhCm&}$AWrippD>7z22Y64BEeisF~OHnNnq>+d9ayIC`1%# z&x$PU$fJ-$_vG_oMo1CPf0UptzgKqT!PfqR)r0l>bb*CM2TEgnlVFW&Pz-1};_63h z-#XyL$M$9vb$SL4GGM9d`bS>7l{$15Nt2$hH>m_Ih#%5qQrCIOBixuM%T~TW-5Rk0 zLq;9hauQ9MbabjCl+nT4k-^J*xy96Sh_s>h=39|B$t)+(@>mz^FOx)VJ_B4GTR{*B z2j#BwPEH26zI&BqoZ^<+%cDBaR%OCcbsv8aKb-t3YnloXlH6HnPafWe&yfZQ_{8w- z2CuC|lL)-gM9h?$Bx*<~G3aaSACrB($lv&?fD#67K9&dy3o@z}-hOI-2)iSW^UO4v zz_UAVg3BVzGLm{kYD)imaIn@Mkszd}Q=6E;&ANB$zyqmEDp#QL*vE$I!&h_phDjF8 z$Cer}m^Pu+=yBBs{n^)Ade#}7d8JTzHWm19-VvlNW|2H(>KwW>LS8OX68rj{h}xcw zpUB8cAv7&F(J+P7&iW^(Q4Qd2Z#Fh!@0gc!G$8%U#-n7`=%arP99Roa@psjewKxSY z?8FNb9|05uj{FUoERihmGqS>YgnIpSKEFdC(VzNFovL)%fJW~qdwDEQ{VFg`qPMm| z!lnRdgqsqXbd+SzQnhW3AAwpT;yShJnJc6F*D*RYT_6MYw!X-6CRB|aDHzaE+wN}! z2ZYmOSK6g?7z&X2dc{8UK!9s>a*E!$tK(j&eH1JBr95JY56~FIUy8DlcVl20H!2X# zNmr?)K+#NhT#D*1?C(DZ4zLe?=qG-#wLz%Wf8KBu6AIn^)ID zEY#Y~1dVK$21M8j_(f&iLgohctc@pUsw6PaIpRnhLEC@D?YC~{Ix(pxaf+w~vq07| zK?8)v$}PBZdKTp~mLW);kn9&ZDVWp%^mVN2a+M3C##j;fwodRu;2nzYoEV|><%wokqB>a^ruD*J zs=K+DXf#U}&odTo4{X>BYm7!M+F1!;@J*w2OE2E7YAjN5=o-j+^%A1OzRYIdON~mBXWsjP zk>|2TDK}gF#Ck2)>KrcnAe%5$v2cY2S(3u6HJYKh#0WJ6B@=H>uw?TG0ls{uY!_pG zCN}3Io2=>Qj3K%-O+=NOrJom?6;sGfKbH{kFf^Ki&BP7aT9&TzON011t=fF z_QCjLgaM&?`j_8K$dtc!M`RqVjKV64@PzAYWl5+?jgwmIgAP=%#F>;locHXY74R#9 z=P=PA$k(6)HNhZsGT1Q(>gY(~y{HJQ5ChvV_tDtvu(`}n*qo`p*XSBIRn*+3K z3R{h}w+~bwxiZz+r>M`SDVZa_ODT1`e^Sc|hdP8=R43`VOAHc`9ueZz$qCr5YOcAM zueGjG^=)4z!wft!@H*c32BxBZTG{z#Fq^z2+Q@qmHB;B>RkPVm;OqB()Q(YxTeC|P zb@8Mx$wJ+|IU)r>gDX_K?_+iy>J{hcn1;^qt}vZ<5s3X%DU_WeTm5;Jg@C-O?&K=I zf9FcJ7xe|_C%)(R_s;eWgB%@+SLy8Ktoysb0hx6%^3BXrPAYsJ26q0|E9{W4W!(BA z*kf~rBcM;n89LU>+U2SlA&R1%8X`j@1;Ap@MUsg9=g%c(G;?*D zw1I86Y`S5?MQIESR(vbMk=vwdSY>+$oC(1Ylpx7ah1O@fZllT;S0y_!GKoqwXG^UG zQKPsLY{H)1K>!XMcMb{K)rlb!6+~z`oJh>>c^7L8=W7n}kHw{!13j@al5Psl3h65A zC1#wM9Ep%kH3?-|v)X-7JtyT(a$HhceRRIQ9Ga&7kmp3L@7-$(n>;2iE^$`|$G&xu zfl7^~7pCsAJ;rTh`!J&B#mH~ZJaw^vB3aRxzU4;?D2Y=AJV|)^fDzWl^N*%;DO)C;)`WC8sL7EA@h<#@UaH7swQu=8zx=_0}Xg z5vZ<5R*kZfK|^*Gls&23B0Mn}he<4W=63&~j+)IP&{w(MV61+a64mRqynab9DvvFVq0I zpqd-oG>1$3MB)0BU+L~5%uL-rXLY+(IDoz_O!;H*@+4J12n=z&rmQIKT*v zGbWWsjcB8`=Sz!$etquz8Oos8`erz-+M~eL0n9jxD6G^rTClhR1{;tGH!9{nKyQwR zRGO-k5P|Aq?Bqs>76b`6bS+A!TCmkX!c^*l$I>CrKn%`a+z^Jv@g5(P!eFXlCD5vX zEwC!|$Uq(Mi`2Y^>`a=T>5QoOi0vv#rDF9}%7hUa;=iKOyf+lYu{FsRyf86;n z3I6CD0hH8@v}Z-$6V)T_uf*!?pUOM)Mk#23i4GhmuKNN!sjkn_SKSX9PP0S@({V0> zO;Y;PR6$)uURE4wwZR%*Ed$g3;D~uIEU)N)H)`8RD|&7D@H6BfRazUCfkUqT2*oWI z1Ht&y;K0K1`zjctU}Kwb`~+7-7)mlIlU^w+6UM{RS}83pyA9$e8YZ~VO3*TL>g z-cPhSV6l?VWTBPR`9*q_ErT4t$w?5bdP%gHW2F1uQiBe0(=+yfs@f+Rtj47b%e1G| z>OC1y8>)G;oJj>J-@o7#@ zatTz&douSRS|XYwVhwf{t5W&S4nW0`pyryTuNKzoH+F^m0xekaU9dt6OgM_|5Z=oC zx52@2MNKb~Hug5NcTvzQhSUycg}p?VCxae)RM@UGuKLq1r@=AnI3Ut?38yFE;q}3i zj=#Nr{W?kvg&ycI^B0^0c5-kI14VzMHiB5pc&wrvdJ&HDve_%jEnvs+_o1t1*JOiz zE!2}SyY9`Ib;nW>C}}#Cl2AO6b;}Ya`?q#8)n*H+#RUAj2nQ}oua-;2o`E-(h=4vL zONOTiVL|fPBSB&HAL??}cLkt%QQThIu7fcxdBy6P#}y#M(nUPIBpz=xR%@K*gNyq;U+Jy~6A$CS)|2hQzuWD%+wAboGIqT6`PbWKl(L1>+NK57)wR4=k}96^oOC+0*t>cuSx*NGS3x^u%g^ z#Ayhp_qXe#RN`O_nXbwNzyNY3b$p8JD;+|LokmW69ynk}Hx&9@m#e98Q?Cy)qZ-$i zj$%|qo@|{)_nK@j%KhPN}#8z5oaBkbUFio zPPe(zSDnPMb2>kaGp*_o>e8-y(yysr{orMdLOd@SyX~=pN%so+?=#nlfdqyuo;j!q8~M?xe~RXo(zr4q_;X+TiH@eqzBAlqebO%8tDUMGUe-?U z=hG0hTk1WVOT9C4x)qw)rQuu~psf_mxXeFIBOeMGzFK`$%3%EPp9Tj3$7gn6cv^M- zjIIMC0q!$DR=W$M>p;oR^Re1p_!w;Kn6%5kugO2JdTKq>3-_QzX}e}jepR4oxL|oqIf`E%9vf5eIzCJxs7J;;+Leuw_^<1Q4F{@h_ z^*2J*=N}{6wuv`NzoZnJvw-0$yQF3IQuW-^J_1|Cwhwg@lRuJ@VWHHQ{%k(P==v#e zkPR=H#;#3mb}TzlAey4&k3MB_Y8E=-q6VLfr**93kGwW>7yPS&0^Q9AH>1q37`pYj zbWDB3X&|B1V|}%CR;Z;$AvrsUQ`QHcx~Nl3hEYvUPO}Z>5IuVbjc^e9He|W%9Pxq! zY+7B#IB^r`;>mbvo~26K1U`}q5S9T47D;uZd3j`BCM4^gd-0vh@|yNdQs$6QvTIJY zB3bTe>{^&NYl+WZuVdMiIrkJ|XP85RO0I}7ai&eMQ74P%OUVmMF9E0O4W^arDpbmf zy(Mu+H`?#aM#cm#*he830xn4o>7GVRC27FQQjTCxAIptQjS}9nU~Tey0CM zuH)iTWQr=+$hfLrXnxmXst)mq2UqbndrN`tuywxC_NB* zmRCUijZ1qe@GfGeol?Y&&>*CWMZg^q1wlgG!O*O^w%R6g&X|$X_?yOoPGU*uF~7QQ z>p}!LYDqF+#)MC zHgB>qwp!)1PlQ8UubfFSwT~ur!y&~whxo3X##k@37fGl%fylS3Gc_IW`)R4~A$fCr(nEoXEn9T+5l{OR>6 z(uG}`-TDUGr5w3W@P;J0gsB>7LihX-{vjs1&E3HrA&U#52|brKCG%lMhL$HGNc$J+ z=kTUXGZn?@P%BoLs`-BJ6+PbNX%yc0*dUH*RPX~_Dj4)$95jRy&Vg3fka`1b9AnFV zA@w5G^&j8f)uR+xQYM^n4aow@FCi-+dr@kwhPODn4^jv>B?*2Ot5HW69D&3Hq-^w| z(I8qy!(xlZk}>L zkcuF5XH%g|HD`RYa~y?}*ZAZ4hVqVp&biSxLlABnpY-M0p< z>I~681rBt|Z#j>`+G7@4#k7F3NB~WHFq0AZ{nu_(*$d5$e6d>?6Ep8B^-{oS_+Yk3 z)MhbJFNf1Tq2RrI(jeN$B1={}eI?c*bix{P=fl1(1hd@maLSXqph)%@BFR^1fxnvY zQ*Z$|H64;3s_x-ZLo+%)0~2=}lfRD)qExQe{x)+s&)@wW)yE;jRBP0OwPiN2Nt%9$;XJ^mQDI{Y4*(YQ1F6 z(xz@5Rwyf_@FmpC9|H#pv8XR^46%-pkc7xs%huXoMJrh$(MPs;F*&maDxTg7=N}@K z|Lap&liJO|Hd+@D3Y{j4A}l$Gs0>-qPt#1)f-tdW-LDlQQijz`Kza_fCGI%jKM4*t z*c_gx(VB$`4j^?>Yt73{sg6<+bN30E3NyYI$JosTLL?_HvtWX9Ydd5=l`NE(9_0M9 zh^JsH&r&NSMaqxDxo_DHS4}%<0OsuJ;nnLd5^|jZr~oFwg)hGp17u4?$$!UpV?bJ+ z&gHOr*^+U;ABo}FK=&8?``-Zv#Mb|wYrm4%diSJvVPhZTLA576V(TtZv7JlAx<8>H zfNXHw$yEp0*PGKaWE!SWlrHL0U82sx$hR6T^FGqJ)9STFx)-@$Te`+wnIxQfqOEoD zM&^y@n; z6);mtO&whK#Nu?bh^^jDoB@U-*0TZGWl zjZ1oT@U4fN?I(4%)`!bSQX4DKCvoHw&V=-U=Asl4(1;s?Qbx`v`DhSkocQfx&`js8 z^VG>BiU3Y}4^4lEyC-z(YPH?~nSX78x^_0q`nhl@4y|#F*cENpHgsp`9`spo=Pk6 zs#HWxL8lD`ji1&}dzU`#T>5ly;i*rTWG5^~Ct!3jqaZkiaZ`~l=N$zQncC$yR@VWB z!`Fc#9(#GjuCaU~+UO(K6heZCxSA)7-lkApZ)-|vbtCCyW(!K4+5Z}>jBIiQyo~m1 z5mT6d>myF4O&4<08%DV{?Rg`uH*<8cK~2j9Hgj?+e~z}*=CO#EAOTZ6UhxA2n}Y4- zA<>DSoSyL+bm@W30qcim3+t9PgQ|drjVG^N3-NxF{|4MVC2r4gVS4)pJJ_$?yrqA? z=0D-Fmk6s`P(^^RrJs@FGW{UVkYxn>eA9E@AfT%=vh2wV-W=?5{k4XGPXBdqz!g=y zlLw^Ob>0L#sFOrf9_)1X-BRkh3El@T>c1mDNi~bBh`IsAm(e~ZR!LZmRrY*)Mf@9M|E@~u|%fA5}s9!l;5g*MfZR!a%m#GK9fcBC^+!t)X z{~~v%`~v>Mul^@~75>7drzgr^Ky+}nxI!X*&M!b5=unPTlK0O!?cPs_w<^D(%`>E$phViWa23Xq~Ev8xwsK2y$2hm-pZ*4!X!)ug7@jN>Pz>U zZR(1EaE3Kkw#mh;7@l9f@j2oV$VS?`$K`xcPwq;J+|oe?U=tv9u9nYb=Ur=}3GmN> z4CXqJ02}0b{bM&)CCdD}zZV?H(1>asVc(Z=M!3`lye|!unW)WihCO9ZJPltc0W2CG zp2M&gY|Y4yHK^NSQp_9)Kk0LCJxKkOsmgfKxb8k)3*k@ViW+>;01xA-&&A*J?_zUW zguCbt2}5fL?*Xe{%~93wi_@i_7laIbThu_x9X3!!BBdKov+T_^aVUTD4$K{3}zkH*S# zU?ZVehZHd(l^WzSP6c1_T4XdFaix?uZ#!_g6ga%3CNM%2)W@wq+Ect}jz8Oed_0J% zHv$X&-h+Qz@d=Rg+K*324b5lp*btgj#BK#X0(cX^ZXk`^`jNiCf zv~PzSdgC9BXGNf)H~vs~m&mfInNlAqK%#IFO97gb(~)54_cV`Hj7O|`tohFdqwp(x znv^nW8MVwQCi_$Ho3urRcXeHe6;0Vc%+*!E4&1CXA zJ==6qBFLSqOTC-72^TViQ$#n8SY&*@Gn4LPhL6~NC`E<{DZk3Nn_|7>Mw@6qM#O}uKU8rz4{tv+c=4ecyg-wvT5y)(_ra*NC^G2#x zN>LeP2Qu_|x+pmg^oqcDp&OnZD|@8LxVljS(Z|fW5P2W11OnM znB=b1Yb zBf>)_PT>?_b^d|K7Tn_I#mmc9U-KfV(7;^R@CVmjfA1=pTu!>|Kry9*x`4Eif7La_ zuMhw5O}a7ykd22N6mgEnl!T-fP5C5ANgp90K^brpoQRkwlBIF4)9fMrbae}F?FREg z`30SmtKbKulE<<@QT1FCBISCX@SP$#M35%Bi;*oK3w4$jREz_XkTyk6#36G}OsV$v z%G8tKDLO9e%yND^zyOirgc@)oX(do(6Glk86?C2}9wT@i=_0jpU7DPKF1(YOd#H+? zglw4y7`3gOR=(s0znoA>EJRXQ0rO>n-qvavDRsiH$$Zt^B{_b7`>vD{40_klvMYbkjU!%lC;n@jM~Z4 z@wJ?H+r@O9aG1Sri}_)20F?Peedoq}=kDI-``VI835f3J<#^2I)pqet=baa?^akeL z|5zWr#d-QOU)Aqc;;emae*VdD0+zrGpgYsoGegbC32n_v&8>GJg~M zXz5#D9PEBjH%g!5%9PE|#!oK{3q=;A;#_U6H@&1TXS%5`&c4uDn%Un32cELP+WhF@ z9=mn+_BZGJI(BC5PWE4%9FEz&XQC1Ybzyb^3O7DCfYfl!fD$)m7heUrrTtrTsgIeD zWF^HXEyRAlyCptvNKP_Qv9$l@SG88R^||*iReRe6&oGoy=2>3O;6xb|9lUwOjl5Do zYxA6O_YoQbgEbDW#Zp&rcg;s_i)+&Zti@a+bqM3Cz#$Al&NWgZfd43Jt)k+%G&RbV zWo0VPN`FLBV^3uq+SlA!m9(aeDD;c%ng}@CnQ*<=P2{ld-NR&@p8pUyINaD&4WQfG zOlvNA!7^eax$Zkb%VRIpxm7CV)A@y=dg5}w2p`v)+jT)7w@ge0Iebb!(vJuRRz25M z>lOjsYA^228ZT5t-4${X(iF;_pv%=bjvx_e!G%|_iixq407UCZe^s3`nsR074l5Q( zvRFI3C>`LcD4l)%N&hc_0|h3zCWFYtcYibRsC#lM5&2bT^HBsq@n~DVP^%{Tk0H@n5z;by9VXZI?svkO_85TwDA-+$zihjwk;sIEZLD zM-(ihygtwU!pZO?v?F^)L4Y_;oWsLdDs8yPK_DGkAU0uX;G_Au>WY7~IC0T&vf;CT zly2z}_QYWOak{krlp~{Xa=O6S$8~7U(}^Z&bCR|y=Zm{#dmxYNEx9scMY*cYlP{pZ zwTvo=hgu`r!R(7U~(iR9a z5G4cB`rvH$j$IR=Z|!6zi`vT~f|I<tjm!u3iyBQe3XtUxBx>^EMOw~bOk3%$bD;mZiFCU(4DTLav$uy-B_|vx%cG?C433@A4*{ z`sK|hi4ph;;UsSm&rTpb^tg>oJ|3pf-G2!V7I6Kgi@6gr=%LvO1iG@E4{5F|=~&4N z*MGxEX+m*1J<{ZfVqoHrOrl%}p7meQfhD}(HaB6*Ht-m#SSb5 z`g3tuvwn3j4upyEtmqQCSR3mzrlfb$w8=PacrV@%oryC`_*^OIcfq% zlWe0)9nw@X0r~M6HsFa>Z5Tr{y<`S~j8BxBvc&YkPYruu`lw)15PMG*-l+C+m^rlE zhA3F9;GksXG@Jvd${Ga#H~XVJ5rlob>1wZU&g_|MHk9-1|EOlHy`9OPsVV1L%{K*` zWSw3%RyCSdEthd6t`6Kb$3c(A-YHiTkfVg`W$%g3`5f|Rby^>1>c1SgM&hTAZAnDl z3}cXOP4c(npgOu0GF5{S2vxYq{A&eO165LW>=4Z?khrrU!FMa|dXy^G`e_o?(fLFY ztI-gb5xAtgp#$f}K_=r&+esYjG@mSxP1M-FiC&$bUeM-Rq^IKV)!L%`7u}=THjE3S z*a>ht_=Dg;xPa)_Q!4e@phx7mIloL~<-*)7ovnV-=olrzSr{8hEqMlFHXfn6;xX6M z(#O6{k*$%A_z?d}-r8EzADC!adImvZvKb|SX_GuJe11;Qs=3~dXfJCFjnvouN~94@ zOKT4}7$P_c${HnuQ2%B4e;XWFY(yUbmNteX*z1^jjREC91M@}B0I!>(3Mf`@2XQP1 z4kR6MT^@(?>v66WT%#m_fDal24TeZzl$^AMJjp$X81+Hky5ZVc3o+YO&RrunK@zeF z-!e}pu*L(qcz6M6dRN8fTEV%W00;Qa|KQR;P((Rep0nyuI3>#^8fp_YC`7~ZMmtUh z8KNU-BkEHVp1YP*8>42&{h# z9B{IlELPDxRt4ugP6vkrj_h+b-#)0gMX#IKK{_WU*hi9G(GJ}|r=|pz9>yiQaAz(m zB|kkSe5d!s3ZzddZiuuqdnGZD)1^DQ8jxrFBljj)eak2Orn{*-RBbjnO0#V~18{IZFuQey11B-&<_@%n8 z2bp6LYtD7hE@Xx}3|2d!C(7j%``0AX&f$MbbReOYNUb;z!X^`9j!ZHeKrPS{Ilaha z#As%USdwU&c0~i8tvegqr~%T3ni@lMTRO5x9Uk{7^a*5o>0C#gFeq$*&ghfQ>gaIB zK(Lww$R7P@>3vPPu?rcj!=k>>CXIQUl0QlxR;Q#|V;B>N-7ycfgZ} z;*?<)6@t^2QG;P9tvipVyLu=rK`UTN7nRXHDtyp|bUka>I2;S2CKx=l&ZC5Qq)(do zinIR|9B8D`VkLRGh{+RLhdx!};J8Y$pv;Z?iU+7SZINJg!4juh98F)1C?;FI@TA)_ zWR0mvB+CmF1uVK>M@p4Bw+FB#<9T1>gM=SR97C+BYf*iaU8= z?9F9&9iz3jc66|0PKqeMaIm^}5P1(??>;)n@1y0+X_kju*1q=wbk_xlvLBaa$j^kGdJgx z0_~}h+83X{w$gOEJ{O(k{&>e>w&^6tP`sieIP7MypQxz*T>0yrU3b53gk1bG;q?Mu z9{+i8(0m_%xsPqkfou~kh>^9Cz8=3>Dy~7W_^;_fDlNhnwn3I^Fk{i0!9a_T4BXlE zfcGJCh#|{t2#n+_hlkhSuR)jTDA}?rKF+vKdjr99YCF5Oi9woU_Xgvw(Li@p$$cpf zN^37w#6jdewidL0tV#mE2_p6RrL;aKA@f)xbk~MN=Ok+LajQzDh-r{#D0>BLrt{62 zsA2ePu!3F)dSzc+DS#&EgXbahBn_bP7*Tr6O;lVmBI?i?s-ir?LOOy6azfI$oodas z_rK59qDD8}+fNSNz_)c3!Cb&oCBy8DJ-^u#TNOIUamuL3b5?#=CXdUb6_+6Nx zGauAyHtHk2k>lFPhE-^7175K2DeY^Jb017@P$>+t8q@# ztISznmzqeiv=?$_tyZ&^N1tj4%lgE zWU4K`oH`DLtTn+eWG++87|7CPP}+=Ey&9I@t5TK#BvUc#2Sc;i?55;TJQN7BRt$nA zC%2wWxQ0hp_|%`5EmdOd{BTSHeX7`c(y5rT!MActwx-5i;{_9Il4Su z=zzEY;0x3lY0UQH*y*M7P=v#l)xqxG5GB_{vx>Rd?~l}5L{`Rmep(RUj#Wq>6MXcL zRe0=v@o9`a1bur>~XI>+$%*(2nkIY1`P*W^++TxLy{!05}!*BKt!R; zLIOmhD)YKygLF1?$ly{E)?mV7MVb81P&?{T%`83G3JYU75U+b#eK>#PWO5@xPS#u- zgmdQ9UD~wb4XNq5gtbB&Sj+jo^R%Q3uk!^j?25J{#|l2eqYvASPUm4O@GSpeT`SsRVHu5-Or$ zMr7pU+Da-5>xb(Xg*4Af;VcR%)Kpp`fjs@LxfFwb359&G-o_21nN5ml+V#r+)?< zCoKRzf4cAq%66(X@u4Zr!7-YtEH%i5~wgo z*mA9p3%jrxu@T}m^(K6`CV2H4BoUIr5OPd&X|uKa!m0|FZp=#LPjwEVJP-K50{wCZqghQNo9w_9(@z~kuBx45U z*TfQptCILoCdmzkRoZ?`qDsej(irwrD_^V8D&bqWzpdb6&QW0)&zx<{6Yp>lAnI@{ zU~bm-p|)FX?ts4238SA6jP<>#~~nHm}rlCgIsxgK>o`Ztafu!lAF z`IKW$kj^AmMEQtm{7A9`azOYqvjR^L;={izUQi-NZ?(n9HHu1=&a~Fnc(^Q>LrdN-Rx6X5#cB_q>6$LRr@`#j_@_lBU2R7q^I#33m%&SE zRfpN=y1w*9B9i7rF=(y(T$;~wIq2^L2Z}#xY4ECHGJ=xWf7;@wp#6*N#53!}gY@Nv z%&k45e|VeHOtSLtf}g5SBkH6;U1>C?tE)!|6os%kQ5hG;kawI zeP9>QQ=CiBw^!FTx79Wsm8EAml-?Pjy{C|aBJ@p^Pz~0&?tyREIuHS~{q?=ogZ29y zcjx<%cy(K6j$IK!ZZYoZ%bQuD^R-+m}`F zgdpOkv{8R^)Z3k;ofo1S1&rP}6kF3c`PnUJ751vX)R6nBrXdZnzPHGoG6W4S3`6f$ zPS|JZG?s|9p`*BzP9v}H)dTWN_dzu8u7BIm{43zVhZ)WcdtG<=aY_~cdY6A)0>ys+ zba#?woY})Sbmu`3a`nV&lxT+QIuoAay>vHS6g1SOe&CiP20DbYi@arSi-Le&QsE!z z&bvxGWYCYQ7YgS@dcp-Dk>}V#6e`75cT124pOB*koWwZOIayQ)3>6|`&vaDKIGa<} zImM~g4plKGDV8$=R0ipw==Zpfy)LBjZj$&lRr@QLS2_txsd9=R~8|0!3M=8xm8ot zkG$V^yo(&XsB^18z0e3cd__sDx|&+W7fNNQxZ-~Y z2Pd89gOl?UN#z-l$dSu+Fhz-JmG*D$ZdVK6CO`RYE_Kk|72b44LD(cxic^klt+j01jDTcTdxuJMAZybX12r-u zAw9q%aWv`wR?z`CNyTKAB&19QvVuXGkE5&~yF~n_g-c66v(m|{zMvdT72Zxendp$M zWQ7+{>d_$?-?r|%Nn}UiQY|jEA5qs5!C3AGkaG(-g4N9+5^ydXQ#{Kp&n~r$T23k= zQ47~qUI~E;6uKiHtwK!ItvlepI@^P;QYQE1;>GA8Uu4|$6K!13IbT@LHD70Gl#Jsr zo#V%})GIY$$#n{V)7gmvxPIO)y-Q^(iPsZ3)H|^)r*fP>m?bzpNq%2&1O}C3!5mao z2$I$uRmK5@-^0EHuqw?!@np!IJUNIWgTKjinUp^EbV8sdz#G|7w@2ox=9-11d{2j8 zl@!r9Vl^%=(oG>2MWgariB3ClkvUf>{*P<3KJ z)TB#-;eR`ns1kdTm#=A?zU1vNI3iutC;@8#LZ|Cz!A7<1P!oaIvHiJ$k*d~;>q?1M zzl-x^H26TbI0J3aNJHbM?@LKV{1D`#Qy`UN5zU*PjlGfwB$#y1xUw*1nW5`ate)R6 zT}AZ)h)xuDqGbqqhj=a*nH8;9x5Xh+*lldI6#L~L*#eE5#tT!zxV-#p&E3u^VsZ~T zVhQsHzyWR%XMSZhh=xrics8vh_pvOHtLXGbi#AQ9XXz0-_rgm;MPFtxP+*mfGZ6M0 zJ1W#fmUJg`$py&@bx9axs}_HbOm)pkIE9Jt(oEXgmZe|>Dqlo+^&SCfJ9$+_N$l_M4T^=Fw5!nm>@$ zriCHs>#j2CD^~(85JrHS1<#Grb@3s)o*wQr)*}bBsJEr+k!qk7n!o{+fsiC~3GCfa z7%S$pq}Grc;<9V<6uM^wP{YopI2WY2k0?yk;isdU&3qbZ{1Oc#;)xwOi6=_4xZyUP zd66{K{|FAYnGddB{ay_71`M4pGceN?ZeP-`YITcN8O^rz5Lt_9&%w1Lne4;PsDI5p zn-B4^{ar|&I4@Zbgc6bNwcMK?UgOw>yu`fcq}V}JD}$*h={z4v@B|fNyUpV0C9{Xy zzI|QtlZ zP4f*SV_R5w10P6-{xhDBAFMe`E>I#M7E6Sj7`3RTjf(@GsmwI*`E1B%mQ|tT7I`U# zQt)Y>LUIFMipW+>pu_{%9c%wH(oz+f30bd{Te39&Tewy)vzLq`t@BO`;yM8;+~_RE zS1gZ{Ovzo=5;UEx0x@55_N8QbXY#ke0Y%qhZ}~N?<>PG0VIh%c9&AqI15{PTWJLwA_==P9zfD*YBnvW`k&t7*VI7_XB7ts7;{AnHS?L%WX;KN*bArxbN~ zyFDD13n;k5Og`Y?Ofr#{$aU)p72!D~pDTB8g1J&rV1*K@>x?Q4_T67CI=r3(8 z3Rf^upZg3y!oAYAdGFY4(ZZd!TGWx+qLtuRgsSPsaa(|Ka)QTQTlvC8J4)RC_1C}w zapezw)30+}IUP6BZiDx&fMt}&DL5m{=!A}NG8Br?DL8(74vye+Sr-cSZmDT{#-+kK zg~n&VG&eV&jEFalxW-EvIVCV08Huod3S?#1N}P4z^61!Lg?xf67|FZZLc3Bsy|p33 z#Ru-tLenCCqOcg2ULK7ghXQdSlGeZhwK!BsjZu-*VbdjIMp8DN0pP$>DvE}y)LSay z3sW)!@Pzair}Zc$!9kO3Dd5~eHZ6CCr^l?}*+2w_NxEJ)a)~%% zh=7r5m1#~*4Bu35a}FupjZbxYu1fP+6f4XWdQzK}J36eC9Zu{EP&~eI)$ju-c=aOf z2-SD#YK;o8uB#qhw_YrkF|AqPXo5G2`X*=Hb23sOW^He6{dNAe??z}7wGvL~Uz<6b ziD5G`jUbbBk048O%^>Ox#Y3y~?gv#7n)y z>e|}g`aZ@j$Fan(%^xj)J=iLLeY4ea`=ESxzxD2*^=oUhY`MN({@Q81d$?V``(~@< z`>mGuTkj59zf`NcwGln}oTJBD=(&|Ud6H`_@Yd4D(R6!bZsqN0xSjeCX7*#Yc&ELE zH*av5`rbtUU2p+H6mojq4-SWKr|Vp{xXfjJPRC8D1O9I2wz^Sty}DEW*xzfKt*vjD zze;%4_BK~PC|d4smdmk!p!?pN*X!HG;OpD>%QwXmuW#>^Z;G+kw+oc5mrK9C{mt^5 zkBc9>4~icT%fCx#9_|+lyRlik+T2=S-7Y9%bL-bVD7x9)EdZQp>X!d1IH*Z`tC$+K z1`RaZtF0f!JhxX1oNn(IkZhN$^kBEZz=KCcvz^WNn{jq_3)oB0DQ#<7JuF*2e6(LI z)n2*8{3sS~uk3F>6ST-q{=z;?-i*MnVvhSI!uL0e;r2I+0rocw^l?;J(cNaNw_+;$ zn+0C>Hw((x-`?CTkg@-0t?2K=)#BAb;ybg@ha1JXAFU@?gKc4=t+}^vCtl-6)8qPI z1qW-zr|S=kw;cA|G~L}Ret^f;uc8MaPOoD0JrU~MJ2;BMxqmgC?$uNqjn~(<=H5w= z@^{m4f96MP(Y6B3?^bWzx`}8<5$GH;%!ZQzCFR&FcPjy5<;;M|EKos=Df$$-D*Z*fy}4mnX*T)B<{(8uf+mO&{+&Pn;t z**HvZUG73fD>_ubR_G2%%R9F}u#mszf4a^x|;bBbXhVRUQXMlO%4- zff}D6JM#4;g&L(BHd<`gPWIY_bCjoNIxnp`(nXfWH7p#tZPVAZjST&%J-{XPdqW7l^Ez#gJmB;8*M2MSrm_Ff%ldvaIK*lsbhHf|@xxwFbvsrvOu>b8YYHMO zZN9}6XNVgh+_n>c?+e(N6la!mkwMWN`W+BGk)`TEpCj%^PcV>pwuUM2*4=6qb56B5 z5l@^xQwW2d>Gu>Ad*0Fdxr7H-D>A&=e+_`l$NRN~ury=(O#cY8*H@LY-{W64M#5iH zK{T;MjtRinbc#!v$7!_V3)@{yKXhzUlO4>IM=J>dN#`936oj2)0QdSg6VMt7gHkRg zU8!5&z}0jI#_pRH0IPm2JaTgIfqW*-jsMf$hDb!#7;qAvT18p8h-P`^=^q}(wG6fa z7OT~TJDd`f@4RN0=c5BiUmTL~M*v7pN8Q9mWYZrG2kvWW&WmGonY7T1zs@cX?Y)rU z=4ii6{kX|YT$cXf47LVgOes~bYPG`jq%(|2(W`I5Al8f}`CGsNCLvTWGW>9u zO=WCW9RBY*nduACemF&4$_crWEB3UIDH^EAv*CPD1y~}sJ9i1n11({|i3d;!?$l=r z)NrMyZ_YN2TgI98Li8+Zb)UzyyT=L{cGy=BvCAJa zTVr8w-(B%LKHV`RhbVRl1z6zJPpb=6F2VAL%gf6vD;zV*-_Ms_JdDW*#EY1kvkht4 zZn$xILt61q(c{i+!@mv=IN5gjkftmAPmKkNe-XS`-QT0@JpSQqOAVm^r=^V53Wj`| z8^7ts%t;OSJI!isJ774>?K~uHG<*$8?o?)OZg^pI`mIOD0KRJUm2&j`1EZ=O{b#{J z8vzK0tX;zeS7QbX2yVVi6Nev-8M!H4I?#J6tbb_1#=q? zhgD&$9_{Lt6nHg+`!8vxy9@o5mJ$R1>ZU=Z(d?TqX;z@-kqwpmvF>vyQ^47*eLOc`;oi+&EOy*@=`#B9{|NiDF6*Z2$ZL_^2}Fg z84gUIeAzNj-s|I*7&WqV!3pv3tqaCt>b&u4pe|Fc_qblkS4W#%72 zR<1klT+^r#J3`8$;s=>F6PPV2Sg%jJOZ-5(ydbW%9y1LeY3#CLGw}d2^M#O!6Inpo zATY={w-hq*F!Sm(AhxJ|mV(}XOY0#i#<;~|?>_o@aBxtq3dj&LZ`DGk0k!~v9t14z zYXNN0vRV1u65qCH>UjxO`d=mz0Y#_yx_MrgH8bqdtQM}#$R$DpMx5nh;4Emg@&yKP z{wkdj)n2DYrA4=iH{@W`CFWg*vuIdqANk(xhUJ9(H&7T9CWLRE`@7goix%j?Ykx^I z=A4_=*tyu7@or?}>F3@ktytFi2Z!oI%T})oe;d9Mkrz8<;Ck$vu4ufz7W(Ofn9rNFz=-y-E=A{rVWRIA5DA8& z9TA#K+NJJ_b_8!OZD*Vp?G)F!wBhXPz^$!zzY82Jr^%ao%1((0rN*4_wXkw4Vf!in zRQi|x$rF8B*iK|$^x?QsV?XCsGc==c5{)p;BM^qw>~9wXpU0RmW>qi-RKR(f%GjVJcEzny<$u|LF>SRZZ5V`u;bWZsZ$stzf?OBn1YgL@d6IacK6R^juK;uZO z-Z!$cim$2sCPGxHq>FkOojK39K(881&S1=?n0$ubP+4F+a}`JI6rcvn;kuliCf(+9 zo>PJvFJ1@H?>Iy3JbOS#OiSm!kuZ{KW>h_-|d8n#Torok(m5 zQvqO;oxYS}PIak$9ct8`E`n4u#Pd*X0+*3A&V?ZnOIS6HKsiJ$I2%Z3Upm@DFS!`e zCpj`c2QqR7y=XAfr3+M@L^B1Y_G8aZv&U1%j74P{X1WH5Qf;atoZROL6-Nu3dwY=R ze0wHDk3~evcJH5YI^oJ)1|qOa;xNt-)Z5MH-TtYgfrg2r>WCWuNy&ry;7-Ss9pI=} zTvb0oJYTDv5p#_R^&1c;k!gRSDn@m3J|wu5iXJp=1-?Y3O9Lsxm27ZjpY z?M;UbQNX#8jzCldtNaR!jwe3N1m;)2*CMc6eYo{dCw4qhY|WJ~#Czz-Ov}IHz!|Pv zAQ;AMK%Fp?Z$v*I{dRDm`bye6C96W4IPg%LONp(~mnv6-r>JR&U9ZgDq_^Eyy-S=5 z>8PgSS;!LIWz8NWqW9Czk(vBnT+2bpJs29Pg)Y2Xhq<2uZ()3>a)8HUe&#k+{QG_ugs2fML zMnaUKYfcLaEFTW@M*@H~Or_Dj^ka#Q z#5xn^jPD}a_Z|pm`J>vp!+9U`a|8~x!BDVh+b8ndiGe~4NfbcJiDMW&)Gf%~*-ckmEvSyy8s60#M_K!^`t4zAtw^WFsHy|VhVI?6`b^!SoS52j) zjKlOov{`>)>m#pl!4a+)3|h<_s}-f6G&6H&VmT1LIe+QAKF6G@&J(IrP*ch`3O9FV za6=zlNv3MMjF~%u8OO%&0~3WQphn-~K(_G8w*9tMH_WRxkZ>N_SiLF;pSHx24RpwXg)#{rpv@p3Zn#cbAzrewr zOcowku$dzwy%-uWr`CAK4Yk@G!d`MJk8V{9oFd%oqf0_ZYLf=RWmV`n2}jq{$*?+x zUni4lsG-ZwKVSpv{#qnJGInTWqDve56VA{h$jbDLofi#?tP&HtvLXr96I99ZB&NRY z#cFqt9opyU@T79(-1OnS$9`E1B)TH1YQEmw@ z^DVSkY^VU7b#CE#!6|p=Cx-}6m^BU-W=AS{7{;ru<%B8K&As10d$`WGI)FhcBJ5Pi zMwYPzVDXV|gpzE(dgxU73A+^#m!D;v$*_~GlI8lh!NK$u)B-oaCMp++7j((W1toWc zbx|(guDSty%fsMrXf>%2KOrB&tC~{0o@PXrvi<;-h`#`r@L&JidW(6}BKod72vRd0 z7zCLNkaT^{+=G1%T#AnK{g|l0d^&w%AwxmS8U{68xuIGdkBqC(;zI8(lWfQ*fuShK zH`kl&RQxGxSCHWM)Wv=|ZAubtZO<@&n6B@L>}z9p3YCi-%PXUauFt67T&p)uan?H4 zz+q=<^CQ`VP?r322Z5Gtg*MfFD(A*H!4^zSa8BzcTD?@s=XT`i^Re0-7Nht9S#c+a zZvoH|(>xyVZ|&oYgg55}v2&9Ap?VrpPRXX15g1{!XFev-31XO;$>?Le3Y!>^KT8uS zGD8lYC8|~WW+IW1H|fjdkbUiG~Yr!PSB|6W}F^3fa)XC6XW|47PtHX0ET+ z;;d<4!=D8XXNzqxzrmhjOPq{%)fUi$?t8Zn@t(Hic<(%z(UDg=>|57h>6DOktU6er zkGVH8oqP8szJh{}X@Jb$hzwY9wvyZH@K z5P!yEhAo^>Pfx<0L~wHqf4<-r231+gtC8c6F93*5QtHLB_~OUbr~ZOVIl+fcHs$DC ztpLD4;GpQOyMaFJL)OQ(wMB^TU}*oU(QTH|u*@S&=S-wXJl0XwFfKq)u1%E=9xRgQ z;ESsw!W$w)&*6+xRBWg=w=p9VsQ6masdloSjKLOi2;tZgEOCL!D;2UxYqXR$b)*9y zwP#AS=C4DhF{{QBNUUMOvIS4{dbq+1}VEOuv870I5y_NO%1?`&+?<>i!9EK*b5hjy(pgw;~rl$QxV( zHiHRzkEeLHS!hv*IKUNzFcIC^7vPEPUiViUR#_uUmpO1z8-|vvA)i!gB674J5##{L z2U(}EBWrX~+X1fCIz)zc(IVUy;cw?3RsfpOCv1kNkmVI4Dj2HnT`^Uo*dsvmi~}*g zYtl`S{eSJfS&XIGmfr;uAZ5N|zwmG>1Y}fYMpR~G)^Mx(c6DS#WYwvTj0i_$-O9`d zk`q(rxfRom;Z|fdErHtx8*JGOLSQTgAsNglftZaD7#RV60Bj^M0x`(Q*vuf18U+0Q z|F!o1_IKh$R^9Gv)SxQeTNUT~zCEqI_L|q)GJkntMS8tr`Et%RoHA;u62#A9U1dI0 zs3J6p?CGR&M+di3ki2ZP#_phX`jT`Orw@H#9xUJR1(MAWp40{9gbDlpD6T*G(0wH*Kn?{4=i$i01Xz zHB;R~0)u_tRn8}v#N;JcK!(Z+njo^0o3I-z2}%`LnMhj?5n9yiAyPhkoF2LC zg{z8xs)8%oYvj-*(^E~2&dSS9%#68a-}tPpNzKrsL8q`dTr-)j7}dKhVG!~w0-Z3SkY)lwns%PQc|BQ zYOof4oa%gpINlx1aT1+9`~iQC&_O>SM~}^!4``m_L7@>Q>zXsDu}@E0R}femiTw( zz&lQG2)&61i6Kb)i?JR%oUdXdP}jJOluKXbtn~>qsUzVpeAC7p4yu`da z&uG5V6w5jvl?7!xF$%6uJhwt9ov$xkA{ z6#dx;gX$0=yoX1pYi^5(kW)DKnKWNS1xq+S)lcNYI6YR(wz+x8)ZlwoWM|{UoFqwx zK;vU-K}5ybeel8|yeA_$3U#TBFSFILIe*0kZDF7XV@Ng>qVsg`Fj4?SPq?<5b)^zM zf3wqmz?_dAF)ohAWmBQHTBN7CL!{YQhmV<=CNpc=VKxA#f#%lMYpu<0g2>sgB4*S03bzGokluW+E6cPZZ@e z%V8@pU7nQ&i)`S<01^hhA|7^0wQ%+jzu@0;I#V9U&S(BB!&e$y@-#rVTzZL>8Jp{E z@m9}Z7A_L((CN@Tf%xJi0wEj;s^AXOg0vVWK+e{~&G+K*>BQp)@mLBFnoRjxch)@= z2~kgr{dbG+$K%n&;}`(_sp;n{sZ%F6Fm*Q%)AD_5x!*xt6&ig@)j>-v)A`2ma={;+ zK-v6W!l8Vl0+o}s(ae^G2j*xFRBqPe6{vcCvG{)dfEo=5g44cvulwfLfWhUx>EGE* z9D}8={pxtJ9{Q_c21YpVk*6h?Ok#hW6p#xPsk%Wb(+Jj)Mq;g+QWv_ZyfL{U48gx2 z5=O7%Ux0zO8;Rb+z>0ZkQ7*HSg?8FB|1ZG+2==Fn_d|~5EP)+lSvN;OA60D6W`HM< zl|WUf7T$((IR#1YGPgmgv_LYxk92nyD!*OX-a58n-F8yq9LY$C(T4Q}pZ>8)P% z78mfTn*hqZFPnrN4d_tbS`b?r(*6B521RZhk#!5)dFu&|9CgD}TcY5}Ag%qX%ncQ$ zIsrskZTAnus!Vj1+yj5*wMpNfX6om*GWNQFF<}Txs%c5`Ce_!#qg)#)4M9~l!*#Fg zEM4Wr4C!)@6mp@3c^X`I52sT&T z4f4H9X=z*zxEm@qNNTUN8I5|vj;L*@Kq#ifaz?Gm-LNCL*ykrtZ3(dv-_Ybaxjq$H z21^H2=R9fM=7aLy2VKOUhEN+#!#9yyRR=Ew?N)a6Ew6VkWi^660;w{9S)F9%&WBLB zm?$kO2ST@avwg^xMS^d!?uhv)Dwdd+#GfrJ1(PC>y4n;KuH-1lY`D{7$tS8z6pZ3& zYyG29%JVC8NM^-uY2jj-CgLvqduAWs{GgU#vM zGAvVKxR7%g>}c>)-CZapQL8B+4}Z?F?xBp(EW4jf3sTgUL!~S_ik4K`)dypheG6u4 zoS2Q5(n-|y=%ZXgPM24hUpP0}aSM>_URu^6;-m>Dkty~#mvO6r|AilNGNw z(nEVEv$=c`Zn({+) z<>xjjn*YwAE{$d?-Psh~k>cJ`o170GJ$3;LLZ|THBu4Z|JI_mazM~4S%F$JFWHFTt z`436(EFsjC6z5zE6GAkHn|2%j=k5-ciZey1SUJH8>K^TVTH^L0b5Coe+j(mjg8%^XRt-%MpmC$v5 zd<;1|dMTt2U)8}edmXZ7sZ$xsQK!vEx-+LOtaqmbODGm0a4v`wLd|HOxa2Q z8>mS)jNT!c-S+8i!|tAjSpRe3_pKcxMmqF&k zfaRxpDnHm2=^)whL82Lf?&9&pA`aBAJXp%f}ufruY!QzTA`{?#f*n*o=yb; zzx_c4!RLbMy$XTP{k8&t$Zp=&^{;wI@3DCKonr)^xlIKCIaf4N?W*#Dhg_&IAS+cL zR2YzZs^1j^>*{Zzf?)lL2Uw^;Sbq{7Rwz(BLoF&4$RyS83Ix?c(t`?x&6O?vu0SA5 zRKF_}R3S+ZDjayAjaaCV*aUHO7A_YmCTy+>c@`=hHdnP*_bVLutq;(m5-^)u=lu$X z%}u|qVA$Mr`w9ns`-2LHO(N>)pn`$qH2tn%*z)nYU%^0`1HG?M*z$z$S14?0QC$8~ z=110|epeto^~T&s9SRTveEkiL-w@2VM1sZTPyj7@7>FP6U8gi_uUUDL%lTg_GL_3eV+=9jk% zNO}Fm#?t!oO7nK1eOoTMt{>ihP!?Nn)xo~fzYk_najFumZmop}@A0jh)|1xOPang@ z#LCx_S$`8h`69UP)y~|}k=#*-+0D^mc5>A3g!j>j2RpcYou3`l&#vkHQoX;<-fOeV z+RQWNeVL*Z5+VjehK2Ia%4Hz041xm^wQWLwNHFNwhos$~PfDANyGS!AC&L#Y;BCe4 z`7Z%V97@3={se*hf&Wl=ZNr^HK-Y~m2)Rsbc(h8g4oXm(j*An+Vo-7AspniV>SA4S z=)dS+_{i+qP3P@U3dyengQ2vN;nO*33&Uq~X%IS7$kCMRew1~Unq4pND&tRX-42AB zyEUIlS5Kd@$yVAX^DlZLr%-Ol1|r25MO(sI6$7o9bi!sUEnexTkx^aSRYst`a9SQq zW&i!aKxT_6!_CKcEC9v%z=5Zose*hNL#zbxaq*)dR^<5GdOPRh%-2{JG^bQEq`1^M zfF+Ia8*`rnG-2QkB@k)^Y>L;Dh;?EuBh@FYC!uUZftri&>gf<-6(Sd&Pt_KV!;+{o zKiJHZVi4$XBvq6kWvgL)khWHNUj{^IaO!aW;|Cr?B~=BSmL{m0p3FjfhbQG$r^XdQ zew#vmT!U4ul>qfaZXeCcU<|GHZcA~e#XQD2Hn8yUQFNTZR1|j?b#^?&FjR8uM_zT9 zMFr$yf(UA^*t{cL1fq$&4N5^Mn8-%s)S!2rw7Ly8-V}b2NDoU9WoxzU&d$Oe;7m|p z$m9Bnj6>;Ll1*3^?AX7LaQEinvDrb_0&-RrKbuo4V}r#1Jcjv}V(>w-lp-QKKu0?#REwKYs2{M#(T8pp_#P>b)|5lX$l0?3F~zKz z*juH6+@jhLEO5&hz`EOP?g3Bh_IsDFMi*!2f`K9cnQg+C!n|Sos7E|pZoV-UAYmqA z`tBW&?wxMQYhQIRk&a+>gkJ}pjS;CRdIxCOvCStgE;g9da9{Df4k@roq@l~cr-aTP= z3R8mm+p{RfPNcWDA?%f5@1m#K3}mQB_IO~P!XmEaZ?*BLS72Z858(QQ$6?|YbP+4g zY#!VA0(|SZp_wf}i7~aY5~GAC0*vg+dwm${rnqzQ^uz;%u!wi)e^%(r0{%zsGOT!LH74@ryRi(*00PXRe!KJU#d>vSX0Mgzq z=;I~d8sy57McI!G-$?IiP;olWY6zyrS0oWEO5x}!t_64}{6=P{$T#wibMy$Q4a!`9$=05@97j9jT|7Kpb+X%3+=C zi(WmEed17fon3N~LL(VN8wZb;R|N_(3#}l0RMatDT9!52*bhxa;U6i5a&ia+!E_xx z$uB~oRJqRpi|EDq_>eCwzrAx~pz7n#+r@Fuu-xShk!t948=k3eAV$ zj0V0eK=fd^%ax;_>gs@@E-OqQp#!C=2SuDFo0!(zy|j+O)sNB7fc&xB+#9Z0^jt5$ zh~Rs~B81L;g50n@c7)(QaijUF0iWOrjLv1OK0{L(*$M+P6js}8-QBnCX$f0iby z#Uw&r{zS9LB)XonM8{>9!V^$(iGTpkbLEh`&%8;Sqpz%~6D&j#r>JjJSMg+)mhv^s zA-if{FFssaUXdR}3}ffc{|XGcv6${JvTfTF+oof$;q97s!4JbDCzjH#Fq%bvdU}$Q ze86mM6NWe!H2U5=dAgY>s6Zw_ONO-yrkrqukhC9kbjgGu)I<)RNnCuu)C!C;+XfCt<8_S^*3*14X$a z-2>!#AqteV-GrqjPzEX>-&-t6yQYuZuU5o$+6TFJlWohE_P(XD(9#QG@pe85lLaq4 zmLWD~&>7GFCE-DimDp~ZOI^%|EI})wQ>pM^HAKhyI((g*RJ3sfE*LvR0(*TqVi+dC zO*VpF#Aq3YYStYvH6(?JXXv6Tg@X`!1{YLH1$@bSO};lXIFp2`h9MusVGZRDzx<`t zHE4i{wE|GAb}{pvlW{#1akxx9kK?%gZeUQJvK8u$H7gt3i>@@KQ*GahOtQ(_j!5Ga zvR0B}k^#dqJ7CW4QyVWJX`l@NHd)&Osy-Z0Zk%^nU}tb)e0VoUKmv?qo65M%qAOqG552IT53UtnyyAX(}R1>8KU zh8an2PAVyEmi=4pGiazM=w;KEzhVit^hZEx4Rjvt5ew`45TiE>PMQib57yb@CcXLl zfC1JA2?s*b!EB|xn64g^ZzXxhy_3VHW9tG~-BD(_Gd`3va7~>^<5i@sX0;v1H+iCUkK6cfC`Lp zB!mRRXWXVnYR-)ZE`@VDi$6(Sad9~biO4HPz022h!?zOrK5EQ`f^vSKfr@=K2Ff@* z03A6q-Y`gdy}`AK$*Z>RhyV#jk-BE#PErU60QOSM&r++%_nN@W!~Y5x44=%zX~4vE zxzm&3YG`sYxMGo&;7!dl#}BC^!<*Qg^-U?y||T)*L(GrxHZhE~GoFf(sg<+4xy}VaB)~ z;_X$F^qP*~W9%NjUyy4)RX}S_;}3LA0(=ECct~YhSqKCib@BC%1SAbp83^J^q2ENb z6G@m#O^hL=!7c$wQb$IQHXVRc3z8!uMt+NP6)53~W;6n1haS|ma>Ne#ULB?Gh%&~U z=j3~bU%&%@SR7R5pR~}j6^$wVpXB6j z+ktZM`HYF>V9K!>RQ^ddtu{&o^z3iqwa$M0tXihab8IzK7VEai~eX* z=0cFpctHr;n$(u258aGHoU1Z3C)2<|WxSy;Ji*=+fz$7rV%+&cDE5ph#$ z39i+Fusj*{gf0z6(yUM$t~{>vD+INF7#QRMYLvht#szPQ;CN;nvYzO#ndv8qda;Pz zp<6I32zk9j&1NE4pv4JB#F0;e6 ze*ruw(H((!P%3B+79n9?y`waqk_TdZjFrI9He(@j+-y6%k$6ONofq9Fxo)Cp+OMO~ z)3sj{Y1I2#fs*`lv+38AOIBPT%{;B&HG!N4hdY#YQXkAnXPil2bPOefusGpc1`9TRFgjKKLb4scMT}D?U6Z6Js0YC%MGMdmkfh~wY=MMAuc?0` zd610IrW%|s6FwWf_tAY~2BkG+Yz}1J-cy@omDQw7d^T%Hfd^zftYZ-(Xu}1 zIz>SP5Gz#y__$~vdn%~)rHcOu7%;$>CBNG>P3BG9qmyX>3h*<+HDvD1!bMp6E?jM; zmKl>)4E9R4vRn$_U3gfCSg_j0FY<{OPhbAZy*mrPD!zw=W>GyNhQdQC6irDPZaAb! zc>1-{W@ERTR3===vOoV%z#zO_36mP3 za)Or;Y?#A2q^DLl2s#pC&&p<*cN^Gp(@5Q#4uTY|$u$&14&22biEd4KvCDmmQlVXj ztlKR!ZDKTa6rQ?CA^sL>Lped)dvaQh&M}@?hv|XYCiO@?*Cs0GU)^|U)kn(VE!wx1 zJ=G36!VKYh_(`c;gf$gSTWW|k?gW%GwEXTvRn)P&tM{SBd*g*jp@OR-$TABg2$AKIAfKoFy>axs(8D(Rk>WsPNe7eS-79ZBe|Do`Jp|0sbf|Td0 z>0H+72zi{%Csl@p)9v!Ld+2NivT{%lw z6COfU<5dMDeqo@{FYf8d-9{ysGuOkKic6vnGG)Sb4z5B9v?CFM?<4A46(CRyf$4PK z6mGbFQ)V5ZpqFZhageAYv*i z_F63WZv_T8F>!Vl$4>06J!S={5f7{ZvS)Qu>qI!J1xU}uOK~u;v?QY$A*foHIK$?I z(?YCW-Gn73MbY(5O2fUR111CoG-Jfx6Vj1o38A(4R#Xn3A+Kg|Is<62At{*1rje+0 zD08U-P)y>_j^D`@isw9}@AtJ^TI>C{Wk-tLksx5yroRcn9eKdA9F8oy%vJTi;p`T< z1896g|zG5^P8SR9~x=8^`@*!(abmA`q(X9|Z>ROVa;=e>x~a92JJQ$H$h4DvFDU6&M0Jzt_lIE8PJGoV(W&E=cx#a zhTVAiu#QjVxKzLbk!Bqb*aXqgUK6sy@^f!d>p#6?F*T}1$F9jlBjLm542t)xTE-A@ zinR&K5>%L`O>Pm`*Qge051svN6~!LBZ!EW?JE8~aD9haCg6$$oTKY`Wl}R2}@-IaN zeU-L=o5oH}q-a|@&8{2)4cFv4L#p82*c(kl`M@`EFgc5vUD#0^*rsC#U~&f_@6$v!TcS#jQ2$X(y`?)n<9h-W=MDm&eyLJ}@D zlDlM}>Ey?6uM(e_hX{*wCeabdUQ$G++#ASv+;GfdC6Z7yaS-zm#CV{1cKYCLZB{p? z#^Y=>eFjaN+T+9!J~&b70CDJo)!At6NdLp_qSOTkg znr!P6UxAmH-9HqN@4ausWp!>!dPevt$4<;kJ)wz6e#f-0U9sO$^Dtv7UV)%C;0Z+{ zj2mAnrbx9~jS@O}4Nnc92J%$+y9;iXSh9`^RN*8`k;E`gH6htjZsCZKMqbj~a(5Gd zz`9cw@Oyy)3Z4Ri5o$WgB_+dTnA3Q|6e`zf2R(Qp5LoPZiANkJfC>0Pp% z4AMPZ4o2f$MR0Z|ionECC?p*!)5Zx3k&^PxQcs7|rR7MC91m=Lp zmJdQQ=SV@tLkO!vAZR{`rtrug<0~Ur{>S3ZIt4lqIRW0*poP(3VNNK`*8KMNk{ra7MmvtQ3-Js4vXdQhiZmNPqpcHnFt*o44g(e}saSEUq+mc-&p znLbvTv0>;(diO|DL`JPNZhhed_K%>U3f@kef+%2#S+8+S>L;A2MF^MF35n6ZQ>N@- zaQ6Ce`#5i?gG%bo$ceQ`K0v5V^Wiv49Zpm?wD2j~E|sAZq9k|-ThRyej9m#QPi?p0 zv<3>Zos3vv*VQVkK}v%xA1f>a;Ybo4L`pjz=mvTSDJc~W=2gp;PxrLCe>KvUj~xwJ zBu&&2DY)UzzH#HvnkLqOON)vuZDwz7fl5xr>Fr_I&*hazl&V&Hb-L@jwzfLrK0g1% zBA%AYVO5|PF{d%{JStLyFcZNJQb|Mli;9Zg?V*lA$$>FOQmG&L6p_%fF67-=o$6+_ zIaH30|M0H+@KK7Y{yz;Z@oFE&+0w!P01TvP{{nr}MTPM6GDG(6FVKS7H(`OdtIBt%kFb4&V%*#XeElV#PS2T@dRv`2wY=l;K ziOvDE^!b_fTT*Qc!2o4B0mzHy!UL_yL^KKzY5tZlR(%^#Fw$e)SqFNV55AG9E%*P^?TrY^V#kM;etmD3P%~e~v=cy3BWUY%l&DU|@>}^k8S(q{8UVu7-tN z2kw4n*+<}nqU&ZyiJn?Q)N%+}Q)~>xf#NlCuLy>NT08=*1uAdvLDj{q43Y}K^(D+n z9oEz<_2qVLhqkq=@)2oS!a=p*fSGd7d-+QsTB+BT@ae3WY!uKm!QWAt)_)Zk2(f4Z zQZE_V!zg46u49MlSv0PrhIW|*oIC~XTe=9dUu!7{%V}g0e5w6o_u}+tKprc+(HN#} z5E&n@D1X14IOdA%5m^Q9!_>MBg^zTP8XitMP&xM8+iRkk6>{>{$s$P zMA7HyZ)&;q*~;qb3$-7v>p$z8f_I5_)&Yxvd}c&91@#Me4u%@e`m$dgSQ=#|xzY~l zNI3RgH8x-;+tta9``zPeJBM%?UvBrYt40)JfE4zI*t%eZzn^UI-v%E8Kc=7QX?6JbAU*?gAzd0 zuL*86P*$qt2}*Z!jl%f+meD@T z&?||eFdI?AZW9jg+S!UnC;_sfqvftna;cAABC)U+g(CazYXYN>PZR`=czLKxcy^A@ zUe_LC=a54|Mqe4(9kYyBtb&x!UOdc$Wk!HlIC1?0Wh5AfgXX@*WNGUlXLlS8QR43G z+`OS0QAHwykQG1(|3O+~2-Qrr)}*R+T+)Twn;@Ej>nHu2DYi$u`-cc{5Q_f1idCbX z*UvI1ymGl{lXKyyq(?;7uvg?N!bI(A@F?G3kEjjI62WEVwVlTu-F92k_$_VZ6He`k zf@8TB-U6vK`tU~jggR;!(GN`?s~w7t6M2LNgGUr0RTtZ1G(#J|zdpX8wuXYO50sfl z#nr;2&TYXS+2ALRQKBB^uNgER;k5Z+}nVdog>3Mvz*_MNh zve-hEG`=!S6cAvNqU7$#vP3M&(acJd8d3f$vkDA28eXMtO-Mh;CRVQeg_|*3BNCR* zYU3=3A$%zgMCY@m4FJ!Fx0!&7b87w^Nd!m86b`&R9$_rSt_o5aAYJr|SD>K<%O$5VMHj$W~%(*1~$)5c800TwK zDmJ~u0GSa|HBAH_(IS|$;$*^r%*t%*GKh$i@P9kX$z1Dx6#)lJn}mkJ^BtzZxcLkMdhXWzHDxn^>?&6hO+Nhqi`pN~terkPZ+ zd81Xw{q9H^UA4MB0*;)_=Y9nxeCwe^Q8`2+5rv2xc18zz(~$#gQ1C-xw-p~#rDzQc zEvs^;ne9;Ock%k}zqZR$FA>p+qDI+wqa)HJ!?jf?2pO zfr2E+S-Thd0^LbNqYT0Wj6{mZj%rZ4xl1odhX+S|ch@5EPcw@IOem(0|K;O{di?Op z<0U;_y7KrdJ)T{9TQ9N$-K{mVeC5j(Jzlx;_%l8JZ03$&Ffo%=y;{A}VyMT%E01** z+05pZ$FJOf=_RMAjKi5(g0?Wz85X;Guv})B5BL1l@=EtK#&h~ zjo8fMqnt@T+>eL1^fVtm)uZ9l<~!-m++Xm_FP=3oc&K`fGZNWnM7|OdaqlcZB9#A7gWAku`E zZ74oh2hX$9ZlT}k@tU3w649`m=!`<+=xCoDtxf@Oy)}0`@g+AFg0L%mDcw?yJP9w}%T zkLc0#Q&e70!$}*XvIm`y2xS7g%;!R{;0ECl3AE(8K4p|UO;_vp=?ThAndf_=rcqlY ziRsMt?yHecre7Q5W}bhu^uzKDwkUMdcW31p)`oocv_5-KpFKO9QT;@ncKUqpW{&A< z9d7o`^B*qVTev+p<1a?}zAMY&kD|cJi^ce8TX>=J;={$&!Ka(+Uu;0n$R?&LA}PM9 zqZ>z%qGGu-yqVD*7E~=qG#3zq7~GMC+yP-9mBj0kY)ntvd*@#(G&L^T{2-2T==Q;a zIS|@7P-klPu|HLso9?U|tc;M}GlQ=n(br=MvT>2AoR_jFWAC%b=!)dAHIU+EQ)~lP zzs#D-ueJ7;Gy;r<8aD z5fv7%eXO->Q$_Le=JOtOK8GcDW3AF%`>X9;HN;CFq}nv&@@wa3Wb;N$lPn*po#T=4ZH82tku7J!Ui(QYP-7xDz<%4 z4!pK2!b|QLrNG-SHaBt5-|f527AvXz-Mpjh zvVWOmib#fj9%Nq1bC%-cKsQ<&{HmVaDn&zv5nQ;j*%{e%h#c-V?-n+s8sG{`iFi{R zbD-x^&GrVX3Fb)k zs<*DHE~jWECo)t9ht9km3OS%pc7z&{ALdJk8UM&D6(x!ff{P7iO>fWamPHGZ=SZv; z5_`&q#uD9Z?@U!^=uCXG2Ma|>FhR;8hIx4*YQygIjYOfgE!}y1F3VBbglwoU z1v*QZaY^?>y8ZyC6HAu9AbW4&^mK`(x2rW+qcChrrW)hktq8o3-d_Vs7#Z&(j7XM9 zf>{?Nk zGc1xqEzttZPRTSlKO=UVzMkmg5XYo=@V6oPmCCxP@3S3@ES8HUpowrOw{Q63oq+v( zuzyT;$^3`hKe9vxR_VH~GlQZl8U6A@!Y?4Dh)#SkSj5hOHW-ArZA1AvzKS;6PA((C ztlto`6OtC?=$nyLy1$IHGda>xzkw7~lIZlW2M_db<=RKm;XU1E6Ejqq0EN4hp(v)* zElPRsB~R}|(rRh%X3J$^5G7Q{cb_#YEFD}~p)w5nJv1vUt#0*J`2L{Zpjn|B)D^Nk z0e@RV=&GK!*|Y^pLk24Tm;b%HYtUr#T;uTRox#b;KMf4};E@_lx^vfhe`;$k4Lj{t zxTXoqJmBpsKpk~JU0aT9uPYE$%MO?w&IoHdh|+vwunNh7FnhhhDl8FBH2~JvE1ThlZWAEQ1Gs}3mYFk>+ce)VJ>t2(>i)&L@9)>|mmbx= zH~6lw?8<`TcjYvGrwWvXd6a~$Fh9Sp^6dI_W437~MTx0Z!+`YC*N5GfazA50{zhA*n zH%{u_od)R$snZNO=VdZ{AXjuOV5RB#-v9;$qlBjbiKYN*Wmp;I%G1g!S0JRfWCS$D zj_J{CuTE;^>0lP~po)&x;c6T0Ol=dpqLvI+T9vJlC#{U6t*NbITP9o8y>Tm9S8vIh zT3g-yurBNAU=iZ6_=xP#gvQf9Z+dV`2HuHfbJl<5qqS&#+Ti^CPv^>{J@X zYC2is^G$)Fldzzje~ak>^s`cp&o?{j84cv?idIQ%@3$X=;+5LQ_i`=tzpuoZ&UGdx z8pu)7Yp~D`@chd6@}Ts;?+xGvwj!YUtS(oAz6$ydZplGq;!)_v-G2`lfHDDMF14M- zdj;7nh#bx2{pvNl*K2}X>`D_;C=FLf0_*E2QnDDRKZ=`ZsM6%#WD^GJH<9lubc)2W z{fc9(Wox5lPq7paBDY}~gk$sH22FeqA%!R+YfAO7MJqMv0U!?BgVJI+ef{!7HsgSt z?;$jmG3p78G4%1YF-i;YcVb(7!dk7gmKdslmb8mf(}P;@0yVB8&Aq$-BQOy0E2j-G zh!ZrYG-j!0fqn^b)oz*?uFAb`62s}>)#1c#CWo5RC@8z=RZlBX?VkW5Gd!*QJqKeD zYZ$HUrQy0sN+3Dv4`)7g>kk5hN>13UlqW3^0}m;e9X$zfh+B0E4Q*1KtZh&!C)+$$ z8{uI=jr+aRw6?~MP3*L>R_$t&$)iE5-X?Q{5TjV#&W&2QI!Y(z#A^6l{zhFt)D5-J z4kgumcKTSA)pw9%L?gReC@#A{LpA7)l<;Oew-UUs8LJ8j9mFTbsxm^ePwlF5pXylb zQyoh&+Zb`8r5jDR$yiuu7N}YvA#1v+C5%|$G;@whDuY#8bRD^lDt4VzenKvc;%Nz2 zU)TgT_r`TKoA1*28Mi%MX>38^a$9-t;J~CsAnKm=NAFV?kKUc!)|}999HaLe2d#)H zTv@jYm&M4UOkR3#-Oy}ox`;lhpMQaUjo=FYCCdBv0)sN0-6~yj$?#zIhyzqgQY=g&0T{^2HgNrH%BPkF?OSJM-B3m zpA<02`*|m4^=E-Ww~xsh_b}BEo6cwL)ZFU2sWmOSxv9l9bL$K(9;TZd?pOh52e^eC z)Y?F8XqAM)twSqY*V;e3K61k*Xb$gX|I98xuKBy&xw0EORTx#=Zl1vS zR>o6*R%D{wh;lIa3fpPZW_T_7K5!5#4JrlU@3rec_YUZj+B-ZwF_v9;P-h?3WSCqU z2R2th*uNbZl$EGm(gqo!bk4OSUAx?Y)#)SxXZSRz-K(}jKIrC%=9J`Q+8i}S@3w0H zG>sOgz~OE)z*0AYsNEYz@CFGPHV3k$b%Utgo1mbwpV4kAp~SU66$;h5$_I5po8JNj zZI#Drp+IcFG$=F!G*H+Q2}>>c3isCq2`|gOf5Zf(&S7A=PIwG2sW*7|sX9 z|8%uY0^Qgn$67!dpfFT6tkBj-l4>Pefd@&(8b6uPHQV*wNQ6F2gY*50417@M=JR|V zZ4r>Yr?MXmDF1vdec_$378*63zNmDxCL3LJi}b+=#cm3+`#gG)tK8LF=e#K^{q>Cs z{&K1NM5F7G7t{^pRimlcyQRBKzj#=Pur|KXfge=HP4q}lljL`uYS+M9?_O4kgy-5t)t?ovBU8Ms8RHn^nRPm7ydNXo^4i9q)l2%OpQZ`bnI-?lFGm^g0u6(aI zPR>fP+Bg4_|KI+jdTC3Kwto8`{B5eD@b2!IJeqUv-<;=HS@g#PRr_CBU)y@Jr9W?y zC-IYu8_O@2A5tEGBIxDkm-9WGV@DBNxEu=Zp+XLhnp))FIE?~p8RNW^+x{OTztIsWN}l; zBK4E4rOm}BOP_5pqh6caW%2HamMd$^rJt_N?e5PPTf^roxt^tUk{J!|j|bF4cG#^# zYltA344S;jzBK`pH)fW*xG#QuIm6L3!MQQRu0+JyjTtti{Q2mA2L{88mE;Yvb@@HJ zQ2t~CW@>~7K^`LqLkqwWW}?dRlL1W`aiqwPGDl7JGeUR{$jz`Q_VtZuzx+^R)?Z(? zznFIWlc~2qL8bO5({F#Wg!U)PxS6Gumme|#r#dR#=XV2xQdy*AYwaj!hTx)!w817f zPq{N^JA?x5ygKp4Eoz}elhftn3()a*TpSbP->~Sef0Z)L4K}P zcS(zyd!&t#on-S%xpIwzP&2x9`AIL6yUQDol%i=#;!Y=XZhM!m6N~s0z_)C!!PZ+wMgA{aXz>7td2vKq!F`7K} zWyhZ=wv!~imsI(pf*zs0VpgD0!8@*9lSV+K;cEi>xE-0ifZdC{PP>$jQfXSa}G z;~*KHC9B85rHZ;$%qz8J2;Yy&RSM2*$~!s!Q&F+Rlv0*hn5bt7uTx4x_A*uXZFiQhFm_)%;!q`z;L}Wt1XsA8CtVRwm1tP-;gAL!Efz7rM%} zdlV864aTQ8)!mw;8_^sgXNKc~=*QeNm6ah>Ak=5!=S`W!$*;~BjYc<0vf#fP7+mV&QiH}i?i~aeP%^@GGRN;49^QZ1(CWl zyhB=z3?Ap`J9)~e3<~d)Q72O1sQY|9jJrM6%cwcuncy#~5fp;pXibHT;EPk;FyPw- zU`Wo!Bbk?q*->$0=HCPcq9rpVt&#M{sdc$AY8fg?pXJ71Y@Lhi2Y#P_Jti^N@#a2I znvW3(e9D^oyOF!A)MqjMq=*sq)@G0t_@Sm%+=bJ^wFqLZb^Moai{L|GCbBWMavRr6P$3y-w1GC`L(dItXdH zwAX6-HyI~TzmovnU03?XJ?MRQy#U>PR^Y(w0s=alSsg0A`gLG%{=A5kC|*Jet^{YL z4a;g6RL3O~)xKr_Lg0C%l9?8GI8EHaH?O4HU7}`ZB!45C?D%+{(=a^RIk*r40EPM;bomM;aYc=v0Yv-V?PJ13sKCnF z`jbcNUl77KjZ$aHj*z0!`~Tts;|~FYtl5)PV2dkT9*%<}{Z;@(oWoL3LOR2&!s#xaxL?fV<=+ep_Rg1!8F8pcwm4N;+K$Ux=5Kjl zT)M3<)tZwQ>QVG-n&X;Ue!>3TwujVzDz!{DJ$DbyCKH-LLtx(# zyU2JtQFR(@lO*F)_vlDB%p#Zx(A^+t4j3!lk7^T2KX5q}RYEz}^`+b+g${FWB~Nuk z(zM`@07djfVN|u&B`xQ#NDHHOX|N(Cc{z)-8_@}LMNUh}FNCs_k?N+Ppgosrm(m~s zC&%Y=dO}wzKrRXnQQ}ss@zX5Uru$e1vpS^jkcDTGyIdgJvItdvkd+L;B0gp*fvDz# zVR2uzeE==9E*8V6a)cW;XmM_M_tqzmOt|HhdU*TZ1T zrc6RuvQZ5s6xYngBLd}x4N-4*wEI)t(&frt+CtTvv2_Wxooakv7d_S1^TY)1P6p4c zqUm#WmNkw@gpE>tsuU69|E0nM@RNCuiHZo;Jy490vT*?JATXMw>y6$z+s>Ta&moxd8olLEp97Gb#2tzYUMX^B4?6##KZr^hbaJ+Bj-)QahPm=BO2N z@Y4fbY}*Ls#$MVyf@m?B{LbhLv3hl&mcKAJS6XsxZ+s&l$oT7qI7#A{4=qYK)@>W*ruFLro$U0wG~(GG&Z+WhW3hwVg5mFrWBU$OHuMHH9Wv zEAcYIQEfBG@-G7eE0?L6x

D04Y{KbBYMsTUtHrOO@#J^Ff&+Y?Oj(R-z) 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 OVFHJz|IUB^@xK9);J)kt literal 0 HcmV?d00001 diff --git a/recipes/zxspectrum/Hardware.tap b/recipes/zxspectrum/Hardware.tap new file mode 100644 index 0000000000000000000000000000000000000000..37177ebff6a1d10e95dc0af4dac6bf6a46c6dc41 GIT binary patch literal 66560 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 K{Qsx^!T$pl{?ax8 literal 0 HcmV?d00001 diff --git a/recipes/zxspectrum/Kernel.tap b/recipes/zxspectrum/Kernel.tap new file mode 100644 index 0000000000000000000000000000000000000000..b8ab228c5595cb2f2b6611cb37242f8536701450 GIT binary patch literal 133120 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 K`ybH%;Qs=vUuVVu literal 0 HcmV?d00001 diff --git a/recipes/zxspectrum/README.md b/recipes/zxspectrum/README.md new file mode 100644 index 0000000..89095e3 --- /dev/null +++ b/recipes/zxspectrum/README.md @@ -0,0 +1,138 @@ +# Sinclair ZX Spectrum + +Sinclair ZX Spectrum is the British Z80-based home computer manufactured and sold in app. 5 mln branded units since the early 1980s and available worldwide in various clones until today. The most widespread legacy 48K model is a challenging Collapse OS target due to: +* absense of standard communication protocols, with the expansion egde connector requiring complex additional hardware; +* cassette tape storage as the only medium supported out-of-the-box; +* 16K ROM space with no paging, 7K memory-mapped screen, and the infamous [contended memory][contention], limiting the resources further against the competitors. + +This recipe builds a RAM-based kernel self-assembling on the 48K model with tape storage. The ZX Spectrum firmware routines are used extensively for console and tape handling, which requires the `IM 2` interrupt mode of the Z80. Tape is accessed in two ways, via a read-only block device abstraction (required for `zasm`) and a set of short read/write applications directly bridging the MMAP blkdev and file system to tape. The assembly of the kernel binary is done with the tape-based CFS as the source and the bare MMAP blkdev as the destination. `Zasm`, `ed`, and tape applications are included into the RAM kernel binary. The MMAP size is 16K, the remaining userspace is app 7K. + +## Gathering parts + +* A Sinclair ZX Spectrum with access to tape storage. The 48K and 128K+ models have EAR/MIC [3.5 mm sockets][sockets] on board, the +3 has a single input/output socket, the +2A needs restoration of the EAR input, the +2/+2B models have a built-in tape recorder (reportedly out of order on most currently available units) and no sockets, which requires restoration of the pinout. +* A tape recorder with blank tapes, or a digital wave playback/recording device +* A cord pluggable into the playback/recording device and the ZX tape sockets +* Tape conversion routines for modern hardware, such as [BIN2TAP][bin2tap] for tape format conversion of the kernel binary and [TAPIR][tapir] for direct playback or WAV conversion of the tape image (both under Windows). See the description of [tape file format][TAP] +* A hex file editor for SD card image manipulations + +## Kernel assembly + +The necessary kernel modules include grid display emulation (32x21) and keyboard scan routine, both using the firmware ROM calls for simplicity and thus requiring preservation of the `IY` register extensively used by Spectrum BASIC. RAM-based kernels have to work in `IM 2` mode for this, with the handler located in the non-contended memory above `0x8000`. The `IM 2` [interrupt vector table][im2readmore] should be placed in the non-contended memory as well for the [128K model compatibility][128Kim2]. + +Stack memory is contended in this recipe, with the bottom at `0x8000`, which should be changed (e.g. by patching the kernel init routine before launching) if precise timings are needed. The top of the user memory `0xc000` is one possible bottom of the moved stack. + +The tape-based blkdev is another platform-specific kernel module. The device is read-only due to infeasibility of tape-to-tape assembly. Instead, MMAP-tape bridge routines are designed as applications independent of the tape blkdev, but included into the binary in this recipe. They naturally require the MMAP blkdev in the kernel. + +To save some RAM for MMAP, the shell and ed line buffers are slightly reduced compared to defaults (2K `BUF_POOLSIZE` left for 256 lines with shell, 3K `ED_BUF_PADMAXLEN` for 1024 `ED_BUF_MAXLINES` lines with ed). The 1K shell `BUF_LINES` buffer is placed to contended memory. + +Due to features of screen handling by firmware ROM, the three bottom screen rows are left blank. + +See the respective glue.asm and user.h files for details. + +## Assembly of application binaries + +The application binaries, `zxs/ed.bin`, `zxs/zasm.bin` and `zxs/tapeutil.bin` were assembled in advance and included into glue.asm using `.bin` directive. + +The starting point is learning `BAS_RAMEND` value by examining a memory dump of the test build assembled with the necessary shell memory allocation. On init, the basic shell saves the SP value, which is the value set in glue.asm minus 2 (`0x7ffe` in this recipe). The address of this storage +6 is `BAS_RAMEND`, which is the reference point for all memory assignments for included binaries. The tape blkdev and utilities use 527 bytes in this build, which allows assigning memory from `BAS_RAMEND+527` to `USER_CODE`, incl. `ed` and `zasm` working buffers, by writing the value in `user.h`. + +Finally, the binaries lengths should be used to learn the necessary .org values for each application. The `.org` and `.equ USER_RAMSTART USER_CODE` directives in `mono/ed` and `mono/zasm` glue files override the `user.h` settings. + +## Tape conversion + +The kernel binary can be converted to a tape file with a single CODE-type block and a header using the utilities described above or similar. +Conversion of the OS sources to the tape-based CFS is, however, a tedious two-step process and requires: +* splitting the SD card image, using a hex editor, into smaller parts of size equal to MMAP volume of your build, containing an integer number of CFS blocks; +* converting each part to a tape image with a single headerless block; +* loading the blocks into the ZX Spectrum Collapse OS MMAP filesystem using the `BINLD` application (see below); +(with a Spectrum emulator such as Fuse, the two previous steps can be shortcut by loading image parts into MMAP area directly using the `File/Load binary data` option) +* saving them to tape from the MMAP using the `CFSSV` application (see below), as a chain of 256-byte headerless blocks. +The resulting sequence of blocks is readable by the tape blkdev. +To save some assembly time, it is advised to minimize the working tapes content: one tape per application, one tape for kernel sources of the currently processed build. + +The tape files with the OS sources converted from the emulator cfs images (as standing on May, 2020) are: +* `Kernel.tap` (Spectrum kernel modules, utilities, basic shell, old shell) +* `Apps.tap` (ed, zasm, memt, sdct, at28w) +* `Hardware.tap` (non-Spectrum kernel modules) +in this directory. + +## Launching + +To load and run the kernel from tape, execute the following in 48K BASIC mode of the Spectrum: + + CLEAR 24316 + LOAD "" CODE 24317 + RANDOMIZE USR 24317 + +You may adjust your screen colours using `INK/PAPER/BRIGHT/BORDER` and `BORDCR (23624)` variable prior to that. +An example of a loader package is shown as `Boot.tap` in this directory. + +## Emulation + +The recipe has been tested to work on the emulated ZX Spectrum under Windows, using Fuse 1.1.1 binary build and the original Sinclair Research Ltd ROMs. The original 48K and 128K configurations both run the boot binary, starting from either 48K or 128K BASIC mode. The binary works with the Beta Disk/TR-DOS emulation turned either on or off. No other emulated clones were tested. + +To run the provided package or your converted boot tape, open the `Boot.tap` using the `Media/Tape/Open (F7)` command in Fuse and run the launching commands above. Depending on Fuse configuration, the binary file will be loaded instantly or in real time. + +Please take note of the following when using emulated tapes with Collapse OS under Fuse: +* The `Use tape traps` option in `Options/General (F4)` menu has to be turned on when *saving* to an emulated tape. Before loading from the tape just created, always save the modified content to a new .tap file by `Media/Tape/Write (F6)` and re-open it by `Media/Tape/Open (F7)` +* When learning the system with minor works, the `Use tape traps` option can be turned off when *loading* from the tape. The playback is started and stopped manually by `Media/Tape/Play (F8)` in this case. Do not rewind the tape unless prompted by the magenta border +* When assembling from the tape with `zasm`, the `Use tape traps` option can be turned on for speed, as the tape is always rewound after loading a new data portion +* The new content is written at the end of the .tap file and can not be erased or overwritten +* The `CFSSV` and `CUTSV` utilities add a 2-second pause between the saved CFS blocks, which is required for `zasm` to load and process the blocks seamlessly, but not preserved in .tap files. It is not relevant to tape emulation, but if you plan to convert your .tap files for real hardware, the pauses have to be somehow restored. + +## Usage + +The devices list is as follows: +* 0 - MMAP, +* 1 - file handle 0, +* 2 - file handle 1, +* 3 - tape blkdev. + +CFS is initialized on MMAP upon launch. Major assembly works with zasm should be done from tape using the bare MMAP blkdev (0) as the destination. + +The tape CFS is not default, it has to be mounted by typing `bsel 3: fson`, then `fls`. File listing should be completed by loading a null ("invalid") block. It's useful to have at least one at the end of every tape, including the boot tape. Other tape operations which get rid of the placeholder data in the buffer, including `ed` or `fopen`, will suffice. + +File handles are then assigned by typing fopen and loading the first block of the file. When searching for a tape block, purple border means "rewind the tape and press ENTER". Writing does not work with the tape device (specifically, PutB points to unsetZ with all due consequences). For creation of new tape files, MMAP and the dedicated routines have to be used. + +In case the CFS 'magic' label is damaged in the tape buffer due to a loading error, fs commands will error out. To restore the buffer, type `bseek 256: getb: bseek 0: getb` to reload the first CFS sector from tape, then `fls` or `ed` the first file before starting any assembly works. + +The MMAP-tape routines, exposed as shell commands in this recipe, are as follows (optional arguments are in parentheses; only decimal values are accepted): +* `BINSV (len)` - saving the MMAP content as a raw headerless binary, the whole MMAP area by default +*(may be convenient for storing the existing MMAP filesystem within a single block, saving the freshly assembled kernel binary, creating a null block)* +* `BINLD len` (a/o, a by default) - raw binary loading, appending or overwriting the filesystem +*(may be useful for loading the filesystem converted from an SD card image, or a previously stored MMAP)* +* `HEAD addr len` - saving of the CODE-block header in the Spectrum BASIC format +*(required for loading and launching the self-assembled kernel binary from Spectrum BASIC)* +* `FILSV file` - saving a particular file as a raw headerless binary +*(useful for exporting a file from the tape CFS)* +* `FILLD filename len (a/o, a by default)` - loading of the raw binary as a file into the existing MMAP filesystem, appending or overwriting the filesystem +*(for importing an external source file or binary)* +* `CFSSV (file)` - saving a particular file or (by default) the whole existing filesystem as a chain of 256-byte blocks *(to be readable by the tape blkdev)* +* `CUTSV filename (len)` - saving the raw MMAP content (whole MMAP area by default) as a single CFS file, cutting it into a chain of blocks *(for saving an application binary assembled to bare MMAP. Saving an existing filesystem will error out)* +* `CFSLD (num, 1 by default (a/o, a by default))` - loading of the CFS chain, appending or overwriting the filesystem +*(useful for viewing, editing and converting source files, particularly kernel sources)* + +For getting the length of a freshly assembled binary, ZTELL routine is exposed, fetching the internal writing counter from within the zasm working memory. It can be accessed by executing `addr ztell: s=a`, then `usr s: print h`. + +## Modifications and further development + +Some additional memory can be acquired by reducing the grid display to 32x15 (2K + 256b additionally) or 32x7 (4K + 512b additionally) size and thus freeing a part of the screen memory. The bottom row in the last third of the screen used for grid emulation has to be left blank. The two memory blocks are located *down* from `0x5800` (bitmap) and `0x5b00` (attributes) respectively in the contended memory and should be managed accordingly (e.g. for placing interrupt and jump tables upon boot; for `basic`/`ed` line buffers etc.). + +All of the advanced models and clones are backwards-compatible with the 48K model, making this recipe a suitable point of departure. + +There is a number of external disk systems for the Spectrum. Many of them (e.g. the +3's native +3DOS, or Beta Disk interface implemented in many Eastern European clones), while removing the need for included applications, may still require `IM 2` mode, and thus the 'non-contended memory', even with completely stand-alone console drivers, due to the interface architecture. + +The 128K/+2/+3 models have a combined MIDI/RS232 port on board, with the pin diagrams widely available. This allows writing serial I/O drivers pluggable into the `IM 2` interrupt handler, expanding usability in various ways. + +The extended RAM of the 128K+/+2/+3 models may be accessed by modifying the MMAP kernel module to directly support RAM paging. This may be useful for viewing and editing large source files, but is not enough for memory-to-memory kernel reassembly, as the minimal set of kernel sources is app. 160K. The ROM/RAM paging available on the +3 model allows the kernel to reside in RAM under `0x0`. Some of the paged RAM is contended on all mass produced models. + +More sophisticated tape bufferization, with the additional RAM footprint, may increase the speed of tape-to-memory self-assembly, which is almost prohibitively slow at the moment. + +The 16K model would require a ROM-based kernel completely replacing the firmware for Collapse OS to remain self-hosted. It can however be expanded with the additional RAM module up to 32K plugged to the edge connector. + +[bin2tap]: https://sourceforge.net/p/zxspectrumutils/wiki/bin2tap/ +[tapir]: http://www.worldofspectrum.org/pub/sinclair/tools/pc/tapir1.0.zip +[TAP]: https://faqwiki.zxnet.co.uk/wiki/TAP_format +[im2readmore]: http://www.breakintoprogram.co.uk/computers/zx-spectrum/interrupts +[sockets]: https://faqwiki.zxnet.co.uk/wiki/Tape_leads +[contention]: https://www.worldofspectrum.org/faq/reference/48kreference.htm#Contention +[128Kim2]: https://www.worldofspectrum.org/faq/reference/128kreference.htm diff --git a/recipes/zxspectrum/glue.asm b/recipes/zxspectrum/glue.asm new file mode 100644 index 0000000..457d0dc --- /dev/null +++ b/recipes/zxspectrum/glue.asm @@ -0,0 +1,263 @@ +.equ IYBAS 23610 ; user.h +; The ZX Spectrum firmware requires IY value to be equal to 23610 +; (in this case, to handle keyboard interrupts and screen correctly). +; an IM2 handler has to be included to manage this. + +.equ RAMEND 0xffff ; user.h + +.equ USER_CODE 41639 ; = BAS_RAMEND+527 in user.h +; when changing the memory layout, it should have a dummy value for a test assembly, +; then changed to the actual value in relation to the new BAS_RAMEND + +.org 0x5efd + +jp init + +.inc "err.h" +.inc "ascii.h" +.inc "blkdev.h" +.inc "fs.h" + +.inc "kernel/zxs/jumps.asm" + +.inc "core.asm" +.inc "kernel/str.asm" + +.inc "kernel/zxs/vid.asm" +.inc "kernel/zxs/kbd.asm" + +.equ GRID_COLS 32 +.equ GRID_ROWS 21 ; to avoid CRLF outside of the #2 screen +.equ GRID_SETCELL v_putc +.equ GRID_GETC k_getc +.equ GRID_RAMSTART RAMSTART +.inc "kernel/grid.asm" + +.equ BLOCKDEV_RAMSTART GRID_RAMEND +.equ BLOCKDEV_COUNT 4 +.inc "kernel/blockdev.asm" +; List of devices +.dw mmapGetB, mmapPutB +.dw blk1GetB, blk1PutB +.dw blk2GetB, blk2PutB +.dw tapeGetB, unsetZ ;read-only + +.equ STDIO_RAMSTART BLOCKDEV_RAMEND +.equ STDIO_GETC gridGetC +.equ STDIO_PUTC gridPutC +.equ STDIO_SETCUR gridSetCurH +.inc "kernel/stdio.asm" + +.equ MMAP_START 0xc000 ; 49152 +.equ MMAP_LEN RAMEND-MMAP_START+1 +; 16K, 64 fs blocks for MMAP FS +.inc "kernel/mmap.asm" + +.equ FS_RAMSTART STDIO_RAMEND +.equ FS_HANDLE_COUNT 2 +.inc "kernel/fs.asm" + +; BASIC shell +; RAM space used in different routines for short term processing. +.equ SCRATCHPAD_SIZE STDIO_BUFSIZE +.equ SCRATCHPAD FS_RAMEND +.inc "lib/util.asm" +.inc "lib/ari.asm" +.inc "lib/parse.asm" +.inc "lib/fmt.asm" +.equ EXPR_PARSE parseLiteralOrVar +.inc "lib/expr.asm" +.inc "basic/util.asm" +.inc "basic/parse.asm" +.inc "basic/tok.asm" +.equ VAR_RAMSTART SCRATCHPAD+SCRATCHPAD_SIZE +.inc "basic/var.asm" +.equ BUF_RAMSTART VAR_RAMEND +.equ BUF_POOLSIZE 0x800 ; 0x1000 by default, cut to save some RAM +.equ BUF_POOL shell_buf ; in contended memory +.equ BUF_MAXLINES 0x100 +.equ BUF_LINES BUF_RAMSTART+4 +.equ BUF_RAMEND @+BUF_MAXLINES*4 ; continue allocating in higher RAM +.inc "basic/buf.asm" +.equ BFS_RAMSTART BUF_RAMEND +.inc "basic/fs.asm" +.inc "basic/blk.asm" +.equ BAS_RAMSTART BFS_RAMEND +.inc "basic/main.asm" + +; BASIC records the SP value, which is glue init value-2; the address of this storage +6 is BAS_RAMEND +; this is the value to be learned from a memory dump for user.h! + +.equ tap_buffer BAS_RAMEND +.equ buf_pos @+256 +.equ tap_pos @+1 +.equ TAP_RAMEND @+8 ; user.h for assembling zxs/tapeutil.bin, BAS_RAMEND+265 +.inc "kernel/zxs/tapeblk.asm" + +;.equ USER_CODE BAS_RAMEND+527 ; 265 tapeblk + 262 tapeutil.bin below + +.equ ZBCOUNT USER_CODE+14 +tpztell: +; fetches the zasm internal counter (IO_OUT_BLK) at ZASM_RAMSTART+14 +; it's called through 'addr ztell: s=a: usr s: print h' +ld hl, (ZBCOUNT) +xor a +ret + +basFindCmdExtra: + ld hl, basBLKCmds + call basFindCmd + ret z + ld hl, basFSCmds + call basFindCmd + ret z + ld hl, .mycmds + call basFindCmd + ret z + jp basPgmHook +.mycmds: +.db "binsv", 0 +.dw tapeutil +.db "binld", 0 +.dw tapeutil+3 +.db "head", 0 +.dw tapeutil+6 +.db "filsv", 0 +.dw tapeutil+9 +.db "filld", 0 +.dw tapeutil+12 +.db "cfssv", 0 +.dw tapeutil+15 +.db "cfsld", 0 +.dw tapeutil+18 +.db "cutsv", 0 +.dw tapeutil+21 +.db "ztell", 0 +.dw tpztell +.db "ed", 0 +.dw edrun +.db "zasm", 0 +.dw zasmrun +.db 0xff + +init: +di +ld sp, 0x8000 +; if precise timings are needed, +; the stack should be moved to non-contended memory +call int_init +call v_init +call tapeblk_init + +; init a FS in mmap +; possibly not needed in the final build + ld hl, MMAP_START + ld a, 'C' + ld (hl), a + inc hl + ld a, 'F' + ld (hl), a + inc hl + ld a, 'S' + ld (hl), a + +call gridInit + +call fsInit + xor a + ld de, BLOCKDEV_SEL + call blkSel + call fsOn + +call basInit +ld hl, basFindCmdExtra +ld (BAS_FINDHOOK), hl + +ei +jp basStart + +; *** blkdev 1: file handle 0 *** + +blk1GetB: + ld ix, FS_HANDLES + jp fsGetB + +blk1PutB: + ld ix, FS_HANDLES + jp fsPutB + +; *** blkdev 2: file handle 1 *** + +blk2GetB: + ld ix, FS_HANDLES+FS_HANDLE_SIZE + jp fsGetB + +blk2PutB: + ld ix, FS_HANDLES+FS_HANDLE_SIZE + jp fsPutB + +int_init: +di +ld a,0x80 +ld i,a +im 2 +ret ; does not enable interrupts yet + +tapeutil: +.bin "zxs/tapeutil.bin" +; all tape utilities in one block with library +; t_load ROM call routine is duplicated in zxs/tapeblk.asm in case those utilities are moved to userspace + +; 0x7492 is free space, +2K=7c92, the rest 0x36e=878b for stack space +shell_buf: +; basic shell BUF_POOL points here + +.fill 0x8000-$ +; The ZX Spectrum hardware noises the CPU data bus so that any value can appear on interrupt instead of 0xFF. +; A 257-byte table is thus required to hold the INT handler address for IM2 mode. + +; interrupt table = 128 words + 1 byte +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.dw 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181 +.db 0x81 + +; the handler and the table are to reside in the non-contended memory, i.e. in 0x8000-0xC000 +; (or rather in 0x8080-0xBFBF) + +.fill 0x8181-$ + +; *** interrupt handler +; other possible int routines here, e.g. RS232 or debug calls +push iy +ld iy, IYBAS +rst 56 +pop iy +ei +ret + +;0x818c +edrun: +.bin "zxs/ed.bin" ;1108 = 0x0454 + +;0x85e0 = 0x818c+0x454 +zasmrun: +.bin "zxs/zasm.bin" ;4881 = 0x1311 + +RAMSTART: ; 0x98f1 = 0x85e0+0x1311 (39153) +; bin length (14836) + + \ No newline at end of file diff --git a/recipes/zxspectrum/mono_ed_glue.asm b/recipes/zxspectrum/mono_ed_glue.asm new file mode 100644 index 0000000..e9305c5 --- /dev/null +++ b/recipes/zxspectrum/mono_ed_glue.asm @@ -0,0 +1,46 @@ +; *** Requirements *** +; _blkGetB +; _blkPutB +; _blkSeek +; _blkTell +; fsFindFN +; fsOpen +; fsGetB +; fsPutB +; fsSetSize +; printstr +; printcrlf +; stdioReadLine +; stdioPutC +; + +.inc "user.h" +.org 0x818c +.equ USER_RAMSTART USER_CODE + +; *** Overridable consts *** +; Maximum number of lines allowed in the buffer. +.equ ED_BUF_MAXLINES 0x400 +; Size of our scratchpad +.equ ED_BUF_PADMAXLEN 0xc00 + +; ****** + +.inc "err.h" +.inc "blkdev.h" +.inc "fs.h" + jp edMain + +.inc "core.asm" +.inc "lib/util.asm" +.inc "lib/parse.asm" +.inc "ed/util.asm" +.equ IO_RAMSTART USER_RAMSTART +.inc "ed/io.asm" +.equ BUF_RAMSTART IO_RAMEND +.inc "ed/buf.asm" +.equ CMD_RAMSTART BUF_RAMEND +.inc "ed/cmd.asm" +.equ ED_RAMSTART CMD_RAMEND +.inc "ed/main.asm" +USER_RAMSTART: diff --git a/recipes/zxspectrum/mono_zasm_glue.asm b/recipes/zxspectrum/mono_zasm_glue.asm new file mode 100644 index 0000000..30afd23 --- /dev/null +++ b/recipes/zxspectrum/mono_zasm_glue.asm @@ -0,0 +1,90 @@ +; zasm +; +; Reads input from specified blkdev ID, assemble the binary in two passes and +; spit the result in another specified blkdev ID. +; +; We don't buffer the whole source in memory, so we need our input blkdev to +; support Seek so we can read the file a second time. So, for input, we need +; GetB and Seek. +; +; For output, we only need PutB. Output doesn't start until the second pass. +; +; The goal of the second pass is to assign values to all symbols so that we +; can have forward references (instructions referencing a label that happens +; later). +; +; Labels and constants are both treated the same way, that is, they can be +; forward-referenced in instructions. ".equ" directives, however, are evaluated +; during the first pass so forward references are not allowed. +; +; *** Requirements *** +; strncmp +; upcase +; findchar +; blkSel +; blkSet +; fsFindFN +; fsOpen +; fsGetB +; _blkGetB +; _blkPutB +; _blkSeek +; _blkTell +; printstr +; printcrlf + +.inc "user.h" +.org 0x85e0 +.equ USER_RAMSTART USER_CODE + +; *** Overridable consts *** +; NOTE: These limits below are designed to be *just* enough for zasm to assemble +; itself. Considering that this app is Collapse OS' biggest app, it's safe to +; assume that it will be enough for many many use cases. If you need to compile +; apps with lots of big symbols, you'll need to adjust these. +; With these default settings, zasm runs with less than 0x1800 bytes of RAM! + +; Maximum number of symbols we can have in the global and consts registry +.equ ZASM_REG_MAXCNT 0xff + +; Maximum number of symbols we can have in the local registry +.equ ZASM_LREG_MAXCNT 0x20 + +; Size of the symbol name buffer size. This is a pool. There is no maximum name +; length for a single symbol, just a maximum size for the whole pool. +; Global labels and consts have the same buf size +.equ ZASM_REG_BUFSZ 0x700 + +; Size of the names buffer for the local context registry +.equ ZASM_LREG_BUFSZ 0x100 + +; ****** + +.inc "err.h" +.inc "ascii.h" +.inc "blkdev.h" +.inc "fs.h" +jp zasmMain + +.inc "core.asm" +.inc "zasm/const.asm" +.inc "lib/util.asm" +.inc "lib/ari.asm" +.inc "lib/parse.asm" +.inc "zasm/util.asm" +.equ IO_RAMSTART USER_RAMSTART +.inc "zasm/io.asm" +.equ TOK_RAMSTART IO_RAMEND +.inc "zasm/tok.asm" +.equ INS_RAMSTART TOK_RAMEND +.inc "zasm/instr.asm" +.equ DIREC_RAMSTART INS_RAMEND +.inc "zasm/directive.asm" +.inc "zasm/parse.asm" +.equ EXPR_PARSE parseNumberOrSymbol +.inc "lib/expr.asm" +.equ SYM_RAMSTART DIREC_RAMEND +.inc "zasm/symbol.asm" +.equ ZASM_RAMSTART SYM_RAMEND +.inc "zasm/main.asm" +USER_RAMSTART: diff --git a/recipes/zxspectrum/tapeutil.asm b/recipes/zxspectrum/tapeutil.asm new file mode 100644 index 0000000..973823f --- /dev/null +++ b/recipes/zxspectrum/tapeutil.asm @@ -0,0 +1,594 @@ +; The include file with tape utilities exposed as commands, for kernel build + +; *** A library file for MMAP-TAPE bridge, which can be included with the userspace versions of the routines +; (user routines are below, addressed by the jump table) + +; required syscalls: +; strncmp +; fsAlloc +; fsblkTell +; the applications require: +; parseDecimal +; fsFindFN + +.inc "user.h" +.org 0x711f ; 0x7492-0x373 + +; for CUTSV 1st block +.equ sv_buffer TAP_RAMEND +; Parsed arguments +; block, then byte length +.equ par_blocklen @+256 +; length of the parsed filename +.equ par_namelen @+3 +; pointer to filename in the args +.equ par_filename @+1 +.equ TAPUTIL_RAMEND @+2 + +jp tpbinsv +jp tpbinld +jp tphead +jp tpfilsv +jp tpfilld +jp tpcfssv +jp tpcfsld +jp tpcutsv + +; t_CFSHead +; t_parseName +; t_parseOver +; t_chainEnd +; t_newFile +; t_save +; t_load +; t_stkStor +; t_stkRet + +; CFS header preparation (for CUTSV 1st block, for FILLD newfile) +t_CFSHead: +push hl +push bc +push de + +; position in ix +push ix + +ld hl, sv_buffer +push hl +pop de +inc de +ld bc, 32 +xor a +ld (hl), a +ldir ; clear the header + +ld ix, sv_buffer ; for generality +ld a, 'C' +ld (ix+0), a +ld a, 'F' +ld (ix+1), a +ld a, 'S' +ld (ix+2), a +ld hl, par_blocklen ; block length stored by parser +ld a, (hl) +ld (ix+3), a +inc hl ; actual file length stored by parser +ld a, (hl) +ld (ix+4), a +inc hl +ld a, (hl) +ld (ix+5), a +ld bc, 6 +ld hl, sv_buffer +add hl, bc +push hl +pop de ; destination for the parsed filename transfer +ld hl, par_namelen ; filename length stored by the parser +ld c, (hl) +ld hl, (par_filename) ; filename pointer stored by the parser +ldir ; copy filename + +pop ix + +pop de +pop bc +pop hl +ret + +; Parsing of the filename (HL) +t_parseName: +push de +push bc + +push hl +push hl +pop de +ld hl, par_filename +ld (hl), e +inc hl +ld (hl), d +pop hl +ld c, 0 +.loop: +ld a, (hl) +cp 32 +jr z, .end +inc c +inc hl +jr .loop +.end: +push hl +ld hl, par_namelen +ld (hl), c +pop hl +inc hl ; the next argument in HL + +pop bc +pop de +ret + +; Parsing of the overwrite flag 'o' +t_parseOver: +push de +ld de, .flag +ld a, 1 +call strncmp ; Z - equal (overwrite) +pop de +ret +.flag: +.db 'o' + +; Search for CFS chain end (for binary/CFS loading) +t_chainEnd: +push hl +ld a, (par_blocklen) +ld hl,.dummy ; placeholder name +call fsAlloc +call fsblkTell ; position in HL +ld bc, MMAP_START +add hl, bc +push hl +pop ix ; chainend in ix + +pop hl +ret +.dummy: +.db '@', 0 + +; New file at the CFS chain end (for binary loading into CFS) +t_newFile: +push de +push hl +push bc + +call t_chainEnd +call t_CFSHead +; start of the new file in ix +push ix +pop de +ld hl, sv_buffer +ld bc, 32 +ldir ; copy header to CFS +push de +pop ix ; loading position in ix + +pop bc +pop hl +pop de +ret + +; SAVE-BYTES ROM call +; header/bytes flag set outside +t_save: +;ld ix,addr +;ld de,len +;ld a,head +push iy +ld iy, IYBAS +; one can not call directly, as RST8 is then called upon break +call 0x04c6 ; SA-BYTES+4 to skip SA/LDRET +jr t_ldret + +; LOAD-BYTES ROM call +t_load: +;ld ix,addr +;ld de,len +;ld a,head +push iy +ld iy, IYBAS +scf +; one can not call directly, as RST8 is then called upon break +inc d +ex af,af' +dec d +di +ld a, 15 +out (254), a +call 1378 ; jump into LD-BYTES +t_ldret: +ld a, (23624) ; restore border +and 0x38 +rrca +rrca +rrca +out (254),a +pop iy +ei +ret + +; Stack store (CALL) +t_stkStor: +ld (.stkbc), bc +pop bc +ld (.stkret), bc +ld bc, (.stkbc) +push hl +push bc +push de +push ix +push iy +ld bc, (.stkret) +push bc +ret +.stkbc: +.dw 0 +.stkret: +.dw 0 + +; Stack restore (JP) +t_stkRet: +pop iy +pop ix +pop de +pop bc +pop hl +ret + +; 2-sec pause between savings +t_pause: +push bc +ld b,100 +.loop: +push bc +halt +pop bc +djnz .loop +pop bc +ret + +; *** APPLICATIONS *** + +tpbinsv: +call t_stkStor +call parseDecimal +jr z, .arglen +ld de, MMAP_LEN +.arglen: +ld ix, MMAP_START +ld a, 255 +call t_save +xor a +jp t_stkRet + +tpbinld: +call t_stkStor +call parseDecimal +jp nz, t_stkRet +inc hl +call t_parseOver +jr z, .ovlen +push de +call t_chainEnd +pop de +jr .applen +.ovlen: +ld ix, MMAP_START +.applen: +ld a, 255 +call t_load +xor a +jp t_stkRet + +tphead: +xor a +inc a +call t_stkStor +call parseDecimal +jp nz, t_stkRet ; ERR no addr +ld ix, sv_buffer +ld a,3 +ld (ix+0),3 +ld (ix+13),e +ld (ix+14),d +inc hl +call parseDecimal +jp nz, t_stkRet ; ERR no len +ld ix, sv_buffer +ld (ix+11),e +ld (ix+12),d +ld de, 17 +xor a +call t_save +xor a +jp t_stkRet + +tpfilsv: +xor a +inc a +call t_stkStor +call fsFindFN +jp nz, t_stkRet ; ERR file not found +call fsblkTell ; position in HL +ld bc, MMAP_START +add hl, bc +push hl +pop ix +ld b, (ix+3) ; blocks +;xor a +;or b +;jp z, t_stkRet +ld de, 256 +ld hl, 0 +.loop: +add hl,de +djnz .loop +ld bc,32 +sbc hl,bc +push hl +pop de +push ix +pop hl +add hl,bc +push hl +pop ix +ld a, 255 +call t_save +xor a +jp t_stkRet + +tpfilld: +call t_stkStor +ld (par_filename), hl +ld b,26 +ld c,0 +.loop: +ld a,(hl) +cp 32 +jr z, .namlen +inc c +inc hl +djnz .loop +.namlen: +ld a, c +ld (par_namelen), a +inc hl +call parseDecimal +jp nz, t_stkRet ; something wrong +ld (par_blocklen+1), de +inc hl +push hl +push de +pop hl +ld de, 256 +ld b,1 +.div: +sbc hl,de +jr c, .blklen +inc b +jr .div +.blklen: +ld a,b +ld (par_blocklen), a +pop hl +call t_parseOver +jr z, .whole +call t_newFile ; load to ix +jr .load +.whole: +call t_CFSHead ; in sv_buffer +ld de, MMAP_START +ld hl, sv_buffer +ld bc, 32 +ldir +push de +pop ix +.load: +ld de, (par_blocklen+1) +ld a,255 +call t_load +xor a +jp t_stkRet + +tpcfssv: +call t_stkStor +xor a +cp (hl) +jp z, .whole +call fsFindFN +jp nz, .err +call fsblkTell ; position in HL +ld bc, MMAP_START +add hl, bc +push hl +pop ix +ld b, (ix+3) ; blocks +;xor a +;or b +;jp z, t_stkRet +ld de, 256 +jr .len +.whole: +ld de, 256 +ld ix, MMAP_START +ld hl, MMAP_LEN +ld b,0 +.div: +sbc hl,de +jr c, .len +inc b +jr .div +.len: +; blocklen in B +xor a +or b +jp z, .err +push ix +pop hl +sbc hl,de +push hl +.loop: +pop ix +ld de, 256 +add ix, de +ld a, 255 +push ix +push bc +call t_save +pop bc +call t_pause +djnz .loop +pop ix +xor a +jp t_stkRet +.err: +xor a +inc a +jp t_stkRet + +tpcfsld: +call t_stkStor +call parseDecimal +jr z, .arglen +.deflen: +ld b, 1 +jr .flag +.arglen: +xor a +or d +jr nz, .deflen +ld b, e +ld a, b +ld (par_blocklen), a +.flag: +push bc ; cycle counter +inc hl +call t_parseOver +jr z, .whole +call t_chainEnd ; position in ix +jr .load +.whole: +ld ix, MMAP_START +.load: +pop bc +ld de, 256 +; blocklen in B +push ix +pop hl +sbc hl,de +push hl +.loop: +pop ix +ld de, 256 +add ix, de +ld a, 255 +push ix +push bc +call t_load +pop bc +djnz .loop +pop ix +xor a +jp t_stkRet + +tpcutsv: +call t_stkStor +push hl +ld hl, MMAP_START +ld de, .cfslabel +ld a,3 +call strncmp +jr nz, .noerr +inc a ; 'CFS'=ERR +pop hl +jp t_stkRet +.cfslabel: +.db "CFS",0 +.noerr: +pop hl +cp (hl) +jp z, t_stkRet ; no name provided +ld (par_filename), hl +ld b,26 +ld c,0 +.loop: +ld a,(hl) +cp 32 +jr z, .namlen +inc c +inc hl +djnz .loop +.namlen: +ld a, c +ld (par_namelen), a +inc hl +call parseDecimal +jr z, .arglen +ld de, MMAP_LEN +ld b, 0 +jr .deflen +.arglen: +ld b,1 +.deflen: +xor a +or d +or e +jp z, t_stkRet ; len=0 +ld (par_blocklen+1), de +push de +pop hl +ld de, 256 +.div: +sbc hl,de +jr c, .blklen +inc b +jr .div +.blklen: +ld a,b +ld (par_blocklen), a +call t_CFSHead +push bc +ld de, sv_buffer+32 +ld hl, MMAP_START +ld bc, 224 +ldir +push hl +ld ix, sv_buffer +ld de, 256 +ld a, 255 +call t_save ; 1st block+meta +pop ix +pop bc +xor a +dec b +jp z, t_stkRet +ld de, 256 +push ix +pop hl +sbc hl,de +push hl +.svloop: +pop ix +ld de, 256 +add ix, de +ld a, 255 +push ix +push bc +call t_save +pop bc +call t_pause +djnz .svloop +pop ix +xor a +jp t_stkRet + +;end \ No newline at end of file diff --git a/recipes/zxspectrum/user.h b/recipes/zxspectrum/user.h new file mode 100644 index 0000000..1716a56 --- /dev/null +++ b/recipes/zxspectrum/user.h @@ -0,0 +1,44 @@ +.equ BAS_RAMEND 0xa098 ; (41112) +; BASIC shell records the SP on init, +; the storage addr+6 is BAS_RAMEND + +.equ USER_CODE @+527 ; 41639 + +.org USER_CODE ; overrideable + +.equ IYBAS 23610 + +.equ MMAP_START 0xc000 +.equ RAMEND 0xffff +.equ MMAP_LEN RAMEND-MMAP_START+1 + +.equ TAP_RAMEND BAS_RAMEND+265 +; for tapeutil.bin + +.equ strncmp 0x5f00 +.equ upcase @+3 ; 0x5f03 +.equ findchar @+3 ; 0x5f06 +.equ parseHex @+3 ; 0x5f09 +.equ parseDecimal @+3 ; 0x5f0c +.equ blkSel @+3 ; 0x5f0f +.equ blkSet @+3 ; 0x5f12 +.equ fsFindFN @+3 ; 0x5f15 +.equ fsOpen @+3 ; 0x5f18 +.equ fsGetB @+3 ; 0x5f1b +.equ fsPutB @+3 ; 0x5f1e +.equ fsSetSize @+3 ; 0x5f21 +.equ fsOn @+3 ; 0x5f24 +.equ fsIter @+3 ; 0x5f27 +.equ fsAlloc @+3 ; 0x5f2a +.equ fsHandle @+3 ; 0x5f2d +.equ fsblkTell @+3 ; 0x5f30 +.equ printstr @+3 ; 0x5f33 +.equ printnstr @+3 ; 0x5f36 +.equ printcrlf @+3 ; 0x5f39 +.equ stdioPutC @+3 ; 0x5f3c +.equ stdioGetC @+3 ; 0x5f3f +.equ stdioReadLine @+3 ; 0x5f42 +.equ _blkGetB @+3 ; 0x5f45 +.equ _blkPutB @+3 ; 0x5f48 +.equ _blkSeek @+3 ; 0x5f4b +.equ _blkTell @+3 ; 0x5f4e