From 46ca8560e2c143e210be5db458fb1b2d5d8cec15 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 16 Jan 2021 21:40:04 -0500 Subject: [PATCH] Title screen, screen editor, and new slim loader --- NeutTower.dsk | Bin 143360 -> 143360 bytes asm/asm.fnl | 10 +++-- asm/prodos.fnl | 2 + asm/vm.fnl | 5 ++- editor/brushedit.fnl | 17 ++++++++ editor/brushes.json | 1 + editor/gfxedit.fnl | 1 + editor/init.fnl | 35 ++++++++------- editor/screenedit.fnl | 96 ++++++++++++++++++++++++++++++++++++++++++ editor/tiledraw.fnl | 30 +++++++++++-- editor/tileedit.fnl | 3 -- game/disk.fnl | 54 +++++++++++++++++++----- game/tiles.fnl | 2 +- game/title.screen | 1 + 14 files changed, 220 insertions(+), 37 deletions(-) create mode 100644 editor/brushedit.fnl create mode 100644 editor/brushes.json create mode 100644 editor/screenedit.fnl create mode 100644 game/title.screen diff --git a/NeutTower.dsk b/NeutTower.dsk index abf5934fb545ec64a32b950211e0b8528a6fb82e..47982632d189e8b108ec87351f36bd24faa5c2e6 100644 GIT binary patch delta 10150 zcmbtae{ft?y}z5bG_>0;IBY?EJfjjYTLMK>QmPM9u~b5_u+1hATAHQ>+Tia;HTcrK zcN1bT5({UuRa8tV{%AH+zav^zeNpDJXhC&f%I1jy#+ z+@aaiu9MGBi`gar6U)O(Lnq2^om;6bp)`ypZ%Hn@PV1}a`PeF(pOjh`UIFtgbe_pW zkV3WqK?;)t$Fy2f5N(NAq9zfms;*pHwKmbd`4%lebG$7ct4@>@z?qVah8=NvW0VW> zy=S1Y>w+N!7#Eh9c8dkDE#ZnpLn4m5rgCj%b)r3bb0Sumh;2{AnrqtX8GI1Vdoxo%JZ;vWb`%_uWhC}OJLoIA~&!5qpR zlnvvE0R$(qVV2xN77+Z60NU@H?P&7f3O-L{5r%~kSVLq(K?I@5hDrB`RzdS80b+^z z=7#1N!VUh8wluXLu$z?U(c?`_t==;|6m&WU5Q5SnhhEF($5XAP!oHrJorE1uyFWqyj5{mS|{Z7i82e~ zRd+PUVg72QVQUj*L3P#kSfa5Zwzddxd-IM~+sxnN%(*fPCdmTRL(m>~#v5p|K)V3= zM;Snu985qYBH(5K(e=t5+AV&wdhK3`Kr;R0EaF#Xe71EDel!cxDHsRzcVhAAqf0OKkp4+$uS{y_oe zF`yj2z&j)1R|u$L02UB9V3Sk<3kYV~;2WaJrr3qCC$5A803JfcA{-F<2L#YKkVwRl zjtIid_AV{XJRA_7R|p3_15Y?YNx}gvJrsoImIy(w{Ww7Wr#lz}1_xGjT%XwB!-1HY zPJQPsF-R&e9eYaQ!0)rOGw{BL122tamHtHnU^N5|toN;ki{U`lky;DY)lZK<2;UHv z@F2^F16qGi02%Rw1I-Et#A>K;0QEt!6N=)W1OPC3I53HH6V~c3fdh6*8PXF#4)$;W z5pZre06X9^^BGqyh6A<+0(|C=fxM`QVsHUfL<$EGhN>cpnaMqNoj^Z*rAQJ3NCpR{ zo=4hI#_5Xaw2h!GuF1@D9AMJB2o6wwc!Dh0>OMO@CzdCOsbat;XcPs(8~7|>0Wpn; z2AaNo*Midq#9VL`c+M4072|-7@;FcsND*Luz-}YfJz9JKyug8Iaxon6mU;5Quw0x3 z4$KB|z$`%m2W%J7=`RSB2}mb+o5Y}dMaM0$fPMlk*4c*xC{0YDLx6epK<6J(1po&o zsUEOJLGYr<)_@DBDlWo-MAafyacX`l9x^i{2!R7|wj7o-X!32zbH#y_GiGwi=O|H< zVlnD;!3*`ki%3KJY#~?>;8j3?#c{w0?PJsFm1Tqijzf!)xD`J5cSg3}8l5u^=*i|& zWhtL1^T&uD9}wFb2;duu1GGv9ETAS)nb1mzaUu6Cwjl+xOSTOZs%^5IS_>e9a7{wu zKy1AzN?R!rb!rAgK_#f;Nzs(Rg@tiI#Gix&Y?XCY8nl4NEV1I_cC_7Ah9=|qx# zxw@PeymVX;2W%w941nNyfdexpTZ>$vS3|Ho*VRzQp5t_y@RM%St6{IGitS-&fEXxD z(%#IJ#TcqxKpKK=1GZ&X$tR>)_&Jq#3{7%o*6;|=UD1sIn= z>Gqh+^$7rW%|OD+5<8>DQadBFGZehV&!K<-ur}063I5`>S`N`(2nnygvuJ0uzKs^A z`23yGydcDKgfNs9kzlOtl{s5uBvk9tc!?mq=3P~>wbxc(cm28>-u<4M^*5$NWm8l* z!ty!|60y2RFK@T0I@324^xrZva6$+706$=IH5LsaQw3{;LxQf3PK*xQ%Z3}qR z&&4tDFPW3s=`!cHlk(_{&hBu2dqgXx`I7)(qGLS~3$+6WyeKHH(z3$!Vt;}fm>3dhId{1&H|bbgDYvywQ_?XApOlpf~=12Ls=z|^cN z2yMur1rU12uTEf%s$a8S;Q)yQ9FV8i+G~QAIJXl^hQI+B+ZQAAaiE}}82Wnxh-n25 z2vLfQg!(lL;6Mhe^za#p0s#>X4xIJjKta|BGh)L^`UeH@;eaXHRohj?m8q2OvQHC0heQkp*<2C~!dhN0K@^ zD^(9<4E&Mm@^X%tnPG?gBmt5qsxDkmxcXNki3CD>g9BpA3?Pao+6V{gOB9MKxHW6n z?V_@IKmbt?2TU2FPA^@%RG}!1eEyq-j59SLW5MVSt#KP12p*xM-(GmLK=nYqs0V^L zpf(E$IkoRsmm|gwJqzN1SdPcBQrI-O_#UAOIR_;+!7 z*S6QwwGI5}_7IEX{4sR;4f5Q=X3QIn7$p zb%3WYDFgi!X9qw&&Dp0w+By3)$fKOKgM5awM?wCFv(JEZs4ot3)&ct@N7=!R>5U)% z8B1jQB(`vUZ{q2DJsv(fWO&OQP17(dz-Vx4GZIO_*F z%vlEHi<}(>`4VSe1bLdXFM)iSv!_A6!r7NWzRKBGK%U|3s~}(F>=}?JIr|zI9Ri~i zXNSzWqL>$1hPjNPY9>&>IA`GuQ zYW?`itDdngnHYQH`0@%Ko+^KJX~nC{E5;_a<|ByL{|trGjXSToEd2GokN?mLb?+9x zEsyQpYK7BJ?Obvw@!dUzr60X5tjg<}lvTt4F_}^Cdy_d#X z8^u_R2w8)_z}u63t>W!Lnlnjr+7a+^h);^Xu&s{B)J1%&V9^=LB#(DRGPYnM|I!JZ zG5go)`)|AL(lt0e2V_y8r0!tLq}44ZkC@B^>tu zkyOQ-!xbCC$H-t6cFn5L_gcH1QT&h<#Frtbh&z-?c6noH5|V|#_YCMIN(WKxtQ8Al{ZaVMt7sK>=SSaE4CHFd?wlY?bfJkZkJ z@?_axc4L6*pE!B)i1ode?$%NK?EXe;cMIN4Ozg|7arR|W#uw=6Zr#_t=Sb)HH^)PF F|38Hpt2Y1u delta 11675 zcmZX4349b)wtn@Nbe2v!X_giQE)td?LU=A69h^}>O|W<)sG~lZH|>H3)X^E)iPH&m z#Sl`RqJxAjP&BDXWvHZM+&Y-C5fZy1BqggXzJXCPVP*_vAm9SzeYZOJ-v9j@emPZl zzvrBLmhV>4S$ol0dpOx*vQ$3ncQ=i(JYcJInwL~QZ_h}0l9|F(|3}kB`#olpxoKR= zsk=QPro}U+nn~%_t}2N{wd?i{E9poiS~sm(Sg%4$f4(`Pa>Ad!48EyWssT@s2PyId1L`i-XR1{H;0gLr^2gjt(;s4$ z>KmTmAMv`_6MO??i6^)iWT_{(1Z0^fxD;f$C%6n`g(tWiq|g&w0rI9NSO~&24YO1ttJy5CEdx8qeL{G3DJKJHZG?_iY z9ViKUg6lylJ;5Nz22T*r>f4^+29S-O;M*Wop5R8+=um~X&0xhQuwu)7m6pwImFiZ| zEue}gw8s?uGg|z`6KnwqdxC$#Tn*sjPEW7_B_U66XMCU#-fBF-T_BPtSQ9Ul@b-=; zSPQb-6MP3m_5^o>)Omt3$e%sII*=Am=wnlGFP=I)!9yTXPp|_MeS(P^J;6^<@~$V? z2-4&Uz6-DUmyl*Pg@0WXWpsSsj_Z662uZzSYXXV*c}DvUrWqsT?j=P1+cF zKH1z%NFn*bw@5vy4U(Ux?=P+-DJ3LuolN0|O*GpIb5zCT(>W;Bz;IxOWjxhPb+=lu%ZiiavLt;9h(>%)ms zTCIcZ`B23DH2%;}W(a~{;(BR|MD)qx3K`4&8&#wHIY%zid`nd~BOEYC`GrjqAh{`6qy z{?8fqk3KvfY2AOc^Dsl7#J0n&t<8+IsP+}|r$Unarku%Tq2kz))&nShv9@5Kc!W{x zJKA}4-$B~mz2L<>>6HZqb+iGS{3d&54FvV@QXYIU3-`;dCFgv;^|0QkG*0F_S|5B}uZ0JI@;f@_RbPER0O>d`~8Wfv`F?mYP)PKA4uDkE?hEwor2M=L)4k{ND<5m9vG{ zW4=NzQ#n_7T`S~V%HImFe_6;43LkCP{)SraHLof8g>I+#KoQQ0Wqir>jmDWVrEdZa zncshnkT=_%-+M!elS0->A@ih=>HXKVVX|oG>1Ew%RG=uaUHd^d)7pU^Nny2FFfUAC zO+Qqs2Ry<3Py6O?Oy79@!REI=eDH~lzkT2?FjBgtI>TUeGdr za(naS8cbB+B|DotI>k2iVCxa_Nb5nUOzQy#swdmX;zIczbd+aMxqy>vmykJy>^+p9 zN>}B-KYZ7N<_*t0y!T=C;mQ-O*}(%aU~QgYE68V_U>iux6Z{NB^#o%e?Vg|t^0_D2 zuKHGxA*(PT4w2cyCt9fGNYWhg@92DY)A?}9pT2g}l5u-s*jP-A^cS+-rDh)LQy4s1}hkYtZtSs=@38yN9?QjY)3;O+K6fg*>-j`2fPXU-hxJVNc4cmSFS#XLhblNOvgL#2IEJlZ)>CGI}i&>@ST zhzywl2S)u@3fb65&B)W&WX6lZ)5)9flIn;w4ED!&X%$IWMGX++f6{LvJ3b_{R=|Xg zpzb1DS2fK=27lltA5_p0PS?YNnY2M@Bj=Mvg3OTYAS?}ROm>$^GPMp9T4-m&y&rZ< zPr@59oGJI`&KR9NwH`jsLe4G=S>yv`x9?iJ_Pv)EuDZSGn64}o_=f~?cSGk)fnEGA zdtsTG8VghnMq%uEK`9XUn{7H~3SNt7W>Og@_xuytH{1)J$UT3aJLMIb$WF82=VAv% zv(W36PCRs6e~9kvxHCy~Hab)*D+!{x(c#PXX?I9{{4qhgoF_fO^??tU8!zk0**>(z zAnPy3w2NJRQs1Ftg3wjKUG~CeQM>=_dX<4`9};3Wt|#||6ug`DsZ^B1aYmuKkRts1 zq~$m^(4R!PpWCfjy=26IK-D8~Pjh_hr9`I%QA35dZHUuCeqSLCAzM~RBa@RC=GL_^ z`D1V8>nmDJ`C~^o>MQiq(yjUZ_cQs`OujS%Pp158Q-05pfM)4A8t}T6ocvd(=4+Un zpPDacXesI#0Ta^~=b`s1bT^-q&;2~~2vff9JE+{9&kga)c`VmJS#A8nS<;hO^YBno z&8gDT(sG9&4dYV<*~*6 zX>_bliD^G{rFEsYYrS5EkxY4H`G*CZi9EARa&p6Rbzf?T=`O48w}0d0j|Buv&+!2H zGQbWBD8~YPV+EO1QQuf0jjU!;xn5~VwJDXm1oP0<*V9;m|I!@I+%~suPR}x4S;j+P zrdh3L!VWwnNONp+bqia~OW)`j%DWX@uhLY(U6NB_J;tq44hQs6HGO`Y4{NnHTJvHD z4+n&+HBb0$dkzOm3)Wjpoj)p9)^S$l>N?J*90`b{*IQ%C(ZG5u_CbIDGbR=(jpR+K z{JRhyZ%*Z#Dx|)=ftd<0UrL3Xip{__)L|pt+K+Cfp@O%iE?mj`8Y+}<1)q?*km17_ z{8C<7!fTd}rF_Q{x}Su!CH&;2JUtMv^U52%`_&~p{|2ut=3iaP^NVSP_B#FB@j4GC z$R>7txp88!K!chXRDNEjZsIMBi+a_8VzV?zhJR+#G4{ zx5oqAT(p{eJTUnL6{Y*t#tJH5JLC&pMcMHH#tYkg9VY@gLopa_v@o@P8UM|h@bLe$ zhLor|oY=FD?`H2P4?xuGz#?`y<Cc;I(`u&wgJnJ!Yf&HduO$U&%{z_*J|#moGHLvz-1t_$E(=Hb{^2 z;~GRuvE!!mA|r1vhi2f!789{gYSQo9Oh9pgAvektN?$bV}vV)b%0snM)L1fg!Vf^3E5tyQSw1)e zHozO&c%vL6tmCsk&Hq$4%SH7Q8?bBPsO}=4*0X74U}NleWy%X>Z~$&E`&I*EGFzQi z>yOtGZY0G0fZ>#=hPIt*J4H?`Gc0~i3N`e6%px-S@5RANrv+Zkoa=3LZ2kq~i$&c6 zJrFj?+DctR$okbYWx5R!X~@>{cp2?C60UGyQI43!7%AJQk5QfaDAgilh@%=EBD3Bq z5>ON6$7AcQ(wrEc$`1!NxfeW!?U)wK;pPbDuDRIb_v^UFu$i@$v~1i;fkpgcrecs216d zMr6+(5wdP{ znFG$wjbTMvYPo7DZ@2g#^Uv|mjmyE8KvveXBg@F2>V@0XN3=;eCd#;m)-Tl~M~^TC z&I}s#)Qaj6k>+!)2kMO|NbKl5A)bisJBlzz%Hln1mKp+fv-9{-Z?7n@6>!J&zx>Ovi~auGa3aa86%8V zJZllZ&M2(UU3=D{Th;x#SMAV~)dTwP$bJ3nf0QD$qTyG^z@VQ@;ioXhD&%A?OHPM$ z%<@Q%A@?i_e-RMP2uT<-!WeV5Z}U#G5tj5sM~3Y_S)}jUWw(%qA?1FA6d1YSeLxp~ zeT%FWC{}UTN{SpLAw0+z$Peq_(T?D3Qx%Cbab&Hjg-Ozf(k#Ke@@Bk-mmP1>cr6~8 zg)Qt~N}wI?fmR679J$1Yzzz)$yu~hgiyi(})(I!6pNW$qPx)%5MYmQzWa*A|M?`b= zObZRAE(K;h9W=z^3i>V zKWjY-5Q1GU1qGqH>C(RZut5oa5+d;EMPYMr> zSm?Tu@jP@)xBF;R>;<5~C6QB&nCZ!ZIlxE6#T#BgkqN;vZI*|V77uoRGr&X2;t$Et zm%!FBStoKvQ4@+oCo-xP=i!E)Dw@?F^#t{rZWgWn%l}8B_%z!0_k(C4PJU+l#$Fh~4LUzWLXMp1+IddwVbTin|ykZ8n+M40iEHQT_Er{Rdim z?(gR=^wihmkRZ(;wUp+Sc0RcT@oiEG)Ec?H9a`-!A@>(bS5&)pi{ksdSRX3wRl^Wk zB>NiH?IOcuR^gD1>9>)gvS1-+xUN3@i)iMq=8ohN9SQLop;1XH;rhH%#J$kYMPS&P z2{T`~C|y-=hev&@0a#gREG8kksk@Bkv16O%`{EP}V5j_K#3QoL0_9w#76LqQ3B z7XI$`qQ2D+c<6Jqb)!k3m9`H5T>(X-R=;ooxtyM&YQAuS8Wzm5=Jwi`+ffhnh5yVy zflrEt5?c=V-<}3Xpsb7HKSdyC)ZWkAqlZ>UC%`WE8(WZ`b3O{=n>?FOnQbg`G!~gO zTebq8q}b$S%q*MnvWULjmMom7z!e&pXagV063{}p;)O`nV$F=zGu*Q{A8OC#^SwQb zDrqKW82f9%ylkCcR9TRnu6M0>i0LrgqPf)hy_nJH;3E9Xl`!vs8(*nZ7FB}rL)9E@ zv=N35mBTItA#_Ax&_GT@ObW@`fS39fRl>WXefC9_XfKFqZRnNjo{MXKlCR)Sw(z;YyhdiNZ1v{w{a$*=)er9SY5m_6eB(vO~ z-_P?KxJ0tPf%qN?!Daym2DXthiQfR9x)q44U49O_$~II|gG7If{5(}&z-cG7S78j0 z;spX5!q3;XycdmrqFHNp=RB2XG(OOJ8?Q#nTB=<}HzR?kv*{);SXD+7l1n+ofaQ|qLHwGX zgk3>aE8!HmpDg?cU}(phon6Vb$=^7`Dax9i+F8IxZ0=6FpwpjyrF_;2r}wj)V}N0) zpXoNr8Xp5Q2fsw2J`>Cr*|pPf7f!90J-f_HUiu*XqdbiY1j(N@u4smqQH3~5RS+xF zen5bfo^%#bPg?d3b&!@Qy^Ms5-jZNYh1Vz}4I1Vyuk{qFN zCYYRr-1AM{+Lf}>^;UM6Og1!-;znT0SXQcZRky2i_0Xp#U+wKJ$hHx2WW@Xw!jOx& zjGHh<9L0DfgoC(Kk{T9WZop@26cv(-Nl=67?($ZR~c(hlbx&Z@}jsttAgh zKeraXR(6W|uc@4?BeKPS)hd1aiz!+Iut9L!v9>!9WG^nnnb-%IAP*ueh#f?-q^k|O z%@FB?u!TIeLK>{y!fv}Jo8#bI+}BNEP{}^E!V3u*NVQnQNX@Y5QUrhC_JAmW;Rqv~ z6dVX85!()&0$+#`uanFj;n~t9-nxV0IB-&MIwUlr(NVo*T4}rUYCS4!JGu-A39z8- z;4Zb%7esS|ASa)058VZ(n?nhK>C?Kdut3{hfdgbpE0 zC3eT!nw;Ocy=Q%lew$p6t-|P#ZP%o+>R_SETj0&}_u6{(s|9%v_b!V6=XwjW6O;4E z@2U&j3r&IS?c61_7;b>E!xtvN6-mA7n6MK-Th?x+w0ivncYXGDFCz~Ho4Uq;Eo#T{ zeFxP8&EgcmKRF4cWmRt2XCbS$w~c{v=Z3%VN`v*E}zc~#TzgYuk*S+CcJsC%^2 z6qCy|a2I_Xo3)J{zYT$+&_g246w=| zNY@Z)2!@MxWySD|mJ14a0017`d9+Y+Y8C^d_rb0tARgttG=icEoMLFSjmAFz>?zs; zY@>LK5!;UEu9C^C3*jTHa)u zT!5BvPPp;g6(5NBjLU$V82N2D+>8MggYRpjEqt^k5Oq3Q%A=5id^>lQl>zR~mlx6* zljbL6j&n(_oIZZmR$SubZmrG zFW#aQZHeF7-3&67;w@T2ebJV7SmGm)F2Hg!;-&Dj&<;Y49Ccn#kop&eUS!*kdX1B5 z97|0PtDU4Hrre=t#4D3 z&RbpVwcYYdl;6h1TRISvgSt&Urd{mDGTh#fg+j-xx2Pug96-lQHdE+$^%k6xHCv38 z?QA~YdRT2ciHjA)M*}Q?N$rrlc`x6`8WZaS6R52&i>*gF8T$WGj zrCA4*eFhx|cgZU7HgaxNcqq2lv875&hf%iBcw}ppJb~X*)#X6ekS3+I_6bQHJF28_ zv?M)Q*;=LBv=2JAS4m^}>MCUL+p54DTT94>gJ4%9dNQ2GA-SJ_~y)!W1k*S4;xp!CyfN3?xtr$_>P<6q4{;+CSEinEr?mbQy?59j&J~c z2q(xd!u?S|342P1t2M&JGzbQ>3}q`7_`-C|32*B&?o2MNVoP=sbwl_rLY~}6ZJWDU zwsE&nmlND*$J>OkP1#Ic1;JRt`LFdxmCz|s4J)C-vXp^V92zE4EMi8^{oCJ z3iFS{?QG`Y*-GnQ8RYAchH9>B-tu1wla;xIzCg?r|(^N+H!% zGG#mUE>r239HW}(qm}xV>6Ft{b`a!WA~c#B`Vyc~XzF0?R%tkN87*mjaAWu*;w#t~ zZlaR?PTNCe3pgTh{po88%_i{G0lnx!c6@w8_=5ZbH3D#dBj|-`CN4z7PNQB+;CAB_ zKg(8apc+T7JDK?i^(YZ;8AzXHYErS#vCR|&!A&0%x0gQQ6z-4Y1@r?93pZWb%gw-8 z4|9)jGm+;#q&!fsYC^(5y86p{j`E3ym}d-}ieb-eFkUDg7EeY7&PxLW!){TvfamI#ShlbFsd?RJox(qqr{?+e1Zdxj^NheChhVeCe)kk-^)+(p>`Okz1V?9;H4Qc19Vb+>>Fy za)fmCzHrKBFpm1WBjGH0u4ZX5J;Pm9=i)lHNeRs@xmxEIz__p-uemUXCO2*f6YaQE z1Qbou=VQtVQlb~PIL|Q9oUj{+lFyrXQIm+a*Hq*WW%mpuXwHT0zU7# zuv<$y8y{ll22`!xCD^ep3%g^3H*meC{6-BDsEEHga_!^Ij4N`jWivAot6~i$cWKNV{e8a93&Q zi$vp7o6cj0_qR4P>?3uMK?)RY0QqB-raCUm2xp|hPU<2C(kH*G@dE#DUCzC5&I!oR zr)sx}w#Ey3HkXOs2XIX~kT}Djtu7>A7m9;4ULuPiynjzsX40NWXrIJ;( z!mT|!MY&(I^@K$EMjma&Y+COqs5MnHNnR3?d&Ukz7(Q+gzA?b*?8X(;idt}FWi7rq z!8&sEbYz0l#mqQ%CE(~dZvt82OCsa*pRPF_VKTVp2;<};wq_t%G*!c5({FYP+qzCW zPh!=Sn{)-hK{N|+kWJv}>GBy;`AiA;7SuvbhaJ_l5#mrhn_(|^y!DMt31Sk4S3HL`|`A>@@ z<>Gi(=*yT|KD(B`y*AGNtXh6zEkB9A@nem@<7#Q}IKH-gLM=Hhg@-~N5l|}VHojIt z^9i*+lnaxTY|68V;F+8WJTN@mV4aqs+)m3U)pC1fCoQ+IFV(V-)(!-nkwfEa0VFpc zno#T3$Hcn;*Qkw9EjUdE)haWjLt|?-O_?bj8ds~uyft4*k4AdUR74y@=9>%rD?9v^vXo7~TmU6R;eXK@Kz)Ek_HLivAZ5SaO)l18sTVK^YIIk}jhYaV`+-5yD79U?qIWC4>*!(^()jD>LTh@u(zJin zU$1FlAX5w=Mbrd+4Bu}|0K@qaPGvpb7;Lhmzeee=Q4_;GSQWr=H38P#gykYHp!+I{ tp4Gp&1cp?gbxlX=T}ohA~32nwQY>3n{;U>gvDN{?#<+zX96{C^`TD diff --git a/asm/asm.fnl b/asm/asm.fnl index 51b8760..f25b3c9 100644 --- a/asm/asm.fnl +++ b/asm/asm.fnl @@ -120,9 +120,13 @@ (fn parse-dats [block dats] (each [_ dat (ipairs dats)] (if (= (type dat) "string") - (do (tset block.symbols dat (+ (length block.pdats) 1)) - (when (= (dat:sub 1 2) "G-") - (tset block.globals dat true))) + (do (tset block.symbols dat (+ (length block.pdats) 1)) + (when (= (dat:sub 1 2) "G-") + (tset block.globals dat true))) + + (not= (type dat) :table) + (error (.. "Invalid operation " dat)) + (let [opcode (. dat 1) parser (. dat-parser opcode) pdat diff --git a/asm/prodos.fnl b/asm/prodos.fnl index c46560b..67e641a 100644 --- a/asm/prodos.fnl +++ b/asm/prodos.fnl @@ -6,7 +6,9 @@ (local lume (require :lib.lume)) (local prodos-mli :0xbf00) +(fn Prodos.str [str] [:block [:db (length str)] [:bytes str]]) (fn Prodos.install-words [vm] + (fn vm.pstr [self str] (self:anon (Prodos.str str))) (fn prodos-call [cmd param-addr crash-on-fail] [:block [:jsr prodos-mli] diff --git a/asm/vm.fnl b/asm/vm.fnl index 066b064..12da712 100644 --- a/asm/vm.fnl +++ b/asm/vm.fnl @@ -53,8 +53,9 @@ (error (.. "VM can't parse " (fv bytecode))))) block)) -(fn mk-vm [prg options] - (local code1 (prg:org 0x4000)) +(fn mk-vm [prg ?options] + (local options (or ?options {})) + (local code1 (prg:org (or options.org 0x4000))) (install-vm-parser prg) (local vm { :IP :0x60 diff --git a/editor/brushedit.fnl b/editor/brushedit.fnl new file mode 100644 index 0000000..5dfb8c3 --- /dev/null +++ b/editor/brushedit.fnl @@ -0,0 +1,17 @@ +(local TileView (require :editor.tileedit)) +(local tiledraw (require :editor.tiledraw)) +(local tiles (require :game.tiles)) +(local style (require :core.style)) + +(local BrushEditView (TileView:extend)) + +(fn BrushEditView.spritegen [self] tiledraw.char-to-sprite) +(fn BrushEditView.tilesize [self] (values 8 8)) +(fn BrushEditView.tilekeys [self] [:gfx :mask]) +(fn BrushEditView.map-bitxy [self x y] (values y x)) +(fn BrushEditView.filename [self] "editor/brushes.json") +(fn BrushEditView.get_name [self] "Brush Editor") +(fn BrushEditView.draw-tile-flags [self x y]) + +BrushEditView + diff --git a/editor/brushes.json b/editor/brushes.json new file mode 100644 index 0000000..8a62058 --- /dev/null +++ b/editor/brushes.json @@ -0,0 +1 @@ +[{"mask":"FFFFFFFFFFFFFFFF","gfx":"D5D5D5D5D5D5D5D5","flags":[]},{"mask":"00008F8F8F000000","gfx":"00000A0A0A000000","flags":[]},{"mask":"00008F8F8F000000","gfx":"00008A8A8A000000","flags":[]},{"mask":"0000BCBCBC000000","gfx":"0000141414000000","flags":[]},{"mask":"0000BCBCBC000000","gfx":"0000949494000000","flags":[]},{"mask":"0000000C0C000000","gfx":"0000000C0C000000","flags":[]},{"mask":"00000C1E1E0C0000","flags":[],"gfx":"0000000000000000"},{"mask":"3E7F7F7F7F7F7F3E","gfx":"3E7F7F7F7F7F7F3E","flags":[]}] \ No newline at end of file diff --git a/editor/gfxedit.fnl b/editor/gfxedit.fnl index a7336db..3febe48 100644 --- a/editor/gfxedit.fnl +++ b/editor/gfxedit.fnl @@ -16,6 +16,7 @@ (attach-imstate self)) (fn GraphicsEditView.spritegen [self] tiledraw.tile-to-sprite) (fn GraphicsEditView.tilesize [self] (values 16 16)) +(fn GraphicsEditView.tilebytelen [self] (let [(w h) (self:tilesize)] (/ (* w h) 8))) (fn GraphicsEditView.filename [self] tiles.fn-tiles) (fn GraphicsEditView.reload [self] (self.tilecache:load (tiles.loadgfx (self:filename)))) diff --git a/editor/init.fnl b/editor/init.fnl index 12f47d9..e392731 100644 --- a/editor/init.fnl +++ b/editor/init.fnl @@ -2,6 +2,7 @@ (local util (require :lib.util)) (local TileView (require :editor.tileedit)) (local MapEditView (require :editor.mapedit)) +(local ScreenEditView (require :editor.screenedit)) (local PortraitView (require :editor.portraitedit)) (local {: cmd-predicate} (util.require :editor.imstate)) (local core (require :core)) @@ -10,26 +11,30 @@ (local common (require :core.common)) (let [commands {}] - (each [_ name (ipairs [:tile :portrait :font])] + (each [_ name (ipairs [:tile :portrait :font :brush])] (local cls (require (.. "editor." name "edit"))) (tset commands (.. "honeylisp:" name "-editor") (fn [] (local node (core.root_view:get_active_node)) (node:add_view (cls))))) (command.add nil commands)) -(command.add nil { - "honeylisp:map-editor" (fn [] - (core.command_view:enter "Open Map" - (fn [text item] - (local node (core.root_view:get_active_node)) - (node:add_view (MapEditView (or (and item item.text) text)))) - (fn [text] - (local files []) - (each [_ item (pairs core.project_files)] - (when (and (= item.type :file) (item.filename:find "^game/map%d+%.json")) - (table.insert files item.filename))) - (common.fuzzy_match files text)))) -}) +(local fileeditors + {:map {:view MapEditView :filefilter "^game/map%d+%.json"} + :screen {:view ScreenEditView :filefilter "^game/.*%.screen"}}) + +(each [type {: view : filefilter} (pairs fileeditors)] + (command.add nil + {(.. "honeylisp:" type "-editor") (fn [] + (core.command_view:enter (.. "Open " type) + (fn [text item] + (local node (core.root_view:get_active_node)) + (node:add_view (view (or (and item item.text) text)))) + (fn [text] + (local files []) + (each [_ item (pairs core.project_files)] + (when (and (= item.type :file) (item.filename:find filefilter)) + (table.insert files item.filename))) + (common.fuzzy_match files text))))})) (command.add (cmd-predicate :editor.gfxedit) { "graphics-editor:save" (fn [] (core.active_view:save) (core.log "Saved")) @@ -41,7 +46,7 @@ "tileedit:copy" #(system.set_clipboard (: (core.active_view:tile) :tohex)) "tileedit:paste" - #(when (= (length (system.get_clipboard)) 64) + #(when (= (length (system.get_clipboard)) (* (core.active_view:tilebytelen) 2)) (core.active_view:update-tile (: (system.get_clipboard) :fromhex))) }) (keymap.add { diff --git a/editor/screenedit.fnl b/editor/screenedit.fnl new file mode 100644 index 0000000..d4afc8e --- /dev/null +++ b/editor/screenedit.fnl @@ -0,0 +1,96 @@ +(local GraphicsEditView (require :editor.gfxedit)) +(local util (require :lib.util)) +(local lume (require :lib.lume)) +(local style (require :core.style)) +(local {: char-to-sprite : scanline-to-sprite : screen-y-to-offset} (util.require :editor.tiledraw)) +(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton} (util.require :editor.imstate)) + +(local ScreenEditView (GraphicsEditView:extend)) +(local screen-scale 4) +(local screenw 280) +(local screenh 192) + +(fn ScreenEditView.new [self filename] + (ScreenEditView.super.new self) + (set self.screenfilename filename) + (set self.scanlines []) + (self:reload)) + +(fn gfxshift [byte offset] + (local pixels (bit.band (string.byte byte) 0x7f)) + (local color (bit.band (string.byte byte) 0x80)) + (bit.bor color + (if (> offset 0) (bit.band (bit.lshift pixels offset) 0x7f) + (bit.rshift pixels (- offset))))) + +(fn brush-mask-at [brush xoffset y] + (values (gfxshift (brush.gfx:sub y y) xoffset) (gfxshift (brush.mask:sub y y) xoffset))) + +(fn paint-byte [src brush mask] + (if (not= (bit.band mask 0x7f) 0) + (-> src + (bit.band (bit.bxor 0xff mask)) + (bit.bor brush)) + src)) + +(fn paint-byte-at [screen brush y xbyte xoffset yoffset] + (if (and (>= xbyte 0) (< xbyte 40) (>= y 0) (< y screenh)) + (let [ibyte (+ (screen-y-to-offset y) xbyte) + srcbyte (screen:sub (+ ibyte 1) (+ ibyte 1)) + painted (paint-byte (string.byte srcbyte) (brush-mask-at brush xoffset yoffset))] + (util.splice screen ibyte (string.char painted))) + screen)) + +(fn paint [screen brush x y] + (var result screen) + (for [row y (+ y 7)] + (local xbyte (math.floor (/ x 7))) + (local xoffset-left (% x 7)) + (local xoffset-right (- xoffset-left 7)) + (local yoffset (+ (- row y) 1)) + (set result (paint-byte-at result brush row xbyte xoffset-left yoffset)) + (set result (paint-byte-at result brush row (+ xbyte 1) xoffset-right yoffset))) + result) + +(fn ScreenEditView.draw-screen-editor [self x y] + (local (w h) (values (* screenw screen-scale) (* screenh screen-scale))) + (activate self :screen x y w h) + (var screen self.screen) + (when (and self.itile (mouse-inside x y w h)) + (local mx (math.floor (/ (- (love.mouse.getX) x) screen-scale))) + (local my (math.floor (/ (- (love.mouse.getY) y) screen-scale))) + (set screen (paint screen (. self.tilecache.tiles self.itile) (bit.band (- mx 3) 0xfffe) (- my 4))) + (when (active? self :screen) (set self.screen screen))) + + (for [scany 0 (- screenh 1)] + (local scanline (or (. self.scanlines scany) {})) + (local ibyte (screen-y-to-offset scany)) + (local linehash (screen:sub (+ ibyte 1) (+ ibyte 40))) + (when (not= scanline.linehash linehash) + (set scanline.linehash linehash) + (set scanline.sprite (scanline-to-sprite screen scany)) + (tset self.scanlines scany scanline)) + (love.graphics.draw scanline.sprite x (+ y (* scany screen-scale)) 0 screen-scale screen-scale))) + +(fn ScreenEditView.reload [self] + (ScreenEditView.super.reload self) + (local (loaded screen) (pcall #(util.readjson self.screenfilename))) + (set self.screen + (if (not loaded) (string.rep "\0" 0x2000) + (screen:fromhex)))) + +(fn ScreenEditView.save [self] + (util.writejson self.screenfilename (self.screen:tohex))) + +(fn ScreenEditView.draw [self] + (self:draw_background style.background) + (love.graphics.setColor 1 1 1 1) + (self:draw-screen-editor (+ self.position.x 10) (+ self.position.y 10)) + (self:draw-tile-selector (+ self.position.x 10) (+ self.position.y 20 (* screenh screen-scale)) (- self.size.x 20))) + +(fn ScreenEditView.filename [self] "editor/brushes.json") +(fn ScreenEditView.spritegen [self] char-to-sprite) +(fn ScreenEditView.tilesize [self] (values 8 8)) +(fn ScreenEditView.get_name [self] (.. "Screen: " self.screenfilename)) + +ScreenEditView diff --git a/editor/tiledraw.fnl b/editor/tiledraw.fnl index 660d79f..0705d39 100644 --- a/editor/tiledraw.fnl +++ b/editor/tiledraw.fnl @@ -70,6 +70,28 @@ (fn tile-to-sprite [tile] (if tile (tilestrip-to-sprite [tile]) (make-canvas 14 16 #nil))) +(fn screen-y-to-offset [y] + (var offset (* (% y 8) 0x400)) + (local ybox (math.floor (/ y 8))) + (local ysection (match (math.floor (/ ybox 8)) + 0 0x0000 + 1 0x0028 + 2 0x0050)) + (+ offset ysection (* (% ybox 8) 0x80))) + +(fn draw-scanline [screen y ydest] + (local ibyte (+ 1 (screen-y-to-offset y))) + (var state nil) (var prevpal nil) + (for [x 0 39] + (set (state prevpal) (draw-byte screen (+ ibyte x) (* x 7) ydest state prevpal)))) + +(fn scanline-to-sprite [screen y] + (make-canvas 280 1 (fn [canvas] (draw-scanline screen y 0)))) + +(fn screen-to-sprite [screen] + (make-canvas 280 192 (fn [canvas] + (for [y 0 191] (draw-scanline screen y y))))) + (fn portrait-to-sprite [gfx] (local top (tilestrip-to-sprite [(gfx:sub 1 32) (gfx:sub 65 96)])) (local bottom (tilestrip-to-sprite [(gfx:sub 33 64) (gfx:sub 97 128)])) @@ -79,8 +101,9 @@ (fn char-to-sprite [gfx] (make-canvas 7 8 (fn [canvas] - (for [y 0 7] - (draw-byte gfx (+ y 1) 0 y))))) + (when gfx + (for [y 0 7] + (draw-byte gfx (+ y 1) 0 y)))))) (fn TileCache [tiles ?spritegen] {: tiles @@ -108,5 +131,6 @@ (tset self.tilesprites key (self.spritegen (. self.tiles itile (or ?key :gfx))))) (. self.tilesprites key))}) -{: tile-to-sprite : tilestrip-to-sprite : portrait-to-sprite : char-to-sprite : pal-from-bit : pal-from-byte : TileCache} +{: tile-to-sprite : tilestrip-to-sprite : portrait-to-sprite : char-to-sprite : scanline-to-sprite + : screen-y-to-offset : pal-from-bit : pal-from-byte : TileCache : make-canvas : draw-byte} diff --git a/editor/tileedit.fnl b/editor/tileedit.fnl index 06596a4..e6820e8 100644 --- a/editor/tileedit.fnl +++ b/editor/tileedit.fnl @@ -87,9 +87,6 @@ (fn TileView.save [self] (tiles.savegfx (self:filename) self.tilecache.tiles)) -(fn TileView.draw-neut-tile-selector [self x y] - (self:draw-tile-selector x (- self.size.x 20) :neut)) - (fn TileView.draw [self] (self:draw_background style.background) (local (x y) (values (+ self.position.x 10) (+ self.position.y 10))) diff --git a/game/disk.fnl b/game/disk.fnl index 8675eb8..4f9a027 100644 --- a/game/disk.fnl +++ b/game/disk.fnl @@ -1,4 +1,5 @@ (local asm (require :asm.asm)) +(local VM (require :asm.vm)) (local Prodos (require :asm.prodos)) (local util (require :lib.util)) (local {: lo : hi} util) @@ -30,8 +31,12 @@ [:bne :ld-src] :done]) -(fn prg-loader [org game] +(fn create-sys-loader [disk filename game] (local blocks []) + (local prg (asm.new game)) + (local org (prg:org 0x2000)) + (org:append :loader-main) + (set prg.start-symbol :loader-main) (each [_ block (pairs game.org-to-block)] (table.insert blocks block)) (table.sort blocks #(< $1.addr $2.addr)) @@ -39,19 +44,48 @@ (org:append (org-loader block))) (org:append [:jmp game.start-symbol]) (each [_ block (ipairs blocks)] - (org:append (.. :loader- block.addr) [:bytes block.bytes]))) + (org:append (.. :loader- block.addr) [:bytes block.bytes])) + (prg:assemble) + (disk:add-file (.. filename ".SYSTEM") Prodos.file-type.SYS 0x2000 org.block.bytes)) -(local game (util.reload :game)) -(local prg (asm.new game)) -(local org (prg:org 0x2000)) +(fn create-loader [disk game] + (local boot (asm.new game)) + (set boot.start-symbol :boot) + (local vm (VM.new boot {:org 0xc00})) + (disk.install-words vm) + (vm:def :hires + [:sta :0xc050] + [:sta :0xc057] + [:sta :0xc052] + [:sta :0xc054]) + (vm:word :loadfile ; length addr filename -- + 0xbb00 :open :read :drop :close) -(org:append :loader-main) -(set prg.start-symbol :loader-main) -(prg-loader org game) -(prg:assemble) + (disk:add-file "TITLE.SCREEN" Prodos.file-type.BIN 0x2000 (: (util.readjson "game/title.screen") :fromhex)) + (vm.code:append + :boot + [:jsr :reset] + [:jsr :interpret] + [:vm :hires + 0x2000 0x2000 (vm:pstr "TITLE.SCREEN") :loadfile]) + (local files []) + (each [_ block (pairs game.org-to-block)] + (local filename (.. "STUFF." (length files))) + (table.insert files filename) + (disk:add-file filename Prodos.file-type.BIN block.addr block.bytes) + (vm.code:append [:vm (length block.bytes) block.addr :lit (.. :filename (length files)) :loadfile])) + (vm.code:append + [:vm :native] + [:jmp game.start-symbol]) + (each [i filename (ipairs files)] + (vm.code:append (.. :filename i) (disk.str filename))) + (boot:assemble) + boot) (local disk (Prodos "ProDOS_Blank.dsk")) -(disk:add-file "NEUT.SYSTEM" Prodos.file-type.SYS 0x2000 org.block.bytes) +(local game (util.reload :game)) +(local loader (create-loader disk game)) +(create-sys-loader disk :NEUT loader) (disk:update-volume-header {:name "NEUT.TOWER"}) (disk:write "NeutTower.dsk") diff --git a/game/tiles.fnl b/game/tiles.fnl index ef91e7c..bd7aa73 100644 --- a/game/tiles.fnl +++ b/game/tiles.fnl @@ -6,7 +6,7 @@ (each [iflag flag (ipairs flags)] (tset flag-to-bit flag (bit.lshift 1 (- iflag 1)))) -(local encoded-tile-fields [:gfx :neut]) +(local encoded-tile-fields [:gfx :neut :mask]) (fn convert [tile field method] (local oldval (. tile field)) (when oldval diff --git a/game/title.screen b/game/title.screen new file mode 100644 index 0000000..06b3de7 --- /dev/null +++ b/game/title.screen @@ -0,0 +1 @@ +"D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A552A552A552AD5AAD5AAD5AAD5AAD5AA552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFD5AAFF83D5AAD5FFFFBFD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AA552A55AA552A550AFFAFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFDFFAD5F0D7AAF5EAFFAFD5AAD5FF9FFCFFAAD5FEFFABFDEBFF80D5AAF5AFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A157E3F7E052E552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFFFFFD7C2FFAAD5AAFFBFD5FAD5FF9FFCD7AAD7FEFFABD7EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A292D252B292B5578453F552A552A552A552A5A526A522A2D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA80F0FFFFFFFFFFFFBF808080808080AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8AFD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABF5FF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555255525534252B252D5578153E552A25552A53552A5A346A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA9580C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FC0AAD5AAD5AAD5AAD5FEFFFFFFFFFFAFD5AAE1FFFFFFFFFFFFFFFFFF9FFCDFFAFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A55546A4A5A526A2A152D152D55621778552A252B2553294D5A34254B5A2A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF80F0BFD0AAD5AAD5AADFAAD5FEFFAFD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFBFF0FFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555216555A4A2A5556542A355562577855625F2A552A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81C0FFFFFFFF8FD4AAD5AAFDFFFFAAD5AAD5AAD5AAD5AAD5AAD5F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFBFD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A707F15787F2A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFF8380B880F0FFFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582DEAAD5FADFAAD5FAFFC3FFAFD5FAFFABF5FAC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFAFD5AAFF83D5AAFDFFFFAFD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AA552A552A552A55627FABD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFDFFDFFED7F0D7AAF5EAFFAFD5AAD5FF9FFCDFAAD5FEFFABFDEBFF80D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA552A552A552A552A157E1F7E452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8180D0A8D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFFFFFD782FFAAD5AAFFBFD5BAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A2A35252B292B5578053E552A552A552A552A5A526A522A2D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58280F8FFFFFFFFFFFFFFFF808080808080D4AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8AFD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABFFFF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555256521535252B252D5578153E552A25552953552A5A346A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA8180F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FC0AAD5AAD5AAD5AAD5FEFFFFF7FFFFABD5AAE1FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A55526A4A5A526A2A152D252D55621778552A252B2553294D5A34252B5A2A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58280FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8380FFBFD0AAD5AAD5EADFAAD5EAFFAFD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFF83AAD5AAD5AAD5AAD5AA0000000000000000D52A552A555256545A4A2A5556546A2A55625778157E5F2A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58A8080C0FFFFFFFFFFFFFFFFFFFFFFFFFFBF80FCFFFFFFFF8FD4AAD5AAFDFFFFAAD5AAD5AAD5AAD5AAD5AAD5F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A7C3F55785F2A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFFFF878080FCFFFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582DEAAD5FADFAAD5EAFFC3FFAAD5FAFFABF5BAC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58AD7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FCDFFEF5FFFFFFFFFFFFFF9FFCFFFFFFFFFFABD5AAFF83D5AAFDFFF7AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AA552A552A552A552A55785FAAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFED7E0DFAAF5EAFFAFD5AAD5FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A153E5778452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8080808080AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD582FEABD5AAFFBFD5AAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A2A35252B292B5578053E552A552A552A552A5A526A522A2D552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58280FEFFFFFFFFFFFFFFFFFF8180808080D0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAF0AFD5EAFFFFD5AAD5FF9FFCDFAAD5FEFFEBFFFF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555256521535252B252D5578153E552A252B2553252B5A545A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87C0AAD5AAD5AAD5AAD5FEFFFFF7FFFFAAD5AAC1FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552294B5A525A2A152D252D55621778552A252D29532A555654292B552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD580F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80F8FFBFD0AAD5AAD5EAFFAAD5EAFFABD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFF81AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A545A2A2A5555525A2A55625778457F5F2A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58A8080808080FEFFFFFFFFFFFFFFFFFF9F8C80FFFFFFFFFF8FD4AAD5AAFFFFFFAAD5AAD5AAD5AAD5AAD5AAD5E0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A7C2F5538572A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFFFFFF87F8FFFFFFFFFFFFFFFFFF87D4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD58ADCAAFDFADFAAD5EBFFC3FFAAD5FAFFABF5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5F8D7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95FCDFAAD5FEFFFFFFFFFFFF9FFCFFFFFFFFFFABD5EAFF83D5AAFDFFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD52A552A552A552A5538157E572AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFFD7C0DFAAF5EAFFAFD5AAD5FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A153E5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58A808080808080D0AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD582FEABD5AAFFBFD5AAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5554552A5A34252B292B5578053E552A552A5552552A5A52694A6A2A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD580F0FFFFFFFFFFFFFFFFFFFFFFFFFF8080C0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0BFF5FFFFFFD5AAD5FF9FFCDFAAD5FEFFFFFFFF8FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A555456525652152D252B152D5578153E552A252B2553252B5A545A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81C0AAD5AAD5AAD5AAD5FEFFFFD7FFFFAAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552294B5A52552A152D252D55625778552A252D29532A5556542A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58AD580FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780FEFFBFD0AAD5AAD5EAFFAAD5AAF5ABD5AAD5AAD5AA95FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A545A2A2A2D552A552A15605778757F572A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58AF88780808080C0FFFFFFFFFFFFFFBF8080E0FFFFFFFFFF8FD4AAD5FAFFFFFFAAD5AAD5AAD5AAD5AAD5AAD5C0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A55627F2A550A572A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAC1FFFFFFFFFFFFFFFFFFFFFF87FCFFFFFFFFFFFFFFABFF83D4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD58AD8AAFDEADFAAD5EBFFC3FFAAD5FAFFABF5FEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95FED7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95F8D7AAD5FEFFFFFFFFFFFF9FFCFFFFDFFEFFABF5EAFF83D5AAFDFFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AA552A552A552A552A457F157E552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFD7C0DFAAD5EAFFAFD5AAD7FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A552A5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5808080808080808082D4AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD58AFEABD5AAFFBFD5AAD5FF9FFCD7EAD5FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5554554A5A34252B252B5578153E552A55545652552A5A54694A5A2A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8580FCFFFFFFFFFFFFFFFFFFFFFFFFFFBF80C0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFD5AAD5FF9FFCDFAAF5FFFFFFFFFF87A8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A55545A525652252D252B152D5578153E552A252B2553252B5A54564A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD580C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F80C0AAD5AAD5AAD5AAD5FEFFFFD5FAFFAAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552264D5A52552A152D252D55625778552A25356A4A2A5556522A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58A8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF80C0FFFFBFD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFDFFAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A4A5A2A552A552A552A156017787F7F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF8FF8080808080808080FCFFFFFF838080FEFFFFFFFFFF8FD4AAD5FAFFFFDFAAD5AAD5AAD5AAD5AAD5AAD5C0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A55625F2A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF87FEFFFFFFFFFFFFFFAAFF83D4AAF5FFFFFFDFAAD5AAD5AAD5AAD5AAD5AAD58AF8AADDEADFAAD5EBFFC3FFAAF5FAFFABD5FEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FED7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5BED5AA95F0D7AAD5FAFFAFD5EAFFFF9FFCFFFFD5FEFFABF5EBFF83D5AAF5FFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AA552A552A552A552A7C7F153E552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5EFFFFFFFFFD7C2DFAAD5EAFFAFD5AAD7FF9FFCD7AAD5FEFFABD7EAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A552A5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA9580F09F808080808080C0AAD5AAD5AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AFEABD5AAFFBFD5AAD5FF9FFCD7EAD5FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA55345552554A5634252B252B5578153E552A15555A52552A5A54694A5A2A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFFFAAD5FF9FFCDFAAF5FFFFFFFFFF87A8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A55545A525652252D252D152D5562153E552A252B2553252B5A54554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA9580E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A0C0AAD5AAD5AAD5AAD5FEFFFFD5EAD7AAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555226555A52564A1635252D5562177E552A15556A4A6A54564A2A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8380FCFFFF9FD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95F8FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFDFFAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A4A5A2A552A552A552A056017787F2F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF0FFBF8080808080808080E0FFFF8080CCFFFFFFFFFFFF8FD4AAD5FEFFFFDFABD5AAD5AAD5AAD5AAD5AAD5C2FFFFFFFFDFAAD5FEFFE0FFFFFFFAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A5562DFAA552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF87FCFFFFFFFFFFFFFFAAFF83D5AAF5FFFFFFD7AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEADFAAD5EAFFC3FFAAF5FAFFABD5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF1FFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFD5AA95F0D7AAD5FAFFAFD5AAFFFF9FFCFFBFD5FEFFABF5EBFF83D5AAF5BFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A550A7F7F153E552A552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFDEFFFFFFFFFD7C2DFAAD5EAFFAFD5AAD7FF9FFCD7AADDFEFFABD7EABFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A552A552A552A5578452F552A552A552A552A552A554A162D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA9580FCFFBFF8808080808080D5AAD5AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AFCABD5AAFFFFD5AAD5FF9FFCD7EAD5FEFFABD5FA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5534555255525634252B252B5578153E552A15555A52552A5A34694A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F80AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFFFAFD5FF9FFCDFAAFDFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000D5AA552A55545A525652292B252D152D5562177E552A252B2553252B5A34554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA8580F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780B8D0AAD5AAD5AAD5AAD5FEFFBFD5AAD5AAD5AA85FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555226555A52564A1635293555621778552A55545A4A6A54562A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080FFFFFF8FD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFD7FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A552A5A2A552A552A552A552A017817787F2F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE0FFFFFFFF81808080808080FC8780E0FFFFFFFFFFFFFF8FD4AAD5FFFFFFDFABD5AAD5AAD5AAD5AAD5AAD5C2FFABF5FFDFAAD5FAFFC0FFFFDFFAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A55E2D7AAD52A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF8FFCFFFFFFFFFFFFDFAAFF83D5AAF5FFFFFFD7AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEADFAAD5EAFFC3FFAAF5FEFFABD5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFCBFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFD7FA95F0D7AAD5FAFFAFD5AAD5FF9FFCFFABD5FEFFABF5EBFF81D5AAF5AFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A55787F7F153E552A552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFFFFFFD7C2FFAAD5AAFFBFD5EAD7FF9FFCD7AADFFEFFABD7EA9FA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A292B552A292B5578452F552A552A552A552A554A5A52262D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81E0FFFFFFFFFFFF80808080808080AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8ABD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABD5FF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5534555255525634252B252D5578153E552A25556A52552A5A34694A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58080FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0AAD5AAD5AAD5AAD5FEFFFFFFFFFFAFD5AAE1FFFFFFFFFFFFFFD7FF9FFCDFAAFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000D5AA552A55545A525A522A2B152D152D55621778552A252B2553292D5A34554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA8180FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8180BED0AAD5AAD5AAD5AAD5FEFFBFD5AAD5AAD5AA85FFFFFFFFFFFFFFFFFF9FF8FFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555216555A4A5652563429355562177855625752564A6A54552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F80F8FFFFFF8FD0AAD5AAF5FFFFAAD5AAD5AAD5AAD5AAD5AA95F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A552A5A2A552A552A552A552A407917787F2B552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFBF8080808080F88180FEFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582FFAAD5FADFAAD5FAFFC1FFBFD5FAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A552A552A552A552AD5AAD5AAD5AAD52A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFD5AAFF83D5AAF5FFFFFFD5AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEAFFAAD5EAFFE7FFAAF5FEFFAFD5BED0AAD5AAD5AAD5AAD5AA0000000000000000" \ No newline at end of file