From 90c628612e093acfec7041461064b59e7d4b2682 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 31 Mar 2024 23:35:59 -0500 Subject: [PATCH] prepare for 0.6.2 --- demos/misc/combat_vehicle_pokey.fur | Bin 1785 -> 1848 bytes .../backends/imgui_impl_sdlrenderer2.cpp | 1 - extern/opn/ym3438.c | 44 +- extern/opn/ym3438.h | 2 + res/make-tile.sh | 2 + res/tile.data.pal | Bin 0 -> 1024 bytes res/tile.gif | Bin 0 -> 17965 bytes src/engine/engine.cpp | 14 + src/engine/engine.h | 7 + src/engine/platform/genesis.cpp | 3 + src/engine/platform/genesis.h | 2 +- src/engine/playback.cpp | 25 + src/gui/about.cpp | 10 + src/gui/editControls.cpp | 7 +- src/gui/gif_load.h | 302 ++ src/gui/gui.cpp | 153 +- src/gui/gui.h | 20 +- src/gui/render/abstract.cpp | 2 +- src/gui/render/renderDX11.cpp | 2 +- src/gui/render/renderDX11.h | 2 +- src/gui/render/renderGL.cpp | 11 +- src/gui/render/renderGL.h | 2 +- src/gui/render/renderSDL.cpp | 4 +- src/gui/render/renderSDL.h | 4 +- src/gui/sysConf.cpp | 11 + src/gui/tileData.h | 1501 +++++++++ src/gui/tutorial.cpp | 2858 +++++++++++++++++ src/main.cpp | 3 + 28 files changed, 4946 insertions(+), 46 deletions(-) create mode 100755 res/make-tile.sh create mode 100644 res/tile.data.pal create mode 100644 res/tile.gif create mode 100644 src/gui/gif_load.h create mode 100644 src/gui/tileData.h diff --git a/demos/misc/combat_vehicle_pokey.fur b/demos/misc/combat_vehicle_pokey.fur index d5ff19e28f22947fa8d7d6bf442c572ebc6ea475..1bcd33b949afeb50b17b50194a8df12c6256bdd8 100644 GIT binary patch literal 1848 zcmV-82gmq$oYh!cZyQAvKD)Eto9(#J779iX2_BG2l{ihB6jW%M)a246P8y8cki>TF zxVbr1ZZr`>^#dvuAXNy8Dk@Y_AtZP~2nit`P$dKsLIU1+;K5RrH+X>`5Wbn6U2okw zG>D5knQ!LI+4;_yGq+u5Uwmb;m^qbioL|VT%;ooeO+<}UNxg&dp=J$&t}8@mjvS_) zr0r-B&v?JLXzO(NFVbJo|M%3jFrUpVHzxC^r%%o0X&`etyO3+_&n#x<7Z%p1Gez|I zrHfQm;k^~b84n&BuJBTjbLzKIhsAVS>Y8TPZz(>1@Ub+vq?2V+P3V)2!QwxRB&sqUrrrs4fft?{MA z+>oE3 zKm{0}0Rcb<48Q~|zy^Xq2nYiWKm;HvgI@-}41O8>GWcci%ix#6FN0qOzYKmE{4)4u z@XO$X%M%Yl)vFSv5X%Zs0y?{UM|R6l`Pi{nG`V#`Vg68)bK#eJ2amTbq5hh7(O_qo zdW%cTi!1Z_;&Nj%4RogXlj=g=dMH2wPon09kDbd#dbWt0IM#@he6;ZFe2OV<#^UK zCcTzwd!6E5_eifu4Gr*(Ll_BLrmmTWq3Z#61hryL1K5g($AED@f}rJ#9pg~l@F#1} ze0TNC+qPxGzrn{42w)yGXB1g@*b6)k%=+U+C+Vi`_HJ6?=0Wa8uf!W+OmSLysX%4GpTUPDS zxs&vCZF7%SuS~=l+@)=(}C*?W$ocGHDX<1LpI`5N< zzIsN=GxB*pAcpf5IWHeFQhG%BjHPsz)7_e-Ax6{suS`fN*rYDYlwK#jMHoMbFmQPr zNfAa;XIb5?*#sv~a59%rM91}wgjXl^I%J5j;vy`()E>!Mk&TNbmb0*9tP(&%o&pLM z*O!ET3>b%Q3^-w(XITqPmb8SmL&6$95oC9#u9(5bKzkP8bwSh@SRVSUFei+BFO1+D z;}L9_jdPmDHx5?F6R;|f)4_-opmdjt_oy?1i0L~Kli}pKHXzE$ExX;?Ke^5Rus^P`VUeqZw8ln7_6u1} zMDwkPMqFB2Uo?6hM&ob?ZV_&KC&*~T>r^rL*|+hA z=dUaquPoaWSenb}P(%t)PI4tm-lNV4mDj0a^4F=Lqhwjz6W9coCqQ=uD95=HWgQZH z5m|`njBRKtFWF1BC$O_zJ{vNm0OgBZiLwp}zKCo@R1|cSY~A(*w#wyI&>aEF6|O{C zhXh|l!Rn6!{}Hbx=Uh$hj^uyWK{TfYmC8q)TKR~3U9=VcYal=yS1CFf*!V>Jj=cK6 z{eBdmVk-X>JLXNw-I;yi@ZXVr2&YfGd$TW`z~2dHyAwFD%{;Wd>^l&ecObe&8=nHk zRU=YjR}EtC8YO^){628a;QEr#zXM!`?j7K5<2<`)vR6&^idp$_tl~v1yE}Eo46zT; z{t)2xHBnz+S4?7;fj1o^MfqO{VjprSwd-qY=_YKeKl8Hix+1*tA9q(c(EAFLHF|sU mKmJTOzfU+<`I=m2W6a6HF%}k2*TqxzpAOB-n|}f$-Ogz;!+OF1 literal 1785 zcmV?l-*fm(>yGmC&%b^1 zo450_yP0+OoxFWxY3_1;a&dX#_VxO{djK#At?l&8$+PbZ1X1Jxy!%oOc0jPb+W1WA zK7rm_ZH;Y>-8XzYw!An$cWd%O{mRwL*XuAncV&KgVe-t}jk(3;<@c`6EurSuV<3d5 z)ShSd^SrMxYrB1bPq94~0DOS$du;zVYzNr8 z1K@=R0cIWsxb!IIe>d*;IKanG0(|)tz_)tmjeL59|HL2SpfMQz^i z@#j5w0A{ADaC+(HtsA!&>r1yL_rvtmt55;hxw?u0yoqX-r84sKEk70&{O~*QuHkgV z#GQp_4r~s>-uoTt*bh4UJH?ybOUzcQ zsf>Lu-#IhkCQUeRAmO0TaCo#5DS3A$Nk{o`PjnuciDtOYDCLi@DuRxDm$#sbugJpe z)GOzt-}*JQfNeG3z+s2C8g3PYK0^oKLx>-*z#X8%6wk~dbO$i{PCjLLP9F~_PJkmA zgg&$Em(z3px$z1%esTUey|j!U4k(Ub@@cD2Ec@m3oPTb-q##6I5CS5YXb9-pLh}au zOuS@-r~pDu|F2MEL-=6WMlR+D?3F?cYvs8{f7-ZQ~Cchm0S= z@EcX2Lnw$SF9?0f)Viq-8e)2HL9g%1Xz2AC)hj;D^}RGEX8CJat#|&Ne_Q{gAmT;= z2xdT(7tDY-O~RN>$bfojOiW2MMc06x9-M#Y-`0P#Ak4C;TZeFXOXF5Sm~{yCmtp;3 zfLt-Yf0~eJLWWP<;*6hvG3Neh{$(5X7~H=mBYf7z_pecBBZEmn2vQK{I&S<9$T&_Y z!D5fW_fO*!jnD9O^2Tl0V{rePgz!ll-@k_XCk5d*3nGFF{FT2~qE5_d%)*MseiN6` zWQ3=B%9qikj6QAaw>XaT@BEX3(CZMQL_u&GK>`bAK%6FF%u-$w%<*M3g6Yfocm7F1 zn01KpyX0_}OvBUIUNQ~aTl;+gFnDcE%y=dR5xIhJ1<{3V3xXeSnVhVx8OA*dQxI{p zAdaghA18ot(UjRS%`f=6P4_g@g^S*F2E5ZgF|n)uS% zzn$JTzHNcp#vlH~j|(TbWO%{wV}ngWnE&22Z9LP|EmXY6@S~(xheKFS*iq7tT0S>J z{(UHqNkQm!h^%p@=nky-q68@3x76DVsGs=Gzw_U3d{Pj49m3sI4;IIbKWLZ3RTvG= bTN<|tLSHnEdxbmy&OaBw42J&!Uv+L;|4WN! diff --git a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp index de18d49ea..d8c4dd6f6 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp +++ b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp @@ -190,7 +190,6 @@ void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data) // Bind texture, Draw SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID(); - SDL_SetTextureScaleMode(tex, SDL_ScaleModeBest); // ??? SDL_RenderGeometryRaw(bd->SDLRenderer, tex, xy, (int)sizeof(ImDrawVert), color, (int)sizeof(ImDrawVert), diff --git a/extern/opn/ym3438.c b/extern/opn/ym3438.c index 6a80bd43d..0836ad5d8 100644 --- a/extern/opn/ym3438.c +++ b/extern/opn/ym3438.c @@ -39,6 +39,42 @@ enum { eg_num_release = 3 }; +/* msw table */ +static const Bit16u mswrom[256] = { + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000 +}; + /* logsin table */ static const Bit16u logsinrom[256] = { 0x859, 0x6c3, 0x607, 0x58b, 0x52e, 0x4e4, 0x4a6, 0x471, @@ -1052,7 +1088,7 @@ static void OPN2_FMGenerate(ym3438_t *chip) { quarter = phase & 0xff; } - level = logsinrom[quarter]; + level = chip->msw ? mswrom[quarter] : logsinrom[quarter]; /* Apply envelope */ level += chip->eg_out[slot] << 2; /* Transform */ @@ -1198,6 +1234,7 @@ void OPN2_Reset(ym3438_t *chip) Bit32u i; memset(chip, 0, sizeof(ym3438_t)); chip->chip_type = ym3438_mode_readmode; + chip->msw = 0; for (i = 0; i < 24; i++) { chip->eg_out[i] = 0x3ff; @@ -1217,6 +1254,11 @@ void OPN2_SetChipType(ym3438_t *chip, Bit32u type) chip->chip_type = type; } +void OPN2_SetMSW(ym3438_t *chip, Bit32u msw) +{ + chip->msw = msw; +} + void OPN2_Clock(ym3438_t *chip, Bit16s *buffer) { Bit32u slot = chip->cycles; diff --git a/extern/opn/ym3438.h b/extern/opn/ym3438.h index 955b73174..848d7d151 100644 --- a/extern/opn/ym3438.h +++ b/extern/opn/ym3438.h @@ -124,6 +124,7 @@ typedef struct Bit8u eg_read_inc; /* Settings */ Bit8u chip_type; + Bit8u msw; /* FM */ Bit16s fm_op1[6][2]; Bit16s fm_op2[6]; @@ -201,6 +202,7 @@ typedef struct void OPN2_Reset(ym3438_t *chip); void OPN2_SetChipType(ym3438_t *chip, Bit32u type); +void OPN2_SetMSW(ym3438_t *chip, Bit32u msw); void OPN2_Clock(ym3438_t *chip, Bit16s *buffer); void OPN2_Write(ym3438_t *chip, Bit32u port, Bit8u data); void OPN2_SetTestPin(ym3438_t *chip, Bit32u value); diff --git a/res/make-tile.sh b/res/make-tile.sh new file mode 100755 index 000000000..7e513de50 --- /dev/null +++ b/res/make-tile.sh @@ -0,0 +1,2 @@ +#!/bin/bash +xxd -i -n tileDataC tile.gif | sed -r "s/^ +//g;s/, /,/g;s/ = /=/g;s/unsigned/static const unsigned/g" > ../src/gui/tileData.h diff --git a/res/tile.data.pal b/res/tile.data.pal new file mode 100644 index 0000000000000000000000000000000000000000..1532c7074599f282fcb852773eaedd9e1ddafb09 GIT binary patch literal 1024 zcmWlX%}yd|6o$V7?B2MVm7B?U11`M)mo8nH?iQ#jetKqHx|)@V3KUT2OyVpi@d9jz zpMol&GjZX<3os4>MFDm?F|+atz=CHE_2vEE^HVwX);UKhMO&c0DE|9XSY7j*`imb< zUGDDg*xTD9T;=7!kCLCWGJg_UJ!+NHej%pHsAx_6sn|hJ4*1O9qQLHyF!+Oc+wq zM4^`ET;<7YT}sLqdrrZ8Gp+4zGC-J_81Q%*vmqH$J~Dwc(vzriX$V@rR|T*aBE zW3^7OYc6NaC+w!gM-rcY#PZ8j1~qd2l;Qw#q9;d+qTH25M{Zy28FlSF^_W2`a!N;e z)FXYQ^>mXl+~fxu=?h%5NjLGGhAHuq!p)mhOF5i;hp*Nc#}4soQM_iHYU>=waq#Mo zR2}dJ3U8RDI<{~|H?;c!wNXf0^t92baY7T9_OdTFOw}4wEkQqW!ANV0-=i;j0#jp< z%n-ya2AMj6@yxUIXJ9D?MV+8KL0WaR|_2h?N?!&Fjg1-CV++P^UO3^=s8IK!y-Kf zGh}8(nb~m`g>%R|%uA0*qnXRRsAXBUEO2g^Hv^W9koiR7L!IULM1IEQEs$lFdA*^* zEF%KSg1Y$6!VrtaSYKafV`GEO%}utpw%Fd@W@l%I-Q8XG_xDMqQXC#0a&&aW@$oUX mZF6~f$<@^r*Vos0p2zL&E%*2LJUl!wnM`V#-~95 literal 0 HcmV?d00001 diff --git a/res/tile.gif b/res/tile.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ab4d9bb22de60a15c4de79be9137f42addc7743 GIT binary patch literal 17965 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 literal 0 HcmV?d00001 diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 05387fd8f..357b1887a 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -253,6 +253,12 @@ void DivEngine::walkSong(int& loopOrder, int& loopRow, int& loopEnd) { } } +void DivEngine::setNumTimesPlayed(int count) { + numTimesPlayed=count; + crossedPatterns=count; + if (count==-1) crossedPatterns=0; +} + #define EXPORT_BUFSIZE 2048 double DivEngine::benchmarkPlayback() { @@ -2144,6 +2150,9 @@ void DivEngine::reset() { elapsedBeats=0; nextSpeed=speeds.val[0]; divider=curSubSong->hz; + if (numTimesPlayed>=0) { + divider*=1.0+(double)(MAX(numTimesPlayed-6,0))*0.04; + } globalPitch=0; for (int i=0; ireset(); @@ -3366,6 +3375,8 @@ bool DivEngine::autoNoteOn(int ch, int ins, int note, int vol) { int finalChan=midiBaseChan; int finalChanType=getChannelType(finalChan); + if (note==84 && numTimesPlayed>=0) return false; + if (!playing) { reset(); freelance=true; @@ -3493,6 +3504,9 @@ void DivEngine::setSongRate(float hz) { saveLock.lock(); curSubSong->hz=hz; divider=curSubSong->hz; + if (numTimesPlayed>=0) { + divider*=1.0+(double)(MAX(numTimesPlayed-6,0))*0.04; + } saveLock.unlock(); BUSY_END; } diff --git a/src/engine/engine.h b/src/engine/engine.h index d224cfd65..95b8c80ba 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -436,6 +436,8 @@ class DivEngine { int cycles; double clockDrift; int midiClockCycles; + int numTimesPlayed; + int crossedPatterns; double midiClockDrift; int midiTimeCycles; double midiTimeDrift; @@ -747,6 +749,9 @@ class DivEngine { // find song loop position void walkSong(int& loopOrder, int& loopRow, int& loopEnd); + // set number of times the song has played + void setNumTimesPlayed(int count); + // play (returns whether successful) bool play(); @@ -1325,6 +1330,8 @@ class DivEngine { cycles(0), clockDrift(0), midiClockCycles(0), + numTimesPlayed(0), + crossedPatterns(0), midiClockDrift(0), midiTimeCycles(0), midiTimeDrift(0), diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index fc82709ac..a10f135a2 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1661,6 +1661,7 @@ void DivPlatformGenesis::reset() { OPN2_SetChipType(&fm,0); break; } + OPN2_SetMSW(&fm,msw?1:0); if (dumpWrites) { addWrite(0xffffffff,0); } @@ -1766,6 +1767,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { } noExtMacros=flags.getBool("noExtMacros",false); fbAllOps=flags.getBool("fbAllOps",false); + msw=flags.getBool("msw",false); switch (chipType) { case 1: // YM2612 OPN2_SetChipType(&fm,ym3438_mode_ym2612); @@ -1777,6 +1779,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { OPN2_SetChipType(&fm,0); break; } + OPN2_SetMSW(&fm,msw?1:0); CHECK_CUSTOM_CLOCK; if (useYMFM==1) { if (fm_ymfm!=NULL) delete fm_ymfm; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 76b3e57ef..e943c33ec 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -87,7 +87,7 @@ class DivPlatformGenesis: public DivPlatformOPN { int softPCMTimer; - bool extMode, softPCM, noExtMacros, canWriteDAC; + bool extMode, softPCM, noExtMacros, canWriteDAC, msw; unsigned char useYMFM; unsigned char chipType; short dacWrite; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 1e7d823c2..641dc784d 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -36,6 +36,17 @@ void DivEngine::nextOrder() { endOfSong=true; memset(walked,0,8192); curOrder=0; + if (numTimesPlayed>=0) { + numTimesPlayed++; + divider=curSubSong->hz*(1.0+(double)(MAX(numTimesPlayed-6,0))*0.04); + } + } + if (numTimesPlayed>2 && !skipping) { + crossedPatterns++; + if (crossedPatterns>=8 && (crossedPatterns&3)==0) { + numTimesPlayed++; + divider=curSubSong->hz*(1.0+(double)(MAX(numTimesPlayed-6,0))*0.04); + } } } @@ -621,6 +632,14 @@ void DivEngine::processRow(int i, bool afterDelay) { } else if (!(pat->data[whatRow][0]==0 && pat->data[whatRow][1]==0)) { chan[i].oldNote=chan[i].note; chan[i].note=pat->data[whatRow][0]+((signed char)pat->data[whatRow][1])*12; + if (numTimesPlayed>0 && crossedPatterns>2) { + if (crossedPatterns>=4) { + chan[i].note+=(int)(MAX(0,pow(MAX(0,crossedPatterns-4),1.2)))>>2; + } + if ((rand()%MAX(1,60-crossedPatterns))==0) { + chan[i].note=12+(rand()&63); + } + } if (!chan[i].keyOn) { if (disCont[dispatchOfChan[i]].dispatch->keyOffAffectsArp(dispatchChanOfChan[i])) { chan[i].arp=0; @@ -890,6 +909,9 @@ void DivEngine::processRow(int i, bool afterDelay) { break; case 0xc0: case 0xc1: case 0xc2: case 0xc3: // set Hz divider=(double)(((effect&0x3)<<8)|effectVal); + if (numTimesPlayed>=0) { + divider*=1.0+(double)(MAX(numTimesPlayed-6,0))*0.04; + } if (divider<1) divider=1; cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/divider; clockDrift=0; @@ -1022,6 +1044,9 @@ void DivEngine::processRow(int i, bool afterDelay) { break; case 0xf0: // set Hz by tempo divider=(double)effectVal*2.0/5.0; + if (numTimesPlayed>=0) { + divider*=1.0+(double)(MAX(numTimesPlayed-6,0))*0.04; + } if (divider<1) divider=1; cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/divider; clockDrift=0; diff --git a/src/gui/about.cpp b/src/gui/about.cpp index ce3c0b729..f5dc98025 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -374,6 +374,16 @@ void FurnaceGUI::drawAbout() { while (aboutSin>=2400) aboutSin-=2400; if (aboutScroll>(42*dpiScale*aboutCount+canvasH)) aboutScroll=-20*dpiScale; + if (ImGui::IsKeyPressed(ImGuiKey_Space) && !shaderEditor) { + aboutOpen=false; + if (modified) { + showWarning("Unsaved changes! Save changes before playing?",GUI_WARN_CV); + } else { + cvOpen=true; + cvNotSerious=true; + } + } + WAKE_UP; } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_ABOUT; diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index f4f373817..e17061d37 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -592,6 +592,10 @@ void FurnaceGUI::drawMobileControls() { memoryOpen=!memoryOpen; } + if (ImGui::Button("CV")) { + cvOpen=!cvOpen; + } + ImGui::Separator(); ImGui::Button("Panic"); @@ -614,9 +618,6 @@ void FurnaceGUI::drawMobileControls() { mobileMenuPos=0.0f; aboutOpen=true; } - if (ImGui::Button("Shader Editor")) { - shaderEditor=!shaderEditor; - } if (ImGui::Button("Switch to Desktop Mode")) { toggleMobileUI(!mobileUI); } diff --git a/src/gui/gif_load.h b/src/gui/gif_load.h new file mode 100644 index 000000000..d08e66dc4 --- /dev/null +++ b/src/gui/gif_load.h @@ -0,0 +1,302 @@ +#ifndef GIF_LOAD_H +#define GIF_LOAD_H + +/** gif_load: A slim, fast and header-only GIF loader written in C. + Original author: hidefromkgb (hidefromkgb@gmail.com) + _________________________________________________________________________ + + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + _________________________________________________________________________ +**/ + +#ifdef __cplusplus +extern "C" { +#endif +#include /** imports uint8_t, uint16_t and uint32_t **/ +#ifndef GIF_MGET + #include + #define GIF_MGET(m,s,a,c) m = (uint8_t*)realloc((c)? 0 : m, (c)? s : 0UL); +#endif +#ifndef GIF_BIGE + #define GIF_BIGE 0 +#endif +#ifndef GIF_EXTR + #define GIF_EXTR static +#endif +#define _GIF_SWAP(h) ((GIF_BIGE)? ((uint16_t)(h << 8) | (h >> 8)) : h) + +#pragma pack(push, 1) +struct GIF_WHDR { /** ======== frame writer info: ======== **/ + long xdim, ydim, clrs, /** global dimensions, palette size **/ + bkgd, tran, /** background index, transparent index **/ + intr, mode, /** interlace flag, frame blending mode **/ + frxd, fryd, frxo, fryo, /** current frame dimensions and offset **/ + time, ifrm, nfrm; /** delay, frame number, frame count **/ + uint8_t *bptr; /** frame pixel indices or metadata **/ + struct { /** [==== GIF RGB palette element: ====] **/ + uint8_t R, G, B; /** [color values - red, green, blue ] **/ + } *cpal; /** current palette **/ +}; +#pragma pack(pop) + +enum {GIF_NONE = 0, GIF_CURR = 1, GIF_BKGD = 2, GIF_PREV = 3}; + +/** [ internal function, do not use ] **/ +static long _GIF_SkipChunk(uint8_t **buff, long size) { + long skip; + + for (skip = 2, ++size, ++(*buff); ((size -= skip) > 0) && (skip > 1); + *buff += (skip = 1 + **buff)); + return size; +} + +/** [ internal function, do not use ] **/ +static long _GIF_LoadHeader(unsigned gflg, uint8_t **buff, void **rpal, + unsigned fflg, long *size, long flen) { + if (flen && (!(*buff += flen) || ((*size -= flen) <= 0))) + return -2; /** v--[ 0x80: "palette is present" flag ]--, **/ + if (flen && (fflg & 0x80)) { /** local palette has priority | **/ + *rpal = *buff; /** [ 3L: 3 uint8_t color channels ]--, | **/ + *buff += (flen = 2 << (fflg & 7)) * 3L; /** <--| | **/ + return ((*size -= flen * 3L) > 0)? flen : -1; /** <--' | **/ + } /** no local palette found, checking for the global one | **/ + return (gflg & 0x80)? (2 << (gflg & 7)) : 0; /** <-----' **/ +} + +/** [ internal function, do not use ] **/ +static long _GIF_LoadFrame(uint8_t **buff, long *size, + uint8_t *bptr, uint8_t *blen) { + typedef uint16_t GIF_H; + const long GIF_HLEN = sizeof(GIF_H), /** to rid the scope of sizeof **/ + GIF_CLEN = 1 << 12; /** code table length: 4096 items **/ + GIF_H accu, mask; /** bit accumulator / bit mask **/ + long ctbl, iter, /** last code table index / index string iterator **/ + prev, curr, /** codes from the stream: previous / current **/ + ctsz, ccsz, /** code table bit sizes: min LZW / current **/ + bseq, bszc; /** counters: block sequence / bit size **/ + uint32_t *code = (uint32_t*)bptr - GIF_CLEN; /** code table pointer **/ + + /** preparing initial values **/ + if ((--(*size) <= GIF_HLEN) || !*++(*buff)) + return -4; /** unexpected end of the stream: insufficient size **/ + mask = (GIF_H)((1 << (ccsz = (ctsz = *(*buff - 1)) + 1)) - 1); + if ((ctsz < 2) || (ctsz > 8)) + return -3; /** min LZW size is out of its nominal [2; 8] bounds **/ + if ((ctbl = (1L << ctsz)) != (mask & _GIF_SWAP(*(GIF_H*)(*buff + 1)))) + return -2; /** initial code is not equal to min LZW size **/ + for (curr = ++ctbl; curr; code[--curr] = 0); /** actual color codes **/ + + /** getting codes from stream (--size makes up for end-of-stream mark) **/ + for (--(*size), bszc = -ccsz, prev = curr = 0; + ((*size -= (bseq = *(*buff)++) + 1) >= 0) && bseq; *buff += bseq) + for (; bseq > 0; bseq -= GIF_HLEN, *buff += GIF_HLEN) + for (accu = (GIF_H)(_GIF_SWAP(*(GIF_H*)*buff) + & ((bseq < GIF_HLEN)? ((1U << (8 * bseq)) - 1U) : ~0U)), + curr |= accu << (ccsz + bszc), accu = (GIF_H)(accu >> -bszc), + bszc += 8 * ((bseq < GIF_HLEN)? bseq : GIF_HLEN); + bszc >= 0; bszc -= ccsz, prev = curr, curr = accu, + accu = (GIF_H)(accu >> ccsz)) + if (((curr &= mask) & ~1L) == (1L << ctsz)) { + if (~(ctbl = curr + 1) & 1) /** end-of-data code (ED). **/ + /** -1: no end-of-stream mark after ED; 1: decoded **/ + return (*((*buff += bseq + 1) - 1))? -1 : 1; + mask = (GIF_H)((1 << (ccsz = ctsz + 1)) - 1); + } /** ^- table drop code (TD). TD = 1 << ctsz, ED = TD + 1 **/ + else { /** single-pixel (SP) or multi-pixel (MP) code. **/ + if (ctbl < GIF_CLEN) { /** is the code table full? **/ + if ((ctbl == mask) && (ctbl < GIF_CLEN - 1)) { + mask = (GIF_H)(mask + mask + 1); + ccsz++; /** yes; extending **/ + } /** prev = TD? => curr < ctbl = prev **/ + code[ctbl] = (uint32_t)prev + (code[prev] & 0xFFF000); + } /** appending SP / MP decoded pixels to the frame **/ + prev = (long)code[iter = (ctbl > curr)? curr : prev]; + if ((bptr += (prev = (prev >> 12) & 0xFFF)) > blen) + continue; /** skipping pixels above frame capacity **/ + for (prev++; (iter &= 0xFFF) >> ctsz; + *bptr-- = (uint8_t)((iter = (long)code[iter]) >> 24)); + (bptr += prev)[-prev] = (uint8_t)iter; + if (ctbl < GIF_CLEN) { /** appending the code table **/ + if (ctbl == curr) + *bptr++ = (uint8_t)iter; + else if (ctbl < curr) + return -5; /** wrong code in the stream **/ + code[ctbl++] += ((uint32_t)iter << 24) + 0x1000; + } + } /** 0: no ED before end-of-stream mark; -4: see above **/ + return (++(*size) >= 0)? 0 : -4; /** ^- N.B.: 0 error is recoverable **/ +} + +/** _________________________________________________________________________ + The main loading function. Returns the total number of frames if the data + includes proper GIF ending, and otherwise it returns the number of frames + loaded per current call, multiplied by -1. So, the data may be incomplete + and in this case the function can be called again when more data arrives, + just remember to keep SKIP up to date. + _________________________________________________________________________ + DATA: raw data chunk, may be partial + SIZE: size of the data chunk that`s currently present + GWFR: frame writer function, MANDATORY + EAMF: metadata reader function, set to 0 if not needed + ANIM: implementation-specific data (e.g. a structure or a pointer to it) + SKIP: number of frames to skip before resuming + **/ +GIF_EXTR long GIF_Load(void *data, long size, + void (*gwfr)(void*, struct GIF_WHDR*), + void (*eamf)(void*, struct GIF_WHDR*), + void *anim, long skip) { + const long GIF_BLEN = (1 << 12) * sizeof(uint32_t); + const uint8_t GIF_EHDM = 0x21, /** extension header mark **/ + GIF_FHDM = 0x2C, /** frame header mark **/ + GIF_EOFM = 0x3B, /** end-of-file mark **/ + GIF_EGCM = 0xF9, /** extension: graphics control mark **/ + GIF_EAMM = 0xFF; /** extension: app metadata mark **/ + #pragma pack(push, 1) + struct GIF_GHDR { /** ========== GLOBAL GIF HEADER: ========== **/ + uint8_t head[6]; /** 'GIF87a' / 'GIF89a' header signature **/ + uint16_t xdim, ydim; /** total image width, total image height **/ + uint8_t flgs; /** FLAGS: + GlobalPlt bit 7 1: global palette exists + 0: local in each frame + ClrRes bit 6-4 bits/channel = ClrRes+1 + [reserved] bit 3 0 + PixelBits bit 2-0 |Plt| = 2 * 2^PixelBits + **/ + uint8_t bkgd, aspr; /** background color index, aspect ratio **/ + } *ghdr = (struct GIF_GHDR*)data; + struct GIF_FHDR { /** ======= GIF FRAME MASTER HEADER: ======= **/ + uint16_t frxo, fryo; /** offset of this frame in a "full" image **/ + uint16_t frxd, fryd; /** frame width, frame height **/ + uint8_t flgs; /** FLAGS: + LocalPlt bit 7 1: local palette exists + 0: global is used + Interlaced bit 6 1: interlaced frame + 0: non-interlaced frame + Sorted bit 5 usually 0 + [reserved] bit 4-3 [undefined] + PixelBits bit 2-0 |Plt| = 2 * 2^PixelBits + **/ + } *fhdr; + struct GIF_EGCH { /** ==== [EXT] GRAPHICS CONTROL HEADER: ==== **/ + uint8_t flgs; /** FLAGS: + [reserved] bit 7-5 [undefined] + BlendMode bit 4-2 000: not set; static GIF + 001: leave result as is + 010: restore background + 011: restore previous + 1--: [undefined] + UserInput bit 1 1: show frame till input + 0: default; ~99% of GIFs + TransColor bit 0 1: got transparent color + 0: frame is fully opaque + **/ + uint16_t time; /** delay in GIF time units; 1 unit = 10 ms **/ + uint8_t tran; /** transparent color index **/ + } *egch = 0; + #pragma pack(pop) + struct GIF_WHDR wtmp, whdr; + long desc, blen; + uint8_t *buff; + + memset(&wtmp,0,sizeof(struct GIF_WHDR)); + memset(&whdr,0,sizeof(struct GIF_WHDR)); + + /** checking if the stream is not empty and has a 'GIF8[79]a' signature, + the data has sufficient size and frameskip value is non-negative **/ + if (!ghdr || (size <= (long)sizeof(*ghdr)) || (*(buff = ghdr->head) != 71) + || (buff[1] != 73) || (buff[2] != 70) || (buff[3] != 56) || (skip < 0) + || ((buff[4] != 55) && (buff[4] != 57)) || (buff[5] != 97) || !gwfr) + return 0; + + buff = (uint8_t*)(ghdr + 1) /** skipping the global header and palette **/ + + _GIF_LoadHeader(ghdr->flgs, 0, 0, 0, 0, 0L) * 3L; + if ((size -= buff - (uint8_t*)ghdr) <= 0) + return 0; + + whdr.xdim = _GIF_SWAP(ghdr->xdim); + whdr.ydim = _GIF_SWAP(ghdr->ydim); + for (whdr.bptr = buff, whdr.bkgd = ghdr->bkgd, blen = --size; + (blen >= 0) && ((desc = *whdr.bptr++) != GIF_EOFM); /** sic: '>= 0' **/ + blen = _GIF_SkipChunk(&whdr.bptr, blen) - 1) /** count all frames **/ + if (desc == GIF_FHDM) { + fhdr = (struct GIF_FHDR*)whdr.bptr; + if (_GIF_LoadHeader(ghdr->flgs, &whdr.bptr, (void**)&whdr.cpal, + fhdr->flgs, &blen, sizeof(*fhdr)) <= 0) + break; + whdr.frxd = _GIF_SWAP(fhdr->frxd); + whdr.fryd = _GIF_SWAP(fhdr->fryd); + whdr.frxo = (whdr.frxd > whdr.frxo)? whdr.frxd : whdr.frxo; + whdr.fryo = (whdr.fryd > whdr.fryo)? whdr.fryd : whdr.fryo; + whdr.ifrm++; + } + blen = whdr.frxo * whdr.fryo * (long)sizeof(*whdr.bptr); + GIF_MGET(whdr.bptr, (unsigned long)(blen + GIF_BLEN + 2), anim, 1) + whdr.nfrm = (desc != GIF_EOFM)? -whdr.ifrm : whdr.ifrm; + for (whdr.bptr += GIF_BLEN, whdr.ifrm = -1; blen /** load all frames **/ + && (skip < ((whdr.nfrm < 0)? -whdr.nfrm : whdr.nfrm)) && (size >= 0); + size = (desc != GIF_EOFM)? ((desc != GIF_FHDM) || (skip > whdr.ifrm))? + _GIF_SkipChunk(&buff, size) - 1 : size - 1 : -1) + if ((desc = *buff++) == GIF_FHDM) { /** found a frame **/ + whdr.intr = !!((fhdr = (struct GIF_FHDR*)buff)->flgs & 0x40); + *(void**)&whdr.cpal = (void*)(ghdr + 1); /** interlaced? -^ **/ + whdr.clrs = _GIF_LoadHeader(ghdr->flgs, &buff, (void**)&whdr.cpal, + fhdr->flgs, &size, sizeof(*fhdr)); + if ((skip <= ++whdr.ifrm) && ((whdr.clrs <= 0) + || (_GIF_LoadFrame(&buff, &size, + whdr.bptr, whdr.bptr + blen) < 0))) + size = -(whdr.ifrm--) - 1; /** failed to load the frame **/ + else if (skip <= whdr.ifrm) { + whdr.frxd = _GIF_SWAP(fhdr->frxd); + whdr.fryd = _GIF_SWAP(fhdr->fryd); + whdr.frxo = _GIF_SWAP(fhdr->frxo); + whdr.fryo = _GIF_SWAP(fhdr->fryo); + whdr.time = (egch)? _GIF_SWAP(egch->time) : 0; + whdr.tran = (egch && (egch->flgs & 0x01))? egch->tran : -1; + whdr.time = (egch && (egch->flgs & 0x02))? -whdr.time - 1 + : whdr.time; + whdr.mode = (egch && !(egch->flgs & 0x10))? + (egch->flgs & 0x0C) >> 2 : GIF_NONE; + egch = 0; + wtmp = whdr; + gwfr(anim, &wtmp); /** passing the frame to the caller **/ + } + } + else if (desc == GIF_EHDM) { /** found an extension **/ + if (*buff == GIF_EGCM) /** graphics control ext. **/ + egch = (struct GIF_EGCH*)(buff + 1 + 1); + else if ((*buff == GIF_EAMM) && eamf) { /** app metadata ext. **/ + wtmp = whdr; + wtmp.bptr = buff + 1 + 1; /** just passing the raw chunk **/ + eamf(anim, &wtmp); + } + } + whdr.bptr -= GIF_BLEN; /** for excess pixel codes ----v (here & above) **/ + GIF_MGET(whdr.bptr, (unsigned long)(blen + GIF_BLEN + 2), anim, 0) + return (whdr.nfrm < 0)? (skip - whdr.ifrm - 1) : (whdr.ifrm + 1); +} + +#undef _GIF_SWAP +#ifdef __cplusplus +} +#endif +#endif /** GIF_LOAD_H **/ diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index f61de8b4c..44e8f2546 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1117,6 +1117,12 @@ void FurnaceGUI::play(int row) { if (e->getStreamPlayer()) { e->killStream(); } + if (shaderEditor) { + numTimesPlayed++; + e->setNumTimesPlayed(numTimesPlayed); + } else { + e->setNumTimesPlayed(-1); + } memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); for (int i=0; i=25) { + switch (numTimesPlayed) { + case 25: + showError("*bleep*\n\n\nAccess Denied"); + break; + case 26: + showError("*bleep*\n\n\nAccess Is Denied"); + break; + case 27: + showError("*bleep*\n\n\nUnauthorized Access"); + break; + case 28: + showError("*bleep*\n\n\nIllegal Access"); + break; + case 29: + showError("Please, move away from the stop button"); + break; + case 30: + showError("You will not stop the song"); + break; + case 31: + showError("Move on immediately"); + break; + case 32: + showError("You will not stop the song!"); + break; + case 33: + showError("No, no and no!"); + break; + case 34: + showError("Will we do this all day?"); + break; + case 35: + showError(""); + break; + default: + showError("YOU HAVE NO CHOICE."); + break; + } + numTimesPlayed++; + return; + } + } bool wasPlaying=e->isPlaying(); e->walkSong(loopOrder,loopRow,loopEnd); e->stop(); @@ -1194,6 +1244,11 @@ void FurnaceGUI::noteInput(int num, int key, int vol) { DivPattern* pat=e->curPat[cursor.xCoarse].getPattern(e->curOrders->ord[cursor.xCoarse][curOrder],true); bool removeIns=false; + if (shaderEditor && num==84) { + showError("This note is reserved for the Master. You may not use it."); + return; + } + prepareUndo(GUI_UNDO_PATTERN_EDIT); if (key==GUI_NOTE_OFF) { // note off @@ -1370,6 +1425,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { if (introPos<11.0 && !shortIntro) return; if (ImGuiFileDialog::Instance()->IsOpened()) return; if (aboutOpen) return; + if (cvOpen) return; int mapped=ev.key.keysym.sym; if (ev.key.keysym.mod&KMOD_CTRL) { @@ -2264,6 +2320,18 @@ int FurnaceGUI::load(String path) { // warn the user showWarning("you have loaded a backup!\nif you need to, please save it somewhere.\n\nDO NOT RELY ON THE BACKUP SYSTEM FOR AUTO-SAVE!\nFurnace will not save backups of backups.",GUI_WARN_GENERIC); } + if (!cvOpen && shaderEditor) { + for (int i=0; isong.systemLen; i++) { + if (e->song.system[i]==DIV_SYSTEM_YM2612 || + e->song.system[i]==DIV_SYSTEM_YM2612_EXT || + e->song.system[i]==DIV_SYSTEM_YM2612_CSM || + e->song.system[i]==DIV_SYSTEM_YM2612_DUALPCM || + e->song.system[i]==DIV_SYSTEM_YM2612_DUALPCM_EXT) { + showWarning("pure sine wave YM2612s are becoming expensive!\nwhy not try out the new Modified Sine Wave YM2612?\nequivalent quality, without the price!\ngo to file > manage chips for more details.",GUI_WARN_GENERIC); + break; + } + } + } return 0; } @@ -3095,6 +3163,7 @@ int FurnaceGUI::processEvent(SDL_Event* ev) { e->saveConf(); } #endif + if (cvOpen) return 1; if (ev->type==SDL_KEYDOWN) { if (!ev->key.repeat && latchTarget==0 && !wantCaptureKeyboard && !sampleMapWaitingInput && (ev->key.keysym.mod&(~(VALID_MODS)))==0) { if (settings.notePreviewBehavior==0) return 1; @@ -4340,6 +4409,11 @@ bool FurnaceGUI::loop() { if (ImGui::MenuItem("restore backup",BIND_FOR(GUI_ACTION_OPEN_BACKUP))) { doAction(GUI_ACTION_OPEN_BACKUP); } + if (numTimesPlayed>3) { + if (ImGui::MenuItem("Enable Serious Mode")) { + cvOpen=true; + } + } ImGui::Separator(); if (ImGui::MenuItem("exit...",BIND_FOR(GUI_ACTION_QUIT))) { requestQuit(); @@ -4385,9 +4459,11 @@ bool FurnaceGUI::loop() { toggleMobileUI(!mobileUI); } #endif + /* if (ImGui::MenuItem("manage presets...",BIND_FOR(GUI_ACTION_WINDOW_USER_PRESETS))) { userPresetsOpen=true; } + */ if (ImGui::MenuItem("settings...",BIND_FOR(GUI_ACTION_WINDOW_SETTINGS))) { syncSettings(); settingsOpen=true; @@ -4715,32 +4791,6 @@ bool FurnaceGUI::loop() { MEASURE(userPresets,drawUserPresets()); } - // NEW CODE - REMOVE WHEN DONE - if (shaderEditor) { - if (ImGui::Begin("Shader Editor 2024",&shaderEditor,ImGuiWindowFlags_NoScrollWithMouse|ImGuiWindowFlags_NoScrollbar)) { - ImGui::PushFont(patFont); - ImGui::InputTextMultiline("##SHFragment",&newOscFragment,ImVec2(ImGui::GetContentRegionAvail().x,ImGui::GetContentRegionAvail().y-ImGui::GetFrameHeightWithSpacing()),ImGuiInputTextFlags_UndoRedo); - ImGui::PopFont(); - if (ImGui::Button("Save")) { - FILE* f=ps_fopen("/storage/emulated/0/osc.fsh","w"); - if (f==NULL) { - showError("Something happened"); - } else { - fwrite(newOscFragment.c_str(),1,newOscFragment.size(),f); - fclose(f); - showError("Saved!"); - } - } - ImGui::SameLine(); - if (ImGui::Button("Apply")) { - if (!rend->regenOscShader(newOscFragment.c_str())) { - showError("Of course you screwed it up, again!"); - } - } - } - ImGui::End(); - } - // release selection if mouse released if (ImGui::IsMouseReleased(ImGuiMouseButton_Left) && selecting) { if (!selectingFull) cursor=selEnd; @@ -4992,6 +5042,9 @@ bool FurnaceGUI::loop() { case GUI_WARN_OPEN_BACKUP: openFileDialog(GUI_FILE_OPEN_BACKUP); break; + case GUI_WARN_CV: + cvOpen=true; + break; default: break; } @@ -5641,6 +5694,30 @@ bool FurnaceGUI::loop() { ImGui::CloseCurrentPopup(); } break; + case GUI_WARN_CV: + if (ImGui::Button("Yes")) { + ImGui::CloseCurrentPopup(); + if (curFileName=="" || curFileName.find(backupPath)==0 || e->song.version>=0xff00) { + openFileDialog(GUI_FILE_SAVE); + postWarnAction=GUI_WARN_CV; + } else { + if (save(curFileName,e->song.isDMF?e->song.version:0)>0) { + showError(fmt::sprintf("Error while saving file! (%s)",lastError)); + } else { + cvOpen=true; + } + } + } + ImGui::SameLine(); + if (ImGui::Button("No")) { + ImGui::CloseCurrentPopup(); + cvOpen=true; + } + ImGui::SameLine(); + if (ImGui::Button("Cancel") || ImGui::IsKeyPressed(ImGuiKey_Escape)) { + ImGui::CloseCurrentPopup(); + } + break; case GUI_WARN_OPEN_BACKUP: if (ImGui::Button("Yes")) { ImGui::CloseCurrentPopup(); @@ -6711,6 +6788,8 @@ bool FurnaceGUI::init() { xyOscIntensity=e->getConfFloat("xyOscIntensity",2.0f); xyOscThickness=e->getConfFloat("xyOscThickness",2.0f); + cvHiScore=e->getConfInt("cvHiScore",25000); + syncSettings(); syncTutorial(); @@ -7051,6 +7130,20 @@ bool FurnaceGUI::init() { firstFrame=true; + time_t timet=time(NULL); + struct tm* curtm=localtime(&timet); + if (curtm!=NULL) { + if (curtm->tm_mon==3 && curtm->tm_mday==1) { + if (cvHiScore<=25000) { + shaderEditor=true; + } + } + } + + if (!shaderEditor) { + e->setNumTimesPlayed(-1); + } + userEvents=SDL_RegisterEvents(1); e->setMidiCallback([this](const TAMidiMessage& msg) -> int { @@ -7278,6 +7371,8 @@ void FurnaceGUI::commitState() { e->setConf(key,recentFile[i]); } } + + e->setConf("cvHiScore",cvHiScore); } bool FurnaceGUI::finish(bool saveConfig) { @@ -7322,7 +7417,7 @@ bool FurnaceGUI::finish(bool saveConfig) { } bool FurnaceGUI::requestQuit() { - if (modified) { + if (modified && !cvOpen) { showWarning("Unsaved changes! Save changes before quitting?",GUI_WARN_QUIT); } else { quit=true; @@ -7337,6 +7432,7 @@ FurnaceGUI::FurnaceGUI(): sdlWin(NULL), vibrator(NULL), vibratorAvailable(false), + cv(NULL), sampleTex(NULL), sampleTexW(0), sampleTexH(0), @@ -7399,6 +7495,7 @@ FurnaceGUI::FurnaceGUI(): wheelCalmDown(0), shallDetectScale(0), cpuCores(0), + numTimesPlayed(0), secondTimer(0.0f), userEvents(0xffffffff), mobileMenuPos(0.0f), @@ -7535,7 +7632,9 @@ FurnaceGUI::FurnaceGUI(): xyOscOpen(false), memoryOpen(false), csPlayerOpen(false), + cvOpen(false), userPresetsOpen(false), + cvNotSerious(false), shortIntro(false), insListDir(false), waveListDir(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 43eedc9e8..ee8a56166 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -579,6 +579,7 @@ enum FurnaceGUIWarnings { GUI_WARN_SUBSONG_DEL, GUI_WARN_SYSTEM_DEL, GUI_WARN_CLEAR_HISTORY, + GUI_WARN_CV, GUI_WARN_GENERIC }; @@ -1456,7 +1457,7 @@ class FurnaceGUIRender { virtual bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); virtual bool unlockTexture(FurnaceGUITexture* which); virtual bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); - virtual FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + virtual FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true); virtual bool destroyTexture(FurnaceGUITexture* which); virtual void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); virtual void setBlendMode(FurnaceGUIBlendMode mode); @@ -1501,6 +1502,8 @@ struct PendingDrawOsc { lineSize(0.0f) {} }; +struct FurnaceCV; + class FurnaceGUI { DivEngine* e; @@ -1510,7 +1513,10 @@ class FurnaceGUI { SDL_Window* sdlWin; SDL_Haptic* vibrator; bool vibratorAvailable; - + + FurnaceCV* cv; + FurnaceGUITexture* cvTex; + FurnaceGUITexture* sampleTex; int sampleTexW, sampleTexH; bool updateSampleTex; @@ -1550,6 +1556,7 @@ class FurnaceGUI { bool willExport[DIV_MAX_CHIPS]; int vgmExportVersion; int vgmExportTrailingTicks; + int cvHiScore; int drawHalt; int zsmExportTickRate; int macroPointSize; @@ -1560,6 +1567,7 @@ class FurnaceGUI { int wheelCalmDown; int shallDetectScale; int cpuCores; + int numTimesPlayed; float secondTimer; unsigned int userEvents; float mobileMenuPos, autoButtonSize, mobileEditAnim; @@ -2083,7 +2091,9 @@ class FurnaceGUI { bool mixerOpen, debugOpen, inspectorOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen; bool pianoOpen, notesOpen, channelsOpen, regViewOpen, logOpen, effectListOpen, chanOscOpen; bool subSongsOpen, findOpen, spoilerOpen, patManagerOpen, sysManagerOpen, clockOpen, speedOpen; - bool groovesOpen, xyOscOpen, memoryOpen, csPlayerOpen, userPresetsOpen; + bool groovesOpen, xyOscOpen, memoryOpen, csPlayerOpen, cvOpen, userPresetsOpen; + + bool cvNotSerious; bool shortIntro; bool insListDir, waveListDir, sampleListDir; @@ -2478,6 +2488,7 @@ class FurnaceGUI { // user presets window int selectedUserPreset; + std::vector randomDemoSong; void drawExportAudio(bool onWindow=false); void drawExportVGM(bool onWindow=false); @@ -2725,6 +2736,9 @@ class FurnaceGUI { void initTutorial(); void activateTutorial(FurnaceGUITutorials which); + void initRandomDemoSong(); + bool loadRandomDemoSong(); + bool loadUserPresets(bool redundancy=true); bool saveUserPresets(bool redundancy=true); diff --git a/src/gui/render/abstract.cpp b/src/gui/render/abstract.cpp index 4d304e2e0..135cb9ee5 100644 --- a/src/gui/render/abstract.cpp +++ b/src/gui/render/abstract.cpp @@ -35,7 +35,7 @@ bool FurnaceGUIRender::updateTexture(FurnaceGUITexture* which, void* data, int p return false; } -FurnaceGUITexture* FurnaceGUIRender::createTexture(bool dynamic, int width, int height) { +FurnaceGUITexture* FurnaceGUIRender::createTexture(bool dynamic, int width, int height, bool interpolate) { return NULL; } diff --git a/src/gui/render/renderDX11.cpp b/src/gui/render/renderDX11.cpp index 80b877034..71f25f42c 100644 --- a/src/gui/render/renderDX11.cpp +++ b/src/gui/render/renderDX11.cpp @@ -199,7 +199,7 @@ bool FurnaceGUIRenderDX11::updateTexture(FurnaceGUITexture* which, void* data, i return true; } -FurnaceGUITexture* FurnaceGUIRenderDX11::createTexture(bool dynamic, int width, int height) { +FurnaceGUITexture* FurnaceGUIRenderDX11::createTexture(bool dynamic, int width, int height, bool interpolate) { D3D11_TEXTURE2D_DESC texDesc; D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; ID3D11Texture2D* tex=NULL; diff --git a/src/gui/render/renderDX11.h b/src/gui/render/renderDX11.h index 8348d068f..20e598b43 100644 --- a/src/gui/render/renderDX11.h +++ b/src/gui/render/renderDX11.h @@ -64,7 +64,7 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender { bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool unlockTexture(FurnaceGUITexture* which); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); - FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true); bool destroyTexture(FurnaceGUITexture* which); void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); diff --git a/src/gui/render/renderGL.cpp b/src/gui/render/renderGL.cpp index 0c0e2429e..6f0a2a789 100644 --- a/src/gui/render/renderGL.cpp +++ b/src/gui/render/renderGL.cpp @@ -301,12 +301,17 @@ bool FurnaceGUIRenderGL::updateTexture(FurnaceGUITexture* which, void* data, int return true; } -FurnaceGUITexture* FurnaceGUIRenderGL::createTexture(bool dynamic, int width, int height) { +FurnaceGUITexture* FurnaceGUIRenderGL::createTexture(bool dynamic, int width, int height, bool interpolate) { FurnaceGLTexture* t=new FurnaceGLTexture; C(glGenTextures(1,&t->id)); C(glBindTexture(GL_TEXTURE_2D,t->id)); - C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)); - C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)); + if (interpolate) { + C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)); + C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)); + } else { + C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)); + C(glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)); + } C(glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,PIXEL_FORMAT,NULL)); C(furActiveTexture(GL_TEXTURE0)); t->width=width; diff --git a/src/gui/render/renderGL.h b/src/gui/render/renderGL.h index eb9739ebf..57560763b 100644 --- a/src/gui/render/renderGL.h +++ b/src/gui/render/renderGL.h @@ -53,7 +53,7 @@ class FurnaceGUIRenderGL: public FurnaceGUIRender { bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool unlockTexture(FurnaceGUITexture* which); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); - FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true); bool destroyTexture(FurnaceGUITexture* which); void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); diff --git a/src/gui/render/renderSDL.cpp b/src/gui/render/renderSDL.cpp index 2aae041cb..a291c3b09 100644 --- a/src/gui/render/renderSDL.cpp +++ b/src/gui/render/renderSDL.cpp @@ -49,8 +49,10 @@ bool FurnaceGUIRenderSDL::updateTexture(FurnaceGUITexture* which, void* data, in return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0; } -FurnaceGUITexture* FurnaceGUIRenderSDL::createTexture(bool dynamic, int width, int height) { +FurnaceGUITexture* FurnaceGUIRenderSDL::createTexture(bool dynamic, int width, int height, bool interpolate) { + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,interpolate?"1":"0"); SDL_Texture* t=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ABGR8888,dynamic?SDL_TEXTUREACCESS_STREAMING:SDL_TEXTUREACCESS_STATIC,width,height); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,"1"); if (t==NULL) return NULL; FurnaceSDLTexture* ret=new FurnaceSDLTexture; diff --git a/src/gui/render/renderSDL.h b/src/gui/render/renderSDL.h index ba68f5366..b78770bc5 100644 --- a/src/gui/render/renderSDL.h +++ b/src/gui/render/renderSDL.h @@ -26,7 +26,7 @@ class FurnaceGUIRenderSDL: public FurnaceGUIRender { bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool unlockTexture(FurnaceGUITexture* which); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); - FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true); bool destroyTexture(FurnaceGUITexture* which); void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); @@ -46,4 +46,4 @@ class FurnaceGUIRenderSDL: public FurnaceGUIRender { bool quit(); FurnaceGUIRenderSDL(): sdlRend(NULL) {} -}; \ No newline at end of file +}; diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 876d7e159..d676284eb 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -44,6 +44,7 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl } bool noExtMacros=flags.getBool("noExtMacros",false); bool fbAllOps=flags.getBool("fbAllOps",false); + bool msw=flags.getBool("msw",false); ImGui::Text("Clock rate:"); ImGui::Indent(); @@ -93,6 +94,15 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl altered=true; } } + + if (msw || shaderEditor) { + if (ImGui::Checkbox("Modified sine wave",&msw)) { + altered=true; + } + if (msw && shaderEditor) { + ImGui::Text("Oopsie..."); + } + } if (altered) { e->lockSave([&]() { @@ -100,6 +110,7 @@ bool FurnaceGUI::drawSysConf(int chan, int sysPos, DivSystem type, DivConfig& fl flags.set("chipType",chipType); flags.set("noExtMacros",noExtMacros); flags.set("fbAllOps",fbAllOps); + flags.set("msw",msw); }); } break; diff --git a/src/gui/tileData.h b/src/gui/tileData.h new file mode 100644 index 000000000..1c2fa5b35 --- /dev/null +++ b/src/gui/tileData.h @@ -0,0 +1,1501 @@ +static const unsigned char tileDataC[]={ +0x47,0x49,0x46,0x38,0x37,0x61,0x00,0x01,0x00,0x04,0xf7,0x00, +0x00,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0xa7,0x00,0xe5,0x93, +0x00,0x00,0x00,0xa6,0x77,0x00,0x97,0x12,0x81,0xb1,0xbe,0xbe, +0xbe,0x51,0x51,0x51,0xfc,0x00,0x00,0x00,0xff,0x00,0xff,0xff, +0x1d,0x00,0x00,0xfa,0xff,0x00,0xff,0x1f,0xfa,0xff,0xff,0xff, +0xff,0x00,0x00,0x00,0x00,0x01,0x67,0x04,0x00,0x89,0x00,0x03, +0xab,0x00,0x00,0xdc,0x04,0x00,0xfe,0x00,0x63,0x00,0x00,0x5f, +0x5f,0x01,0x62,0x85,0x05,0x5d,0xb6,0x00,0x61,0xd9,0x02,0x5f, +0xfb,0x00,0x8a,0x06,0x00,0x8a,0x59,0x00,0x85,0x8a,0x06,0x87, +0xb1,0x00,0x8b,0xd3,0x02,0x87,0xff,0x00,0xb0,0x00,0x00,0xb1, +0x62,0x00,0xaf,0x84,0x02,0xad,0xa7,0x02,0xb1,0xfe,0x00,0xaf, +0xd8,0x00,0xd8,0x05,0x00,0xdb,0x5c,0x00,0xd7,0x8e,0x03,0xd5, +0xb0,0x00,0xd9,0xd2,0x00,0xff,0x00,0x00,0xff,0x66,0x00,0xff, +0x88,0x03,0xff,0xaa,0x00,0xff,0xdb,0x00,0xd4,0xff,0x00,0xff, +0xfd,0x64,0x00,0x00,0x64,0x00,0x65,0x5c,0x03,0x87,0x60,0x01, +0xa9,0x64,0x00,0xda,0x5c,0x00,0xfc,0x61,0x60,0x00,0x5d,0x5d, +0x5d,0x65,0x5f,0x83,0x5d,0x61,0xb5,0x61,0x5f,0xd7,0x59,0x63, +0xf9,0x61,0x88,0x04,0x5e,0x87,0x57,0x62,0x83,0x88,0x5e,0x8b, +0xaf,0x62,0x86,0xe0,0x5a,0x8a,0xff,0x5e,0xae,0x00,0x5e,0xaf, +0x60,0x62,0xad,0x83,0x5a,0xae,0xb4,0x5e,0xac,0xd6,0x5a,0xb5, +0xfc,0x5e,0xd5,0x03,0x5e,0xd9,0x5b,0x62,0xd4,0x8c,0x5b,0xd9, +0xae,0x5f,0xd7,0xd0,0x63,0xd2,0xff,0x5f,0xff,0x00,0x5f,0xff, +0x64,0x63,0xff,0x86,0x5b,0xff,0xa8,0x5f,0xfe,0xd9,0x63,0xfc, +0xfc,0x88,0x01,0x00,0x88,0x01,0x62,0x8c,0x00,0x84,0x84,0x01, +0xb5,0x88,0x00,0xd7,0x8c,0x00,0xfa,0x85,0x60,0x07,0x81,0x60, +0x5a,0x89,0x5f,0x8f,0x8d,0x5e,0xb2,0x85,0x62,0xd4,0x89,0x5d, +0xff,0x85,0x8b,0x01,0x82,0x87,0x63,0x86,0x86,0x86,0x8a,0x84, +0xa8,0x86,0x89,0xdd,0x8a,0x87,0xff,0x82,0xb1,0x00,0x82,0xb2, +0x5e,0x86,0xb0,0x80,0x8a,0xab,0xb1,0x82,0xaf,0xd3,0x8a,0xaf, +0xff,0x82,0xd8,0x00,0x82,0xdc,0x58,0x86,0xd7,0x89,0x8b,0xd5, +0xab,0x83,0xd7,0xdc,0x87,0xd5,0xff,0x83,0xff,0x00,0x83,0xff, +0x61,0x87,0xff,0x83,0x8b,0xfd,0xb4,0x83,0xff,0xd7,0x87,0xff, +0xf9,0xac,0x01,0x07,0xac,0x04,0x5f,0xb0,0x02,0x81,0xb4,0x00, +0xb2,0xac,0x02,0xd4,0xb0,0x00,0xff,0xb5,0x5d,0x04,0xb1,0x5d, +0x57,0xad,0x62,0x8d,0xb1,0x60,0xaf,0xb5,0x5c,0xe0,0xad,0x60, +0xff,0xb5,0x88,0x00,0xb1,0x84,0x60,0xaa,0x88,0x83,0xae,0x84, +0xb4,0xb6,0x86,0xda,0xae,0x8a,0xfc,0xb2,0xab,0x03,0xb2,0xaf, +0x5b,0xaa,0xb0,0x8c,0xae,0xae,0xae,0xb2,0xac,0xd0,0xaa,0xae, +0xff,0xb2,0xd5,0x00,0xb2,0xd6,0x64,0xaa,0xda,0x86,0xae,0xd8, +0xa8,0xb3,0xd4,0xd9,0xab,0xd8,0xfc,0xb3,0xff,0x00,0xb3,0xff, +0x5e,0xab,0xff,0x80,0xaf,0xff,0xb1,0xb3,0xfe,0xd4,0xab,0xff, +0xff,0xdc,0x00,0x05,0xdc,0x01,0x5c,0xd4,0x02,0x8d,0xd8,0x01, +0xaf,0xdc,0x00,0xd2,0xd4,0x00,0xff,0xd9,0x60,0x01,0xd5,0x5d, +0x63,0xd9,0x5b,0x86,0xd5,0x63,0xac,0xd9,0x5f,0xdd,0xdd,0x5d, +0xff,0xd5,0x86,0x00,0xd5,0x87,0x5e,0xd9,0x85,0x80,0xd2,0x87, +0xb1,0xda,0x89,0xd7,0xde,0x84,0xff,0xd6,0xae,0x00,0xd6,0xb1, +0x58,0xda,0xad,0x89,0xd2,0xb1,0xab,0xd6,0xac,0xdc,0xda,0xaa, +0xff,0xd6,0xd8,0x00,0xd6,0xd9,0x61,0xda,0xd7,0x83,0xd2,0xd8, +0xb4,0xd7,0xd7,0xd7,0xdb,0xd5,0xf9,0xd7,0xff,0x04,0xd7,0xff, +0x5b,0xdb,0xfe,0x8c,0xd3,0xff,0xaf,0xd7,0xff,0xd1,0xdb,0xfc, +0xff,0xff,0x00,0x02,0xff,0x01,0x68,0xff,0x00,0x8a,0xfc,0x04, +0xac,0xff,0x00,0xde,0xff,0x00,0xff,0xfd,0x63,0x00,0xf9,0x60, +0x60,0xfd,0x5e,0x83,0xff,0x5d,0xb8,0xfd,0x62,0xda,0xff,0x60, +0xfc,0xf9,0x86,0x03,0xf9,0x8a,0x5b,0xfd,0x85,0x8c,0xff,0x84, +0xae,0xfa,0x88,0xd0,0xff,0x87,0xff,0xfa,0xb1,0x00,0xff,0xab, +0x64,0xfe,0xb0,0x86,0xff,0xae,0xa8,0xfa,0xaf,0xd9,0xfe,0xad, +0xfc,0xfa,0xdb,0x00,0xff,0xd6,0x5e,0xfe,0xda,0x80,0xff,0xd5, +0xb1,0xfb,0xd9,0xd4,0xff,0xd5,0xff,0xfb,0xff,0x01,0xff,0xf9, +0x63,0xff,0xff,0x89,0xff,0xff,0xac,0xfb,0xff,0xdd,0xff,0xff, +0xff,0x04,0x04,0x04,0x0c,0x0c,0x0c,0x18,0x18,0x18,0x20,0x20, +0x20,0x2d,0x2d,0x2d,0x35,0x35,0x35,0x41,0x41,0x41,0x49,0x49, +0x49,0x55,0x55,0x55,0x61,0x61,0x61,0x69,0x69,0x69,0x71,0x71, +0x71,0x7d,0x7d,0x7d,0x8a,0x8a,0x8a,0x92,0x92,0x92,0x9a,0x9a, +0x9a,0xa6,0xa6,0xa6,0xb2,0xb2,0xb2,0xba,0xba,0xba,0xc2,0xc2, +0xc2,0xce,0xce,0xce,0xdb,0xdb,0xdb,0xe3,0xe3,0xe3,0xeb,0xeb, +0xeb,0x21,0xf9,0x04,0x09,0x0a,0x00,0x00,0x00,0x2c,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x08,0xff,0x00,0x01,0x08, +0x1c,0x48,0xb0,0xa0,0xc1,0x83,0x08,0x13,0x2a,0x5c,0xc8,0xb0, +0xe0,0x01,0x83,0x0f,0x05,0x46,0x6c,0x48,0x51,0x21,0x84,0x8b, +0x18,0x33,0x5e,0xac,0x58,0x50,0xa3,0x47,0x08,0x1c,0x09,0x7e, +0xd4,0x18,0x72,0xe0,0xc8,0x8c,0x25,0x53,0x32,0x3c,0x09,0xb2, +0xe1,0xc6,0x85,0x0f,0x0e,0xc8,0x7c,0x30,0x70,0x22,0x80,0x88, +0x36,0x45,0xb2,0x6c,0xa9,0x12,0x00,0x84,0x4c,0x40,0x81,0xd2, +0x19,0x4a,0xd4,0x0d,0xcf,0x8a,0x3f,0x83,0x66,0x22,0x5a,0xf4, +0x28,0xc5,0xa4,0x41,0x99,0x0e,0x35,0x5a,0x12,0xaa,0x50,0xa9, +0x54,0x7b,0x6a,0x35,0x59,0xa4,0x08,0x91,0x13,0x32,0x64,0x9c, +0x20,0xd2,0xd5,0xe9,0x4b,0x93,0x0f,0x1e,0x1c,0x9d,0x39,0x71, +0x26,0xcd,0x9c,0x39,0x0f,0x42,0x48,0x40,0xb7,0xae,0x5d,0xba, +0x4e,0x43,0x5a,0x95,0x4a,0xc7,0x4d,0x56,0x8e,0x7b,0xb1,0xfe, +0x45,0xaa,0x94,0xaf,0xdf,0xbc,0x2b,0x0b,0x0b,0x46,0xbc,0x15, +0x70,0xd7,0xaf,0x32,0x2e,0x8a,0xf5,0x4a,0x84,0x27,0x84,0xb4, +0x47,0x2f,0xab,0x25,0x18,0x33,0x66,0xcd,0x9b,0x07,0xd2,0xde, +0x1c,0x2d,0x11,0xe1,0xc3,0xb9,0x09,0xf8,0xa9,0x5e,0xad,0x1a, +0x6f,0xd5,0x96,0x50,0x0d,0x1f,0x16,0xb8,0x6e,0x9d,0xc2,0xda, +0x02,0x63,0x0b,0xce,0x7a,0x56,0x2e,0xec,0xa8,0xbb,0x5b,0xe2, +0x4e,0x38,0x5c,0x37,0x53,0xbf,0xbc,0x19,0x37,0xb6,0x48,0x19, +0xac,0xe4,0xb1,0x64,0x2d,0x63,0x16,0x39,0x7d,0x60,0x67,0x99, +0x12,0xdd,0xd2,0xfc,0xcc,0xdd,0x20,0x04,0xd5,0x69,0xc3,0x87, +0xff,0x57,0xad,0x1c,0x61,0x6d,0xdb,0xc6,0x8b,0x22,0xa7,0x8a, +0x11,0x61,0xfb,0xf4,0x53,0xd7,0x83,0x3c,0x6f,0x1e,0x37,0xfc, +0xbe,0xf2,0x7d,0xf6,0xd6,0x09,0xf2,0xfe,0x7a,0xaa,0xf4,0x2d, +0x87,0x14,0x11,0x64,0x39,0x07,0x81,0x58,0x64,0x15,0x91,0x59, +0x66,0xe2,0xb5,0xe4,0x96,0x4d,0xd7,0x11,0x14,0x57,0x5c,0x3e, +0xf5,0x23,0xde,0x85,0x0f,0xf4,0x53,0x9e,0x6f,0x10,0xec,0xb0, +0x93,0x46,0x3b,0x04,0x68,0xd0,0x79,0x1e,0x7e,0x88,0x51,0x89, +0x8c,0x9d,0x68,0xe2,0x89,0x22,0x16,0x44,0xe2,0x8a,0x17,0xa1, +0x28,0xe0,0x80,0x5d,0x19,0x38,0x99,0x57,0xe5,0x69,0x56,0x9d, +0x84,0xd9,0xdd,0xe4,0x59,0x69,0x40,0x42,0x94,0x5b,0x5a,0x09, +0x3c,0x50,0xe4,0x91,0x45,0x6e,0xc6,0xd1,0x79,0x91,0x40,0xa0, +0xce,0x79,0xeb,0x40,0x50,0x9b,0x94,0xe7,0xa9,0x03,0x41,0x93, +0xfb,0x99,0x74,0x51,0x93,0x4f,0x9e,0x47,0x25,0x95,0xb5,0x59, +0x19,0x49,0x8b,0x04,0x31,0xe9,0x24,0x94,0x5f,0x42,0x29,0x66, +0x7b,0x1c,0x72,0x89,0xe6,0x94,0x6a,0x5e,0x49,0xe6,0x8c,0x09, +0x41,0xf0,0x98,0x8d,0x27,0x50,0x96,0x63,0x83,0x0d,0xc5,0x44, +0xa1,0x90,0x68,0xd1,0x65,0xe4,0xa0,0x47,0x2a,0x89,0x54,0x46, +0xea,0x74,0x29,0xe5,0x45,0x51,0x86,0x69,0x25,0x98,0xf5,0x45, +0xe9,0xa4,0xa2,0x92,0x36,0xba,0x4e,0xa2,0x24,0x71,0x78,0x51, +0xa2,0x70,0x32,0x4a,0x25,0xa6,0x90,0x1e,0xe4,0xe5,0xa4,0x9d, +0x2e,0xea,0x68,0xa6,0x74,0x2e,0x64,0x27,0x81,0x78,0x12,0xa8, +0xa0,0x45,0x7c,0x2a,0xff,0x74,0xc2,0x09,0x07,0xcd,0x6a,0x90, +0xad,0x68,0x11,0x4a,0x68,0x92,0x1b,0x8a,0x1a,0x25,0x0a,0x93, +0x62,0x2a,0x6c,0xa2,0x56,0x02,0x9b,0x25,0x7f,0x0a,0x04,0x6b, +0xe5,0xb0,0x98,0x02,0x3b,0x5c,0x7d,0x10,0x24,0x4b,0xec,0xb2, +0xd4,0x62,0x9a,0xec,0xb1,0x5a,0x42,0x00,0xec,0xb4,0x93,0x2a, +0x1b,0x2d,0x95,0xa9,0xba,0xe4,0x6a,0xab,0x65,0xd5,0x89,0x61, +0x4b,0xb3,0xe2,0x0a,0xc0,0x09,0x33,0xcc,0x40,0x2b,0x41,0x60, +0x89,0x05,0xef,0x0c,0xf2,0x0e,0x39,0xa8,0x91,0x85,0xee,0xa8, +0x97,0xb1,0x1f,0x02,0xfb,0x14,0xbf,0x3b,0x25,0xfb,0xd4,0xb5, +0x1f,0x0a,0xec,0x12,0xc1,0x3b,0xf9,0x1b,0xae,0xb8,0x77,0x86, +0x35,0xd6,0x63,0xca,0xe9,0x18,0x1e,0x48,0xec,0xba,0x5b,0x2f, +0x58,0xed,0xbe,0xbb,0x6e,0xbb,0x0e,0x0b,0xc4,0x6e,0xc7,0xb9, +0x59,0x88,0x61,0x78,0x1a,0xaa,0xf4,0x6d,0x1c,0x28,0x43,0x20, +0xcf,0x3b,0xef,0xc8,0x03,0x01,0xca,0x71,0x7c,0xfb,0xef,0xcb, +0x29,0xaf,0xdc,0x32,0xcd,0x31,0x1b,0xbc,0x12,0xb0,0x30,0xab, +0xcc,0xb2,0xcb,0x3d,0x2b,0xbc,0x52,0xb2,0x3d,0xdb,0x0c,0x74, +0xca,0x42,0x2f,0xcc,0x9c,0x57,0x78,0xea,0x69,0xee,0x85,0x14, +0xd3,0xdb,0xf1,0xc7,0xf4,0x6a,0x5c,0x31,0xc8,0x1f,0xcb,0xe0, +0x6e,0x6e,0xe0,0x8d,0x4c,0x9e,0xc9,0x44,0xc7,0x71,0x07,0x04, +0x2d,0xaf,0x0c,0xc1,0x1d,0x29,0xeb,0xac,0x6a,0xd8,0x63,0x97, +0xfd,0xce,0xd9,0x48,0xf7,0x9a,0x1b,0xcf,0x62,0x93,0x2d,0x8f, +0xd9,0x68,0xc7,0x9c,0xb4,0x45,0x74,0xb7,0xff,0x7d,0xf7,0xdb, +0x79,0xcb,0xac,0xb4,0xaa,0xcd,0x45,0x76,0x20,0x74,0xaf,0xba, +0x87,0x99,0x66,0xe8,0xb6,0xbb,0x75,0xbc,0x61,0x6d,0xbd,0x71, +0xe4,0xef,0x5e,0x5d,0x2f,0x6a,0xac,0xb1,0xe6,0x5a,0x4a,0xda, +0xbe,0x7c,0xc7,0xd8,0x46,0x9f,0x8d,0x76,0xe7,0x03,0x7b,0x0e, +0xfa,0xcf,0xa2,0xeb,0x2d,0xb7,0x4f,0x44,0x7f,0xee,0xf3,0xcd, +0x9f,0xe7,0xbc,0x7a,0xe7,0x62,0x9f,0x0e,0xfb,0xe8,0x6a,0x0f, +0xee,0x5e,0x82,0xf1,0x22,0xbe,0x27,0x6c,0x86,0xce,0x2a,0xb9, +0xf0,0x92,0x6f,0xec,0xb8,0xd5,0x15,0xbf,0x8b,0xda,0x5d,0x77, +0xad,0xee,0x1d,0xb0,0x9f,0xfb,0x8d,0xb7,0xeb,0x7b,0xd7,0x09, +0xbd,0xeb,0x6e,0x8b,0x3e,0x76,0xee,0x75,0x26,0x1b,0xbd,0xdd, +0xd3,0x6f,0x3f,0xbb,0xf7,0xd8,0xff,0xad,0x3d,0xe9,0xba,0xab, +0x7a,0x92,0xfa,0x3a,0x15,0xa4,0xb1,0xc7,0xef,0xaf,0x9b,0xee, +0xad,0xef,0x7f,0xd8,0xd3,0xb7,0xd1,0x8f,0x8d,0x51,0xfe,0x82, +0xef,0xac,0xbd,0xfe,0x17,0xe1,0x1f,0xf7,0xdc,0x73,0x3d,0xd7, +0xed,0xef,0x7b,0xd5,0x73,0x0f,0xf9,0x0c,0x18,0x40,0x04,0x3a, +0x2f,0x7d,0x10,0x8c,0xa0,0x5e,0x2e,0xb2,0xc0,0xfc,0x59,0xf0, +0x5b,0xcf,0xf2,0x15,0xfe,0x2c,0xc8,0xc1,0xce,0x61,0x2b,0x37, +0x17,0x29,0x20,0x07,0x1d,0x98,0xc1,0x11,0xfd,0xea,0x7f,0x23, +0x14,0xdf,0x07,0xfd,0xc1,0xc2,0x16,0xba,0xf0,0x85,0x30,0x8c, +0xa1,0x0c,0x67,0x48,0xc3,0x19,0xb2,0x8c,0x65,0xf0,0xb8,0xa1, +0x0e,0xdf,0x91,0xc3,0x1d,0xde,0x10,0x1e,0x40,0xec,0x61,0x0f, +0xff,0x7d,0x48,0x44,0x1e,0xee,0x70,0x88,0x3f,0xfc,0xa1,0x97, +0xae,0x37,0x12,0xea,0xa1,0x44,0x53,0xe4,0x6b,0xe2,0xd8,0x9c, +0x55,0xc2,0x81,0x78,0x29,0x8a,0x1f,0x71,0x1d,0xc2,0xdc,0x83, +0x11,0x26,0x66,0x51,0x7c,0x73,0x12,0x08,0x0b,0xfb,0xd1,0x8f, +0x1a,0x9a,0x91,0x86,0x65,0x7c,0x61,0x1a,0xcf,0xe8,0xc2,0x24, +0xfe,0x30,0x88,0x40,0xe4,0xa1,0x10,0x71,0x88,0xc3,0x1c,0x22, +0xd1,0x88,0x3e,0xbc,0x23,0x1d,0x8d,0x18,0x47,0x39,0xf6,0x30, +0x23,0x4c,0x34,0x83,0x19,0x76,0xb0,0x03,0x41,0x8a,0xae,0x73, +0x61,0x04,0xc0,0x12,0x0f,0x29,0x48,0x42,0x1a,0x52,0x8b,0x4f, +0xf4,0x0e,0x46,0xa2,0xd8,0xc8,0x42,0x9a,0xe1,0x90,0xc9,0x4a, +0xe4,0x15,0x19,0x39,0x48,0x4b,0x1e,0x12,0x60,0x08,0xf1,0x07, +0x19,0xd9,0x48,0xca,0x16,0x92,0x71,0x8d,0xa6,0x44,0x25,0x1b, +0x89,0x08,0xc7,0x38,0x0a,0xb1,0x95,0x7e,0xc4,0x63,0x11,0xf1, +0x78,0xc7,0x57,0xf2,0x51,0x87,0x39,0xdc,0xa4,0xeb,0x1c,0xd9, +0x49,0x4c,0x46,0xb2,0x23,0x5d,0x3c,0x24,0x2f,0x09,0xe9,0x4b, +0x4d,0x4e,0x89,0x89,0xc3,0xf4,0x90,0x13,0xd9,0x24,0x49,0x0a, +0x0a,0xd3,0x92,0xc4,0x74,0x62,0x22,0x45,0x59,0x4a,0x52,0x9e, +0x72,0x86,0xaa,0x3c,0xe3,0x11,0x5f,0x09,0xc7,0x37,0xba,0xb2, +0x9b,0x76,0xc4,0xe5,0x2c,0x65,0xe9,0x4d,0x57,0xde,0x30,0x23, +0x94,0x6c,0xe4,0x23,0xc1,0x58,0x45,0xda,0x4c,0x29,0x9d,0x83, +0x5c,0xa7,0x07,0xb1,0x05,0x48,0x4e,0xc6,0xf3,0x92,0xd2,0x6c, +0xa7,0x22,0x8f,0x69,0xff,0x4f,0x4f,0x42,0x92,0x99,0x05,0x31, +0xe3,0x28,0xab,0x49,0xcd,0x31,0xa6,0x71,0x8d,0x03,0x25,0xa5, +0x1b,0xed,0x88,0x44,0x6e,0xb6,0xf2,0x9b,0xe6,0x64,0x65,0x37, +0x8b,0x38,0xc4,0x3e,0xee,0xb3,0x73,0x9c,0x18,0x5b,0x21,0x79, +0x79,0x36,0x4e,0xcc,0xd3,0x22,0xce,0xcc,0x68,0x87,0x3a,0xf9, +0x48,0x8f,0x52,0xf1,0x36,0x51,0x4a,0x96,0x48,0x37,0xea,0x4f, +0x8f,0x12,0x0c,0xa4,0x18,0xd5,0x28,0x49,0xf1,0xe9,0x52,0x70, +0x85,0x12,0x8d,0xd9,0xac,0x66,0x42,0x73,0xaa,0xd0,0x3d,0x36, +0xb4,0xa2,0x7e,0xb4,0xa5,0x1c,0xc7,0xb9,0x50,0x3d,0xfa,0x54, +0x87,0x26,0x01,0x16,0x27,0x3c,0xba,0xd1,0x46,0x42,0x60,0xa9, +0xe8,0xf3,0x1f,0x54,0x9b,0x3a,0xc8,0xa7,0xd6,0xb4,0x74,0x53, +0xbd,0xa7,0x87,0xa0,0x3a,0x40,0xb9,0xa8,0x94,0xa9,0x5a,0xb5, +0x6a,0x54,0x6f,0x8a,0x4d,0x82,0xaa,0x11,0x95,0x09,0x25,0xe8, +0x11,0xc5,0x59,0xc7,0xb6,0xd6,0x71,0xa2,0xe3,0x0c,0xe2,0x42, +0x67,0x39,0x44,0x9d,0x4c,0xb5,0xa9,0x5b,0xf5,0xe8,0x03,0x2f, +0x72,0xd7,0x78,0xe6,0xf5,0x83,0xbe,0xe9,0xeb,0x46,0xc5,0xba, +0x57,0xb1,0x3a,0x72,0xb0,0x50,0xed,0x95,0x59,0x17,0x9b,0xca, +0xc5,0xae,0x35,0xae,0x7b,0xa4,0xa5,0x1b,0xf3,0xd8,0xc7,0x70, +0x52,0x96,0x88,0xc0,0xb4,0xdf,0x04,0x35,0x0b,0x18,0x13,0xbd, +0x86,0xb3,0x0a,0xd1,0x81,0x68,0x47,0x4b,0xda,0xd2,0x92,0xf6, +0x1d,0xa6,0x4d,0xad,0x6a,0x51,0xab,0xda,0xd6,0x92,0x56,0x02, +0xb0,0x8d,0xad,0x6c,0x67,0x4b,0xdb,0xda,0xff,0xda,0xf6,0xb6, +0xb8,0xbd,0xad,0x04,0x77,0xcb,0xdb,0x85,0xb8,0xf6,0xb7,0xc0, +0x0d,0xee,0x69,0x7f,0x8b,0xda,0xdc,0x1a,0xf7,0xb8,0xc8,0x45, +0x6e,0x6f,0x97,0xcb,0x5c,0x81,0xb0,0x56,0x07,0xcf,0x35,0x6d, +0x74,0xa1,0x3b,0xda,0xe9,0x52,0x37,0xb8,0xd6,0xbd,0x6e,0x6a, +0x93,0xcb,0xdd,0xee,0x72,0xb7,0xb9,0xe0,0xdd,0xad,0x70,0xc7, +0x9b,0xda,0xec,0x8e,0x37,0xba,0xb0,0x8d,0x80,0x7a,0xd5,0x9b, +0xde,0xf5,0x46,0x60,0xb6,0xec,0x95,0x40,0x7c,0xe7,0x1b,0xdf, +0xf6,0xba,0xd7,0xbd,0xf2,0xad,0xef,0x7b,0xf3,0xbb,0x5e,0x09, +0x84,0xf7,0xbf,0xe9,0x23,0xef,0x6a,0x81,0x3b,0x5d,0xf3,0x02, +0xf7,0xbe,0x08,0x4e,0xb0,0x82,0x17,0xcc,0xe0,0x06,0x2b,0x18, +0xc0,0x10,0x5e,0xd8,0x70,0xab,0x2b,0x5d,0x01,0x0b,0xd8,0xc0, +0xa3,0x75,0xb0,0x86,0x37,0xcc,0x61,0x06,0x47,0xf8,0xc3,0x33, +0xb2,0xb0,0x88,0x47,0x2c,0x5a,0xd4,0xb2,0xb6,0xc3,0x28,0x4e, +0xb1,0x86,0x41,0xcc,0xe2,0xad,0x60,0x77,0xc0,0xae,0xc5,0xb0, +0x88,0x55,0x4c,0xe3,0x1a,0xbb,0xb7,0xc5,0x38,0x6e,0xf1,0x76, +0x72,0x2c,0x41,0x53,0xb9,0xa7,0x51,0x4b,0x5a,0x94,0x79,0x84, +0x8c,0x14,0x20,0xcb,0xc5,0xc8,0x14,0x69,0x14,0x63,0x94,0xbc, +0x95,0x1d,0x0b,0x64,0xc7,0x50,0xb6,0x0e,0x67,0x44,0x23,0xe5, +0x2a,0x3f,0xf9,0x20,0x4e,0x9e,0xb2,0x75,0xb2,0x6c,0xe5,0xdd, +0x3a,0x59,0xc9,0x51,0x1a,0x91,0xa9,0x66,0x07,0x66,0xef,0x94, +0xb9,0x21,0x60,0xce,0x4b,0x9a,0x9f,0x72,0x66,0x91,0xb4,0x39, +0xff,0x25,0x0f,0x40,0x00,0x67,0xe4,0x0c,0x80,0x38,0x3f,0x99, +0xce,0x76,0xae,0x73,0x9d,0x11,0xb0,0x9d,0xf0,0x3c,0x39,0xcf, +0x34,0xe1,0x72,0x9e,0x39,0x03,0x00,0x04,0xd0,0xb9,0xd0,0x59, +0x0e,0x34,0x9f,0xbd,0x3c,0xe8,0x35,0xbb,0x68,0xcc,0x6c,0xf6, +0x71,0x47,0xde,0x7c,0x1b,0x48,0x3f,0x9a,0xc9,0x2e,0xa1,0xb4, +0x4f,0x34,0xcd,0x91,0x41,0xef,0xf9,0xce,0xa0,0xfe,0x34,0x4d, +0xf8,0x2c,0xe7,0x3e,0x1b,0x7a,0xcf,0xa5,0x2e,0xb4,0x9e,0xe7, +0x5c,0x90,0x51,0x63,0xb9,0xd5,0xa2,0x39,0x74,0xfa,0xe2,0x4c, +0x67,0x18,0x45,0x62,0x07,0x87,0x32,0xd1,0xad,0x73,0xfd,0xa1, +0x5d,0x3f,0x65,0x45,0xbe,0xd6,0x8a,0xa7,0x01,0x5d,0x6a,0x0c, +0x89,0x9a,0xce,0xc8,0xae,0x33,0xb1,0x43,0xcd,0x6c,0x3d,0xcb, +0xba,0xd5,0x53,0xf6,0xb4,0xee,0xd2,0x52,0x6b,0x14,0xa0,0x40, +0x01,0x0a,0xb0,0x36,0xb6,0xb5,0x9d,0x6d,0x50,0xee,0x6c,0xdb, +0xd7,0xee,0x36,0xb8,0xb7,0x38,0x34,0x71,0x9b,0x9b,0xdb,0xbf, +0xec,0x1e,0xb7,0xd7,0x1d,0x6e,0x6f,0xf7,0x44,0xda,0x87,0xc6, +0xb3,0xa1,0x49,0x9d,0x6a,0x69,0xdf,0xf9,0xd0,0x81,0x56,0x35, +0x41,0x64,0x6d,0x6f,0x56,0xeb,0x39,0xce,0x89,0x56,0x1a,0xad, +0xf5,0xb3,0x22,0x4c,0x65,0x02,0xa0,0x99,0x35,0x91,0xc1,0x11, +0xce,0x1f,0x85,0x5b,0xe9,0xe0,0x1f,0x84,0x51,0xb7,0x20,0xfe, +0x40,0x7f,0x2b,0x64,0xd9,0x7f,0x7e,0xb6,0xb2,0x9f,0x3d,0x6a, +0x2e,0x5b,0x1c,0xcb,0xf1,0xb6,0x33,0xbf,0x35,0xde,0x18,0x6a, +0xe7,0x66,0xa9,0x19,0xff,0xe5,0x60,0xcf,0x38,0x65,0x95,0x14, +0xa1,0x7c,0x84,0x2b,0x7f,0x52,0xcb,0xdd,0xf3,0x72,0x95,0xa7, +0x8c,0xe5,0x4a,0x71,0xf9,0x52,0x61,0x7e,0x73,0x99,0xe7,0x1c, +0xce,0x24,0x6f,0xb5,0xbc,0xb5,0x3c,0xe5,0x53,0x4b,0x39,0xd6, +0x09,0xe9,0xb7,0x75,0x9e,0xcd,0x6f,0xf1,0xc0,0xc4,0xe9,0x0c, +0x19,0xb8,0x4f,0x76,0x9e,0xc2,0x9b,0x4f,0xe9,0xe7,0x72,0xa1, +0x3a,0xcf,0xcf,0x14,0x25,0xac,0x7b,0x47,0xeb,0x36,0xe7,0xfa, +0xcc,0xb3,0x9e,0xf2,0xad,0x2b,0xca,0xeb,0x9d,0x0e,0xba,0xbf, +0x87,0xbd,0xe8,0xa5,0xf3,0x1b,0xd1,0x46,0x47,0x88,0xd2,0x9b, +0x7d,0x10,0x7a,0xab,0x5d,0x20,0xf3,0x8e,0xbb,0xdc,0x07,0x2d, +0xc5,0xe8,0xc5,0x4c,0x51,0x74,0x08,0x4a,0x8a,0xbe,0xe8,0x77, +0xb1,0x07,0x1e,0x28,0x83,0xf7,0x88,0x05,0xff,0x3e,0xa5,0xc3, +0x1f,0x9c,0x8b,0x8a,0xcf,0x1f,0xe3,0xa3,0xe4,0xf8,0x8a,0x0f, +0xe4,0xee,0xca,0xbe,0x10,0xab,0xfb,0x3c,0x6c,0x7d,0x7b,0xfc, +0xe3,0x06,0x99,0xfb,0xd2,0x53,0x25,0x75,0x9f,0x10,0xb2,0xa9, +0x87,0x44,0xd4,0xa2,0x86,0x82,0x78,0xf7,0x9c,0x3e,0x9e,0xa9, +0xc7,0x88,0x95,0x28,0x7f,0xf8,0x14,0xbd,0xbe,0x90,0xb1,0xdf, +0xd4,0xea,0x6b,0xef,0xfa,0xc3,0xe2,0x13,0x80,0xba,0xa7,0x7d, +0xeb,0x05,0x3e,0x6f,0x5a,0x9b,0xfa,0xd8,0xa9,0xfe,0x34,0xdd, +0x43,0x9f,0x74,0x7d,0x2f,0x04,0xf3,0x21,0x31,0xb9,0x49,0x2c, +0x09,0x7b,0xbf,0xdd,0x6c,0x51,0x10,0x20,0xca,0xe3,0xe5,0x42, +0x7d,0xdc,0x5b,0xdf,0x65,0xd8,0xd7,0xbe,0xff,0xed,0x05,0x59, +0x7d,0xbb,0x5d,0x5f,0x52,0xe2,0x77,0x3d,0xf9,0xbd,0x6f,0x7e, +0xf0,0xa3,0x9f,0xf5,0x96,0x5f,0x35,0x4c,0x86,0xfe,0xef,0x45, +0xf3,0xd9,0xce,0x7e,0x06,0xb4,0xfc,0x9b,0xcf,0x7c,0xe8,0xf3, +0x3f,0xea,0x89,0xa6,0x77,0x10,0x30,0x53,0xca,0xe4,0x33,0x66, +0x33,0x7b,0xd9,0x47,0x14,0x29,0x42,0x80,0x67,0x63,0x80,0x6f, +0x83,0x80,0x4c,0xb1,0x80,0xc3,0xd4,0x80,0x2b,0x73,0x80,0xbb, +0x37,0x14,0x12,0x08,0x4d,0x14,0xd8,0x32,0x0f,0x78,0x81,0x74, +0x10,0x7f,0xa2,0x17,0x6a,0x83,0xe6,0x67,0xa5,0x66,0x74,0x03, +0x47,0x82,0x21,0xa8,0x6c,0x5b,0xe6,0x7c,0x40,0xd7,0x27,0x23, +0x28,0x6d,0x23,0x75,0x58,0x1b,0x68,0x81,0xb4,0x87,0x81,0xea, +0x27,0x83,0xa7,0x43,0x83,0x09,0x68,0x83,0xdc,0x47,0x52,0x05, +0x58,0x81,0x1d,0x58,0x83,0x1f,0x78,0x83,0x83,0x95,0x83,0x41, +0xb8,0x83,0x43,0x98,0x12,0xfe,0x17,0x6f,0x73,0xc6,0x84,0x97, +0x77,0x79,0x46,0xb7,0x84,0xf1,0xe6,0x7f,0xcd,0x47,0x85,0x71, +0x57,0x7a,0xb9,0x41,0x7e,0xe5,0xc7,0x81,0xee,0x77,0x11,0x11, +0xe8,0x1e,0x5a,0xc8,0x7e,0x5c,0xe8,0x29,0x48,0xb8,0x80,0xeb, +0x87,0x4f,0xed,0x47,0x86,0x5f,0x28,0x17,0x61,0x88,0x86,0x63, +0x18,0x7e,0x0a,0xd8,0x5c,0x54,0x18,0x5e,0xae,0xa6,0x12,0x1a, +0xd7,0x21,0xd0,0xf4,0x7b,0x1a,0x81,0x80,0x6e,0x10,0x87,0xdc, +0x97,0x87,0xb9,0xe7,0x24,0x8b,0xd2,0x87,0x3c,0xe8,0x1d,0xc3, +0xa4,0x87,0xaa,0x17,0x25,0x84,0x98,0x84,0x86,0x08,0x88,0x0c, +0xff,0x14,0x7c,0x10,0xb0,0x88,0xf1,0xc7,0x63,0xe1,0x32,0x87, +0xbf,0x16,0x79,0x85,0xa7,0x28,0x7e,0x51,0x88,0x09,0x97,0x11, +0x8b,0x27,0x76,0x9b,0xc8,0x88,0x9d,0x78,0x40,0x99,0x38,0x25, +0xa1,0x98,0x78,0x1a,0xf1,0x89,0x9a,0x48,0x88,0x93,0x48,0x89, +0x94,0x68,0x55,0x29,0x14,0x38,0xab,0xd8,0x87,0x3a,0x17,0x8b, +0x56,0xa7,0x88,0x9b,0x58,0x8b,0x55,0x37,0x79,0x91,0x98,0x8b, +0x34,0x57,0x76,0x61,0x37,0x8b,0xa2,0x18,0x7a,0x54,0x46,0x68, +0xb0,0x96,0x68,0xc5,0x08,0x6d,0x99,0x07,0x75,0x2b,0xb8,0x8c, +0x7e,0xf6,0x67,0xc8,0xf8,0x79,0x11,0xf4,0x8c,0x53,0x07,0x76, +0x7e,0xd7,0x73,0xb8,0x38,0x1b,0x64,0x07,0x8c,0xd7,0xf8,0x77, +0x32,0x97,0x1f,0xdb,0xc8,0x73,0xde,0x98,0x8d,0x83,0x21,0x12, +0x35,0xb7,0x78,0xd8,0xd8,0x8b,0xda,0x88,0x65,0x00,0xe7,0x64, +0xd2,0x77,0x65,0x86,0x16,0x65,0xf1,0x48,0x8c,0x25,0x98,0x77, +0x57,0x58,0x68,0xc8,0x96,0x77,0xf8,0x87,0x8f,0xf2,0xd8,0x76, +0xbd,0x35,0x6a,0x6d,0x27,0x71,0x98,0x62,0x14,0x11,0x07,0x23, +0x03,0xc9,0x70,0xd9,0xe2,0x70,0x91,0x88,0x90,0x20,0x54,0x70, +0x56,0x42,0x90,0xe5,0x71,0x82,0x78,0xa6,0x7c,0xce,0x76,0x74, +0xce,0xe7,0x8e,0xc7,0x26,0x77,0x2c,0x48,0x68,0xf6,0x67,0x91, +0xf8,0x26,0x6c,0xd2,0x98,0x8c,0xf0,0x58,0x65,0xda,0xd2,0x6e, +0x26,0x09,0x6e,0xe9,0xa6,0x40,0xec,0x36,0x6e,0xd9,0x96,0x92, +0x5e,0x75,0x6e,0x27,0x49,0x6e,0xaa,0x12,0x93,0x2b,0xe9,0x92, +0xd0,0x56,0x6f,0xce,0xff,0xe6,0x69,0x23,0xc7,0x82,0xfa,0x47, +0x6a,0x14,0xc9,0x91,0x49,0x57,0x82,0x73,0xc6,0x76,0x7f,0x46, +0x8c,0x1a,0xa9,0x77,0x05,0xe1,0x8f,0xcd,0x96,0x67,0xb6,0x86, +0x6b,0x97,0xd8,0x6b,0x4e,0xe9,0x12,0xc0,0x16,0x95,0x2b,0x31, +0x95,0x7d,0x22,0x6f,0x22,0xf7,0x93,0x42,0x77,0x93,0x15,0x89, +0x7f,0xf7,0x27,0x8f,0x55,0x78,0x65,0xf0,0x48,0x94,0x1b,0x07, +0x6b,0x1c,0x57,0x87,0xce,0x08,0x6b,0xfb,0x66,0x71,0x63,0x66, +0x1b,0x93,0x26,0x69,0x0c,0xe1,0x68,0x65,0x62,0x69,0x2b,0xa1, +0x69,0x6d,0x99,0x64,0x74,0x69,0x45,0x79,0x09,0x72,0x39,0x89, +0x6f,0x41,0x57,0x87,0x24,0x58,0x91,0xa2,0x06,0x90,0xa6,0x46, +0x8d,0x1f,0x17,0x98,0xf2,0xf7,0x8e,0x48,0x89,0x8f,0x1c,0xc9, +0x74,0x79,0x97,0x94,0x1e,0x87,0x96,0x77,0xf9,0x96,0x48,0xb6, +0x10,0x72,0xa9,0x97,0x98,0x56,0x97,0x70,0x69,0x12,0x9c,0x26, +0x2a,0x7b,0xa9,0x48,0x9f,0xb9,0x95,0x5e,0x39,0x7a,0xfd,0xb7, +0x6f,0x6d,0x37,0x32,0xa8,0x76,0x74,0x84,0xc9,0x95,0xf0,0xa8, +0x94,0xf9,0x67,0x89,0x68,0xd9,0x69,0xac,0x89,0x99,0x4b,0x46, +0x64,0x91,0xe6,0x96,0x66,0x26,0x25,0x41,0x16,0x66,0x9e,0xc9, +0x9b,0xb7,0xf9,0x63,0xba,0x39,0x7f,0xae,0x36,0x82,0x1a,0x17, +0x9b,0xc6,0xa8,0x8f,0xa7,0x36,0x72,0xa5,0xe7,0x8e,0x1f,0xf9, +0x91,0x50,0xe8,0x93,0xb2,0x59,0x12,0x68,0x69,0x9c,0xae,0x58, +0x9d,0xa1,0x07,0x9d,0xc4,0x39,0x9b,0xd7,0xb9,0x95,0xd7,0x49, +0x96,0xd3,0xb9,0x93,0x40,0x19,0x7d,0xd1,0xff,0x28,0x92,0x48, +0xb7,0x96,0xd6,0x79,0x9e,0x47,0x29,0x98,0x3f,0x19,0x9b,0x01, +0x28,0x9a,0x42,0xe7,0x9d,0xe0,0xb9,0x94,0x1b,0x59,0x11,0x4a, +0x89,0x8f,0xf3,0x26,0x65,0x8b,0x89,0x9e,0xfa,0x69,0x94,0xef, +0x48,0x91,0xd4,0x09,0x96,0x6b,0x87,0x9f,0x89,0xa9,0x6a,0xc6, +0x09,0xa0,0xea,0xa9,0x82,0xcc,0xb7,0x77,0x49,0x47,0x9d,0xfb, +0xb7,0x9f,0xfb,0x19,0x1e,0xa7,0x86,0x9a,0xa8,0x09,0x8d,0xf3, +0xf9,0x82,0xd3,0x59,0x9e,0xfd,0x86,0x98,0xe5,0xb9,0x65,0x67, +0xa9,0x76,0xf9,0x89,0x77,0x7f,0x69,0x89,0x0e,0x0a,0x62,0xf7, +0x09,0xa2,0xf6,0x68,0x9f,0x8f,0x69,0xa2,0x08,0x21,0x6b,0x25, +0xfa,0x9c,0xe6,0x69,0x10,0x2d,0xca,0x98,0x30,0xca,0x71,0x1f, +0xba,0x15,0x22,0x3a,0xa2,0x38,0x8a,0xa3,0x0c,0x9a,0xa3,0x3c, +0xda,0xa3,0x11,0x74,0xa3,0x3e,0x1a,0xa4,0x42,0x6a,0x9d,0x2b, +0xf2,0x59,0x3b,0x61,0xa4,0x2c,0x81,0xa4,0xeb,0x53,0x11,0x22, +0xb9,0x7f,0x9a,0x77,0x8c,0x81,0x66,0x98,0x12,0x6a,0x6c,0x5b, +0x26,0x1a,0x01,0x97,0x96,0x09,0x1a,0x70,0x91,0x09,0x6d,0x57, +0x9a,0x79,0x81,0x05,0x56,0x2c,0x45,0x58,0x9d,0x95,0x55,0x61, +0x9a,0x58,0x63,0x0a,0xa6,0xbd,0x64,0xa6,0x87,0x42,0xa6,0x69, +0xaa,0x57,0x14,0xd1,0x71,0xd1,0xe6,0x76,0xf3,0xc8,0xa1,0xc5, +0x57,0x7c,0x72,0x8a,0x9c,0xf6,0x88,0x67,0xb4,0x16,0x8f,0xe0, +0x69,0x77,0xdb,0x39,0x82,0x70,0x67,0x94,0x19,0x97,0x8c,0xf8, +0xd7,0x8e,0x1d,0xa1,0x54,0x60,0xe5,0x57,0x62,0xd5,0x55,0xde, +0xff,0xf1,0x55,0x23,0xa5,0xa8,0x5c,0x35,0x3e,0x86,0xa5,0x4e, +0x7f,0x95,0x40,0x72,0x81,0xa8,0x8f,0x8a,0x58,0x26,0xd5,0x2b, +0x80,0xb9,0x74,0x18,0x27,0x96,0x00,0x49,0x9a,0xab,0x66,0x6f, +0x19,0xba,0x9c,0xf1,0xa9,0x74,0xa3,0xd9,0x95,0xc5,0x09,0x68, +0xed,0xe8,0x97,0xa9,0x99,0x67,0xef,0xf4,0x54,0x63,0x53,0x49, +0x55,0x75,0x07,0x9b,0x0a,0x58,0x93,0x24,0xab,0x03,0xe8,0x83, +0x1d,0x85,0x41,0xb8,0xa9,0x41,0x4a,0x35,0xab,0xbc,0x6a,0xab, +0xdf,0x82,0xab,0x21,0xa4,0xab,0xb4,0xaa,0x4c,0x9b,0xaa,0x4f, +0x5d,0xa9,0x7c,0x00,0x47,0x7f,0xa0,0x26,0x6d,0xd9,0x49,0xaa, +0xab,0xaa,0x77,0x64,0xa9,0x95,0xa3,0xb7,0x8f,0xd0,0xea,0xa9, +0xf5,0x07,0x70,0xdc,0xfa,0x91,0xe8,0xc4,0x49,0xd4,0xf7,0x49, +0xa1,0x62,0x42,0x27,0xe4,0x3a,0xea,0x24,0x4f,0xee,0x96,0x70, +0x81,0x74,0x4f,0x7a,0x98,0x49,0xfa,0xa4,0x4b,0xc2,0x3a,0xae, +0xff,0x84,0x2d,0xfb,0x68,0x72,0xd4,0x46,0x65,0x80,0xda,0x91, +0x87,0x89,0xad,0xd4,0x4a,0xa3,0x16,0x87,0xaa,0x25,0xf8,0x9d, +0xdd,0x99,0xaf,0xa4,0x46,0x6c,0x6c,0xb7,0x48,0xbb,0x04,0x4d, +0xca,0xa4,0x42,0xf4,0x14,0x4c,0x0b,0x5b,0x49,0xe4,0x6a,0x4c, +0x29,0xf5,0x4c,0x12,0xbb,0x4c,0x0f,0xeb,0x4c,0x11,0xdb,0x4b, +0x90,0x94,0x48,0xde,0x2a,0x94,0x12,0x99,0x96,0x42,0xc9,0x9d, +0x77,0x46,0xa5,0x26,0xab,0xa7,0x51,0x7a,0x21,0xae,0xca,0x97, +0x1b,0xea,0xaf,0xf5,0xf8,0xac,0xa3,0x0a,0x9d,0x77,0x56,0x4f, +0xe8,0x3a,0x53,0xc5,0xff,0x14,0xaf,0xb1,0x5a,0xb3,0x1c,0x55, +0xaf,0xa8,0x98,0x4e,0x3b,0x3b,0x45,0xe5,0xea,0x22,0xfc,0xa4, +0xb3,0xfe,0x04,0xb4,0x0c,0x09,0xb3,0x19,0x89,0x7c,0x73,0x4a, +0xad,0x43,0x99,0xa7,0xa8,0xf6,0x98,0x83,0x76,0xb0,0xf6,0x98, +0x9d,0x2c,0x2b,0xad,0xc5,0x99,0x6c,0x30,0xeb,0x95,0x09,0x9b, +0xb3,0xc0,0xe7,0x89,0x46,0x9b,0xb1,0x1b,0x24,0x45,0xbe,0xfa, +0xab,0x65,0x32,0xb4,0x5d,0x7b,0x40,0xc5,0x0a,0xb6,0x5e,0x14, +0x79,0x88,0xa4,0x4f,0x48,0x5b,0xa8,0x10,0xba,0x9e,0x2e,0xdb, +0xb4,0xdb,0x49,0xb2,0x7b,0x76,0xad,0x02,0x7b,0xb7,0x76,0xbb, +0x94,0xd8,0x79,0xb7,0x3b,0x99,0xab,0xb1,0x48,0x42,0x64,0x2b, +0xb4,0x9d,0x13,0xb8,0x18,0x0b,0x53,0x22,0x94,0x42,0xbe,0x8a, +0x52,0x1b,0x14,0xb8,0x69,0x1b,0x94,0xff,0xd6,0xaa,0xf1,0xa8, +0x68,0x9b,0x57,0xb7,0x7d,0x69,0xb9,0xcd,0x58,0xb2,0xa7,0xea, +0x9c,0xd1,0x9a,0x7c,0xcb,0xc7,0x76,0x08,0x7b,0x7f,0x6c,0x29, +0x42,0x5e,0x0b,0x49,0x33,0xc3,0x3f,0xa4,0x08,0xb4,0xa5,0x83, +0xba,0x0d,0xe4,0x44,0xab,0xfb,0x3d,0xa9,0xdb,0x3f,0x72,0x37, +0x91,0xcf,0xea,0x97,0x44,0x69,0xb5,0xd9,0x7a,0xb5,0x7c,0xa9, +0xb9,0x01,0xbb,0xb2,0x49,0x0b,0x65,0xba,0xeb,0xa9,0xf8,0x96, +0xaa,0x92,0x59,0x40,0xe0,0x03,0x38,0xa6,0x7b,0x30,0xe7,0x93, +0x3d,0xdf,0xc3,0xa8,0x1d,0xb1,0x40,0xc7,0x7b,0x3e,0x96,0xfa, +0x3c,0xcb,0x6b,0x3e,0x0e,0x14,0x75,0x4f,0x28,0xb3,0x7e,0x2b, +0xa0,0x08,0x2a,0x82,0x04,0x1a,0xbc,0x6a,0xff,0xb9,0x71,0x78, +0x3b,0xbc,0x19,0xe7,0x9f,0x9f,0xab,0x9c,0xc3,0x5b,0x6c,0x65, +0x69,0x12,0xad,0x63,0x3b,0x2e,0x13,0x3b,0x63,0x65,0x11,0xed, +0xfb,0x3a,0xef,0x8b,0x3b,0xb3,0xc3,0x33,0xae,0x13,0x3a,0xf0, +0xeb,0xbc,0x22,0x81,0xbf,0xee,0x9b,0x3a,0xf1,0xab,0x91,0x87, +0xf9,0x95,0x2d,0xeb,0x74,0x4e,0x87,0xb2,0x06,0xfc,0x97,0x56, +0xaa,0xbd,0x70,0x5b,0x8c,0xe2,0x11,0xa1,0x6f,0x27,0xa1,0xe8, +0xbb,0x76,0xd4,0x26,0x6b,0x27,0x53,0x37,0xcc,0x1b,0x37,0x33, +0x83,0x32,0xd2,0x03,0x38,0x1a,0xec,0x12,0x7d,0x13,0xbd,0x81, +0xc3,0xbf,0xec,0x4b,0x33,0x1d,0x0c,0x37,0xb2,0xf3,0xa6,0xc5, +0xc8,0x74,0x28,0xaa,0x71,0x8f,0x99,0xa2,0x26,0xfa,0xc2,0x09, +0x71,0x9f,0x72,0xc6,0xc2,0x2d,0xfc,0x9c,0x4e,0x98,0xbd,0x4e, +0xcb,0xc2,0x36,0x6c,0x9f,0x87,0x8a,0x33,0xf4,0x0b,0xc4,0x24, +0x3c,0x37,0x40,0x1c,0x3a,0x41,0x23,0xa9,0x45,0x83,0x3a,0x47, +0x5c,0x3a,0x49,0x7c,0x33,0x3d,0x33,0xc4,0x2a,0x3a,0xa4,0x00, +0x36,0x4f,0x01,0x23,0xa9,0x26,0x02,0xc5,0x69,0x9b,0x30,0xf7, +0xbb,0x22,0xd3,0x2b,0xc5,0x38,0x16,0xab,0xdc,0xc2,0x2c,0xc5, +0xc2,0x90,0x0d,0x29,0x2d,0xc4,0xd2,0x2d,0xdc,0x02,0xaf,0x8c, +0xbb,0x2d,0x67,0x2c,0xc6,0x8f,0x5b,0x27,0xc7,0x1a,0xc6,0xd5, +0x32,0xc6,0xcc,0xea,0xc5,0x00,0xc8,0x8c,0xec,0x88,0xc7,0x52, +0x29,0x7b,0x94,0xe2,0x29,0xa7,0x12,0xb4,0x65,0x2b,0x29,0x9c, +0xa2,0x64,0xa6,0x72,0x29,0x8f,0xc2,0x90,0x7b,0xd8,0xc7,0x85, +0xff,0x0c,0x2a,0x14,0xbb,0x29,0x8a,0x6c,0x29,0xa0,0x72,0xb4, +0x7a,0x4c,0x8d,0x4f,0x5a,0xa5,0x55,0x6a,0xc0,0x5c,0x9a,0xc9, +0x84,0xa6,0xa5,0x5c,0x7a,0xb2,0x53,0x3b,0xc3,0x75,0xda,0x65, +0x91,0xe2,0x26,0x5e,0x02,0x27,0x55,0x72,0x25,0x88,0xbc,0x25, +0x5c,0x67,0xca,0x60,0x72,0x29,0x72,0x82,0xb3,0xeb,0x40,0xca, +0xac,0x1c,0x27,0x58,0x92,0x78,0xb2,0x6c,0x29,0xad,0x2c,0x26, +0x1e,0xab,0x8f,0x1c,0xaa,0xaf,0xbc,0xdc,0x9a,0x3b,0xc6,0xa7, +0xa1,0x2c,0xbc,0x74,0x4b,0xcc,0xc6,0x0c,0x6a,0x53,0x3b,0xb2, +0x99,0x0b,0xb9,0xff,0xa6,0x3e,0x1d,0x22,0x71,0x21,0x02,0xcb, +0x28,0x62,0x22,0x32,0xc2,0x21,0xd3,0xfc,0x21,0xd1,0x3c,0xb8, +0xee,0xb4,0x0e,0xd7,0xbc,0x13,0xd5,0x8c,0xb9,0xa6,0x06,0xb2, +0x11,0x7c,0x91,0xbd,0x5b,0xcc,0xbc,0x9b,0xad,0x02,0x6a,0xa0, +0xe5,0xcb,0xb4,0x17,0x97,0x6a,0x9e,0xeb,0x2b,0xe8,0xf1,0x1f, +0x7c,0x21,0x78,0x04,0x07,0x79,0x3e,0x21,0xcf,0x52,0x41,0xcf, +0x14,0x7b,0xcf,0xeb,0x31,0xcf,0xad,0x97,0xca,0xfd,0x81,0xcf, +0x4c,0xa1,0xcf,0x6e,0xab,0x9c,0xe4,0x0c,0xba,0x3d,0x4c,0xb5, +0x25,0x0b,0x65,0x48,0xdb,0xb9,0x22,0xb8,0xad,0x1b,0xa7,0xcc, +0xcb,0x0c,0x72,0xd3,0x09,0x52,0xb9,0x81,0x1c,0xfe,0xbc,0x7d, +0x75,0x5c,0x1c,0x18,0x9d,0xcf,0xc3,0x67,0xac,0x17,0x1d,0x8a, +0x03,0x3d,0x7c,0x1b,0xed,0x96,0xea,0x98,0xd1,0xb0,0xa1,0x1c, +0xfb,0x8a,0xd0,0x45,0xf9,0xce,0x24,0x7b,0xbb,0xf2,0xc6,0xc0, +0xb4,0x7b,0xd0,0x1b,0xff,0x29,0x75,0x19,0x7a,0x77,0x59,0xf9, +0xa2,0x16,0x21,0xd2,0xda,0x47,0xcf,0x7a,0xc1,0xd3,0xac,0xe7, +0xd3,0x80,0x01,0xd4,0x8e,0xb7,0x7d,0x43,0xbd,0x88,0x3d,0x3d, +0x7c,0x4f,0x17,0x98,0xa0,0x4b,0x82,0xe4,0x6b,0xb9,0x30,0xed, +0xd0,0xa2,0xca,0x9e,0xda,0xbb,0xbe,0xd8,0xda,0xbd,0xbb,0xcb, +0x39,0x48,0x1d,0xd4,0x42,0x8d,0x14,0x5b,0x5d,0xd4,0x46,0xed, +0xd5,0x19,0xad,0xd4,0x62,0xed,0xd1,0x5d,0x1d,0x94,0x29,0x8a, +0xd0,0x73,0xba,0x6f,0x82,0xe6,0xbb,0x83,0x59,0x96,0x56,0x6a, +0xd5,0xa4,0xca,0x93,0xa6,0x3a,0xbb,0xcc,0x6c,0x32,0x47,0xca, +0x39,0x79,0xad,0xa4,0x1e,0x81,0xd7,0x49,0x7a,0x95,0xe0,0x2c, +0xb3,0x5b,0x5a,0xce,0xa4,0x59,0xbb,0x9a,0x6b,0xd3,0x0d,0xaa, +0x95,0x58,0x88,0xaa,0x21,0x09,0xa4,0x76,0xfc,0x5f,0xec,0x7c, +0xce,0x62,0xa9,0x8c,0xcc,0x06,0x9f,0x2f,0xb8,0xbe,0xc3,0x69, +0xb7,0xfd,0x79,0xd5,0xcb,0xd7,0xd9,0x8f,0x4d,0x89,0x19,0x8a, +0x9f,0xa0,0xfb,0xd2,0x6e,0xcd,0xaa,0x2f,0x78,0x7f,0xf4,0x87, +0xb7,0x58,0xc8,0xd9,0x58,0x0d,0x7a,0x9f,0xed,0x8a,0xa5,0xaa, +0xaa,0x95,0x3b,0x92,0xf2,0x49,0xdb,0xa9,0x79,0x6f,0xa2,0x46, +0xce,0x53,0xbd,0x98,0xa2,0x77,0xd3,0xaf,0x8d,0x9e,0x8c,0xed, +0xcb,0x14,0x4c,0xd5,0xc7,0xc8,0x93,0xe0,0x99,0xaa,0x95,0x3d, +0xbc,0x4f,0xda,0xdb,0x91,0xe9,0xd8,0xbf,0xcd,0x5c,0x1e,0x2a, +0xba,0x1b,0x39,0x85,0x2e,0x3c,0xa3,0xd5,0xfd,0xa2,0xc9,0xa6, +0xd3,0x2c,0xea,0xb4,0x54,0x2a,0x9a,0x2a,0xff,0xfb,0xdc,0x43, +0x9a,0x82,0xe7,0xe9,0xb4,0x30,0x1a,0xc3,0x1f,0x3a,0xa1,0xe0, +0x4d,0x89,0xce,0x0d,0xde,0x79,0xba,0xde,0xe9,0xdd,0x64,0xef, +0xcd,0x5c,0x99,0x79,0x69,0x7b,0x55,0x99,0x6e,0x16,0x9c,0x78, +0xe9,0x9b,0xf4,0x0d,0x18,0xf6,0xcd,0x99,0xf8,0xfd,0x74,0xd8, +0xab,0x12,0xd2,0x18,0xa7,0x02,0xfc,0x6e,0x91,0xd9,0xa4,0xcb, +0x31,0x99,0xf7,0xdd,0xdf,0x43,0x36,0xdf,0xb4,0x11,0x9a,0x47, +0xb6,0x99,0xb9,0xd1,0x99,0x62,0xe6,0xe0,0xa0,0x69,0xe1,0x0a, +0xda,0xce,0x02,0x8e,0x79,0x15,0x1c,0xa2,0xff,0x67,0x8c,0xa2, +0xca,0xd6,0xee,0x1d,0xe1,0xfd,0xad,0xe0,0x96,0xf9,0x99,0x97, +0x69,0x11,0x76,0x49,0xe1,0xf4,0xad,0xdf,0x0f,0x8e,0xe1,0x19, +0x6e,0xd7,0x2d,0xd8,0xce,0x38,0xad,0x76,0x91,0xcd,0xd9,0xe2, +0x9d,0x12,0x3b,0x50,0xcb,0xa0,0xb5,0x10,0x3b,0x0e,0x23,0x15, +0xf1,0xe3,0x45,0x4a,0x11,0x42,0xee,0x59,0x6f,0x6a,0xe3,0x8e, +0x1d,0x82,0x4a,0x7e,0x77,0x24,0x17,0x9f,0x7b,0x2b,0x20,0xe8, +0xb4,0x92,0xe7,0x26,0x37,0xe8,0x04,0x93,0x2c,0x49,0xe5,0x5d, +0xc4,0x92,0x35,0xb9,0xc7,0x25,0xa9,0xe5,0x26,0xe9,0x3c,0x08, +0x5c,0x98,0xe4,0x29,0xa5,0x0b,0x4c,0xa1,0x97,0xec,0x8e,0x71, +0xdd,0x8e,0xc8,0x28,0xa8,0x85,0xfd,0xd2,0x2a,0xd8,0x67,0x5e, +0x4a,0xe0,0x0d,0x69,0x14,0x91,0x6c,0xe4,0x1c,0x42,0xe7,0x87, +0x6c,0xe7,0xcd,0x84,0xe7,0x12,0x07,0xc7,0x0b,0x59,0xe7,0x3d, +0xde,0x10,0xbc,0x1c,0x6b,0xfe,0x08,0x90,0xa7,0xc9,0x8f,0xda, +0xff,0xaa,0x94,0x7e,0xea,0x6c,0xa8,0x4d,0xe8,0xed,0xa9,0xd9, +0xee,0x1c,0xb0,0x51,0x1a,0xb9,0xfc,0x88,0x9f,0x01,0x29,0x1f, +0x86,0x8c,0x33,0x23,0x84,0x72,0x29,0x82,0xe9,0x98,0x02,0x33, +0x9b,0x0e,0x55,0xee,0xe1,0xe9,0x56,0x02,0xea,0x1c,0xc4,0xe9, +0xa3,0x8e,0x1c,0x52,0xf2,0xe9,0x1c,0x7c,0xea,0xa2,0xfe,0x6e, +0xf4,0xe6,0x91,0x6c,0x7d,0x91,0xfc,0xea,0xa4,0xcd,0x29,0xbc, +0x9c,0x3b,0xb7,0xdf,0x4a,0xda,0xf4,0x66,0xd8,0x57,0x56,0xd1, +0xd9,0xa7,0xea,0x61,0x62,0xc2,0x29,0xf4,0xea,0xde,0x81,0x1f, +0x46,0x31,0xec,0xad,0x1e,0xea,0x29,0x82,0xec,0x9f,0x42,0xec, +0xcc,0xee,0x1e,0xce,0xae,0xec,0xb5,0x13,0xed,0x9d,0xa6,0xb2, +0x2c,0x0d,0xe9,0x23,0xe3,0xbb,0xd9,0x9e,0xdc,0xe0,0xfc,0x9f, +0xae,0xaa,0xb5,0x13,0xbc,0x74,0x09,0x78,0x18,0xca,0x7e,0x41, +0x1f,0x21,0xed,0xf8,0xf1,0xec,0xd5,0xfe,0x88,0x36,0x59,0xee, +0xc9,0xee,0xca,0xed,0x7e,0xb6,0xf4,0x14,0x1f,0xec,0x8e,0xee, +0x7d,0xcd,0xa4,0x28,0xda,0xd0,0xdb,0xab,0xed,0xed,0xbd,0xdb, +0xe6,0xec,0x9f,0xe0,0xab,0xb7,0x50,0x2d,0xce,0xdd,0xbe,0x67, +0x3b,0x98,0xec,0x82,0xe8,0xb5,0x03,0xc8,0xb0,0xcd,0x3e,0x15, +0x8b,0x92,0xe7,0x8c,0xe4,0xf0,0xea,0xde,0x17,0x11,0x9f,0x8a, +0xb3,0x4a,0xf1,0x72,0xd1,0x14,0x51,0x22,0xf1,0xe8,0xaa,0xf1, +0x47,0x1e,0xf0,0xfc,0xce,0xb7,0x73,0xa7,0xd0,0xfd,0xee,0xed, +0x90,0x9e,0xd8,0xd3,0x3a,0xb0,0xe3,0x3e,0xb3,0x11,0x88,0x7d, +0x40,0xd8,0x80,0xee,0xff,0x7a,0x49,0x15,0xff,0x81,0x30,0xcf, +0x81,0x32,0x4f,0x7d,0x34,0xbf,0xf1,0x0a,0x78,0xf3,0x78,0xd3, +0xf0,0x5a,0xf8,0xf0,0x18,0xe8,0xf3,0x80,0x03,0xf4,0xe4,0xf7, +0x40,0xa7,0xed,0xc0,0x04,0x6a,0x8c,0x0c,0xed,0xd2,0xfd,0x3a, +0xa8,0x9b,0x1b,0xd8,0x93,0xed,0xed,0xe2,0x3e,0xdb,0xce,0x56, +0x86,0x1d,0x9f,0x86,0x32,0x25,0x83,0x35,0x7f,0xf1,0x63,0xb8, +0xf5,0x83,0xd5,0xf5,0x59,0xff,0xf5,0x31,0x18,0xf6,0x3c,0x8f, +0x81,0x63,0x5f,0x81,0x0d,0xc8,0x52,0x55,0x25,0x9e,0x0b,0xac, +0xe6,0x17,0xa9,0xa1,0x65,0x8e,0xa5,0x74,0xf7,0x9a,0xb7,0x3b, +0xc9,0xa7,0x0a,0x8d,0xc2,0x5d,0xf5,0x85,0x8d,0x74,0x58,0x2f, +0x88,0x64,0xcf,0xb0,0x3b,0x7f,0xec,0x0a,0x98,0xf6,0xb0,0x93, +0xa9,0xb8,0x27,0xf6,0x80,0xaf,0xf6,0x32,0x45,0x52,0x42,0xff, +0x81,0x86,0xff,0xbe,0x88,0x3f,0xf8,0xf4,0x49,0xc3,0xaa,0x16, +0xa3,0x28,0x6a,0x9a,0x35,0x8c,0xc3,0x2c,0x6a,0xdd,0x39,0xfd, +0x84,0x37,0x1c,0xa5,0x3d,0xac,0x6f,0x27,0x4a,0xfa,0x78,0x37, +0xdd,0x2e,0xea,0x13,0x4b,0x31,0xf4,0x92,0x12,0xf3,0x19,0xbf, +0x7e,0x29,0xb2,0xfa,0x36,0xdf,0xfa,0x38,0xff,0xfa,0x4e,0xe5, +0x1e,0xb2,0x4f,0x86,0xae,0x6f,0xf4,0x6d,0x2f,0x17,0xb9,0x4f, +0xf4,0x39,0x0f,0xfb,0x39,0xba,0xd9,0x00,0x58,0xa3,0xba,0x93, +0x14,0x68,0xbf,0xf0,0x68,0xeb,0x57,0xc4,0x84,0xfb,0xab,0x7f, +0xf1,0x0c,0xcf,0xfc,0x1e,0xe2,0xfc,0xc9,0xef,0xf1,0xaf,0x7f, +0x7a,0xb1,0xff,0xfc,0x59,0x1f,0xfd,0x2c,0xff,0x35,0xfd,0xfa, +0xa9,0xb2,0x37,0x6a,0xfc,0xc7,0x1f,0x15,0xf7,0xce,0xba,0xa8, +0xd2,0x11,0xe4,0x7f,0xee,0xe6,0xff,0xee,0xe9,0x2f,0xef,0xf8, +0x7e,0xfe,0x22,0xd1,0xfe,0xa5,0xfe,0xfe,0x36,0x19,0xdf,0xc5, +0xbd,0xa0,0x03,0x6e,0x11,0x39,0x47,0xed,0xb1,0x68,0xec,0xe8, +0x0f,0x10,0x99,0x04,0x42,0x58,0xb7,0x4e,0x1d,0x84,0x38,0x71, +0xee,0x2c,0x64,0xc8,0x90,0x13,0x27,0x08,0x00,0x24,0x4e,0x94, +0x08,0x41,0xe0,0xc0,0x82,0x07,0x13,0x36,0xe4,0xf8,0x30,0x22, +0xc5,0x89,0x16,0x2f,0x12,0x34,0x88,0x50,0x21,0x47,0x87,0x10, +0x41,0xae,0x64,0xd9,0xd2,0xe5,0x4b,0x98,0x31,0x65,0xce,0xa4, +0xf8,0x00,0x00,0x02,0x9c,0x13,0x6d,0x82,0xc4,0xb9,0x93,0x66, +0xc5,0x8b,0x99,0x08,0xaa,0xd3,0xb8,0x11,0xe5,0x43,0x95,0x2c, +0x45,0x62,0x24,0x6a,0xf2,0x64,0x47,0x8f,0x2d,0x97,0x0a,0x35, +0x58,0xf4,0x69,0x43,0xa4,0x1f,0x57,0x4e,0x1d,0x6a,0x15,0xe5, +0x9d,0xac,0x3f,0xc5,0x8e,0x25,0x5b,0xb6,0xa5,0x4d,0x04,0x2b, +0x1f,0xa4,0x65,0xe9,0xf3,0x27,0x04,0xb8,0x42,0x9b,0xc2,0xa5, +0x5b,0xd7,0xae,0xd6,0xad,0x71,0x21,0xcc,0xbd,0xdb,0x17,0x2f, +0x48,0xba,0x72,0x0f,0xfa,0xed,0xeb,0x32,0xf0,0xde,0xc1,0x84, +0xed,0x9a,0x65,0xec,0x96,0xf1,0x63,0x90,0x6b,0xdb,0xb2,0x55, +0x4b,0x79,0x6c,0x5d,0x14,0x0a,0x14,0xa0,0xc8,0xbc,0xb9,0x33, +0x67,0x05,0x7f,0xa5,0xd2,0xd5,0x0c,0xda,0x73,0xe9,0xce,0xa2, +0x95,0x92,0x36,0xdd,0xfa,0xb3,0xea,0xbc,0x70,0x5d,0xa3,0x46, +0xff,0x0d,0x1b,0x72,0x4c,0xc9,0xb7,0x75,0x03,0xc8,0x1d,0xd9, +0x72,0xcd,0xdf,0x6d,0x5d,0xee,0x88,0xa4,0x78,0xf1,0x4c,0xe2, +0xc6,0xeb,0xd2,0x4c,0xae,0x1c,0x2e,0xf3,0xe2,0xce,0x6d,0xf3, +0xe6,0xfd,0xc0,0xb1,0x75,0x9b,0xd9,0xab,0x5b,0xd7,0x89,0xbd, +0x26,0xf6,0x9d,0xd7,0xa9,0xd7,0x1c,0xaf,0xb3,0xbc,0x44,0xed, +0xe4,0xc1,0x7b,0x47,0x1f,0x9c,0xb7,0xfb,0xf7,0x30,0xd1,0xae, +0x5c,0x47,0xd0,0x3e,0x7d,0xfb,0xf5,0x67,0xe6,0x27,0xb8,0xb5, +0xfe,0xff,0x99,0xfe,0xbb,0x0f,0x24,0x01,0xf5,0x93,0x89,0xbf, +0x75,0xfc,0xcb,0x4f,0x3e,0xb4,0x10,0xf0,0xa9,0x41,0xeb,0x1c, +0x6c,0xd0,0x41,0xea,0x70,0xa2,0x70,0x22,0x07,0x2d,0x8c,0x4f, +0xa7,0x0c,0x81,0xeb,0x2d,0xbe,0x07,0x6f,0xfa,0x50,0x32,0x0b, +0x25,0x4c,0x6b,0xbe,0xca,0x5c,0x0a,0xcf,0xb1,0x0a,0x59,0x2a, +0x50,0xb4,0x17,0xf7,0x2b,0x50,0x41,0x00,0x65,0x8a,0x91,0x40, +0xfe,0x64,0x5c,0x10,0xb0,0x19,0x5f,0x5a,0x8b,0x32,0xed,0x80, +0xcc,0xd0,0xb2,0x0e,0x31,0x04,0x8e,0x43,0x0f,0x2d,0x5b,0x4b, +0xb2,0xf0,0xd8,0x0a,0x72,0xc3,0xf6,0xbe,0xcb,0xe9,0xc3,0x23, +0xcf,0xa2,0xf0,0xc2,0xec,0xd6,0x73,0x6c,0x47,0x1a,0x7f,0x12, +0xb0,0xa5,0x2f,0x69,0xe2,0x92,0xc7,0xfe,0x68,0x0a,0x13,0x3f, +0x03,0x7d,0x54,0xb2,0xc8,0xf6,0xa8,0x44,0x8f,0xc5,0x28,0xe3, +0x8c,0x32,0xc4,0x0e,0x99,0x04,0xf2,0x26,0x39,0xa1,0x8c,0xf0, +0xce,0xc9,0xce,0xc2,0xd3,0xc9,0xf9,0x7e,0x2c,0x71,0x37,0x42, +0x0b,0x35,0x74,0xa6,0xff,0x11,0xd9,0x7c,0xcf,0x4d,0x89,0x24, +0x4c,0x31,0x4f,0x3b,0xe7,0xa4,0x30,0x3b,0x21,0x91,0xb4,0x74, +0xcf,0x2a,0x7d,0xb3,0x72,0xa5,0x9c,0xd0,0x3b,0xf4,0x53,0x50, +0x43,0xb5,0xb4,0xcd,0x35,0x19,0xc5,0xf0,0xba,0x4a,0x2f,0x6d, +0x71,0xc9,0x0c,0x73,0x4b,0xcf,0xd3,0x37,0x4f,0xfc,0x51,0xd3, +0x47,0x6b,0x55,0x51,0x54,0x5c,0x73,0x85,0x8c,0x3b,0x4f,0x4f, +0xec,0x4e,0x51,0x58,0x21,0x55,0xf2,0x57,0x52,0xcd,0xf3,0xf5, +0xd8,0xf3,0xbc,0x5b,0x72,0x56,0x5a,0x9b,0x75,0xd6,0x25,0xf8, +0x74,0x95,0x76,0xda,0xca,0xbc,0x03,0x92,0x3b,0x56,0xdb,0xb2, +0x36,0x32,0xb7,0x94,0xbd,0x33,0x55,0x26,0xf1,0x0c,0xf6,0xa6, +0x9e,0x24,0x5c,0x8f,0x3c,0x5b,0x8d,0xa5,0x76,0x5d,0x76,0xc9, +0x22,0xb1,0x53,0x0c,0xcb,0x15,0x97,0x53,0x0d,0xe9,0xa5,0x48, +0x43,0x22,0x79,0x32,0x72,0xde,0x46,0x53,0x2c,0xb1,0xde,0x37, +0xbb,0x55,0x92,0xbb,0x68,0xdb,0x35,0xf8,0xe0,0x3c,0x37,0x45, +0x58,0xa6,0x08,0x65,0x02,0x98,0x5f,0x72,0x0b,0x5e,0x78,0xe2, +0x69,0x4d,0xcd,0x94,0xe2,0xef,0xb0,0x83,0x17,0x63,0x8e,0x3b, +0x36,0xcb,0xaf,0xd1,0xee,0xb2,0x77,0xe4,0x78,0x59,0xda,0xb8, +0x22,0xd1,0x9e,0x03,0x2c,0x65,0xd1,0x4e,0x6e,0xf4,0x37,0x97, +0xc9,0xfd,0x89,0x9b,0x99,0x68,0x96,0xc8,0x66,0x8f,0x01,0xb0, +0x66,0x25,0x65,0xc4,0xea,0xf9,0x40,0x65,0x94,0xc1,0x62,0x68, +0x2c,0x82,0x4e,0x39,0x68,0xa2,0x8b,0x56,0x06,0x2f,0x04,0xcc, +0x30,0x03,0x66,0xa7,0x29,0x7b,0xba,0x69,0xff,0x90,0xa6,0x36, +0x03,0x43,0x08,0x58,0x61,0xe5,0xae,0x01,0x06,0x80,0x80,0x2d, +0x33,0xb2,0xde,0xda,0xae,0xae,0x21,0xb8,0xba,0xd1,0xa8,0x79, +0x4a,0x5b,0x22,0xab,0xab,0xc6,0xe9,0x6c,0x96,0x70,0xe6,0xc6, +0xe6,0xb9,0x5b,0xa2,0x5b,0x6e,0x42,0x7f,0x06,0xa0,0x67,0xbd, +0x77,0x8e,0x49,0x6f,0x9e,0xf7,0xa6,0x88,0x6f,0xc0,0x7f,0x0e, +0x3a,0x26,0x04,0xe0,0x12,0x3a,0x68,0xa4,0x97,0xfe,0x9a,0x6d, +0xc5,0x95,0x6e,0x1c,0xae,0xb3,0x97,0xa3,0xc8,0x72,0x00,0x30, +0x47,0x59,0xe5,0xa6,0xc5,0xd6,0xfa,0xf3,0xae,0xbd,0x9e,0x3a, +0xf1,0xcf,0x4b,0x0f,0xfd,0x6b,0xb6,0x34,0xcf,0x9c,0xae,0x90, +0x58,0xbf,0xdc,0x75,0x8a,0xea,0xbe,0x99,0xe6,0xb9,0xeb,0xc6, +0x79,0xa5,0xdb,0x6b,0x07,0x00,0x1a,0x00,0x6c,0xbf,0x9d,0x67, +0xbd,0x95,0xe1,0x86,0x70,0xc6,0x0f,0x97,0xc8,0x1a,0xbf,0x25, +0x2a,0x5e,0x79,0x9d,0x91,0x67,0x89,0x71,0xc1,0x99,0x7f,0xde, +0xe1,0xb0,0x85,0xbe,0xab,0x68,0xb3,0x2d,0x84,0xc0,0x7a,0xbb, +0xb0,0xc7,0x09,0x82,0xb2,0xc5,0xb1,0x4b,0x28,0xc7,0x33,0x0f, +0x7f,0xfc,0xed,0x9f,0xeb,0xdc,0x73,0xad,0x4f,0xcf,0xfe,0x7b, +0xf6,0x59,0x71,0x3f,0x27,0xc5,0x21,0x70,0xc3,0x2e,0xf1,0xb5, +0x8e,0xa8,0xfe,0xfb,0xeb,0xca,0x7f,0x6b,0xdc,0xd5,0x4e,0x80, +0x02,0xbc,0x19,0xee,0x78,0xd7,0xbb,0xde,0x71,0x83,0x77,0x73, +0xe3,0xdd,0x01,0x7f,0x37,0x11,0xc3,0xf5,0x6e,0x79,0x11,0xec, +0xdb,0x4b,0x8c,0xd7,0x33,0xe4,0x25,0xef,0x79,0xc1,0x03,0x09, +0xff,0xdf,0x60,0xb2,0x3e,0x08,0xd0,0x41,0x84,0x23,0xa4,0xcb, +0xe8,0xe8,0x32,0x42,0x12,0xc2,0xe5,0x7b,0xa7,0x13,0x87,0xf8, +0x46,0xa2,0x34,0xb8,0xb0,0xd0,0x85,0x03,0x81,0xe1,0x4d,0x20, +0xf0,0x3f,0xf9,0x9d,0x0f,0x6c,0x37,0xf4,0x1c,0x0b,0xcd,0x96, +0x39,0xa4,0xd9,0xcf,0x0d,0xf7,0x6b,0xa1,0xe7,0x14,0x67,0xbd, +0x21,0x12,0x11,0x87,0xa2,0xb1,0x5d,0x39,0x68,0x37,0xc0,0x07, +0x26,0x10,0x8a,0xd0,0xa8,0x1d,0x34,0xa8,0x48,0xc5,0xdf,0x79, +0x70,0x78,0xc5,0xe3,0xe2,0xde,0xc4,0x61,0x41,0x96,0x24,0x6f, +0x67,0xce,0x6b,0x09,0xf4,0xa2,0xa7,0x3c,0x0f,0x02,0x8e,0x53, +0x22,0x09,0x21,0x09,0x87,0xf8,0x38,0x00,0x84,0x6d,0x20,0x28, +0x14,0xe2,0x0f,0xcd,0x17,0x3e,0x17,0x86,0x10,0x02,0xd8,0xbb, +0xa3,0xd7,0x8a,0x28,0x14,0x3a,0xec,0x71,0x69,0x21,0xc9,0x9f, +0x0f,0xb7,0x52,0xc8,0xf3,0x85,0xc4,0x7a,0x81,0x54,0xa2,0x11, +0x81,0x88,0x05,0x3d,0x36,0xf2,0x73,0x78,0x81,0x22,0x37,0xca, +0xe1,0xc4,0x27,0x12,0x90,0x22,0x56,0x54,0xe0,0x00,0xa9,0xd8, +0x3b,0x71,0x70,0x52,0x76,0x68,0x14,0x1c,0xed,0x18,0x27,0x8e, +0x2e,0x9a,0xf1,0x78,0xd2,0x43,0xa3,0x1a,0x9b,0x47,0xc6,0xc1, +0xb5,0xd2,0x83,0xa4,0x14,0x93,0x40,0x4a,0xf4,0xc6,0xad,0xd8, +0xd2,0x42,0xb8,0x0c,0x49,0x0e,0xbd,0x66,0x21,0x11,0x6e,0x0f, +0x92,0x99,0xf3,0x25,0xea,0x10,0x10,0x4c,0xeb,0x11,0x52,0x7c, +0xdf,0x2b,0xe2,0x21,0x97,0x99,0xb8,0x66,0x56,0x04,0x7b,0x22, +0xd4,0x5e,0xe9,0xf6,0xff,0x37,0x4d,0x3a,0x54,0x73,0x92,0xb1, +0x1b,0x60,0x39,0x00,0xe0,0xcd,0x4b,0x3a,0xd1,0x89,0x08,0x9c, +0x88,0xef,0x3a,0x89,0xc5,0xb9,0x89,0x83,0x1b,0xea,0xbc,0xe2, +0x01,0x65,0x39,0xbc,0x75,0x0a,0x0f,0x00,0x2d,0x9c,0xe0,0x4a, +0xac,0xc1,0xc5,0x0b,0xb6,0x44,0x83,0xf9,0x74,0x89,0x2b,0x5f, +0x62,0x91,0xaf,0x45,0xc8,0x7e,0x29,0x13,0x8a,0x89,0x06,0x7a, +0xb9,0xf6,0x0d,0x00,0x01,0x07,0x58,0x0b,0x32,0x87,0x29,0xb6, +0xae,0x2d,0xb4,0xa1,0x81,0x4c,0x26,0xca,0xc4,0xb1,0xd0,0x03, +0x20,0x40,0x7c,0x2c,0xbb,0xe8,0x01,0x32,0xba,0xd1,0x90,0x60, +0xd3,0x41,0x19,0x1d,0xc0,0x36,0x05,0xd9,0xc6,0x91,0x22,0xa0, +0xa4,0xfa,0x2b,0x27,0x26,0x2d,0x49,0xb3,0x72,0x58,0x07,0x9c, +0x2f,0xd5,0x9d,0x44,0xb0,0x68,0x45,0x9c,0x2e,0xb0,0x6e,0xea, +0xac,0x22,0x37,0x07,0x38,0xcf,0x79,0xb6,0x50,0x8a,0xa7,0x04, +0x9e,0xe0,0x32,0xd8,0xca,0x55,0x96,0x31,0x70,0x1d,0x14,0xd3, +0x0d,0x31,0xaa,0x51,0x95,0xbd,0xae,0xa3,0x1f,0x8d,0x2a,0x31, +0xdb,0x27,0xd1,0x63,0x52,0xf4,0xa1,0xa0,0xc3,0xaa,0x43,0xb5, +0x32,0x50,0x83,0x0a,0x65,0x2b,0xf7,0x0b,0xeb,0x57,0x45,0xfa, +0x00,0x92,0xae,0xf4,0x9a,0x4b,0xa3,0x26,0x5a,0x55,0xaa,0x56, +0x9f,0xc2,0x54,0x4b,0x31,0x85,0x62,0x39,0x15,0xd8,0xc0,0x50, +0x42,0xe3,0x8b,0x2d,0x54,0x27,0x3b,0x3b,0x19,0xbb,0xa0,0xc5, +0xf3,0x8b,0x3f,0xb3,0x99,0xf0,0x5c,0xb9,0xb3,0xe2,0x89,0x51, +0x67,0x67,0x34,0x8b,0xf1,0xf6,0x53,0x44,0xff,0x66,0x8a,0xcf, +0x99,0xa8,0xbb,0xa1,0x64,0x7b,0x39,0x49,0x60,0x6a,0x75,0x7f, +0xd6,0xcc,0xac,0x30,0xbf,0x3a,0xc4,0x12,0x0d,0x64,0xac,0x6e, +0x08,0xad,0x58,0xa5,0xc9,0xd6,0x6c,0xae,0xb0,0x6b,0x00,0x3c, +0x29,0x35,0x55,0x5b,0x52,0xad,0x98,0x53,0x4b,0x0f,0xb8,0xa4, +0x25,0x67,0x47,0x37,0xbd,0xd6,0x2e,0x94,0x0f,0xd8,0xeb,0x6e, +0xa5,0xe8,0x4e,0xc2,0xd1,0x4e,0x70,0x80,0x9b,0x9b,0x2a,0xf5, +0xd9,0x41,0xc7,0x6a,0xd0,0x67,0x6f,0x11,0x5f,0xe8,0xb6,0x66, +0xd9,0xcb,0x35,0x77,0xb5,0x3c,0x44,0xa8,0xfe,0x8a,0x78,0xbf, +0x40,0xf2,0xd1,0x88,0xd7,0xd5,0x23,0x1f,0x13,0xf7,0x46,0x3a, +0x0e,0x64,0x87,0xe0,0x25,0xe1,0x40,0xae,0xe6,0xd9,0x40,0x0a, +0xa5,0x88,0xa7,0x7b,0xa4,0x1e,0xd5,0x2b,0x5d,0xaf,0x49,0x51, +0x77,0xdc,0x98,0x2d,0x6d,0x6b,0x2b,0x5f,0xa0,0xea,0x55,0x9d, +0x9b,0xb4,0xe2,0x7e,0x43,0x49,0x33,0x07,0x4e,0xe4,0x8b,0x85, +0xfd,0x62,0x01,0xb7,0xd8,0xb3,0x02,0xcb,0x52,0xb9,0xb3,0x84, +0x89,0x3f,0xcb,0x02,0x4d,0xf0,0xad,0xd6,0xba,0x70,0x0c,0x1b, +0x7c,0x27,0x29,0xbe,0xf3,0x5e,0x58,0x7c,0x49,0x14,0xa4,0xe3, +0x34,0x2c,0xc4,0xfb,0xc1,0x10,0x84,0x28,0x0c,0x26,0xe5,0xb4, +0x07,0x17,0x12,0x07,0x52,0x85,0x89,0x0b,0xe2,0x48,0xd6,0x5b, +0xb6,0xed,0x59,0xcf,0xc5,0xf0,0x8d,0x88,0x26,0xb7,0x33,0x57, +0xf9,0xd2,0xee,0x8a,0x3c,0xbd,0xa2,0x4d,0x79,0xcb,0xd7,0xbf, +0x42,0x10,0x94,0xeb,0xdc,0x1b,0x3e,0x89,0xe7,0x60,0x35,0xfa, +0xff,0x8d,0xc1,0x8d,0xa5,0x5e,0x0c,0x25,0x3c,0xc9,0xf7,0x25, +0x2e,0xc2,0x2b,0x85,0xf2,0xf7,0x26,0x5c,0x97,0xfb,0x95,0x4f, +0x6c,0x3c,0xc4,0x72,0xfa,0x22,0xd2,0x39,0xee,0xd5,0x05,0x7b, +0x26,0x0c,0x33,0x5d,0xbc,0x97,0x96,0xfa,0x09,0xc5,0x7f,0x11, +0xde,0x5f,0xfa,0xd4,0x4c,0x17,0xe9,0xd6,0xf8,0x9b,0x73,0xbb, +0x64,0x7d,0x1f,0x50,0xd7,0xbb,0xad,0x73,0x6e,0x77,0x86,0xc6, +0x03,0x78,0x27,0x8e,0x3b,0x33,0x50,0x81,0xcc,0x53,0x46,0x81, +0x65,0x67,0x3c,0x54,0x1e,0x2e,0x8a,0xc3,0x0d,0xdc,0x3d,0x19, +0x1b,0xcb,0x58,0x3a,0x96,0x95,0xd0,0x0a,0x9b,0x73,0x4b,0xa7, +0x3f,0x13,0x5a,0xfa,0xd2,0xa8,0x5b,0x5d,0x55,0x3b,0xfd,0x55, +0xd8,0x6d,0x4e,0x2b,0x52,0x5e,0x1c,0xe3,0xb0,0x47,0xe1,0xc8, +0x15,0xef,0xd4,0x70,0x53,0x1d,0xe6,0x5a,0x0d,0x3b,0xdd,0x85, +0xb3,0xbe,0x12,0x71,0xe9,0x6d,0xcd,0xe9,0x63,0xeb,0x0c,0xb8, +0xaf,0xc3,0x43,0xa3,0x9e,0x99,0x27,0x54,0xbb,0x1a,0xb7,0xc8, +0x16,0xf4,0xe0,0x82,0x1d,0x5c,0xc6,0x63,0x37,0x8a,0xcd,0x76, +0xd1,0xdf,0x0e,0x61,0x5c,0x17,0x4c,0xa3,0xed,0x69,0x6a,0x9b, +0x36,0xdb,0xde,0xe6,0x36,0xaa,0x5d,0x0e,0x69,0x44,0x33,0xda, +0x56,0xb6,0x3d,0xb4,0x6e,0xdf,0x6b,0x6d,0x18,0x1a,0x77,0xdb, +0x28,0x62,0x6e,0x04,0x5a,0xb2,0xce,0x31,0x5d,0x8f,0x37,0xd3, +0x8d,0x5b,0x2c,0x1a,0x9a,0x57,0x3f,0x6e,0x21,0x03,0x6f,0xc6, +0x37,0xe1,0xee,0xb7,0x95,0xc5,0xc5,0x19,0x05,0x17,0x0b,0xbc, +0x0a,0xfe,0x0d,0x32,0xff,0x9e,0x5e,0x5d,0x5e,0x0c,0x7e,0x2f, +0xf7,0x9c,0x2c,0x66,0x31,0x03,0xd9,0x6a,0x44,0x46,0x32,0x84, +0xf3,0x24,0xe1,0xbf,0x79,0x69,0x9d,0x65,0x8a,0xad,0x3b,0xdf, +0x76,0x22,0x38,0xad,0xdb,0x02,0x81,0x0a,0xe4,0xff,0xee,0xae, +0x9c,0x12,0x4c,0x27,0x5f,0x13,0x2d,0x3c,0x54,0x46,0xcf,0x66, +0x88,0xed,0xa7,0x32,0xfc,0x36,0xc6,0xe9,0x09,0x79,0xe0,0x85, +0x71,0xf8,0x71,0x22,0x0e,0x71,0x99,0xe1,0xbc,0xe0,0x2b,0x3b, +0xf8,0xeb,0x74,0x9e,0xf3,0x92,0x8d,0x2c,0xcf,0xb6,0xbd,0xe4, +0x37,0xed,0x2b,0x4e,0x4c,0x92,0x53,0xaf,0x4b,0xdf,0x1d,0x4f, +0x6f,0xc6,0xce,0xdd,0x45,0x51,0x78,0x03,0xe4,0xab,0x90,0x09, +0xbb,0x72,0x61,0x23,0xcf,0xe5,0x18,0x74,0x39,0x18,0x8f,0x7d, +0xb8,0x64,0x87,0x64,0x03,0x1b,0x60,0x40,0xd9,0x19,0x30,0xf6, +0x94,0x8d,0xdd,0xec,0x67,0xdf,0x00,0xd3,0xc6,0x2d,0x6d,0xa9, +0x5d,0xfb,0xdc,0x72,0xb7,0x61,0x09,0x4a,0x70,0x17,0x13,0x98, +0x00,0xd5,0x76,0xc7,0xbb,0xde,0xe1,0xd6,0xb4,0x6a,0x93,0x3b, +0xf0,0xe8,0xb6,0x76,0xb6,0xbf,0x29,0xc5,0xc8,0xd4,0x36,0x9c, +0xa3,0xb4,0xeb,0x5d,0xa3,0x4e,0x45,0xbf,0x9e,0x73,0x94,0x87, +0x2b,0x30,0xb0,0x0b,0x0d,0xd4,0xcb,0x93,0xbc,0x83,0x30,0x27, +0x23,0xe1,0xfa,0x19,0x73,0x08,0x4a,0x1a,0x5a,0x70,0x21,0xfb, +0xd8,0xd5,0xde,0x76,0x54,0x43,0xa0,0xf4,0xa6,0x3f,0x3b,0xe5, +0x44,0xbd,0xb2,0xa8,0xbe,0x9a,0x73,0x61,0xb3,0x7b,0xed,0xed, +0x9e,0x77,0xbf,0x6b,0xcf,0xf6,0xb5,0xc7,0xff,0x3d,0xa7,0x3f, +0x0d,0x7b,0x50,0x7b,0x5a,0x75,0xc2,0x3d,0xfc,0x4c,0x6b,0x5d, +0xd3,0x77,0x73,0x92,0xa7,0xff,0xed,0x71,0x4e,0xa5,0xc7,0x6b, +0x57,0x12,0xd7,0x9f,0xf7,0xec,0xfa,0xf3,0x60,0xde,0xe0,0xcf, +0x87,0xbd,0x73,0x64,0xbf,0x4b,0xeb,0x4d,0xc8,0x7d,0xbb,0xb4, +0xfe,0x7b,0x79,0x87,0xc0,0x1e,0xd0,0x87,0xfa,0xcc,0x91,0xdf, +0xfc,0x75,0x11,0x0a,0xfa,0xd7,0xb7,0xfb,0xde,0x47,0x19,0x2e, +0xf0,0x27,0x3f,0xa7,0x49,0x3f,0xd0,0xba,0x98,0x9f,0xef,0xab, +0x6b,0x7b,0xff,0xe8,0xa2,0xff,0xbb,0x1b,0xb9,0x04,0x1a,0x40, +0x98,0xfa,0xa9,0x28,0xd2,0x9d,0x9c,0xba,0xa2,0xbb,0x1a,0xb4, +0x95,0xd8,0x35,0x89,0x48,0x30,0xc2,0x0a,0xac,0x28,0x72,0x34, +0xe5,0xb9,0x27,0xe7,0x81,0x25,0x99,0x0b,0xbb,0xd0,0x13,0x3d, +0xb5,0x39,0x21,0x12,0x2b,0xa1,0x13,0x6b,0x23,0x3a,0x5a,0x31, +0x08,0xe8,0xbd,0x3d,0x30,0xbf,0x91,0x60,0x3b,0xb8,0x30,0x41, +0x14,0x1c,0x08,0x15,0xb4,0x21,0x00,0x2c,0x01,0x13,0x44,0xb5, +0x18,0x9c,0xc1,0xf3,0x52,0x3b,0x10,0x2b,0xbf,0x18,0x24,0x3d, +0xee,0xe3,0xb0,0x13,0x84,0x80,0xda,0xa3,0xa4,0x4a,0x32,0x27, +0xe4,0x03,0x09,0xe1,0xfa,0x29,0x2b,0x12,0xb9,0x06,0x4c,0x34, +0xa1,0x82,0x1e,0x7d,0x5b,0xb4,0x7f,0x43,0x2a,0x32,0x52,0xae, +0xd0,0x43,0x36,0xe8,0xf1,0xbc,0x64,0x4b,0x9c,0x39,0x72,0x23, +0xb2,0x82,0x9c,0x2d,0x0c,0xa6,0x37,0xaa,0x1c,0x16,0x04,0xa8, +0x40,0x6a,0xbd,0xf4,0x53,0x3f,0x14,0xd4,0x23,0x33,0xac,0x08, +0xff,0xfd,0x9b,0xc1,0xad,0x68,0x43,0xf5,0xfb,0x2a,0xee,0x63, +0x24,0x1d,0x04,0xc2,0xfd,0x53,0x3d,0x06,0x88,0xa4,0x3a,0x0c, +0xc2,0xd8,0x49,0x37,0x72,0x22,0xa0,0x22,0x0c,0xa0,0x23,0xd4, +0x31,0x9b,0x7a,0x89,0x04,0x2b,0x25,0x9a,0x31,0x2c,0x79,0xb2, +0xa7,0xa3,0x4a,0xb2,0xe6,0x21,0x8b,0x25,0xd3,0xc0,0xcc,0xd1, +0x25,0x9c,0xe0,0xa5,0xcb,0xa1,0x44,0x04,0xb0,0xc4,0xcc,0x91, +0x41,0xf2,0xeb,0x2c,0xee,0xdb,0xc4,0xde,0xf3,0xc4,0x3c,0x0c, +0x89,0x1f,0xfc,0x9e,0x1f,0x7c,0x43,0xf3,0x33,0x45,0xf3,0x0b, +0x89,0xd6,0x73,0xad,0xc4,0xb1,0xbd,0xfd,0x69,0xc5,0xd4,0x7a, +0x45,0x3e,0x84,0x89,0x9f,0xa2,0x89,0x9a,0xb2,0x19,0x77,0xc2, +0x45,0x08,0xc2,0x1b,0xb1,0x78,0xb9,0xa5,0xa2,0x09,0x0e,0x94, +0x8a,0x82,0x12,0xa8,0xfb,0xc9,0xa5,0x80,0x5a,0x8b,0x83,0x0a, +0x89,0xdb,0x33,0x81,0xae,0x0a,0xa4,0x4f,0xb4,0xc3,0xbc,0x7b, +0x46,0x3c,0x04,0xb5,0x3d,0x78,0xaa,0xf5,0xcb,0x8b,0x6b,0xf4, +0x28,0x04,0xc8,0xc6,0x8a,0x90,0xc5,0x94,0x32,0x01,0x3e,0x84, +0x00,0x70,0x74,0x2b,0x71,0xdc,0xbf,0x5c,0x81,0x42,0x5c,0x54, +0xc7,0x97,0xb8,0xbe,0x75,0x81,0x8b,0x6d,0xcc,0x28,0x6f,0x7c, +0x9d,0x78,0xec,0xc6,0xaa,0xb2,0x43,0x19,0xa4,0xc6,0x68,0xe4, +0x3d,0x7d,0x1c,0xc5,0x8a,0x20,0x2b,0x81,0x32,0xad,0xcb,0x01, +0x48,0x65,0x14,0x48,0x72,0x6c,0xbb,0xb6,0xca,0xa8,0xbc,0xbb, +0xc3,0x72,0x54,0xc8,0x73,0x9c,0x8e,0x9c,0xa1,0x18,0xcd,0x11, +0x08,0x11,0x02,0x8c,0xff,0x52,0x4c,0x9c,0x53,0xb4,0xc8,0x54, +0xc4,0xc8,0x55,0x64,0xc6,0x20,0x14,0xc5,0xfd,0x81,0x45,0x90, +0x0c,0x09,0xd0,0xb2,0x10,0xd1,0x02,0x8c,0x92,0xc4,0x89,0x93, +0xcc,0x1c,0x70,0x1c,0xbf,0x85,0x8c,0x45,0x84,0x9c,0xc5,0x12, +0x7c,0x49,0x89,0x48,0x00,0x9b,0xbc,0x49,0x9b,0x4a,0x40,0x89, +0x58,0x00,0x9e,0xec,0x49,0x89,0xf0,0x05,0xa0,0x0c,0x4a,0x89, +0xd0,0x0c,0xa2,0x54,0x00,0x89,0xa0,0x02,0xa4,0x4c,0x4a,0x89, +0x70,0x00,0xa6,0x6c,0x4a,0x89,0x08,0x01,0xa8,0x8c,0x4a,0x89, +0x58,0xbb,0xb2,0x93,0x88,0x40,0xb8,0x4a,0xac,0x94,0x88,0x06, +0xd8,0x4a,0xae,0x94,0x88,0x62,0xf8,0x4a,0xb0,0xbc,0x8c,0xe2, +0x89,0x88,0xfa,0xc8,0x04,0x11,0xea,0x1f,0x52,0x9c,0x49,0x71, +0x2c,0xbf,0x94,0x31,0x3f,0xdc,0xbb,0xbb,0x8e,0xac,0x88,0x20, +0xfc,0x41,0xec,0x3a,0xc8,0x90,0xe4,0x3b,0xba,0x54,0xc3,0xb6, +0xb3,0x21,0xf2,0x0a,0x26,0xf1,0x82,0x9c,0xbe,0x4c,0x2f,0xa1, +0xb8,0xc1,0x3c,0x4c,0xaf,0x3a,0xec,0xbd,0xcc,0x99,0x43,0x80, +0xfa,0x41,0xc4,0x04,0x80,0x9b,0xc4,0xc9,0xdd,0xd1,0x49,0x00, +0xe8,0x49,0x9f,0x04,0x80,0xa0,0x14,0x4a,0x00,0x28,0x4a,0xcd, +0x38,0xca,0xa4,0x44,0xca,0xa5,0x6c,0x4a,0xa6,0x7c,0xca,0xa8, +0x84,0xca,0xa9,0xa4,0x4a,0xab,0xc4,0xca,0xab,0xd4,0x4a,0xae, +0xdc,0x4a,0xaf,0x04,0xcb,0xaf,0x14,0x0b,0x29,0x2b,0x31,0x29, +0x2b,0x88,0x82,0xe8,0x0f,0x8c,0x54,0xcb,0xb9,0xa4,0x41,0xdc, +0xc4,0xcb,0x1f,0xc2,0xc7,0x3a,0xe4,0x30,0xff,0x15,0xf4,0x4d, +0xba,0x7c,0x23,0x15,0x1c,0xb1,0x0f,0x34,0x31,0xf8,0x11,0xc1, +0x14,0xa2,0x2c,0x1c,0x1c,0x09,0xc6,0xac,0xbf,0xe6,0x1c,0x88, +0xe7,0xd4,0x3b,0xc7,0x7c,0xcc,0x04,0xc8,0x49,0xe7,0x9b,0x4c, +0xca,0x5c,0x80,0x9f,0xbc,0x4c,0x5f,0x18,0x4a,0xcd,0xe4,0xcc, +0xce,0xfc,0x4c,0xd0,0x14,0xcd,0xd1,0x2c,0xcd,0xb5,0x3b,0x4d, +0xd4,0x54,0xcd,0xd5,0x6c,0x4d,0xd7,0x24,0x8b,0x4c,0xa8,0xc4, +0x89,0x50,0x80,0x38,0x90,0x07,0x79,0x88,0x03,0xa3,0x5c,0x9f, +0xb7,0x84,0x45,0xf9,0xdb,0xcd,0x20,0xa4,0x2c,0xde,0xec,0x32, +0xf4,0xb3,0x43,0xb6,0x14,0x50,0xf5,0x09,0x1b,0xf0,0xab,0x0b, +0xef,0xd3,0x9e,0x04,0xa5,0x0b,0xf1,0x43,0x33,0xd5,0x03,0xa8, +0xfc,0x9b,0xc9,0x36,0x6b,0xbb,0x37,0x83,0x47,0x0a,0xad,0xce, +0xc7,0xc4,0x4e,0x9c,0xda,0xc9,0xed,0xec,0xce,0xcb,0x04,0xcf, +0xa2,0x14,0x4f,0xa5,0x04,0x00,0xd0,0x0c,0x4d,0x00,0x18,0x4d, +0xd2,0x04,0x00,0xaa,0x64,0x00,0xf5,0xcc,0x4a,0x00,0x58,0x4d, +0xd6,0x04,0x00,0xd7,0x7c,0xcd,0xb1,0xb8,0x28,0x8d,0x9a,0x08, +0x14,0xb8,0x83,0x77,0x78,0x87,0x3b,0x40,0x81,0x9b,0x08,0x9b, +0xfd,0xdc,0x3d,0xf9,0x1b,0x52,0x91,0x84,0x50,0xe1,0x83,0x1d, +0xd9,0x1b,0x35,0xd2,0x63,0xbb,0xd3,0x53,0x21,0xc8,0xc1,0x43, +0xd3,0x2b,0x3d,0xd7,0x7b,0xbd,0xd7,0x89,0xbd,0x50,0xfb,0x3d, +0x0d,0x85,0xcc,0x04,0x3c,0xa0,0xed,0xe4,0x4e,0xcb,0xf4,0x4e, +0x11,0x25,0x4a,0x12,0xf5,0x4c,0x13,0x3d,0x51,0xf3,0x94,0x4a, +0xff,0x16,0x35,0x4d,0x00,0x40,0xcd,0xd4,0x8c,0x51,0x19,0x75, +0xcf,0xb0,0x14,0x8b,0x18,0x1a,0x1b,0x00,0x58,0x87,0x1d,0x85, +0x8b,0x1f,0xfd,0x32,0x0a,0xb5,0x0b,0xbe,0xdb,0xa1,0xfa,0xab, +0x0b,0xbe,0x3b,0x1b,0xc0,0x83,0x9a,0xc1,0xa3,0xbb,0xc2,0x83, +0x9b,0x8a,0x50,0x3b,0xb3,0x43,0xbb,0xad,0x60,0xd4,0xb2,0x73, +0x54,0x71,0x0b,0x3c,0xb8,0x9b,0x08,0xc2,0x8b,0x23,0xb9,0xb3, +0xce,0xeb,0x8c,0xcc,0xec,0xfc,0x52,0x10,0xc5,0x4c,0xcd,0x34, +0x4a,0x00,0xe8,0x4c,0x33,0x3d,0x51,0x07,0x48,0xd3,0x15,0x6d, +0xd1,0x17,0x7d,0x53,0x19,0x6d,0x00,0x39,0xb5,0x51,0x9a,0x48, +0x1c,0x2a,0xfb,0x1a,0x08,0x50,0x80,0x3b,0x70,0x9a,0x3b,0x50, +0x80,0x04,0x41,0x99,0x9e,0x6b,0x9d,0x5e,0x05,0xba,0x9b,0x0b, +0x3a,0x89,0xab,0x39,0xd5,0x69,0x9d,0x87,0x1b,0x56,0x9c,0x5b, +0x38,0x89,0x89,0xc8,0x89,0xf9,0x88,0xaf,0xe2,0x84,0x1d,0x30, +0x83,0xa4,0x00,0xbe,0x86,0xbb,0x0c,0xe3,0x28,0x0b,0xe5,0xc0, +0xd6,0x6b,0x7d,0x0c,0x5e,0xe9,0x8e,0xea,0xf0,0xd6,0x6e,0x1d, +0x97,0x64,0xf1,0x56,0x6e,0x39,0x8b,0xeb,0x80,0x93,0x75,0x61, +0x91,0xa9,0x30,0x4b,0x12,0x3b,0x46,0x3a,0x0d,0x0a,0x76,0x45, +0x21,0x77,0x7d,0x0b,0x78,0x4d,0xb1,0x79,0xad,0xa5,0xa0,0xb0, +0x57,0x88,0x64,0x90,0x70,0x8d,0x90,0x86,0xa9,0x0e,0x13,0x09, +0x98,0x79,0x1b,0x8f,0x40,0x11,0x11,0x6e,0x09,0x0e,0x4c,0xf9, +0x0e,0x74,0x39,0x0f,0x86,0xdd,0x0d,0x14,0x09,0x89,0x7c,0x6d, +0xd7,0x7b,0xdd,0x8f,0xff,0x88,0x95,0xd7,0x89,0x3d,0x90,0x8a, +0x1d,0x21,0x4d,0xa4,0xd8,0x8b,0xb0,0xd7,0x8b,0xfd,0x09,0xf0, +0xb8,0x96,0x80,0x9d,0x2d,0x80,0x15,0x94,0x5e,0x41,0x91,0x48, +0xb9,0x18,0x80,0x75,0x8f,0x7e,0x6d,0x91,0x51,0x71,0x58,0x71, +0x51,0x99,0xa5,0xf0,0x58,0x77,0x2d,0x88,0x7f,0x72,0xd6,0x8e, +0x95,0xd8,0x9a,0xdd,0xd5,0xd1,0x00,0x0a,0x8a,0xd4,0xd9,0x8f, +0xb0,0x59,0xc3,0xc0,0xd9,0x9f,0xb5,0xd8,0x9d,0x1d,0x8b,0x90, +0x8d,0xb8,0x4e,0xf1,0xd7,0x59,0x39,0x97,0x53,0x99,0x97,0x6d, +0x51,0x17,0x29,0x31,0xd7,0x61,0xb9,0x16,0xf6,0x50,0x11,0xf0, +0xc0,0x0d,0x71,0xa1,0xcd,0x49,0x2c,0x5a,0x8d,0x4d,0xa2,0x63, +0xcc,0xd2,0x89,0xe0,0xda,0x99,0xd5,0x59,0x5c,0x12,0x5b,0x89, +0x20,0xdb,0x9c,0x35,0xda,0xb3,0x25,0xb8,0xb4,0xb5,0xd9,0xb2, +0x65,0xdb,0xb0,0x75,0x5b,0x06,0x89,0x99,0xee,0x70,0x5a,0x11, +0x71,0x94,0x93,0x3d,0xd9,0x57,0x81,0x18,0x80,0xa5,0x5a,0xf3, +0x70,0x8c,0x21,0xb9,0x16,0x7a,0x79,0x18,0xb5,0x98,0x17,0xba, +0xd8,0x01,0xe9,0x80,0x8b,0x1d,0xe0,0x5a,0x87,0x53,0xdc,0xc5, +0x6d,0x5c,0xa1,0x8d,0x0d,0xc8,0x95,0x0e,0xc9,0xe5,0x59,0xd8, +0xab,0x5c,0xe7,0xb8,0x5c,0xb2,0xb0,0x5b,0x29,0xc1,0x94,0xf5, +0x98,0x12,0x83,0xa5,0x94,0x37,0xf1,0xdb,0x72,0x55,0x0b,0x66, +0x29,0x58,0x95,0xfd,0x57,0x06,0x21,0x0f,0xcb,0xa0,0xcd,0xe2, +0x50,0x07,0xda,0xfc,0x0f,0xda,0xcd,0x08,0x08,0x88,0x0e,0xd8, +0x80,0xdd,0xbd,0x98,0x5d,0x92,0x20,0x09,0xff,0xdb,0xc5,0x5d, +0x30,0x29,0x88,0xd8,0xe5,0xdd,0xda,0x9c,0xdd,0x83,0x00,0x5e, +0x17,0x11,0xde,0xdd,0xa5,0xcd,0xde,0x35,0xde,0xdb,0x45,0xdb, +0xd6,0xc5,0x8d,0x65,0xa1,0x8c,0xc1,0x75,0xd9,0x40,0xd1,0x18, +0x74,0x3d,0xdd,0x5f,0xc9,0x97,0x7e,0xb9,0x17,0x29,0x59,0xd6, +0xbf,0x75,0x59,0x63,0x85,0x0b,0xa2,0x28,0x5e,0xb8,0xa0,0xdd, +0xb9,0x70,0xdc,0xd8,0x20,0x5f,0xd9,0x15,0x90,0xfc,0xa8,0x8a, +0xf3,0x9d,0x5c,0x6a,0x2d,0x5f,0xf7,0x45,0xdf,0xc1,0x50,0xdf, +0xf9,0x6d,0x5f,0xfb,0x78,0xdf,0xf4,0x95,0xdf,0x58,0x05,0xdf, +0x9c,0x50,0x38,0xef,0xdd,0x97,0x88,0x49,0x0b,0x00,0x86,0x19, +0xf0,0x6d,0x09,0xcf,0x25,0x19,0xf7,0xa8,0x4d,0x50,0x40,0x8c, +0xa6,0x88,0x60,0xa2,0x38,0x88,0x07,0xa6,0xdb,0xb7,0x85,0x00, +0x62,0x80,0xe0,0x83,0x90,0xe0,0xa6,0xc8,0x60,0x0b,0xbe,0xd3, +0xfa,0xd8,0x02,0x0d,0x46,0x8c,0x11,0x16,0xe1,0x0f,0xae,0xcd, +0x40,0x18,0x61,0x0e,0x3e,0x88,0x14,0xfe,0xe0,0xed,0x40,0xdd, +0x8c,0xe9,0x56,0x2d,0xc9,0x18,0x81,0xed,0x57,0xf6,0x20,0xd9, +0x1b,0x8b,0xe1,0xec,0x65,0x98,0x1d,0xfe,0x56,0x6e,0x09,0xd7, +0x8a,0xa8,0x60,0xe5,0x78,0xe0,0xfd,0xf0,0x60,0xe5,0xc8,0xe0, +0xfd,0x30,0x61,0xe5,0x10,0xe1,0xfd,0x68,0x61,0xe5,0x48,0x61, +0xad,0xd5,0xdb,0x80,0x01,0x14,0x0b,0xe9,0xd6,0x9e,0x48,0x5d, +0x8d,0x59,0xd9,0x7a,0xd9,0x93,0x29,0x11,0x14,0xa6,0xad,0xe2, +0x58,0xb9,0x62,0x72,0x55,0x58,0xd4,0x5d,0x60,0x1f,0x0e,0x63, +0xff,0x20,0xc6,0x60,0x08,0x00,0x05,0x36,0x86,0x00,0x79,0xe8, +0x51,0x79,0x58,0xe3,0x36,0x46,0xe2,0x03,0x79,0x60,0x36,0x7e, +0xe0,0x37,0x7e,0x87,0x38,0xbe,0xe3,0x35,0xde,0xd7,0x8a,0x48, +0xe1,0x2d,0x08,0x64,0x08,0x68,0x87,0x74,0x48,0x87,0x76,0x80, +0x80,0x40,0x16,0x61,0x28,0x3e,0x10,0x11,0x4e,0xe4,0x41,0x2e, +0xe4,0x43,0x76,0x64,0x26,0xf6,0x11,0x57,0xe9,0x96,0xde,0xe8, +0xe2,0xde,0x48,0xd8,0x2f,0xbe,0xb1,0x79,0x63,0x96,0x92,0xd9, +0x93,0x1b,0x96,0x15,0x2a,0x8e,0x95,0x83,0x3d,0x58,0xab,0x05, +0x62,0x19,0x66,0x92,0x0f,0x51,0x63,0x36,0xce,0x60,0x3d,0x7e, +0x63,0x0c,0x9e,0x63,0x3f,0xce,0x1c,0x3b,0x06,0x05,0x57,0xb6, +0xcf,0x77,0x88,0x65,0x3b,0x9e,0x65,0x08,0x00,0xe4,0x2d,0x48, +0x61,0x43,0x26,0xe4,0x5e,0x16,0xe4,0x45,0x8e,0x09,0x44,0x46, +0xe4,0x5f,0x86,0x80,0x60,0x4e,0x87,0x61,0x6e,0x64,0x88,0xfc, +0x57,0xd6,0x65,0xdd,0x1b,0x5b,0xda,0x1b,0xfe,0x91,0x7f,0x2d, +0x11,0x8c,0xcb,0xda,0xef,0x15,0x58,0x71,0xd1,0x12,0xea,0x0d, +0x8e,0x8d,0x49,0xd8,0x78,0x31,0x5c,0x2b,0x36,0x11,0xcb,0xe8, +0x63,0x5b,0xce,0xe0,0x3c,0x8e,0x63,0x62,0x20,0x86,0x5d,0x2e, +0xe2,0x35,0x6e,0x67,0x37,0x86,0x63,0x0c,0x76,0x67,0x35,0x4e, +0x62,0x44,0xbe,0xca,0x47,0x36,0xe4,0x5e,0x0e,0x04,0x67,0x6e, +0xe2,0x7c,0x4e,0x61,0x42,0xe6,0xe7,0xab,0x54,0xe4,0x67,0xae, +0x64,0x91,0xbd,0x5b,0x4f,0x26,0x97,0x6c,0xd6,0xe6,0xcf,0xf5, +0xe2,0x07,0x49,0x5d,0xff,0x11,0xb9,0xda,0x2a,0xae,0x64,0x18, +0xd6,0xde,0x1a,0x36,0xe5,0xed,0x05,0x8c,0x07,0x6e,0xe7,0x5b, +0x86,0x65,0x8f,0xee,0x63,0x78,0x0e,0xe9,0x57,0xce,0xe5,0x90, +0xa6,0x63,0x63,0x56,0x64,0x7d,0x5e,0xe6,0x7e,0x06,0x64,0x5e, +0x4e,0x61,0xac,0x54,0xe6,0x76,0x10,0xe6,0x98,0x2e,0x66,0xac, +0x6d,0x8f,0x84,0xde,0x8e,0x2d,0x8e,0x68,0x03,0xbe,0x62,0x31, +0x8e,0x15,0x68,0x46,0x68,0x4b,0x09,0xd8,0x8d,0x0e,0x5f,0x62, +0xc1,0xe8,0x02,0x16,0x59,0x04,0xde,0x8a,0x0c,0xf6,0x68,0x23, +0xae,0x67,0x79,0x46,0x69,0x98,0xe8,0x63,0xa7,0xae,0x8b,0xaa, +0x26,0xe2,0x03,0x81,0xe9,0x98,0xa6,0x0b,0xd4,0xec,0x65,0x5e, +0x56,0x69,0x7d,0xe6,0xea,0x98,0x9e,0x64,0x7e,0xed,0xe6,0x73, +0xc1,0xe1,0xd0,0x1d,0x18,0x40,0xd1,0x18,0x59,0x61,0x6b,0x52, +0x56,0xe8,0xa6,0x75,0x6b,0x61,0x5d,0x59,0x6d,0xa9,0xdb,0xdf, +0x48,0x63,0xb8,0x68,0x6a,0xa7,0xde,0xeb,0xa8,0x26,0x89,0x9b, +0xa5,0x6a,0xbe,0xde,0xeb,0x3e,0xf6,0x5f,0xd8,0xd3,0x6a,0x37, +0x75,0x53,0xaf,0x26,0xec,0x2b,0x05,0xeb,0xc3,0x1e,0x6b,0xbf, +0xfe,0xa0,0x8d,0xf9,0x97,0x9e,0xfe,0x97,0x97,0x31,0x5c,0xa0, +0xa3,0xec,0xca,0x8e,0x6c,0x04,0x06,0x98,0x41,0x81,0x6c,0x68, +0x91,0x18,0x65,0x1d,0x5b,0x07,0xae,0x67,0xbf,0x90,0x67,0x21, +0xce,0xdd,0xda,0xd4,0xeb,0xd2,0x6e,0xea,0x62,0x7d,0xdb,0x10, +0xee,0x67,0xbf,0xd0,0x67,0x25,0x46,0xed,0xfa,0xd0,0xea,0xd8, +0x86,0xe9,0xd6,0x56,0x68,0x1a,0xae,0x61,0xff,0x4b,0xee,0xe4, +0xab,0x25,0x59,0x1c,0xe6,0xe4,0x33,0xf6,0xed,0xab,0x05,0xd7, +0x88,0x3e,0xe3,0x31,0xc6,0x38,0x72,0x75,0xda,0xba,0xe8,0xe8, +0x0c,0x76,0x9a,0x1d,0x88,0xd6,0xb0,0x31,0x6d,0xdf,0x0d,0x19, +0x35,0x96,0x67,0xe8,0x96,0x6e,0xd2,0xce,0x60,0xfc,0xbd,0xd2, +0x63,0xd6,0xe7,0xec,0x76,0x1a,0xd8,0x16,0xe1,0xee,0x1e,0x5f, +0xdb,0x0e,0xef,0xb0,0xd1,0xe7,0x14,0x2e,0xef,0xed,0xed,0x64, +0xbd,0xe5,0x62,0xf7,0x76,0x14,0x50,0x5e,0x11,0xc9,0xe6,0x62, +0x0d,0xb1,0x6f,0xa2,0xbe,0x66,0x2e,0x3e,0xd8,0x86,0x99,0xef, +0xbb,0xce,0x66,0x73,0x01,0x6a,0x88,0x06,0xe1,0xfa,0x50,0xed, +0xe8,0xce,0xee,0xed,0xce,0x6d,0xe6,0x75,0x6e,0x08,0x38,0x70, +0x33,0x88,0x6e,0xd2,0x3e,0xed,0xe0,0xad,0x6d,0xd8,0x76,0x70, +0x08,0x57,0x6f,0x05,0xaf,0x4d,0x95,0x6e,0x70,0xe9,0xbe,0x70, +0x97,0x86,0xde,0xf9,0x9e,0x5e,0x59,0x09,0xdf,0x2f,0x66,0x0b, +0x9f,0x2e,0x5d,0x69,0x36,0xea,0x30,0x9e,0x5a,0xa3,0x4e,0x71, +0x01,0x37,0x67,0x15,0xe7,0x64,0xa6,0xc5,0xb8,0xfc,0x56,0x46, +0xba,0x50,0x6d,0xa7,0x79,0x70,0xf1,0xee,0x6b,0xf6,0xfe,0x34, +0x06,0xcf,0x71,0xed,0xa6,0xee,0x1e,0xaf,0x8b,0xf3,0x86,0x6e, +0xf1,0xc6,0xf0,0x21,0xa7,0x8b,0x0d,0x07,0xf2,0x23,0x77,0xe9, +0x1e,0xef,0xef,0x4d,0x2e,0xd9,0xb4,0x4e,0xf1,0xa0,0x36,0x97, +0x6a,0xd6,0x66,0x28,0xcf,0x92,0xd0,0x3d,0x6a,0xfe,0x96,0x6b, +0x2a,0xf7,0xe6,0xd9,0xaa,0xf1,0xb4,0x18,0xed,0x65,0xc8,0xe0, +0xff,0x68,0x75,0x70,0x0c,0x5e,0x86,0x3e,0x3e,0xe1,0x02,0x87, +0x80,0x32,0x6f,0xf0,0x07,0x0f,0x72,0x35,0x37,0xe2,0x97,0xd0, +0x70,0x08,0x58,0x85,0x14,0x3e,0x73,0xed,0x0e,0x84,0x55,0x38, +0x66,0x36,0xf7,0x6a,0x3c,0x87,0x73,0x34,0xe7,0x73,0xaf,0xb6, +0xe0,0x6b,0xbe,0xe2,0xd0,0x85,0xef,0x2c,0xf9,0x6f,0x2a,0xc6, +0x6f,0x2d,0xee,0xe2,0x46,0x87,0xe8,0x9c,0xee,0xf2,0xdf,0xa6, +0x12,0x7f,0x35,0x91,0x19,0x9f,0xde,0xb7,0xa6,0x65,0x37,0x57, +0xf3,0x33,0x87,0xee,0x4e,0x17,0xe9,0x03,0xc9,0xe0,0x65,0xf0, +0x74,0x1d,0x7f,0xf0,0x50,0x97,0xea,0x7f,0x12,0xe1,0x55,0xe8, +0xf3,0x4f,0x47,0xf5,0x56,0x3f,0x66,0x80,0x8e,0xf5,0x57,0x57, +0xdc,0x58,0xb7,0x69,0x73,0x45,0x71,0x49,0xaf,0x72,0x1f,0xa6, +0xf1,0x95,0xfd,0x72,0x84,0xa5,0x6f,0x5e,0x7f,0xeb,0x54,0xc6, +0x74,0xf7,0x2e,0x65,0x63,0x6f,0x6b,0x31,0x7f,0x9d,0x52,0xe7, +0x70,0x1d,0x57,0xdc,0x66,0x9f,0x65,0x94,0x69,0xf6,0x03,0x3f, +0xf3,0x50,0x97,0xf6,0xd5,0xa1,0xf5,0x4f,0xb7,0xf5,0x3e,0xc7, +0x76,0xb8,0xd0,0xf6,0x67,0xbf,0xf3,0x6e,0x47,0x14,0xb6,0xae, +0x72,0x6f,0x5e,0x6b,0x6b,0x0e,0xd9,0xb6,0xce,0x5a,0x17,0xe7, +0xe4,0x65,0x9f,0x61,0x77,0x1f,0xd9,0x86,0x56,0x16,0x84,0xe6, +0xf5,0xb4,0xa6,0x56,0xc2,0xb0,0xd6,0x6c,0xa5,0x53,0xe7,0xd0, +0xf7,0x6d,0x9d,0x89,0xce,0x86,0x97,0x00,0xc6,0xec,0xcc,0xce, +0xec,0x6f,0xa6,0x6c,0xbb,0x45,0xf8,0x6f,0x36,0x78,0x13,0x0f, +0xf8,0x86,0x9f,0xec,0xff,0x41,0x11,0xf8,0x9e,0x0e,0x3a,0x82, +0x67,0x56,0x8b,0xe7,0xd7,0x4a,0xcf,0x78,0x8d,0x87,0xeb,0x2c, +0x31,0x6e,0x8f,0xd7,0xf5,0xe5,0x5e,0x11,0x19,0x8f,0xe8,0x81, +0xd5,0x16,0x20,0x6e,0xd8,0x8b,0x4f,0x79,0x9a,0x50,0x74,0x2d, +0x8e,0x6f,0xf9,0x4e,0xf7,0x53,0x91,0xf4,0x17,0x9f,0x79,0x29, +0xd7,0x72,0x51,0xfe,0xdb,0x8a,0x46,0xe8,0xa5,0x55,0x60,0x69, +0xee,0x5b,0x95,0xff,0x79,0xe9,0x8d,0xf4,0x51,0x36,0xf7,0xdc, +0x80,0x97,0x61,0x8f,0xf2,0x2f,0x5e,0xf4,0x78,0xff,0xdb,0x68, +0xd6,0x64,0x4b,0x07,0xdc,0x5e,0x41,0x79,0xa0,0x9f,0x7a,0x16, +0x47,0x7a,0x55,0x56,0x76,0xe1,0x3e,0x6a,0xa2,0xb7,0xf9,0x30, +0x9f,0xe2,0x53,0xa6,0x66,0x4f,0x76,0x71,0x38,0x91,0x66,0xea, +0xa5,0x7a,0xb3,0x47,0x5d,0x75,0xcf,0xf4,0x75,0x37,0xd9,0x88, +0x29,0x76,0x62,0x57,0xe5,0x72,0xf7,0xe6,0xac,0x2f,0x6a,0xb9, +0xde,0xf4,0x85,0xe5,0xf2,0xb3,0xcf,0x7b,0xaa,0x1d,0x14,0x28, +0x87,0xf4,0x6a,0xd6,0x7a,0xa1,0x26,0x71,0xd0,0x9d,0x71,0x73, +0x09,0x70,0xc0,0x5f,0xe8,0x18,0x37,0x0f,0x16,0xd7,0x7b,0xc6, +0x2f,0xe5,0x1f,0x5e,0x12,0x52,0xbe,0x72,0xa7,0x3f,0xe5,0xb0, +0xa7,0x66,0xbf,0x8f,0xeb,0x9c,0x0e,0x6e,0x87,0x8e,0x0c,0x81, +0x4d,0xe0,0xc6,0xff,0x79,0x65,0x0d,0xe0,0x97,0xa9,0x6c,0x83, +0x0f,0xd6,0xa4,0xd6,0x17,0x61,0x1d,0xf8,0xb9,0x96,0x78,0x82, +0xef,0x6c,0x4e,0x29,0x78,0xac,0xc5,0xdb,0x8a,0xa8,0x91,0x2e, +0x11,0x13,0xda,0x27,0x13,0xcc,0x35,0xe6,0xff,0xdb,0xbf,0x9c, +0xdd,0x9f,0xea,0xde,0x9f,0xfd,0x32,0x29,0x0b,0x9b,0x04,0x89, +0xe1,0x1f,0xfe,0x9a,0xbc,0x4e,0xe3,0x9f,0x88,0x4d,0x55,0x7e, +0x8a,0x58,0xfe,0xe4,0x57,0xfe,0xe5,0x27,0xfe,0xe8,0xaf,0xce, +0x89,0x89,0xfe,0x1b,0xa1,0x88,0xeb,0x87,0x89,0xec,0x4f,0xdb, +0x1c,0xb1,0x91,0xee,0xc7,0xfe,0xef,0xd7,0xfe,0xf0,0xe7,0xfe, +0x33,0x11,0x8b,0x0d,0x85,0xfe,0x00,0xb0,0xc9,0x00,0x38,0xfe, +0xf4,0x4f,0x80,0xf5,0xdf,0xd2,0x4d,0x45,0xfe,0x9a,0x04,0x80, +0xf5,0xbf,0xce,0xf4,0x97,0xfe,0xf7,0x6f,0x7e,0xf7,0xcf,0xff, +0xe3,0x6f,0x7e,0xe6,0x07,0x08,0x00,0x02,0x01,0x24,0x18,0x68, +0xf0,0x20,0xc2,0x84,0x09,0x0b,0x06,0x18,0xb8,0x0e,0xc2,0xc3, +0x87,0x08,0x23,0x42,0x84,0xa0,0x70,0x62,0x45,0x89,0x07,0x29, +0x6a,0xbc,0xe8,0x30,0xa3,0xc5,0x8d,0x20,0x3d,0x1a,0xe4,0x18, +0xb2,0xe4,0x48,0x92,0x0a,0x13,0xb0,0x4c,0xd0,0x50,0x20,0xcb, +0x00,0x31,0x09,0xb6,0x6c,0x49,0x53,0x66,0x80,0x9c,0x30,0x01, +0xc8,0xe4,0x09,0xb3,0xa1,0xcb,0x83,0x41,0x0d,0xc6,0x7c,0x29, +0xb4,0xe0,0xc0,0x82,0x0c,0x89,0x1a,0x55,0xe9,0x74,0xa7,0x51, +0x08,0x52,0xa7,0x52,0xad,0x1a,0x69,0xc7,0x53,0x00,0x55,0xb7, +0x52,0xbd,0x9a,0x95,0x2b,0x58,0xaf,0x4f,0xc1,0x72,0x15,0x9b, +0xf5,0xe8,0xcc,0x81,0x3a,0x75,0xde,0x2c,0x4a,0xd3,0xa6,0xda, +0xa5,0x30,0x59,0xfa,0x4c,0x5a,0x37,0xe9,0x50,0x84,0x69,0xa1, +0xe2,0x85,0x7b,0xb1,0x26,0x52,0x8f,0x72,0xb5,0x82,0x02,0x45, +0xff,0x8c,0x58,0xe1,0xc3,0x89,0x11,0x83,0xa2,0xea,0x14,0x82, +0x62,0xc3,0x8c,0x23,0x1f,0x76,0xac,0x12,0xc2,0x96,0x2d,0x81, +0x02,0x65,0xde,0xdc,0x99,0xf3,0x16,0xcb,0x24,0x21,0x78,0xd6, +0x0c,0xba,0xf4,0x66,0xd1,0x67,0xf1,0xb2,0x5d,0x09,0x38,0x30, +0x4e,0xba,0x50,0x91,0x32,0xa4,0x1b,0xf8,0x2e,0x6b,0xd7,0x46, +0x95,0x1e,0xc4,0xd9,0x5a,0xb6,0xc1,0x9c,0xc2,0x05,0xdf,0x25, +0xcb,0x55,0x9d,0x3a,0x08,0x99,0xa6,0x5e,0x34,0xbe,0x15,0xb9, +0x72,0xe6,0x0a,0x9d,0x57,0x85,0xbe,0x5c,0x6a,0x73,0xea,0x53, +0xad,0x4b,0x5f,0xcd,0xb3,0xa9,0x6e,0xb7,0x80,0x75,0xd6,0x26, +0x48,0xf0,0x25,0x5d,0xf0,0x7a,0x6f,0xb3,0x46,0xef,0x93,0x7d, +0xde,0xb9,0xea,0x17,0xde,0x1e,0xac,0x75,0x19,0xfe,0xc3,0xfa, +0x23,0x37,0x46,0xfe,0x30,0x13,0x80,0xcb,0x4d,0x87,0xdf,0x32, +0xfb,0xe9,0x57,0x58,0x7f,0xea,0xfc,0x17,0xe0,0x49,0x07,0x41, +0xb0,0x0a,0x84,0x9b,0x49,0x58,0x5a,0x68,0xfe,0x29,0xc7,0xe0, +0x74,0x10,0xae,0x32,0xa1,0x84,0x99,0x55,0xa8,0xe0,0x85,0x00, +0x36,0xf8,0x14,0x70,0x82,0xb9,0xb4,0x97,0x6f,0x40,0xd5,0xb5, +0x54,0x4d,0x3d,0xa9,0x54,0xe2,0x4d,0x4d,0x19,0x05,0x5e,0x53, +0x6e,0xbd,0x38,0x94,0x7d,0xf7,0x15,0x68,0xe0,0x81,0xfd,0xad, +0xb3,0xa0,0x88,0x03,0xee,0xc8,0x23,0x63,0x10,0x28,0x08,0xa4, +0x80,0x09,0x3d,0xb8,0x21,0x87,0x1d,0x56,0xf8,0x63,0x88,0x49, +0x22,0xb4,0x64,0x93,0x4e,0x1a,0x09,0x65,0x80,0x52,0x9e,0xd5, +0x9a,0x47,0x6b,0xd1,0xff,0x18,0x1c,0x98,0x02,0x09,0xd7,0xd0, +0x7c,0x08,0x71,0xf9,0x9d,0x77,0x6a,0x95,0x99,0x50,0x6b,0xea, +0x81,0x65,0xa0,0x8f,0x0f,0xd1,0x81,0xa1,0x92,0x5c,0xc1,0x79, +0xa5,0x9c,0x74,0x4e,0xc9,0x15,0x87,0x4f,0xe6,0x19,0x64,0x9d, +0x5b,0xf5,0x89,0x27,0x04,0x73,0x02,0xea,0x1a,0x7b,0x34,0x11, +0x55,0x53,0x5f,0x7e,0xbd,0x35,0x17,0xa3,0x8d,0x42,0x1a,0x69, +0xa4,0x93,0x26,0x7a,0x16,0x8c,0xeb,0xad,0x07,0x1c,0x04,0x3b, +0x78,0x6a,0xc6,0x0e,0x66,0x40,0x46,0x4c,0x75,0x15,0xd1,0x61, +0xe8,0x88,0x03,0x75,0xfa,0x69,0xa8,0xa3,0x96,0x2a,0x27,0xaa, +0xd3,0x79,0x1a,0x6a,0xab,0xa9,0x51,0x95,0x1c,0xac,0x87,0x3a, +0x38,0x2b,0xa8,0xa2,0xda,0xba,0x9d,0xa9,0xb1,0xae,0xc4,0x53, +0x89,0x2d,0xa1,0xe7,0x52,0x4e,0xc0,0x25,0x8b,0xec,0xa4,0x40, +0x21,0x3b,0x5c,0x8c,0xe4,0x3d,0x1b,0x53,0x51,0x2e,0x56,0x0b, +0x5c,0xa6,0x99,0xc6,0x48,0x52,0xb1,0xc8,0xca,0xd6,0xa9,0x19, +0xe1,0xb6,0x4a,0xea,0x3b,0xf2,0x94,0x2b,0xd5,0x43,0x85,0x9e, +0xaa,0xa5,0x41,0xe0,0x8a,0x2b,0x2a,0xb9,0xe6,0xca,0x83,0xae, +0x54,0xa7,0xce,0x99,0xaa,0x40,0xee,0xf6,0x4a,0x1a,0x04,0xe9, +0xb4,0xe3,0x2f,0xbd,0xea,0xde,0x2b,0x6b,0xb8,0xfb,0x06,0xd2, +0xef,0xbf,0xed,0x04,0x6c,0x2f,0xbb,0xb9,0x29,0xea,0x30,0x9a, +0xc6,0xb6,0x27,0xdf,0x4c,0xaf,0xc9,0x47,0xa3,0xb3,0xcb,0xd2, +0x96,0xb1,0x7c,0x1d,0x2f,0x0a,0x9e,0x8d,0x6f,0xc1,0x88,0x6d, +0x50,0x33,0x41,0x00,0x6a,0xa8,0xa0,0x42,0xff,0x06,0x81,0xbc, +0xef,0x18,0x19,0xec,0xa9,0xf8,0x6a,0x85,0xb2,0xb8,0x2b,0xb7, +0xfc,0x32,0xac,0x31,0x4f,0x47,0xb3,0xca,0x07,0x27,0x9c,0x0e, +0xce,0x02,0xd3,0x21,0xf3,0xc9,0x9f,0xf6,0x0c,0xc1,0xcf,0x41, +0xdb,0x3b,0xb4,0x6e,0x1e,0xdf,0xb4,0xa8,0x8d,0x94,0x7a,0x3b, +0xd4,0x98,0xb6,0x01,0x76,0x14,0x5b,0x8c,0x1e,0xdb,0xa2,0x9a, +0x66,0xd6,0xc8,0x6c,0x70,0x63,0x1e,0xa5,0xa6,0x5b,0xe0,0xb2, +0x6a,0x73,0xb9,0x2e,0xe3,0x2a,0x34,0xd1,0xb4,0xd2,0x8a,0xb6, +0xb9,0x4a,0xdb,0xdb,0x36,0xcd,0x3b,0xf0,0x9b,0xf4,0xda,0x4b, +0xd3,0x7d,0xb6,0xcf,0xfe,0x02,0x9d,0xf7,0xdc,0x4d,0x3f,0xed, +0x74,0x8b,0x32,0xca,0xa4,0x94,0xc5,0x58,0x5f,0x1b,0x58,0xd4, +0xc4,0xfa,0x25,0x5c,0x5a,0xd9,0x26,0x3a,0x72,0xa5,0x17,0x4f, +0x3c,0x73,0xc1,0xe3,0x42,0x90,0xf6,0xbc,0x15,0xb1,0xbd,0x73, +0xe6,0xf0,0x6e,0x2e,0xef,0xc2,0x81,0x2b,0x59,0xb0,0xc1,0x08, +0x03,0xec,0xb9,0xde,0xa0,0xbf,0xcb,0xaf,0xdf,0x0a,0xb3,0x6e, +0x3a,0x7d,0x3f,0xed,0x86,0x63,0xb5,0x73,0xe5,0x06,0xf9,0xd4, +0xac,0x45,0x8e,0xfb,0x6e,0x2f,0x1d,0xfe,0x75,0xd6,0xf1,0x0d, +0xbe,0x68,0x6f,0x62,0x5b,0x1e,0xb6,0xaa,0x46,0x8f,0x4b,0xea, +0xad,0x15,0xb9,0x41,0xfb,0xae,0x29,0x3f,0xff,0x2a,0x04,0xd3, +0xeb,0xac,0xa4,0xf3,0xbe,0x1e,0x1c,0xfd,0x43,0xda,0x33,0xcd, +0xbd,0xf5,0xde,0x63,0x2f,0xbe,0xcc,0x90,0xae,0x78,0xf5,0x6b, +0xb4,0x15,0xfe,0xb1,0xa5,0xd2,0x1a,0x7b,0xec,0xd7,0xf3,0x8b, +0xff,0xcc,0x25,0x97,0x21,0x23,0x6f,0xe2,0x99,0x25,0xbe,0xb9, +0x5f,0x9c,0xb2,0xa7,0x3d,0xa2,0xd9,0x09,0x80,0x84,0x72,0xc3, +0x00,0xa7,0xc3,0xa7,0x09,0xf9,0x49,0x80,0xdb,0xdb,0x93,0xa0, +0x18,0x78,0xc0,0x04,0x76,0x09,0x7f,0x63,0x22,0xd3,0x05,0x85, +0xa7,0x3c,0xe6,0x89,0x69,0x83,0x17,0xe4,0xa0,0x9a,0xa0,0xf5, +0x9d,0x33,0xb1,0x69,0x4d,0x24,0x4c,0x5e,0x09,0x55,0x95,0x1f, +0x22,0x15,0xe9,0x48,0x02,0x9c,0x1e,0xd1,0x56,0x48,0xa4,0xc2, +0x4c,0x10,0x86,0x19,0x62,0x52,0x95,0x32,0x53,0xc3,0xf1,0x4d, +0x29,0x42,0x55,0x02,0xcd,0x0e,0xd3,0x27,0x32,0xa8,0x35,0xaa, +0x5b,0xb2,0xb9,0x9a,0xa5,0xac,0x86,0x44,0x91,0x21,0x0e,0x2f, +0x49,0xd4,0x14,0xc9,0x1e,0xb6,0x3f,0x45,0x45,0x91,0x89,0xf9, +0x22,0xd0,0x0c,0x69,0x68,0x21,0x04,0x22,0x30,0x86,0x32,0x04, +0xa0,0x16,0x41,0xc4,0x45,0x37,0x10,0x4d,0x43,0x39,0xd4,0xe1, +0x16,0xb9,0x58,0x46,0x1f,0xf6,0x09,0x8d,0x62,0x54,0xe3,0x5f, +0x7a,0xd7,0x16,0xf7,0xf1,0xee,0x62,0x56,0x5b,0xd6,0xc5,0xaa, +0xf6,0xac,0xe1,0x54,0x6b,0x59,0xf4,0x13,0x53,0xee,0x3e,0x56, +0xb1,0xa9,0x81,0x4c,0x89,0x87,0xa3,0xe3,0xe2,0xb4,0xa2,0x1d, +0xa9,0x40,0x87,0x8c,0xd8,0x51,0xe0,0x22,0x1b,0xd9,0x1d,0x08, +0x6a,0x47,0x92,0x8f,0x0c,0x54,0x25,0x93,0xe3,0xc8,0xf4,0x15, +0xc5,0x58,0xe2,0x41,0x1c,0xfd,0x6c,0xe4,0x47,0xdd,0xed,0xc5, +0x69,0xcb,0xf3,0xd8,0x5e,0x4a,0xe9,0xbb,0x13,0x31,0x4b,0x95, +0xed,0x3b,0x24,0x28,0xff,0x7f,0xd7,0x10,0x08,0x2c,0xa6,0x96, +0x92,0xa1,0xe1,0x24,0x9b,0x43,0x99,0xc9,0xf0,0x52,0x35,0xcd, +0xf9,0x0c,0x30,0x4d,0xa3,0xc3,0x5c,0x4e,0x07,0x35,0xa7,0x39, +0xa6,0x2f,0xe9,0xe3,0x2c,0x56,0x86,0x72,0x3c,0xc3,0xc3,0x1a, +0xc5,0x90,0x98,0xb8,0x41,0x22,0x6e,0x3c,0x10,0x13,0xa4,0xfd, +0x8e,0x97,0x44,0x56,0x8e,0x47,0x96,0xf9,0x5a,0xa4,0x59,0x2e, +0x03,0x4e,0xac,0x8c,0x65,0x9c,0x5f,0x31,0xe7,0x8d,0x34,0x08, +0x4b,0x4f,0x4e,0x0b,0x94,0xd0,0x9c,0xe3,0x07,0xfb,0xc8,0x31, +0x78,0x8e,0xd2,0x94,0xab,0xf4,0x8b,0x2b,0x4f,0x34,0x3c,0x6a, +0xb1,0xf3,0x8f,0xf9,0xe2,0xc8,0x94,0x00,0xfa,0x18,0x81,0xb6, +0x8b,0xa0,0xa3,0x31,0xe8,0x3f,0x33,0x32,0x16,0x84,0x6a,0x85, +0xa1,0x9a,0xa2,0x62,0x3b,0x9f,0xf9,0xb4,0x23,0xba,0xb3,0x93, +0xc6,0x53,0xe5,0xc3,0xf8,0xe9,0xcf,0xc1,0x91,0x6c,0x9f,0x14, +0x2d,0x24,0x99,0x34,0xfa,0x16,0x89,0xee,0x05,0x24,0xeb,0x08, +0xa8,0x42,0x07,0x9a,0xd2,0x82,0xae,0xf4,0xa0,0x2d,0x4d,0x68, +0x44,0x16,0xfa,0xd2,0x86,0xce,0x94,0x3e,0x16,0x6d,0xe6,0xfb, +0xee,0xb7,0x4e,0xf9,0x31,0x0a,0xa3,0x4c,0x24,0x69,0xc9,0xa4, +0x59,0x38,0x6a,0x32,0xf1,0x8e,0xd1,0xfc,0xa3,0x33,0x51,0xd2, +0x11,0x91,0x2c,0x55,0x25,0x14,0x51,0xc8,0x53,0xb3,0x12,0x55, +0x8c,0x34,0x95,0x24,0x53,0x65,0xaa,0x10,0x93,0xc7,0x96,0x36, +0x61,0x70,0x83,0x23,0x54,0x27,0x57,0x3f,0x78,0xc2,0xaf,0x62, +0xb0,0x6b,0x64,0x05,0xab,0x06,0x3b,0xd8,0xff,0x55,0xb1,0x71, +0x15,0x4d,0x1d,0x54,0xeb,0x58,0xd3,0x24,0xd7,0xb9,0xd2,0xb5, +0xae,0x98,0x5a,0x22,0x5e,0xf3,0x4a,0xb2,0x9e,0x32,0xae,0x89, +0xa4,0xec,0xab,0x14,0x29,0xfa,0x57,0xbd,0xd2,0x06,0x51,0x93, +0xb3,0x2b,0x62,0x13,0xab,0xd8,0xc5,0xf2,0x0f,0x8f,0x89,0x8c, +0xd6,0x1d,0x0f,0x17,0x97,0x88,0x1e,0xb5,0xb2,0x73,0xac,0x26, +0xc7,0x66,0xc2,0x3b,0xe0,0x65,0x4d,0x21,0x12,0xdd,0xc9,0xa5, +0x18,0x2b,0xda,0xd1,0x92,0x96,0x7f,0x96,0x1d,0x64,0x33,0xd3, +0x8a,0x4a,0xe0,0xc9,0x92,0x5a,0x13,0x7d,0x1f,0x6a,0xfb,0x52, +0x3c,0x90,0x09,0xce,0x3c,0x2a,0x2a,0x2d,0x6e,0x73,0x9b,0xdb, +0xd6,0x02,0xef,0xb5,0x41,0x75,0x94,0x37,0x2f,0x3b,0xd2,0x57, +0x42,0xea,0x37,0xd9,0xcc,0xa6,0x36,0x77,0xb2,0x1e,0x19,0xa9, +0x45,0xb7,0xce,0x7d,0x6e,0x62,0x5f,0xe3,0x47,0xae,0x39,0x53, +0x9d,0x1d,0x5d,0xed,0x32,0x2d,0x6a,0xcd,0x25,0x2e,0x0f,0xb9, +0xc9,0x55,0x2e,0xfc,0xa0,0x2b,0xde,0xf1,0x22,0x56,0x9e,0xaf, +0x95,0xd6,0x21,0x75,0x87,0xdd,0xf5,0x8e,0x74,0x99,0x87,0x7c, +0x2f,0x70,0x71,0x07,0xb6,0x6b,0x12,0xe5,0x9d,0xe4,0xbd,0x2f, +0x7e,0xb3,0x82,0xd1,0x16,0xd1,0xf1,0x51,0x3f,0xdd,0x68,0x52, +0x6d,0x67,0x39,0x8d,0xce,0x93,0xa3,0x89,0x1b,0xe2,0x42,0x9a, +0x95,0xdf,0x05,0x33,0xf8,0x22,0x27,0x64,0xeb,0x5b,0x47,0x08, +0x57,0xc3,0x85,0x4d,0x84,0x62,0x02,0xa1,0x97,0xcc,0x1a,0xe1, +0xb3,0xce,0xc8,0xc2,0x61,0xf2,0xea,0xa6,0x2a,0xf7,0x4d,0xea, +0xff,0x78,0x67,0x91,0x25,0xd6,0xce,0x89,0x49,0x8c,0xd8,0x07, +0x00,0xe0,0x01,0x2c,0x66,0x31,0x63,0x61,0xdc,0x60,0xd2,0x4a, +0x05,0x3f,0x66,0x43,0x19,0x04,0x6c,0x9c,0x55,0x07,0xe5,0x78, +0x19,0x37,0xf6,0x54,0x8f,0x2f,0xf9,0x98,0x25,0xfd,0xd8,0x6e, +0x10,0x12,0xb2,0x38,0x8f,0x4c,0x2b,0x1c,0x1f,0x79,0xc7,0x1e, +0x79,0xb1,0x8b,0x1f,0x70,0x00,0x29,0x47,0x79,0xc6,0x56,0xf6, +0x08,0x2d,0x83,0x5c,0x3e,0xbb,0xd9,0x98,0x54,0x63,0x21,0x95, +0x8d,0xb7,0x1c,0xe4,0xc6,0x8c,0x25,0x34,0x4a,0x7e,0x97,0x91, +0x57,0xc1,0xaf,0xb1,0x1c,0xec,0xcc,0xbd,0x4a,0x33,0x66,0x9c, +0xac,0x90,0x28,0x57,0x79,0x20,0x52,0x6e,0xb1,0x5c,0x5d,0x6c, +0x10,0x28,0xd7,0xf5,0x00,0x7e,0x3e,0x00,0x9e,0xf3,0x0b,0x25, +0x30,0x93,0x4a,0x5c,0x6f,0x23,0x86,0x8f,0x1b,0x83,0xe4,0x8d, +0x3c,0xa4,0x31,0x05,0x3a,0x59,0xdd,0x20,0xe3,0x63,0xe8,0x09, +0x11,0x4a,0x6d,0x3e,0x98,0xa1,0x7b,0xa6,0xe6,0xd0,0x2c,0xba, +0x24,0x0f,0x31,0x33,0xa6,0x23,0x1d,0x08,0x35,0x7f,0x4f,0xce, +0x76,0x06,0x34,0x95,0x51,0x4d,0x65,0x3d,0xa7,0x09,0xd0,0x07, +0x91,0x71,0x8b,0x5d,0xbd,0x9a,0x17,0xef,0x39,0xd0,0xde,0x91, +0xf5,0xab,0x61,0x0d,0xc9,0x95,0x55,0xe6,0x5d,0xe1,0x72,0x55, +0x63,0x7e,0x74,0x52,0x4c,0x36,0xa6,0xd7,0xbd,0xfa,0x75,0x65, +0x48,0x25,0xec,0x5d,0x1f,0x2c,0x35,0xbe,0x36,0x5f,0x68,0x96, +0x8d,0xc9,0xd0,0x38,0xfb,0xd8,0xe6,0x3b,0x98,0xb4,0x55,0xa2, +0x67,0x29,0x4f,0x99,0xff,0xce,0x02,0xa1,0x73,0x9d,0x9f,0x4c, +0x6b,0x58,0xd3,0x5a,0x20,0x80,0x9e,0xb2,0x77,0x60,0xac,0xeb, +0x16,0xaf,0x9b,0x24,0xe5,0xf6,0x8e,0xb0,0xb3,0x5c,0x19,0xe7, +0xd9,0x2d,0xd9,0xc9,0x14,0x48,0xbc,0x49,0x35,0x6f,0xeb,0xd5, +0x9b,0x54,0x8a,0xee,0x34,0x00,0xe2,0x4d,0xed,0x83,0xd1,0x9b, +0x34,0xcd,0xbe,0x77,0xc0,0x2d,0x6d,0xf0,0x55,0x19,0x7a,0xe1, +0x9c,0x06,0x38,0x42,0xee,0xfc,0x6d,0x70,0xab,0xba,0xca,0xe8, +0xce,0x8a,0xae,0xf5,0x2c,0xeb,0x76,0x5f,0x44,0xc6,0x75,0x66, +0x35,0x9e,0x71,0x7d,0x16,0x18,0x8b,0xdc,0xd6,0xed,0x9a,0x4a, +0xb1,0x0b,0xcd,0x33,0x57,0x29,0xfb,0x47,0xbb,0xd6,0xb7,0xca, +0x8d,0x06,0x6c,0x88,0xb8,0x7c,0xda,0x0b,0xcf,0xf4,0xb5,0x69, +0x3e,0x6c,0x4a,0x36,0x3b,0xd4,0x32,0x4f,0x4d,0xb4,0x6b,0xee, +0x6e,0x6e,0x4f,0xbc,0xdb,0x76,0xfe,0x36,0x9e,0x39,0xbe,0x67, +0x5c,0xab,0x7b,0xdb,0x79,0x3e,0xfa,0xab,0x07,0x52,0x72,0x8c, +0x23,0x5d,0xea,0x1c,0xcf,0xb7,0xab,0x0a,0x98,0x65,0x62,0xe2, +0x1b,0x4a,0x29,0xff,0xdf,0xca,0xb8,0x9e,0xf0,0x87,0xf4,0x1c, +0x2c,0x40,0x47,0xb8,0xc0,0x17,0xbe,0x40,0x7e,0x89,0xbd,0xd6, +0x2c,0xee,0x36,0xb8,0xb7,0xed,0x62,0xb8,0x3b,0x45,0xdd,0x55, +0x07,0x00,0xaa,0x73,0x3d,0xf5,0x89,0xdf,0xbd,0xef,0x55,0x57, +0x3a,0xd4,0xe7,0xec,0xf6,0x76,0x4f,0x05,0xe6,0x2c,0xac,0x4c, +0xb0,0x77,0x1e,0xa8,0x94,0x1f,0x5e,0xdf,0x34,0xc7,0xb2,0x54, +0x7a,0xfe,0xc3,0xb3,0x0b,0x3d,0x50,0x03,0xff,0x9f,0xfc,0xc1, +0x2b,0xdf,0xf1,0xb8,0x73,0x1e,0xca,0xdc,0x5e,0xf5,0xba,0x3d, +0x1e,0x68,0xbb,0x7b,0x3e,0xf0,0x09,0x01,0xf9,0xd2,0xef,0xee, +0x74,0xbc,0x6b,0xdb,0xdc,0xae,0x96,0x71,0xde,0x47,0xc3,0x78, +0x4a,0x8f,0xca,0xde,0x5f,0xae,0x3d,0xed,0xf7,0x93,0xe5,0x32, +0x1b,0xfc,0x57,0xbd,0x3f,0x38,0x9b,0x7f,0x4f,0x95,0x09,0xc5, +0xf9,0x29,0x9c,0x67,0x77,0xe7,0x3b,0x5f,0xf2,0xa6,0xb3,0x9e, +0xca,0xc8,0x47,0xfd,0xc5,0x45,0xbe,0xf1,0xa3,0x8b,0x9e,0xef, +0x49,0x37,0x79,0x42,0x98,0xee,0xf7,0x5a,0x4f,0x89,0xf1,0xa3, +0x8b,0x9b,0x7e,0x56,0x76,0xfb,0xf0,0x97,0x0b,0xfc,0x88,0x97, +0x73,0x9c,0x25,0x84,0xb0,0x7f,0xf5,0x7e,0xcd,0x8f,0x91,0xfc, +0xfa,0x81,0xa6,0xfe,0xd0,0xd4,0x9d,0xdd,0xcf,0xa7,0x73,0xb7, +0xe1,0xee,0x6d,0xbc,0xa3,0x7e,0xe2,0xfd,0x7f,0xfd,0xdb,0xad, +0xde,0xf6,0x25,0x1d,0xf3,0xf5,0x9d,0xc7,0xd9,0xdd,0x41,0x88, +0x9c,0xae,0xbd,0x9e,0x42,0x94,0xdc,0xca,0x48,0x06,0xcb,0xbc, +0xc3,0xb9,0x28,0xc6,0xee,0x3d,0x46,0x63,0x40,0xa0,0xb9,0x4c, +0x20,0x62,0x88,0xdf,0xfb,0x61,0x46,0x6a,0xfc,0x0b,0xc0,0x78, +0x46,0xf1,0x3d,0x46,0x68,0x98,0x06,0xd2,0xa4,0x43,0x08,0x72, +0x86,0xfb,0xb9,0x9b,0xd1,0x25,0x5f,0xe7,0x11,0x20,0xc8,0xad, +0x1b,0xdc,0xa9,0x1a,0xf7,0x21,0xe0,0xe9,0xc5,0x1a,0x01,0xda, +0xda,0xdc,0xd9,0xa0,0x53,0xa0,0x1b,0x03,0xae,0xc6,0x03,0x1a, +0xc6,0xf7,0xb9,0x4c,0x91,0x90,0x99,0x05,0xd2,0x92,0x10,0x96, +0xff,0x1f,0x11,0xd2,0x90,0x97,0x75,0x60,0x67,0xc4,0x1f,0x69, +0xe8,0x10,0xfd,0x91,0x20,0x66,0x68,0x06,0x14,0x02,0xd1,0xc1, +0xf4,0x60,0x95,0x79,0x9b,0x0b,0xe2,0xdf,0xaa,0x25,0xe0,0xa9, +0x55,0x1c,0x01,0xba,0xda,0xf4,0xe5,0x9a,0x0e,0x72,0x61,0x01, +0xf2,0xe0,0x93,0x51,0x1f,0xf6,0x5d,0xc6,0x05,0xd2,0x50,0x06, +0xce,0x0b,0x82,0x70,0xe0,0x65,0xf8,0x1b,0x1c,0x4a,0xa0,0x1c, +0xd2,0x90,0x11,0x5e,0x46,0x09,0xea,0x10,0x08,0x2a,0x8c,0x87, +0xac,0xe0,0x68,0x1c,0x4c,0x20,0xfe,0x61,0x15,0x96,0xa0,0x9c, +0xc5,0x1d,0xff,0x75,0xe1,0x0b,0x52,0x5f,0x94,0xd1,0x20,0xb8, +0xf1,0x1d,0xea,0x65,0x1c,0xd2,0xd1,0x1d,0x1a,0x92,0xde,0xc5, +0x71,0x5f,0x0e,0xda,0x9f,0xac,0x31,0xa0,0xd2,0x6d,0x1d,0x75, +0x34,0x61,0x1d,0x2e,0xd2,0x1e,0x8e,0xc6,0xc3,0x39,0x47,0x16, +0x76,0xa0,0x76,0x4c,0xa1,0xb8,0x3d,0x22,0xe8,0x31,0xa2,0xf3, +0xd5,0x19,0xba,0x39,0x1f,0xf2,0xe9,0x9f,0x00,0x9e,0x9b,0x0d, +0xf2,0x99,0xd1,0xc5,0x1a,0xfe,0x5d,0x5f,0x1b,0x76,0x9c,0x26, +0x02,0x1e,0xd2,0x0d,0x9a,0x91,0x20,0x47,0x72,0x40,0x87,0x31, +0x26,0xc7,0xbf,0x79,0x84,0xd7,0x15,0x23,0x32,0x1e,0xa3,0x31, +0x86,0x5d,0xa5,0x91,0x9d,0x33,0x42,0x63,0x35,0xc6,0x19,0xc4, +0x25,0x5c,0x9c,0x25,0x63,0x31,0x5e,0x63,0xa9,0xb5,0x22,0x2c, +0x26,0x5f,0xc8,0x85,0x5e,0xf3,0x7d,0x9e,0x25,0xae,0x5a,0x26, +0x96,0x9c,0xf4,0xc9,0xdd,0xc7,0xed,0x5f,0xff,0xb1,0x21,0x0c, +0xee,0xdf,0xa9,0xf1,0xff,0xd8,0x76,0xb8,0x50,0xba,0x44,0xc4, +0x3a,0x40,0x87,0xce,0xed,0x5a,0x31,0x42,0xc9,0x3d,0xd2,0x9c, +0x3e,0x66,0x1b,0x3d,0x32,0x92,0x3d,0xd2,0xcb,0x8f,0x04,0xa4, +0xe6,0xa9,0xca,0xad,0x14,0x64,0x46,0xe4,0x63,0x72,0xec,0xa3, +0xe0,0x9d,0xa3,0xe7,0x75,0x21,0x0e,0xc2,0xda,0xf4,0x5d,0x1c, +0x45,0xe2,0xa0,0x0e,0xa6,0x5e,0x3c,0xca,0xa3,0x26,0xd6,0x1f, +0xf2,0xd9,0x1f,0x39,0x0a,0x5b,0x24,0xe0,0x89,0x3f,0xe2,0xe3, +0x41,0x42,0x40,0x49,0x02,0x1c,0x49,0x9a,0x24,0x3e,0xea,0x5c, +0x3e,0xaa,0xa4,0xd8,0xb5,0xe4,0x91,0x9c,0x24,0x4c,0x26,0xc7, +0x4a,0xca,0x0c,0x4d,0x0a,0xdb,0x4b,0xf2,0x24,0x4e,0xb6,0x1d, +0xc5,0xb9,0x22,0x45,0xee,0xe0,0x2c,0x9a,0x5b,0xd4,0xbd,0x98, +0xfe,0xf9,0xd9,0x17,0x16,0xe5,0x1a,0xb2,0x63,0x3b,0x92,0x5b, +0xc4,0x45,0x1d,0x18,0x3e,0xa2,0xe0,0x4d,0x85,0xdd,0x2c,0x52, +0xa7,0x08,0xe4,0xc9,0x75,0x0a,0x56,0x66,0x65,0x42,0x8e,0xd8, +0x55,0x2e,0xd2,0x0e,0x68,0xa5,0x42,0x72,0x25,0x56,0x8e,0xe5, +0x57,0x9a,0xdb,0x0e,0xae,0x25,0x23,0xb2,0xdb,0x2c,0x86,0x1e, +0x94,0xcd,0x60,0xdc,0x79,0xa2,0x30,0xfa,0x22,0xab,0x6d,0x21, +0x2d,0xbe,0x1d,0xd4,0xa9,0x9b,0x18,0x1a,0xe5,0x2f,0x1a,0xc4, +0x01,0x2c,0xdb,0x0b,0x21,0xd0,0xd2,0xac,0x4b,0x90,0xcc,0xa4, +0xcb,0x0d,0xa6,0xf8,0x30,0xcc,0x61,0xb2,0x64,0x62,0x8e,0xd1, +0x62,0x1a,0xa6,0x80,0x20,0xe6,0x49,0x29,0x66,0x61,0x1a,0xca, +0x64,0x66,0x63,0x52,0xda,0x22,0x2c,0xfa,0xff,0x19,0xeb,0x1d, +0x25,0xb9,0x79,0xa1,0x51,0x92,0x5e,0xeb,0x29,0x25,0x3c,0x0e, +0x20,0x6a,0xba,0x5e,0x5d,0x9e,0x5c,0xbe,0x70,0xd1,0x65,0xd2, +0x49,0x5a,0x7e,0x53,0x6b,0x12,0x66,0x61,0xc2,0xa6,0xe2,0xed, +0xc9,0x6c,0x46,0x26,0x66,0x86,0x44,0x6c,0x2a,0x52,0x6e,0xbe, +0x26,0xa0,0xf4,0xa6,0xff,0x29,0xdf,0x2b,0xba,0xa0,0x9d,0x85, +0xe6,0x67,0xd2,0x1a,0x53,0x8a,0xe4,0xde,0x35,0x9f,0xea,0xa9, +0x61,0xba,0x2d,0x62,0xe0,0xd5,0xa5,0x03,0xd5,0xa6,0x9e,0x7c, +0x05,0x6d,0x2e,0x4d,0x96,0x98,0x9a,0xaa,0x64,0x27,0x63,0xea, +0xca,0x58,0x78,0xa7,0x64,0x36,0x8c,0x47,0xe4,0x5f,0x2c,0x06, +0xa5,0x50,0xca,0x1d,0x60,0xd6,0xe0,0xfd,0x21,0xa5,0x7b,0xa6, +0x26,0x42,0xd8,0x62,0x72,0x86,0xdc,0x5f,0xee,0x19,0x5f,0x0e, +0x20,0x54,0x3a,0x88,0x6e,0x66,0x09,0x79,0x8e,0xc6,0x7e,0x6e, +0x67,0x89,0xfd,0xe7,0x75,0x86,0x27,0x70,0x0e,0xa8,0xbb,0x2d, +0x62,0x24,0x4e,0xa4,0x50,0x6a,0xa4,0x7d,0x56,0x1c,0x00,0x2a, +0xe5,0x17,0xd6,0xe7,0x5e,0x3a,0xe2,0xe9,0x35,0xa7,0x84,0xd6, +0x67,0xf5,0x51,0x12,0x58,0xc8,0x95,0x8a,0xa5,0x18,0x59,0x70, +0xa8,0x73,0xcc,0x9a,0xc6,0xfd,0xd9,0x16,0xf2,0xe2,0x17,0x0a, +0xe0,0xe0,0xf1,0xa2,0x48,0xf2,0xdf,0x67,0xfa,0x65,0xeb,0xf1, +0x59,0xb8,0xb5,0x5a,0x26,0x02,0xde,0x6a,0x5e,0x99,0x8d,0xce, +0x55,0x0b,0xba,0xe0,0x2c,0x4e,0xd9,0x2e,0x46,0xdc,0x3b,0x86, +0xe4,0xab,0xe1,0xda,0xd4,0x65,0x62,0x1b,0x1e,0x20,0xde,0x59, +0xff,0x68,0xeb,0x25,0x1d,0x92,0xde,0x28,0x93,0xd2,0x15,0xf3, +0xa5,0xda,0x18,0xf2,0x28,0xdd,0x5d,0x04,0x8f,0xb2,0x28,0x17, +0x76,0xa2,0x5f,0xee,0x5d,0xb9,0x8d,0x9b,0x01,0xae,0xa8,0x5d, +0xfd,0x68,0x93,0x86,0x29,0x62,0x55,0x29,0x55,0x06,0xe0,0xe7, +0x99,0x23,0x95,0x92,0xa3,0xd5,0xf1,0x9f,0x67,0xae,0x86,0xfe, +0x6d,0x62,0x74,0x4a,0x25,0x9b,0xc2,0xa7,0x98,0xd6,0xa9,0x88, +0x9e,0xa8,0x25,0xe6,0xdf,0x92,0x56,0xe2,0x71,0x66,0xdf,0x85, +0x6a,0x64,0xe8,0x29,0x60,0x74,0xc2,0x1e,0xf6,0xd5,0xa8,0x9d, +0x1e,0xea,0xe6,0x79,0x1e,0x0d,0xb2,0xe8,0xc8,0x21,0x9d,0x00, +0x1a,0xea,0x9c,0x51,0x22,0xa4,0x7e,0xa4,0xd4,0xc9,0x29,0xa2, +0x5e,0xaa,0x9b,0xaa,0x25,0x0e,0x7a,0xa6,0x5e,0xde,0x5a,0x2e, +0x7a,0xe6,0x9e,0x46,0xe5,0xa4,0x1e,0x28,0xa6,0x96,0x2a,0x69, +0xc5,0xde,0x7d,0xd2,0x15,0x91,0x7e,0xe9,0x7a,0x52,0xea,0xac, +0x99,0x2a,0xac,0x96,0x56,0xa8,0x66,0xc5,0xb9,0xc5,0xaa,0x54, +0x55,0x04,0x54,0xe1,0xea,0xad,0x56,0x15,0xbe,0xe9,0xea,0x53, +0x5c,0x95,0x52,0x71,0x27,0xb0,0x7e,0x04,0xaf,0x9e,0x85,0x69, +0xda,0x6a,0x83,0x99,0x14,0x4a,0xc5,0x94,0x4a,0x31,0x2b,0x4b, +0x39,0xab,0x4b,0x41,0x2b,0x4c,0x41,0x84,0x4c,0x49,0x2b,0x4d, +0x59,0x6b,0xfd,0xa5,0xda,0xac,0xb6,0x6a,0x8b,0x22,0x2b,0x87, +0x32,0x94,0xb2,0x36,0x2b,0xb5,0x3a,0x88,0x43,0x29,0x09,0xb8, +0x96,0xeb,0xb2,0x8e,0xeb,0xb3,0xaa,0xeb,0xc8,0xed,0x28,0x98, +0xfa,0xa9,0x5e,0x8e,0xff,0x2a,0x94,0x7a,0xab,0x40,0xec,0x40, +0x4e,0x76,0xa8,0x4a,0xd8,0x2b,0x56,0x66,0x85,0xbe,0x9a,0xd8, +0x53,0xf4,0x2b,0x8a,0x3d,0x05,0xaa,0x91,0xa8,0x5b,0x12,0xec, +0xe6,0x61,0x64,0xad,0xd6,0x28,0xa8,0x4a,0xdd,0xaa,0xde,0x60, +0xa5,0x4a,0xdc,0x7d,0x51,0x05,0x2f,0xd9,0x12,0x05,0x0e,0x99, +0x54,0xdc,0x12,0xc6,0x52,0x86,0x93,0x0d,0x5f,0x30,0x19,0x13, +0x2b,0x42,0x9e,0x54,0x08,0x93,0xc8,0xa2,0x46,0x22,0x4a,0x29, +0x27,0x92,0xdc,0xbb,0x1a,0x65,0x51,0x1e,0x6b,0x79,0x96,0xa1, +0x8b,0xaa,0xc4,0xb6,0xd2,0x98,0x54,0x90,0x91,0x3e,0xfa,0x6b, +0xa0,0xd0,0xec,0x43,0xda,0x2c,0x04,0xe1,0x6c,0x57,0x66,0x47, +0xf6,0x74,0xe3,0xbe,0x96,0x27,0x90,0x7a,0x9b,0x94,0xce,0x1d, +0x30,0x16,0x2d,0x8b,0x22,0x29,0xc7,0x75,0x62,0xbb,0x2d,0x69, +0xcc,0xce,0xd5,0x60,0x42,0x04,0x74,0x20,0x08,0x91,0x10,0x08, +0xd1,0x8c,0x91,0xd4,0x2a,0xe3,0x62,0x18,0x88,0xd5,0x4e,0x07, +0xd6,0x3a,0xe4,0x21,0x56,0x89,0x86,0x5c,0xad,0x1a,0x81,0xad, +0x87,0x88,0xed,0x91,0x0d,0x5d,0x2d,0x2a,0x9f,0x85,0xc2,0xe5, +0x2e,0xee,0x1d,0x2e,0x1e,0x29,0xa7,0xba,0xa5,0xc3,0x76,0x2b, +0x7e,0x15,0x4a,0xd9,0xc6,0xe4,0xd6,0xf2,0x88,0x8d,0x4d,0x07, +0x1d,0xe4,0xad,0xd6,0x1e,0x5e,0xdf,0x2a,0xc9,0xdf,0x76,0x51, +0x4a,0x7e,0x06,0xda,0x12,0x4d,0xe1,0x92,0xd1,0xe1,0x9a,0x46, +0xe2,0xb2,0xe0,0x5a,0x72,0x66,0x39,0xc2,0x1e,0xc4,0x7e,0x66, +0x95,0x02,0xa0,0xdd,0xb6,0x6a,0xbc,0xce,0xff,0x27,0x18,0x62, +0x69,0xe6,0x3a,0x97,0xba,0x18,0xae,0xde,0x1a,0xc8,0x86,0x12, +0x6e,0xe1,0x02,0x24,0x2d,0x91,0x2e,0x57,0xf8,0xed,0xe9,0x1e, +0x2e,0x87,0x94,0xee,0x94,0x9c,0x8a,0xe8,0x26,0x87,0xe3,0xfa, +0x1e,0xc2,0x0d,0xa7,0x17,0xce,0xdd,0x5b,0x12,0xe9,0xe7,0xb9, +0x65,0x0c,0xb6,0x69,0x73,0x1e,0xe0,0xc6,0xb5,0xa9,0xe0,0xc5, +0xe7,0x91,0xbe,0x2c,0x8d,0xd9,0x0b,0xe3,0xbe,0x8c,0xc4,0x16, +0x1a,0xbf,0x29,0xae,0xec,0x56,0x44,0xce,0x4a,0x45,0xaf,0x3d, +0x2f,0xeb,0xfe,0xad,0xf4,0x56,0x85,0xb3,0x59,0xaf,0xe9,0x62, +0xef,0x43,0x4c,0xef,0xcd,0x71,0x6f,0xf6,0xf1,0x68,0x7a,0x26, +0x68,0x86,0x32,0xea,0x22,0x42,0xa8,0x52,0x4e,0x1d,0xc9,0x91, +0xe1,0xf0,0x22,0x6f,0x73,0xd6,0xaa,0xeb,0x7d,0xee,0x62,0xb1, +0x8d,0xe7,0xdc,0x8c,0xf3,0xa2,0x0e,0xf4,0xc6,0xcc,0xfd,0xa6, +0xcd,0xca,0x58,0x9b,0xa8,0x5c,0xef,0xd0,0x78,0x4e,0xd2,0x60, +0x5a,0xca,0xfc,0x9a,0x00,0x07,0x4c,0x01,0x17,0x8d,0xfe,0x3e, +0x59,0xd1,0xb2,0x6d,0xaa,0x55,0xae,0xca,0x22,0x28,0xf9,0x16, +0x69,0x02,0x22,0x65,0xf4,0xc1,0x27,0xc2,0x46,0xac,0xde,0x7c, +0xef,0xe8,0x4c,0xa0,0xd9,0xbc,0x4d,0x02,0x7b,0x30,0xe7,0xac, +0x8c,0xdb,0xa8,0xcc,0x08,0xbf,0x4c,0xec,0xf0,0xcb,0x09,0xdb, +0x4d,0x0a,0x27,0xc7,0x0a,0x13,0x5c,0xa4,0x89,0x1b,0x67,0x72, +0xde,0xb9,0xb1,0x2c,0x5b,0x1e,0x1f,0x9b,0x12,0xdd,0xcb,0xba, +0xe7,0x9d,0xb1,0x1a,0x92,0x2e,0xac,0x3a,0xe6,0x16,0xdb,0x90, +0xff,0x30,0xe9,0x90,0x0a,0xbf,0x05,0x70,0xf7,0x0e,0x8d,0x11, +0x83,0x70,0x12,0xef,0x2f,0x13,0xab,0x70,0xc2,0xb0,0x70,0xa6, +0x41,0x71,0xf6,0xc6,0xb0,0xbb,0x7c,0x4a,0x56,0x15,0xe7,0xf1, +0x69,0x9c,0x04,0x4f,0x2e,0xc5,0xa9,0x28,0xc3,0x96,0xa3,0xdc, +0xe6,0xee,0x2f,0x76,0x22,0xf9,0xa2,0x6c,0xa5,0x96,0x96,0x72, +0xcc,0x4d,0xff,0x82,0x1f,0x03,0xd7,0xcc,0x74,0x64,0x82,0x1b, +0xa7,0x0b,0xfe,0xc6,0x31,0x0a,0x2b,0x09,0x1d,0xf3,0x6f,0xba, +0x2c,0xb0,0xb5,0xb9,0xb0,0x1e,0xd7,0xb1,0x54,0xf8,0xf1,0x01, +0x03,0xf2,0x0d,0x86,0xa3,0xd1,0x76,0x6b,0x00,0x22,0x68,0x8c, +0xfe,0x30,0xa1,0x3a,0xe7,0x9b,0xfa,0xa0,0xdd,0x56,0xdf,0xfa, +0x1a,0x6d,0xc3,0x8a,0xd6,0x85,0xc4,0x8c,0x07,0x37,0x2f,0x03, +0xcf,0x0a,0xd1,0x00,0x88,0x26,0x33,0x6f,0xe1,0xe5,0xaf,0x27, +0xcf,0xf1,0x1e,0x67,0xef,0xf0,0x19,0x30,0xca,0x18,0xb2,0x83, +0x80,0x72,0x14,0x83,0xef,0xf6,0xae,0xf2,0x16,0x43,0xa8,0x8e, +0x26,0xb2,0x8f,0xe2,0x25,0x10,0x6b,0x6a,0xad,0x91,0x61,0xd5, +0x09,0xa9,0xf1,0xf6,0xb2,0xfd,0xb9,0xe8,0xa8,0x9e,0x45,0x88, +0x30,0xf1,0xe8,0xea,0xde,0xea,0xea,0x31,0x28,0xa3,0xae,0x64, +0x84,0x5f,0x32,0x4f,0x49,0x80,0x18,0x33,0xed,0xbe,0xee,0x33, +0xb7,0xf2,0x32,0xbb,0x2e,0xf1,0x55,0x73,0x7c,0xa2,0x67,0xee, +0x6a,0xab,0xe6,0xfa,0xe0,0x5d,0xd2,0x62,0x54,0xaa,0xa5,0xe8, +0xf9,0xe0,0x90,0xaa,0xe5,0xc0,0x4e,0xf0,0x1a,0xd3,0xd8,0x76, +0xa6,0xe4,0xde,0x72,0xff,0xad,0x8f,0x99,0xb2,0x88,0xb8,0x73, +0x33,0xf3,0x6d,0x3c,0x2b,0xf3,0x3c,0xc7,0x24,0xe2,0x36,0x49, +0xda,0xe2,0xf3,0x72,0x34,0xee,0xe4,0xf5,0x73,0xa2,0x2a,0x68, +0xf9,0x0e,0x31,0x89,0x42,0xa2,0xb1,0xce,0xaf,0x42,0xff,0xe5, +0x0f,0x72,0xab,0x6e,0x45,0x49,0xd6,0x22,0x61,0x3d,0xeb,0x47, +0xd7,0xfa,0x73,0x44,0x53,0xad,0x3d,0xdf,0x33,0x34,0x33,0x88, +0xd9,0xee,0xb3,0x84,0x8c,0xad,0x3c,0xff,0x33,0x74,0x9c,0x2d, +0x3f,0x0b,0xf4,0x21,0xeb,0xee,0x0b,0xc6,0x5e,0x9f,0x12,0x2f, +0x54,0x96,0xe8,0x7a,0x92,0xa1,0xf3,0x2d,0xac,0x73,0x82,0xa1, +0xdc,0x8e,0x66,0xde,0x3d,0x6d,0x9a,0x4c,0xc5,0x72,0xd4,0x6c, +0xc0,0x06,0xca,0x4e,0x83,0x6f,0x88,0x42,0xd2,0x4f,0xf7,0xac, +0x50,0x03,0xad,0xce,0x02,0x63,0x7b,0xa2,0x61,0xa4,0x32,0xa8, +0x6a,0xce,0xe9,0x05,0x8b,0xea,0x4c,0x93,0x84,0xa0,0x12,0x33, +0xc0,0x65,0xe3,0x40,0x66,0xec,0xc4,0x0a,0xa1,0xc5,0x42,0x06, +0xc5,0x4e,0xec,0xc6,0x4e,0xc5,0xc8,0x1e,0xd3,0x13,0x6e,0xb5, +0x58,0x87,0xf5,0xc7,0xaa,0x2d,0x41,0xa3,0xef,0x2f,0x43,0xf2, +0x0f,0xab,0xea,0x9f,0x4e,0xe7,0x5b,0x2b,0xd2,0x03,0xe0,0x0b, +0x04,0xb8,0x98,0x55,0x0f,0x04,0xc0,0xe2,0x2b,0x49,0xe4,0x75, +0x50,0x3b,0x05,0x5f,0x1b,0x07,0xbf,0xde,0x6b,0x5f,0x6b,0x9b, +0x23,0xab,0x5a,0xdc,0x6a,0xa1,0x5c,0xc9,0x2f,0x91,0xe2,0x74, +0x5c,0xd7,0xb5,0x5d,0x4f,0x47,0x94,0x65,0xa3,0x49,0x50,0x95, +0xaf,0x5a,0x55,0x4a,0x04,0x6b,0xb1,0x52,0xff,0x76,0x55,0x4d, +0xb6,0x53,0x70,0x36,0x66,0x73,0xe7,0xa9,0x49,0xdc,0x0e,0xd6, +0xdd,0xef,0x0e,0xb3,0x2f,0xaa,0xea,0x6a,0x3a,0xf6,0x5c,0xe7, +0x92,0x6a,0xaf,0xf6,0x45,0x78,0x36,0xb1,0x56,0x36,0x33,0x5e, +0x76,0x6c,0x67,0x36,0x56,0x6d,0x36,0x6d,0xcf,0xf6,0xb0,0xc2, +0x76,0x42,0xb3,0x74,0xba,0x99,0xa6,0xa1,0xde,0xf0,0x78,0xb5, +0x36,0x9d,0x35,0x08,0x71,0xbb,0xb6,0xb9,0xb2,0xeb,0xb3,0x12, +0x33,0xb6,0x5e,0x2b,0x73,0x2b,0xb7,0xaa,0x34,0xf7,0x74,0x34, +0x77,0x4d,0x35,0x6a,0x5c,0xdf,0x68,0xcc,0x4a,0x05,0xe7,0xa5, +0xca,0x71,0xcf,0x35,0xbd,0x7e,0x37,0x78,0x7f,0xc5,0x76,0xd7, +0x49,0xdc,0xdd,0x75,0x78,0x9f,0xb7,0xad,0x1e,0x37,0xc4,0x75, +0x37,0x68,0xa3,0xb7,0x7b,0xdb,0x69,0x6b,0xdf,0xb5,0x6a,0xdf, +0xee,0x7b,0xd7,0xf7,0xa5,0xc6,0xf7,0xc6,0x46,0xb6,0x7d,0xef, +0xb7,0xb7,0xd6,0x75,0xdb,0x29,0xc9,0x63,0xf3,0xb7,0x80,0xc3, +0x6a,0x7b,0xe7,0x8b,0x77,0x0f,0x38,0x82,0x0f,0x78,0x81,0x27, +0x38,0x83,0x37,0x78,0x5d,0x39,0xc0,0x53,0x40,0xb8,0x83,0x4f, +0x38,0x5d,0x49,0x38,0x00,0x58,0x38,0x49,0x60,0xb8,0x47,0x40, +0xb8,0x86,0x5f,0x84,0x84,0x3b,0x00,0x88,0x6f,0x78,0x88,0x5f, +0x78,0x56,0x74,0x78,0x9a,0x98,0x38,0x3f,0x0a,0xd1,0x56,0x88, +0x93,0x62,0x09,0x99,0x79,0x33,0x96,0x93,0x85,0x38,0x8a,0x1b, +0x04,0x87,0x83,0xf8,0x8c,0x0f,0x44,0x8d,0x5f,0xf8,0x8d,0xdb, +0xb8,0x8d,0x6f,0xb8,0x40,0xf4,0xb8,0x53,0x70,0x38,0x8d,0x9b, +0xff,0x78,0x87,0x03,0xf9,0x63,0xa0,0x00,0x92,0x27,0x39,0xd1, +0x24,0xb9,0x92,0x63,0x59,0x80,0xdb,0x95,0x7f,0x1b,0xf8,0x82, +0x5f,0x06,0x64,0x0b,0xd1,0x88,0xab,0xc4,0x88,0xd7,0xf8,0x8c, +0x6b,0x79,0x96,0x2b,0x44,0x96,0xa3,0x78,0x8e,0xf3,0x38,0x96, +0x93,0xb8,0x85,0xe7,0x38,0x8d,0x23,0x84,0x90,0x8f,0x05,0x0a, +0x28,0x00,0x9b,0xb7,0x39,0x0a,0x70,0xf7,0x9a,0xb7,0x39,0x9b, +0xbf,0x79,0x73,0x3c,0x79,0x5d,0x39,0xb6,0x76,0x1f,0x78,0x8b, +0x6b,0x37,0x5d,0xdb,0xf9,0x99,0xdf,0xf8,0x90,0x5f,0xb9,0x8f, +0x6b,0x39,0x89,0x7b,0xf8,0x41,0x18,0xf9,0xa1,0xf3,0x38,0xa2, +0x1b,0xfa,0xa1,0x27,0x84,0xa0,0xff,0xb8,0x9a,0x2b,0x00,0x55, +0xe0,0x01,0x1e,0x28,0x00,0x9d,0xab,0xca,0x9a,0x53,0x3a,0x55, +0x58,0x3a,0xd1,0xf8,0xf9,0x88,0xfd,0xb7,0xaa,0x94,0xf7,0x56, +0x57,0x75,0x7c,0x03,0xb8,0xa7,0x43,0xfa,0x40,0x5c,0xc1,0x15, +0xf8,0xb8,0x40,0xa8,0xba,0x87,0xcb,0xb8,0xab,0xa3,0xba,0x42, +0xc4,0x3a,0x8e,0xcf,0xfa,0x15,0x94,0xf9,0x45,0xc4,0x7a,0x8f, +0x13,0x7a,0xab,0xaf,0xfa,0x8f,0x63,0xf8,0x87,0x03,0x00,0xad, +0x3b,0x48,0xa6,0x43,0x00,0x27,0x1c,0xbb,0xb1,0x57,0xfa,0xa5, +0x43,0x40,0xa6,0x73,0x82,0xb1,0x1f,0x3b,0x27,0x28,0x3b,0x77, +0x17,0xf7,0x94,0x80,0xdb,0xed,0xaa,0xb7,0xcf,0x12,0x37,0x5d, +0x97,0xfa,0x56,0xce,0xb7,0x4a,0x5c,0xc1,0x1e,0xec,0x81,0xaf, +0xcf,0x38,0xb8,0x8b,0xfb,0xb7,0x87,0xbb,0xaf,0x7b,0x44,0xb9, +0xa7,0xfb,0x99,0xa7,0xff,0x3a,0xba,0xcb,0x78,0xa1,0x1b,0xc4, +0xba,0x3b,0xba,0x85,0xcf,0xbb,0x8e,0xcb,0x78,0xbd,0xa3,0xbb, +0x92,0x14,0x7b,0x30,0xf4,0x7b,0x30,0x40,0x80,0xb4,0xe7,0x0b, +0xbf,0xfb,0x7b,0xb4,0x73,0x7a,0xb5,0xeb,0xf7,0xc1,0x97,0xf7, +0xa2,0x61,0x3b,0x3d,0x76,0x1e,0x77,0x33,0x7c,0xa8,0x8b,0x7a, +0xa3,0xb7,0xfa,0x1e,0x0c,0xc3,0x30,0x98,0x7b,0xae,0x57,0xfc, +0xc5,0xb3,0x3b,0x42,0x80,0xbb,0xc5,0x63,0xfc,0xac,0x6b,0x3c, +0xc8,0x27,0x84,0xc7,0x6f,0xfc,0xaf,0xd7,0xba,0xb0,0x8b,0xfc, +0xad,0xa7,0x79,0xa1,0x97,0x3c,0xc6,0x5f,0xb9,0x84,0xbb,0x7c, +0xba,0x4b,0x38,0xb3,0x2b,0x00,0x1e,0x40,0x40,0x30,0x98,0x83, +0x39,0x24,0xbb,0xc1,0x6b,0x45,0xb3,0x4b,0x85,0x39,0x04,0x43, +0xc1,0x5f,0x7a,0xbb,0x50,0xbb,0xa9,0x3b,0x7c,0xc2,0xeb,0x79, +0xc4,0x23,0xbd,0x83,0x8c,0x37,0x8f,0x29,0x7c,0xc6,0x7f,0xfc, +0xaa,0xa3,0xb8,0xcc,0xab,0xbb,0xca,0x5b,0xbd,0xd4,0xa3,0xb9, +0xbb,0x4b,0xfd,0xa3,0xc7,0xfc,0xd5,0xeb,0x38,0x99,0x53,0x7c, +0xd6,0x3f,0xba,0xd8,0x9b,0x3c,0xd8,0xfb,0xbc,0xcd,0x53,0x85, +0xd0,0x07,0x3c,0xda,0xe3,0x01,0x27,0xe4,0xbc,0x54,0x0c,0xfd, +0xb4,0x23,0x7c,0xd2,0x4b,0x7c,0xd1,0xd3,0xfd,0xd2,0x3b,0x7d, +0xde,0x47,0x76,0x9f,0xdb,0x3d,0xc9,0xeb,0xbb,0xac,0x1f,0x84, +0xbd,0x93,0x3d,0xc5,0x8f,0xbc,0xd6,0xdb,0xbb,0xd5,0xbf,0x7c, +0xa2,0x17,0xfe,0xb8,0xd7,0x7a,0xbe,0x2b,0x3e,0xae,0x43,0x38, +0xe2,0x17,0x7a,0xcd,0xdf,0xbc,0xbf,0xaf,0xff,0x7d,0xcf,0x57, +0xfe,0xdb,0xfb,0x3b,0xc0,0xf7,0xfc,0xde,0x2b,0xbd,0x81,0x6f, +0x77,0xa7,0x71,0x7b,0xc3,0xeb,0x7d,0x77,0x83,0xfe,0xc9,0xf9, +0x7d,0xc7,0xcf,0xbc,0xba,0x37,0x7e,0xeb,0xe3,0xb8,0x86,0xf7, +0xf8,0xb0,0x3b,0xbe,0xbc,0x73,0x3c,0xec,0x43,0xfa,0xec,0xdf, +0x7e,0xaa,0xb3,0x3e,0xd5,0x37,0xbe,0x90,0x57,0xfe,0xb3,0x43, +0x3b,0xdb,0x6b,0x3e,0xb4,0xf3,0x3c,0xd1,0x87,0xbe,0xd1,0xef, +0x3d,0x7d,0x93,0x3e,0x26,0x59,0x7b,0x59,0x7a,0xfb,0x68,0x30, +0xbf,0x97,0x13,0xfe,0xed,0xe3,0x7b,0xa3,0xb3,0x7c,0xbc,0x07, +0x3a,0xae,0x5f,0x7f,0x90,0x67,0x3f,0xa3,0x2f,0xbe,0xf7,0x6b, +0xfd,0xd9,0xa3,0x3d,0xc0,0x53,0x3a,0xa5,0x7b,0x3e,0xf9,0x4f, +0xc5,0xf9,0x1f,0x3f,0xf2,0xe3,0xbd,0x22,0xd1,0x77,0xd3,0xa3, +0x7e,0xb6,0x2f,0xbc,0xfb,0x2b,0x50,0xfd,0xa3,0xfc,0xa2,0x83, +0x7f,0xb0,0x4f,0x3c,0xd8,0x63,0xff,0xbd,0x03,0x84,0x03,0x81, +0x00,0x1c,0x00,0x30,0x78,0x90,0xe0,0x40,0x84,0x0b,0x0f,0x2a, +0x64,0xc8,0xd0,0x61,0x43,0x81,0x05,0x1f,0x22,0x1c,0x48,0xf1, +0x20,0x04,0x14,0x0a,0x38,0x76,0x44,0x01,0x81,0xa1,0xc6,0x8e, +0x1e,0x41,0x86,0x7c,0xf0,0x00,0x02,0x84,0x93,0x25,0x2b,0xb6, +0x7c,0xa8,0x12,0xa5,0x4b,0x99,0x26,0x53,0xce,0x44,0x98,0x72, +0xe5,0x43,0x8a,0x05,0x79,0xce,0xc4,0x58,0x51,0x61,0x4f,0x88, +0x06,0x27,0xfe,0xb4,0x98,0x10,0xa9,0x4c,0xa3,0x2d,0x97,0x26, +0x75,0x29,0x74,0xa1,0x46,0x14,0x53,0xa7,0xb2,0x8c,0x4a,0x95, +0xff,0xaa,0xd5,0x9b,0x31,0x01,0xa8,0xd4,0x6a,0xb3,0x22,0xcc, +0xaf,0x60,0x5f,0xd6,0x24,0x9b,0x71,0xec,0xd0,0x88,0x47,0xd7, +0xaa,0x25,0xea,0xd3,0xe9,0x42,0x9e,0x4d,0xdd,0x9e,0xb5,0xfb, +0x96,0x60,0xc8,0x94,0x7b,0x5d,0xee,0xe5,0x1b,0xd6,0xaa,0xd9, +0xbb,0x65,0x07,0x17,0x36,0x7c,0x18,0x71,0x62,0xc5,0x89,0xe9, +0x2e,0x76,0xfc,0x18,0x72,0x64,0xc9,0x93,0x29,0x57,0xb6,0x7c, +0x19,0x73,0x66,0xcd,0x9b,0x39,0x77,0xf6,0xfc,0x19,0x74,0x68, +0xd1,0xa3,0x49,0x97,0x36,0x7d,0x1a,0x75,0x6a,0xd5,0xab,0x59, +0xb7,0x76,0xfd,0x1a,0x76,0x6c,0xd9,0xb3,0x69,0xd7,0xb6,0x7d, +0x1b,0x77,0x6e,0xdd,0xbb,0x79,0xf7,0xf6,0xfd,0x1b,0x78,0x70, +0xe1,0xc3,0x89,0x17,0x37,0x7e,0x1c,0x79,0x72,0xe5,0xcb,0x99, +0x37,0x77,0xfe,0x1c,0x7a,0x74,0xe9,0xd3,0xa9,0x57,0xb7,0x7e, +0x1d,0x7b,0x76,0xed,0xdb,0xb9,0x77,0xf7,0xfe,0x1d,0x7c,0x78, +0xf1,0xe3,0xc9,0x97,0x37,0x7f,0x1e,0x7d,0x7a,0xf5,0xeb,0xd9, +0xb7,0x77,0xff,0x1e,0x7e,0x7c,0xf9,0xf3,0xe9,0xd7,0xb7,0x7f, +0x1f,0x7f,0x7e,0xfd,0xfb,0xf9,0xf7,0xf7,0xff,0x1f,0xc0,0x00, +0x05,0x1c,0x90,0xc0,0x02,0x0d,0x3c,0x10,0xc1,0x04,0x15,0x5c, +0x90,0xc1,0x06,0x1d,0x7c,0x10,0xc2,0x08,0x25,0x9c,0x90,0xc2, +0x0a,0x2d,0xbc,0x10,0xc3,0x0c,0x35,0xdc,0x90,0xc3,0x0e,0x3d, +0xfc,0x10,0xc4,0x10,0x45,0x1c,0x91,0xc4,0x12,0x4d,0x3c,0x11, +0xc5,0x14,0x55,0x5c,0x91,0xc5,0x16,0x5d,0x7c,0x11,0xc6,0x18, +0x65,0x9c,0x91,0xc6,0xff,0x1a,0x6d,0xbc,0x11,0xc7,0x1c,0x75, +0xdc,0x91,0xc7,0x1e,0x7d,0xfc,0x11,0xc8,0x20,0x85,0x1c,0x92, +0xc8,0x22,0x8d,0x3c,0x12,0xc9,0x24,0x95,0x5c,0x92,0xc9,0x26, +0x9d,0x7c,0x12,0xca,0x28,0xa5,0x9c,0x92,0xca,0x2a,0xad,0xbc, +0x12,0xcb,0x2c,0xb5,0xdc,0x92,0xcb,0x2e,0xbd,0xfc,0x12,0xcc, +0x30,0xc5,0x1c,0x93,0xcc,0x32,0xcd,0x3c,0x13,0xcd,0x34,0xd5, +0x5c,0x93,0xcd,0x36,0xdd,0x7c,0x13,0xce,0x38,0xe5,0x9c,0x93, +0xce,0x3a,0xed,0xbc,0x13,0xcf,0x3c,0xf5,0xdc,0x93,0xcf,0x3e, +0xfd,0xfc,0x13,0xd0,0x40,0x05,0x1d,0x94,0xd0,0x42,0x0d,0x3d, +0x14,0xd1,0x44,0x15,0x5d,0x94,0xd1,0x46,0x1d,0x7d,0x14,0xd2, +0x48,0x25,0x9d,0x94,0xd2,0x4a,0x2d,0xbd,0x14,0xd3,0x4c,0x35, +0xdd,0x94,0xd3,0x4e,0x3d,0xfd,0x14,0xd4,0x50,0x45,0x1d,0x95, +0xd4,0x52,0x4d,0x3d,0x15,0xd5,0x54,0x55,0x5d,0x95,0xd5,0x56, +0x5d,0x7d,0x15,0xd6,0x58,0x65,0x9d,0x95,0xd6,0x5a,0x6d,0xbd, +0x15,0xd7,0x5c,0x75,0xdd,0x95,0xd7,0x5e,0x7d,0xfd,0x15,0xd8, +0x60,0x85,0x1d,0x96,0xd8,0x62,0x8d,0x3d,0x16,0xd9,0x64,0x95, +0x5d,0x96,0xd9,0x66,0x9d,0x7d,0x16,0xda,0x68,0xa5,0x9d,0x96, +0xda,0x6a,0xad,0xbd,0x16,0xdb,0x6c,0xb5,0xdd,0x96,0xdb,0x6e, +0xbd,0xfd,0x16,0xdc,0x70,0xc5,0x1d,0x97,0xdc,0x72,0xcd,0x3d, +0x17,0xdd,0x74,0xd5,0x5d,0x97,0xdd,0x76,0xdd,0x7d,0x17,0xde, +0x78,0xe5,0x9d,0x97,0xde,0x7a,0xed,0xbd,0x17,0xdf,0x7c,0xf5, +0xdd,0x97,0xdf,0x7e,0xfd,0xfd,0x17,0xe0,0xff,0x80,0x05,0x1e, +0x98,0xe0,0x82,0x0d,0x3e,0x18,0xe1,0x84,0x15,0x5e,0x98,0xe1, +0x86,0x1d,0x7e,0x18,0xe2,0x88,0x25,0x9e,0x98,0xe2,0x8a,0x2d, +0xbe,0x18,0xe3,0x8c,0x35,0xde,0x98,0xe3,0x8e,0x3d,0xfe,0x18, +0xe4,0x90,0x45,0x1e,0x99,0xe4,0x92,0x4d,0x3e,0x19,0xe5,0x94, +0x55,0x5e,0x99,0xe5,0x96,0x5d,0x7e,0x19,0xe6,0x98,0x65,0x9e, +0x99,0xe6,0x9a,0x6d,0xbe,0x19,0xe7,0x9c,0x75,0xde,0x99,0xe7, +0x9e,0x7d,0xfe,0x19,0xe8,0xa0,0x85,0x1e,0x9a,0xe8,0xa2,0x8d, +0x3e,0x1a,0xe9,0xa4,0x95,0x5e,0x9a,0xe9,0xa6,0x9d,0x7e,0x1a, +0xea,0xa8,0xa5,0x9e,0x9a,0xea,0xaa,0xad,0xbe,0x1a,0xeb,0xac, +0xb5,0xde,0x9a,0xeb,0xae,0xbd,0xfe,0x1a,0xec,0xb0,0xc5,0x1e, +0x9b,0xec,0xb2,0xcd,0x3e,0x1b,0xed,0xb4,0xd5,0x5e,0x9b,0xed, +0xb6,0xdd,0x7e,0x1b,0xee,0xb8,0xe5,0x9e,0x9b,0xee,0xba,0xed, +0xbe,0x1b,0xef,0xbc,0xf5,0xde,0x9b,0xef,0xbe,0xfd,0xfe,0x1b, +0xf0,0xc0,0x05,0x1f,0x9c,0xf0,0xc2,0x0d,0x3f,0x1c,0xf1,0xc4, +0x15,0x5f,0x9c,0xf1,0xc6,0x1d,0x7f,0x1c,0xf2,0xc8,0x25,0x9f, +0x9c,0xf2,0xca,0x2d,0xbf,0x1c,0xf3,0xcc,0x35,0xdf,0x9c,0xf3, +0xce,0x3d,0xff,0x1c,0xf4,0xd0,0x45,0x1f,0x9d,0xf4,0xd2,0x4d, +0x3f,0x1d,0xf5,0xd4,0x55,0x5f,0x9d,0xf5,0xd6,0x5d,0x7f,0x1d, +0xf6,0xd8,0x65,0x9f,0x9d,0xf6,0xda,0x6d,0xbf,0x1d,0xf7,0xdc, +0x75,0xdf,0x9d,0xf7,0xde,0x7d,0xff,0x1d,0xf8,0xe0,0x85,0x1f, +0x9e,0xf8,0xe2,0x8d,0x3f,0x1e,0xf9,0xe4,0x95,0x5f,0x9e,0xf9, +0x0a,0xe6,0x9d,0x7f,0x1e,0xfa,0xe8,0xa5,0x27,0x33,0x20,0x00, +0x3b +}; +static const unsigned int tileDataC_len=17965; diff --git a/src/gui/tutorial.cpp b/src/gui/tutorial.cpp index 0313c5c55..89eec5e36 100644 --- a/src/gui/tutorial.cpp +++ b/src/gui/tutorial.cpp @@ -22,8 +22,543 @@ #include "IconsFontAwesome4.h" #include "imgui_internal.h" +#include "gif_load.h" + #define TS FurnaceGUITutorialStep +#ifndef _WIN32 +#include +#endif + +enum FurnaceCVObjectTypes { + CV_NULL=0, + CV_PLAYER, + CV_BULLET, + CV_ENEMY_BULLET, + CV_BOMB, + CV_ENEMY_BOMB, + CV_EXPLOSION, + CV_ENEMY, + CV_FURBALL, + CV_MINE, + CV_POWERUP_P, + CV_POWERUP_S, + CV_EXTRA_LIFE +}; + +struct FurnaceCVObject { + FurnaceCV* cv; + unsigned short type; + unsigned short spriteDef[512]; + unsigned char spriteWidth, spriteHeight; + bool dead; + short x, y; + unsigned char z, prio; + short collX0, collX1, collY0, collY1; + + virtual void collision(FurnaceCVObject* other); + virtual void tick(); + FurnaceCVObject(FurnaceCV* p): + cv(p), + type(0), + spriteWidth(2), + spriteHeight(2), + dead(false), + x(0), + y(0), + z(0), + prio(1), + collX0(0), + collX1(15), + collY0(0), + collY1(15) { + memset(spriteDef,0,512*sizeof(unsigned short)); + spriteDef[0]=4; + spriteDef[1]=5; + spriteDef[2]=36; + spriteDef[3]=37; + } + virtual ~FurnaceCVObject() { + } +}; + +void FurnaceCVObject::collision(FurnaceCVObject* other) { +} + +void FurnaceCVObject::tick() { +} + +struct FurnaceCVPlayer: FurnaceCVObject { + short subX, subY; + short speedX, speedY; + unsigned char shootDir; + unsigned char animFrame; + unsigned char invincible; + unsigned char shotTimer; + + void collision(FurnaceCVObject* other); + void tick(); + FurnaceCVPlayer(FurnaceCV* p): + FurnaceCVObject(p), + subX(0), + subY(0), + speedX(0), + speedY(0), + shootDir(2), + animFrame(0), + invincible(120), + shotTimer(4) { + type=CV_PLAYER; + spriteWidth=3; + spriteHeight=3; + spriteDef[0]=0x10; + spriteDef[1]=0x11; + spriteDef[2]=0x12; + spriteDef[3]=0x30; + spriteDef[4]=0x31; + spriteDef[5]=0x32; + spriteDef[6]=0x50; + spriteDef[7]=0x51; + spriteDef[8]=0x52; + collX0=0; + collX1=23; + collY0=0; + collY1=23; + } +}; + +struct FurnaceCVBullet: FurnaceCVObject { + short subX, subY; + short speedX, speedY; + unsigned char bulletType, orient, life; + + void killBullet(); + void setType(unsigned char t); + void collision(FurnaceCVObject* other); + void tick(); + FurnaceCVBullet(FurnaceCV* p): + FurnaceCVObject(p), + subX(0), + subY(0), + speedX(0), + speedY(0), + bulletType(0), + orient(0), + life(0) { + type=CV_BULLET; + spriteWidth=1; + spriteHeight=1; + spriteDef[0]=6; + collX0=2; + collX1=5; + collY0=2; + collY1=5; + } +}; + +struct FurnaceCVEnemyBullet: FurnaceCVObject { + short subX, subY; + short speedX, speedY; + unsigned char animFrame, bulletType; + + void setType(unsigned char type); + void tick(); + FurnaceCVEnemyBullet(FurnaceCV* p): + FurnaceCVObject(p), + subX(0), + subY(0), + speedX(0), + speedY(0), + animFrame(rand()&0xff), + bulletType(0) { + type=CV_ENEMY_BULLET; + spriteWidth=1; + spriteHeight=1; + spriteDef[0]=6; + collX0=2; + collX1=5; + collY0=2; + collY1=5; + } +}; + +struct FurnaceCVEnemy1: FurnaceCVObject { + unsigned char enemyType; + unsigned char health; + unsigned char orient; + unsigned char stopped; + unsigned char animFrame; + short nextTime, shootTime; + unsigned char shootCooldown; + + void collision(FurnaceCVObject* other); + + void tick(); + void setType(unsigned char type); + FurnaceCVEnemy1(FurnaceCV* p): + FurnaceCVObject(p), + enemyType(0), + health(1), + orient(rand()&3), + stopped(0), + animFrame(0), + nextTime(64+(rand()%600)), + shootTime(8), + shootCooldown(0) { + type=CV_ENEMY; + spriteDef[0]=0x200; + spriteDef[1]=0x201; + spriteDef[2]=0x220; + spriteDef[3]=0x221; + } +}; + +struct FurnaceCVEnemyVortex: FurnaceCVObject { + unsigned char stopped; + unsigned char animFrame; + short nextTime, shootTime, speedX, speedY; + + void collision(FurnaceCVObject* other); + + void tick(); + FurnaceCVEnemyVortex(FurnaceCV* p): + FurnaceCVObject(p), + stopped(0), + animFrame(0), + nextTime(4+(rand()%140)), + shootTime(360), + speedX((rand()%5)-2), + speedY((rand()%5)-2) { + type=CV_ENEMY; + spriteDef[0]=0x480; + spriteDef[1]=0x481; + spriteDef[2]=0x4a0; + spriteDef[3]=0x4a1; + } +}; + +struct FurnaceCVExplTiny: FurnaceCVObject { + unsigned char animFrame; + + void tick(); + FurnaceCVExplTiny(FurnaceCV* p): + FurnaceCVObject(p), + animFrame(0) { + type=CV_EXPLOSION; + spriteWidth=1; + spriteHeight=1; + spriteDef[0]=8; + } +}; + +struct FurnaceCVExplMedium: FurnaceCVObject { + unsigned char animFrame; + + void tick(); + FurnaceCVExplMedium(FurnaceCV* p): + FurnaceCVObject(p), + animFrame(0) { + type=CV_EXPLOSION; + spriteWidth=3; + spriteHeight=3; + spriteDef[0]=0x210; + spriteDef[1]=0x211; + spriteDef[2]=0x212; + spriteDef[3]=0x230; + spriteDef[4]=0x231; + spriteDef[5]=0x232; + spriteDef[6]=0x250; + spriteDef[7]=0x251; + spriteDef[8]=0x252; + } +}; + +struct FurnaceCVFurBallMedium: FurnaceCVObject { + unsigned char animFrame; + + void tick(); + FurnaceCVFurBallMedium(FurnaceCV* p): + FurnaceCVObject(p), + animFrame(0) { + type=CV_FURBALL; + spriteWidth=3; + spriteHeight=3; + spriteDef[0]=0x410; + spriteDef[1]=0x411; + spriteDef[2]=0x412; + spriteDef[3]=0x430; + spriteDef[4]=0x431; + spriteDef[5]=0x432; + spriteDef[6]=0x450; + spriteDef[7]=0x451; + spriteDef[8]=0x452; + } +}; + +struct FurnaceCVFurBallLarge: FurnaceCVObject { + unsigned char animFrame; + + void tick(); + FurnaceCVFurBallLarge(FurnaceCV* p): + FurnaceCVObject(p), + animFrame(0) { + type=CV_FURBALL; + spriteWidth=4; + spriteHeight=4; + spriteDef[0]=0x390; + spriteDef[1]=0x391; + spriteDef[2]=0x392; + spriteDef[3]=0x393; + spriteDef[4]=0x3b0; + spriteDef[5]=0x3b1; + spriteDef[6]=0x3b2; + spriteDef[7]=0x3b3; + spriteDef[8]=0x3d0; + spriteDef[9]=0x3d1; + spriteDef[10]=0x3d2; + spriteDef[11]=0x3d3; + spriteDef[12]=0x3f0; + spriteDef[13]=0x3f1; + spriteDef[14]=0x3f2; + spriteDef[15]=0x3f3; + } +}; + +struct FurnaceCVMine: FurnaceCVObject { + void collision(FurnaceCVObject* other); + FurnaceCVMine(FurnaceCV* p): + FurnaceCVObject(p) { + type=CV_MINE; + } +}; + +struct FurnaceCVPowerupP: FurnaceCVObject { + unsigned char life; + void collision(FurnaceCVObject* other); + void tick(); + FurnaceCVPowerupP(FurnaceCV* p): + FurnaceCVObject(p), + life(255) { + type=CV_POWERUP_P; + } +}; + +struct FurnaceCVPowerupS: FurnaceCVObject { + unsigned char life; + void collision(FurnaceCVObject* other); + void tick(); + FurnaceCVPowerupS(FurnaceCV* p): + FurnaceCVObject(p), + life(255) { + type=CV_POWERUP_S; + } +}; + +struct FurnaceCVExtraLife: FurnaceCVObject { + unsigned char life; + void collision(FurnaceCVObject* other); + void tick(); + FurnaceCVExtraLife(FurnaceCV* p): + FurnaceCVObject(p), + life(255) { + type=CV_EXTRA_LIFE; + } +}; + +struct FurnaceCV { + SDL_Surface* surface; + unsigned char* prioBuf; + DivEngine* e; + unsigned char* tileData; + + // state + unsigned short* curStage; + int stageWidth, stageHeight; + + const char* typeAddr; + unsigned char typeDelay; + int typeX, typeY; + int typeXStart, typeYStart; + int typeXEnd, typeYEnd; + + int textWait, curText, transWait; + int ticksToInit; + + bool inGame, inTransition, newHiScore, playSongs, pleaseInitSongs; + unsigned char lives, respawnTime, stage, shotType; + int score; + int hiScore; + short lastPlayerX, lastPlayerY; + short fxChanBase, fxInsBase; + + // graphics + unsigned short tile0[56][80]; + unsigned short tile1[56][80]; + unsigned short scrollX[2]; + unsigned short scrollY[2]; + unsigned char bgColor; + std::vector sprite; + // this offset is applied to sprites. + int viewX, viewY; + + // input + unsigned char joyInputPrev; + unsigned char joyPressed; + unsigned char joyReleased; + unsigned char joyInput; + + template T* createObject(short x=0, short y=0); + void buildStage(int which); + + void putText(int fontBase, bool fontHeight, String text, int x, int y); + + void startTyping(const char* text, int x, int y); + + void soundEffect(int ins, int chan, int note); + void stopSoundEffect(int ins, int chan, int note); + + void addScore(int amount); + + void typeTick(); + + void rasterH(int scanline); + void render(unsigned char joyIn); + void tileDataRead(struct GIF_WHDR* data); + void loadInstruments(); + bool init(DivEngine* eng); + void unload(); + + FurnaceCV(): + surface(NULL), + e(NULL), + tileData(NULL), + curStage(NULL), + stageWidth(0), + stageHeight(0), + typeAddr(NULL), + typeDelay(0), + typeX(0), + typeY(0), + typeXStart(0), + typeYStart(0), + typeXEnd(39), + typeYEnd(27), + textWait(60), + curText(0), + transWait(0), + ticksToInit(2), + inGame(false), + inTransition(false), + newHiScore(false), + playSongs(true), + pleaseInitSongs(false), + lives(3), + respawnTime(0), + stage(0), + shotType(0), + score(0), + hiScore(25000), + lastPlayerX(0), + lastPlayerY(0), + fxChanBase(-1), + fxInsBase(-1), + bgColor(0), + viewX(0), + viewY(0), + joyInputPrev(0), + joyPressed(0), + joyReleased(0), + joyInput(0) { + memset(tile0,0,80*56*sizeof(short)); + memset(tile1,0,80*56*sizeof(short)); + + scrollX[0]=0; + scrollX[1]=0; + scrollY[0]=0; + scrollY[1]=0; + } +}; + +static const char* cvText[]={ + // intro + "Play demo songs?\n" + "- Down: no\n" + "- Up: yes", + + "Well, well, well. You wanna\n" + "enable Serious Mode, right?\n", + + "Sure, if you can beat the\n" + "high score in this boring game.\n", + + "A. D. 2xxx\n" + "April 1st\n", + + "The plot is left\n" + "as an exercise for the player.", + + "GAME OVER", + + "Conglaturation!\n" + "\n" + "With high score beat, it\n" + "enables Serious Mode.\n" + "The User is now peace.", + + "Restart Furnace to apply\n" + "changes.", + + "Restart Furnace to apply\n" + "changes.", + + "Restart Furnace to apply\n" + "changes.", + + "Restart Furnace to apply\n" + "changes.", + + "Restart Furnace to apply\n" + "changes.", + + "Never gonna give STOP posting\n" + "about Rick Astley", + + "I'M TIRED OF SEEING IT", + + "My friends on TikTok rickroll\n" + "me", + + "On Discord's fucking rickroll", + + "I was in a server. Right?", + + "And AAAAALLL of the channels\n" + "are just Never Gonna Give You Up.", + + "I've searched for Half-Life 3\n" + "and the video I watched it and\n" + "I said: Hey Babe, Never Gonna\n" + "Give You Up HAHA", + + "Diiiiiiiing Diiiiiiiiiiiing\n" + "Diiing Diiiiiiing Diiiiiiiiiing\n" + "Didididiiiiiiiing", + + "I fucking looked at the DefleMask\n" + "1.2 teaser trailer and I said\n" + "That's a rickroll", + + "I've looked at my [REDACTED],\n" + "I think of the scientist and I go\n" + "[REDACTED], more like never gonna\n" + "[REDACTED] up\n", + + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + + // this is totally intentional. do not attempt to fix it. + (const char*)1 +}; + void FurnaceGUI::initTutorial() { tutorials[GUI_TUTORIAL_OVERVIEW]=FurnaceGUITutorialDef("Overview",{ TS( @@ -242,6 +777,137 @@ void FurnaceGUI::activateTutorial(FurnaceGUITutorials which) { */ } +void FurnaceGUI::initRandomDemoSong() { + std::vector subDirs; +#if !defined(IS_MOBILE) && defined(FURNACE_DATADIR) && defined(SHOW_OPEN_ASSETS_MENU_ENTRY) + String demoPath=FURNACE_DATADIR; + demoPath+=DIR_SEPARATOR_STR; + demoPath+="demos"; +#else +#ifdef IS_MOBILE + String demoPath="/storage/emulated/0/demos"; +#else + String demoPath="demos"; +#endif +#endif + + logW("searching for demos in %s...",demoPath); + +#ifdef _WIN32 + WIN32_FIND_DATAW de; + demoPath+=DIR_SEPARATOR_STR; + HANDLE d=FindFirstFileW(utf8To16(demoPath.c_str()).c_str(),&de); + if (d==INVALID_HANDLE_VALUE) { + demoPath=".."; + demoPath+=DIR_SEPARATOR_STR; + demoPath+="demos"; + demoPath+=DIR_SEPARATOR_STR; + logW("OH NO"); + HANDLE d=FindFirstFileW(utf8To16(demoPath.c_str()).c_str(),&de); + if (d==INVALID_HANDLE_VALUE) { + logW("dang it"); + return; + } + } + do { + String u8Name=utf16To8(de.cFileName); + if (u8Name==".") continue; + if (u8Name=="..") continue; + if (de.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) { + String newPath=demoPath; + newPath+=DIR_SEPARATOR_STR; + newPath+=u8Name; + logW("adding subdir %s",newPath); + subDirs.push_back(newPath); + } else if (strstr(u8Name.c_str(),".fur")!=NULL) { + String newPath=demoPath; + newPath+=DIR_SEPARATOR_STR; + newPath+=u8Name; + randomDemoSong.push_back(newPath); + } + } while (FindNextFileW(d,&de)!=0); + FindClose(d); +#else + DIR* d=opendir(demoPath.c_str()); + if (d==NULL) { + demoPath=".."; + demoPath+=DIR_SEPARATOR_STR; + demoPath+="demos"; + logW("OH NO"); + d=opendir(demoPath.c_str()); + if (d==NULL) { + logW("dang it"); + return; + } + } + + struct dirent* de=NULL; + while (true) { + de=readdir(d); + if (de==NULL) break; + if (strcmp(de->d_name,".")==0) continue; + if (strcmp(de->d_name,"..")==0) continue; + if (de->d_type==DT_DIR) { + String newPath=demoPath; + newPath+=DIR_SEPARATOR_STR; + newPath+=de->d_name; + logW("adding subdir %s",newPath); + subDirs.push_back(newPath); + } else if (de->d_type==DT_REG && strstr(de->d_name,".fur")!=NULL) { + String newPath=demoPath; + newPath+=DIR_SEPARATOR_STR; + newPath+=de->d_name; + randomDemoSong.push_back(newPath); + } + } + closedir(d); +#endif + + for (String& i: subDirs) { +#ifdef _WIN32 + WIN32_FIND_DATAW de1; + i+=DIR_SEPARATOR_STR; + i+="*.fur"; + HANDLE d1=FindFirstFileW(utf8To16(i.c_str()).c_str(),&de1); + if (d1==INVALID_HANDLE_VALUE) continue; + do { + String u8Name=utf16To8(de.cFileName); + String newPath=demoPath; + newPath+=DIR_SEPARATOR_STR; + newPath+=u8Name; + randomDemoSong.push_back(newPath); + } while (FindNextFileW(d,&de)!=0); + FindClose(d1); +#else + DIR* d1=opendir(i.c_str()); + if (d1==NULL) continue; + + struct dirent* de1=NULL; + while (true) { + de1=readdir(d1); + if (de1==NULL) break; + if (strcmp(de1->d_name,".")==0) continue; + if (strcmp(de1->d_name,"..")==0) continue; + if (de1->d_type==DT_REG && strstr(de1->d_name,".fur")!=NULL) { + String newPath=i; + newPath+=DIR_SEPARATOR_STR; + newPath+=de1->d_name; + randomDemoSong.push_back(newPath); + } + } + closedir(d1); +#endif + } +} + +bool FurnaceGUI::loadRandomDemoSong() { + if (randomDemoSong.empty()) return false; + String which=randomDemoSong[rand()%randomDemoSong.size()]; + logW("RDS LOAD... %s",which); + load(which); + return true; +} + void FurnaceGUI::drawTutorial() { // welcome if (!tutorial.protoWelcome) { @@ -359,6 +1025,205 @@ void FurnaceGUI::drawTutorial() { } ImGui::End(); } + + if (cvOpen) { + ImGui::SetNextWindowPos(ImVec2(0,0)); + ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH)); + if (ImGui::Begin("Combat Vehicle",&cvOpen,ImGuiWindowFlags_NoDocking|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_Modal|ImGuiWindowFlags_NoTitleBar)) { + ImVec2 dpadLoc=ImVec2(canvasW*0.25,canvasH*0.85); + ImVec2 buttonLoc=ImVec2(canvasW*0.75,canvasH*0.85); + float oneUnit=canvasW*0.15; + + ImVec2 dpadUpStart=ImVec2( + dpadLoc.x-oneUnit*1.5, + dpadLoc.y-oneUnit*1.5 + ); + ImVec2 dpadUpEnd=ImVec2( + dpadLoc.x+oneUnit*1.5, + dpadLoc.y-oneUnit*0.5 + ); + ImVec2 dpadLeftEnd=ImVec2( + dpadLoc.x-oneUnit*0.5, + dpadLoc.y+oneUnit*1.5 + ); + ImVec2 dpadDownStart=ImVec2( + dpadLoc.x-oneUnit*1.5, + dpadLoc.y+oneUnit*0.5 + ); + ImVec2 dpadDownEnd=ImVec2( + dpadLoc.x+oneUnit*1.5, + dpadLoc.y+oneUnit*1.5 + ); + ImVec2 dpadRightStart=ImVec2( + dpadLoc.x+oneUnit*0.5, + dpadLoc.y-oneUnit*1.5 + ); + + ImVec2 buttonBStart=ImVec2( + buttonLoc.x-oneUnit*1.25, + buttonLoc.y-oneUnit*0.5 + ); + ImVec2 buttonBEnd=ImVec2( + buttonLoc.x-oneUnit*0.25, + buttonLoc.y+oneUnit*0.5 + ); + ImVec2 buttonAStart=ImVec2( + buttonLoc.x+oneUnit*0.25, + buttonLoc.y-oneUnit*0.5 + ); + ImVec2 buttonAEnd=ImVec2( + buttonLoc.x+oneUnit*1.25, + buttonLoc.y+oneUnit*0.5 + ); + + unsigned char touchControls=0; + + if (mobileUI) { + for (TouchPoint& i: activePoints) { + // B + if (i.x>=buttonBStart.x && i.y>=buttonBStart.y && + i.x<=buttonBEnd.x && i.y<=buttonBEnd.y) { + touchControls|=1; + } + // A + if (i.x>=buttonAStart.x && i.y>=buttonAStart.y && + i.x<=buttonAEnd.x && i.y<=buttonAEnd.y) { + touchControls|=2; + } + // up + if (i.x>=dpadUpStart.x && i.y>=dpadUpStart.y && + i.x<=dpadUpEnd.x && i.y<=dpadUpEnd.y) { + touchControls|=16; + } + // down + if (i.x>=dpadDownStart.x && i.y>=dpadDownStart.y && + i.x<=dpadDownEnd.x && i.y<=dpadDownEnd.y) { + touchControls|=32; + } + // left + if (i.x>=dpadUpStart.x && i.y>=dpadUpStart.y && + i.x<=dpadLeftEnd.x && i.y<=dpadLeftEnd.y) { + touchControls|=64; + } + // right + if (i.x>=dpadRightStart.x && i.y>=dpadRightStart.y && + i.x<=dpadDownEnd.x && i.y<=dpadDownEnd.y) { + touchControls|=128; + } + } + } + + if (cv==NULL) { + initRandomDemoSong(); + cv=new FurnaceCV; + cv->init(e); + cv->hiScore=cvHiScore; + e->setNumTimesPlayed(-1); + shaderEditor=false; + } + if (cvTex==NULL) { + cvTex=rend->createTexture(true,320,224,false); + } + + if (cv->pleaseInitSongs) { + cv->pleaseInitSongs=false; + if (cv->playSongs) { + if (loadRandomDemoSong()) { + cv->loadInstruments(); + } + } + } + + WAKE_UP; + + if (cv->inTransition && cv->transWait==1) { + // load random demo song + if (cv->playSongs) { + if (loadRandomDemoSong()) { + cv->loadInstruments(); + e->changeSongP(0); + e->setOrder(0); + e->play(); + } + } + } + + cv->render(touchControls); + + if (cv->hiScore>cvHiScore) { + cvHiScore=cv->hiScore; + } + + if (cvTex!=NULL) { + SDL_LockSurface(cv->surface); + rend->updateTexture(cvTex,cv->surface->pixels,320*4); + SDL_UnlockSurface(cv->surface); + + ImDrawList* dl=ImGui::GetForegroundDrawList(); + + ImVec2 p0, p1; + + if (((double)canvasH/(double)canvasW)>0.7) { + if (mobileUI) { + p0=ImVec2(0.0,0.0); + p1=ImVec2(canvasW,canvasW*0.7); + } else { + p0=ImVec2(0.0,(canvasH-(canvasW*0.7))*0.5); + p1=ImVec2(canvasW,canvasW*0.7+(canvasH-(canvasW*0.7))*0.5); + } + } else { + p0=ImVec2((canvasW-(canvasH/0.7))*0.5,0.0); + p1=ImVec2((canvasH/0.7)+(canvasW-(canvasH/0.7))*0.5,canvasH); + } + + dl->AddRectFilled(ImVec2(0,0),ImVec2(canvasW,canvasH),0xff000000); + + dl->AddImage(rend->getTextureID(cvTex),p0,p1); + + if (mobileUI) { + dl->AddRect(dpadUpStart,dpadUpEnd,0xff0000ff,0,0,dpiScale); + dl->AddRect(dpadUpStart,dpadLeftEnd,0xff00ffff,0,0,dpiScale); + dl->AddRect(dpadDownStart,dpadDownEnd,0xff00ff00,0,0,dpiScale); + dl->AddRect(dpadRightStart,dpadDownEnd,0xffff0000,0,0,dpiScale); + + dl->AddRect(buttonBStart,buttonBEnd,0xffffff00,0,0,dpiScale); + dl->AddRect(buttonAStart,buttonAEnd,0xffff00ff,0,0,dpiScale); + } + } + } + ImGui::End(); + + if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { + time_t timet=time(NULL); + struct tm* curtm=localtime(&timet); + if (curtm!=NULL) { + if (curtm->tm_mon==3 && curtm->tm_mday==1) { + if (cvHiScore>25000) { + if (cv!=NULL) { + cv->unload(); + delete cv; + cv=NULL; + } + cvOpen=false; + } + } else { + if (cv!=NULL) { + cv->unload(); + delete cv; + cv=NULL; + } + cvOpen=false; + } + } else { + if (cv!=NULL) { + cv->unload(); + delete cv; + cv=NULL; + } + cvOpen=false; + } + } + } } // helper functions @@ -410,3 +1275,1996 @@ FurnaceGUITutorialDef::FurnaceGUITutorialDef(const char* n, std::initializer_lis name(n) { steps=step; } + +// CV +// 320x224 + +// renderer details: +// two 80x56 tile planes (40x28 is visible) +// 256 colors +// 4096 tiles (image is 256-color, 256x1024) +// each tile is 8x8 + +static const unsigned char cvPalette[1024]={ + 0x00, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, 0x00, 0xa7, 0x00, 0xff, + 0xe5, 0x93, 0x00, 0xff, 0x00, 0x00, 0xa6, 0xff, 0x77, 0x00, 0x97, 0xff, + 0x12, 0x81, 0xb1, 0xff, 0xbe, 0xbe, 0xbe, 0xff, 0x51, 0x51, 0x51, 0xff, + 0xfc, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x1d, 0xff, + 0x00, 0x00, 0xfa, 0xff, 0xff, 0x00, 0xff, 0xff, 0x1f, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x67, 0xff, + 0x04, 0x00, 0x89, 0xff, 0x00, 0x03, 0xab, 0xff, 0x00, 0x00, 0xdc, 0xff, + 0x04, 0x00, 0xfe, 0xff, 0x00, 0x63, 0x00, 0xff, 0x00, 0x5f, 0x5f, 0xff, + 0x01, 0x62, 0x85, 0xff, 0x05, 0x5d, 0xb6, 0xff, 0x00, 0x61, 0xd9, 0xff, + 0x02, 0x5f, 0xfb, 0xff, 0x00, 0x8a, 0x06, 0xff, 0x00, 0x8a, 0x59, 0xff, + 0x00, 0x85, 0x8a, 0xff, 0x06, 0x87, 0xb1, 0xff, 0x00, 0x8b, 0xd3, 0xff, + 0x02, 0x87, 0xff, 0xff, 0x00, 0xb0, 0x00, 0xff, 0x00, 0xb1, 0x62, 0xff, + 0x00, 0xaf, 0x84, 0xff, 0x02, 0xad, 0xa7, 0xff, 0x00, 0xaf, 0xd8, 0xff, + 0x02, 0xb1, 0xfe, 0xff, 0x00, 0xd8, 0x05, 0xff, 0x00, 0xdb, 0x5c, 0xff, + 0x00, 0xd7, 0x8e, 0xff, 0x03, 0xd5, 0xb0, 0xff, 0x00, 0xd9, 0xd2, 0xff, + 0x00, 0xd4, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x66, 0xff, + 0x00, 0xff, 0x88, 0xff, 0x03, 0xff, 0xaa, 0xff, 0x00, 0xff, 0xdb, 0xff, + 0x00, 0xff, 0xfd, 0xff, 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x65, 0xff, + 0x5c, 0x03, 0x87, 0xff, 0x60, 0x01, 0xa9, 0xff, 0x64, 0x00, 0xda, 0xff, + 0x5c, 0x00, 0xfc, 0xff, 0x61, 0x60, 0x00, 0xff, 0x5d, 0x5d, 0x5d, 0xff, + 0x65, 0x5f, 0x83, 0xff, 0x5d, 0x61, 0xb5, 0xff, 0x61, 0x5f, 0xd7, 0xff, + 0x59, 0x63, 0xf9, 0xff, 0x61, 0x88, 0x04, 0xff, 0x5e, 0x87, 0x57, 0xff, + 0x62, 0x83, 0x88, 0xff, 0x5e, 0x8b, 0xaf, 0xff, 0x62, 0x86, 0xe0, 0xff, + 0x5a, 0x8a, 0xff, 0xff, 0x5e, 0xae, 0x00, 0xff, 0x5e, 0xaf, 0x60, 0xff, + 0x62, 0xad, 0x83, 0xff, 0x5a, 0xae, 0xb4, 0xff, 0x5e, 0xac, 0xd6, 0xff, + 0x5a, 0xb5, 0xfc, 0xff, 0x5e, 0xd5, 0x03, 0xff, 0x5e, 0xd9, 0x5b, 0xff, + 0x62, 0xd4, 0x8c, 0xff, 0x5b, 0xd9, 0xae, 0xff, 0x5f, 0xd7, 0xd0, 0xff, + 0x63, 0xd2, 0xff, 0xff, 0x5f, 0xff, 0x00, 0xff, 0x5f, 0xff, 0x64, 0xff, + 0x63, 0xff, 0x86, 0xff, 0x5b, 0xff, 0xa8, 0xff, 0x5f, 0xfe, 0xd9, 0xff, + 0x63, 0xfc, 0xfc, 0xff, 0x88, 0x01, 0x00, 0xff, 0x88, 0x01, 0x62, 0xff, + 0x8c, 0x00, 0x84, 0xff, 0x84, 0x01, 0xb5, 0xff, 0x88, 0x00, 0xd7, 0xff, + 0x8c, 0x00, 0xfa, 0xff, 0x85, 0x60, 0x07, 0xff, 0x81, 0x60, 0x5a, 0xff, + 0x89, 0x5f, 0x8f, 0xff, 0x8d, 0x5e, 0xb2, 0xff, 0x85, 0x62, 0xd4, 0xff, + 0x89, 0x5d, 0xff, 0xff, 0x85, 0x8b, 0x01, 0xff, 0x82, 0x87, 0x63, 0xff, + 0x86, 0x86, 0x86, 0xff, 0x8a, 0x84, 0xa8, 0xff, 0x86, 0x89, 0xdd, 0xff, + 0x8a, 0x87, 0xff, 0xff, 0x82, 0xb1, 0x00, 0xff, 0x82, 0xb2, 0x5e, 0xff, + 0x86, 0xb0, 0x80, 0xff, 0x8a, 0xab, 0xb1, 0xff, 0x82, 0xaf, 0xd3, 0xff, + 0x8a, 0xaf, 0xff, 0xff, 0x82, 0xd8, 0x00, 0xff, 0x82, 0xdc, 0x58, 0xff, + 0x86, 0xd7, 0x89, 0xff, 0x8b, 0xd5, 0xab, 0xff, 0x83, 0xd7, 0xdc, 0xff, + 0x87, 0xd5, 0xff, 0xff, 0x83, 0xff, 0x00, 0xff, 0x83, 0xff, 0x61, 0xff, + 0x87, 0xff, 0x83, 0xff, 0x8b, 0xfd, 0xb4, 0xff, 0x83, 0xff, 0xd7, 0xff, + 0x87, 0xff, 0xf9, 0xff, 0xac, 0x01, 0x07, 0xff, 0xac, 0x04, 0x5f, 0xff, + 0xb0, 0x02, 0x81, 0xff, 0xb4, 0x00, 0xb2, 0xff, 0xac, 0x02, 0xd4, 0xff, + 0xb0, 0x00, 0xff, 0xff, 0xb5, 0x5d, 0x04, 0xff, 0xb1, 0x5d, 0x57, 0xff, + 0xad, 0x62, 0x8d, 0xff, 0xb1, 0x60, 0xaf, 0xff, 0xb5, 0x5c, 0xe0, 0xff, + 0xad, 0x60, 0xff, 0xff, 0xb5, 0x88, 0x00, 0xff, 0xb1, 0x84, 0x60, 0xff, + 0xaa, 0x88, 0x83, 0xff, 0xae, 0x84, 0xb4, 0xff, 0xb6, 0x86, 0xda, 0xff, + 0xae, 0x8a, 0xfc, 0xff, 0xb2, 0xab, 0x03, 0xff, 0xb2, 0xaf, 0x5b, 0xff, + 0xaa, 0xb0, 0x8c, 0xff, 0xae, 0xae, 0xae, 0xff, 0xb2, 0xac, 0xd0, 0xff, + 0xaa, 0xae, 0xff, 0xff, 0xb2, 0xd5, 0x00, 0xff, 0xb2, 0xd6, 0x64, 0xff, + 0xaa, 0xda, 0x86, 0xff, 0xae, 0xd8, 0xa8, 0xff, 0xb3, 0xd4, 0xd9, 0xff, + 0xab, 0xd8, 0xfc, 0xff, 0xb3, 0xff, 0x00, 0xff, 0xb3, 0xff, 0x5e, 0xff, + 0xab, 0xff, 0x80, 0xff, 0xaf, 0xff, 0xb1, 0xff, 0xb3, 0xfe, 0xd4, 0xff, + 0xab, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x05, 0xff, 0xdc, 0x01, 0x5c, 0xff, + 0xd4, 0x02, 0x8d, 0xff, 0xd8, 0x01, 0xaf, 0xff, 0xdc, 0x00, 0xd2, 0xff, + 0xd4, 0x00, 0xff, 0xff, 0xd9, 0x60, 0x01, 0xff, 0xd5, 0x5d, 0x63, 0xff, + 0xd9, 0x5b, 0x86, 0xff, 0xd5, 0x63, 0xac, 0xff, 0xd9, 0x5f, 0xdd, 0xff, + 0xdd, 0x5d, 0xff, 0xff, 0xd5, 0x86, 0x00, 0xff, 0xd5, 0x87, 0x5e, 0xff, + 0xd9, 0x85, 0x80, 0xff, 0xd2, 0x87, 0xb1, 0xff, 0xda, 0x89, 0xd7, 0xff, + 0xde, 0x84, 0xff, 0xff, 0xd6, 0xae, 0x00, 0xff, 0xd6, 0xb1, 0x58, 0xff, + 0xda, 0xad, 0x89, 0xff, 0xd2, 0xb1, 0xab, 0xff, 0xd6, 0xac, 0xdc, 0xff, + 0xda, 0xaa, 0xff, 0xff, 0xd6, 0xd8, 0x00, 0xff, 0xd6, 0xd9, 0x61, 0xff, + 0xda, 0xd7, 0x83, 0xff, 0xd2, 0xd8, 0xb4, 0xff, 0xd7, 0xd7, 0xd7, 0xff, + 0xdb, 0xd5, 0xf9, 0xff, 0xd7, 0xff, 0x04, 0xff, 0xd7, 0xff, 0x5b, 0xff, + 0xdb, 0xfe, 0x8c, 0xff, 0xd3, 0xff, 0xaf, 0xff, 0xd7, 0xff, 0xd1, 0xff, + 0xdb, 0xfc, 0xff, 0xff, 0xff, 0x00, 0x02, 0xff, 0xff, 0x01, 0x68, 0xff, + 0xff, 0x00, 0x8a, 0xff, 0xfc, 0x04, 0xac, 0xff, 0xff, 0x00, 0xde, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xfd, 0x63, 0x00, 0xff, 0xf9, 0x60, 0x60, 0xff, + 0xfd, 0x5e, 0x83, 0xff, 0xff, 0x5d, 0xb8, 0xff, 0xfd, 0x62, 0xda, 0xff, + 0xff, 0x60, 0xfc, 0xff, 0xf9, 0x86, 0x03, 0xff, 0xf9, 0x8a, 0x5b, 0xff, + 0xfd, 0x85, 0x8c, 0xff, 0xff, 0x84, 0xae, 0xff, 0xfa, 0x88, 0xd0, 0xff, + 0xff, 0x87, 0xff, 0xff, 0xfa, 0xb1, 0x00, 0xff, 0xff, 0xab, 0x64, 0xff, + 0xfe, 0xb0, 0x86, 0xff, 0xff, 0xae, 0xa8, 0xff, 0xfa, 0xaf, 0xd9, 0xff, + 0xfe, 0xad, 0xfc, 0xff, 0xfa, 0xdb, 0x00, 0xff, 0xff, 0xd6, 0x5e, 0xff, + 0xfe, 0xda, 0x80, 0xff, 0xff, 0xd5, 0xb1, 0xff, 0xfb, 0xd9, 0xd4, 0xff, + 0xff, 0xd5, 0xff, 0xff, 0xfb, 0xff, 0x01, 0xff, 0xff, 0xf9, 0x63, 0xff, + 0xff, 0xff, 0x89, 0xff, 0xff, 0xff, 0xac, 0xff, 0xfb, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x04, 0x04, 0x04, 0xff, 0x0c, 0x0c, 0x0c, 0xff, + 0x18, 0x18, 0x18, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2d, 0x2d, 0x2d, 0xff, + 0x35, 0x35, 0x35, 0xff, 0x41, 0x41, 0x41, 0xff, 0x49, 0x49, 0x49, 0xff, + 0x55, 0x55, 0x55, 0xff, 0x61, 0x61, 0x61, 0xff, 0x69, 0x69, 0x69, 0xff, + 0x71, 0x71, 0x71, 0xff, 0x7d, 0x7d, 0x7d, 0xff, 0x8a, 0x8a, 0x8a, 0xff, + 0x92, 0x92, 0x92, 0xff, 0x9a, 0x9a, 0x9a, 0xff, 0xa6, 0xa6, 0xa6, 0xff, + 0xb2, 0xb2, 0xb2, 0xff, 0xba, 0xba, 0xba, 0xff, 0xc2, 0xc2, 0xc2, 0xff, + 0xce, 0xce, 0xce, 0xff, 0xdb, 0xdb, 0xdb, 0xff, 0xe3, 0xe3, 0xe3, 0xff, + 0xeb, 0xeb, 0xeb, 0xff +}; + +#include "tileData.h" + +#define SE_SHOT1 0, 0, 48 +#define SE_EXPL1 1, 1, 67 +#define SE_PICKUP1 2, 2, 67 +#define SE_PICKUP2 3, 2, 69 +#define SE_DEATH_C1 4, 0, 48 +#define SE_DEATH_C2 5, 1, 48 +#define SE_SHOT2 6, 0, 48 +#define SE_TYPEWRITER 7, 0, 48 +#define SE_TRANSITION1 8, 2, 43 +#define SE_TRANSITION2 9, 2, 48 +#define SE_INIT 10, 2, 48 +#define SE_RESPAWN 11, 2, 48 +#define SE_TANKMOVE 12, 3, 48 +#define SE_VORTEXMOVE 13, 3, 55 +#define SE_VORTEXSHOOT 14, 3, 48 +#define SE_RESIST 15, 1, 48 + +template T* FurnaceCV::createObject(short x, short y) { + T* ret=new T(this); + ret->x=x; + ret->y=y; + sprite.push_back(ret); + return ret; +} + +void FurnaceCV::soundEffect(int ins, int chan, int note) { + e->noteOn(chan+fxChanBase,ins+fxInsBase,note); + /* + e->dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,chan,ins,1)); + e->dispatchCmd(DivCommand(DIV_CMD_NOTE_ON,chan,note)); + */ +} + +void FurnaceCV::stopSoundEffect(int ins, int chan, int note) { + e->noteOff(chan+fxChanBase); + //e->dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,chan)); +} + +static const int floorBases[4]={ + 0x40, 0x48, 0x60, 0x68 +}; + +void FurnaceCV::buildStage(int which) { + if (curStage!=NULL) { + delete[] curStage; + curStage=NULL; + } + + curStage=new unsigned short[80*56]; + stageWidth=80; + stageHeight=56; + + int floorBase=floorBases[rand()&3]; + + for (int i=0; i>2); i++) { + int tries=0; + while (tries<20) { + int x=rand()%40; + int y=rand()%28; + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + createObject(finalX,finalY); + createObject(finalX-4,finalY-4); + busy[y][x]=true; + break; + } + } + } else if ((which%10)==19) { + for (int i=0; i<20+(which>>2); i++) { + int tries=0; + while (tries<20) { + int x=(rand()%40)&(~1); + int y=(rand()%28)&(~1); + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + FurnaceCVEnemy1* enemy=createObject(finalX,finalY); + createObject(finalX-4,finalY-4); + enemy->setType(3); + busy[y][x]=true; + busy[y][x+1]=true; + busy[y+1][x]=true; + busy[y+1][x+1]=true; + break; + } + } + } else { + // large + if (which>=2) for (int i=0; i<(rand()%3)+which-2; i++) { + int tries=0; + while (tries<20) { + int x=(rand()%40)&(~1); + int y=(rand()%28)&(~1); + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + FurnaceCVEnemy1* enemy=createObject(finalX,finalY); + createObject(finalX-4,finalY-4); + enemy->setType(2); + if (which>7) { + enemy->setType((rand()%MAX(1,15-which))==0?3:2); + } + busy[y][x]=true; + busy[y][x+1]=true; + busy[y+1][x]=true; + busy[y+1][x+1]=true; + break; + } + } + + // vortex + if (which>=4) for (int i=0; i<(rand()%(1+which))+(which>>1); i++) { + int tries=0; + while (tries<20) { + int x=rand()%40; + int y=rand()%28; + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + createObject(finalX,finalY); + createObject(finalX-4,finalY-4); + busy[y][x]=true; + break; + } + } + + // small + for (int i=0; i<7+(rand()%4)+((which&3)<<2)+(which>>1); i++) { + int tries=0; + while (tries<20) { + int x=rand()%40; + int y=rand()%28; + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + FurnaceCVEnemy1* enemy=createObject(finalX,finalY); + createObject(finalX-4,finalY-4); + if (which>0) { + enemy->setType((rand()%MAX(1,8-which))==0?1:0); + } + busy[y][x]=true; + break; + } + } + + // mines + for (int i=0; i<7+(rand()%18); i++) { + int tries=0; + while (tries<20) { + int x=rand()%40; + int y=rand()%28; + int finalX=x<<4; + int finalY=y<<4; + if (busy[y][x]) { + tries++; + continue; + } + createObject(finalX,finalY); + busy[y][x]=true; + break; + } + } + } +} + +#define CV_FONTBASE_8x8 0x250 +#define CV_FONTBASE_8x8_RED 0x2d0 +#define CV_FONTBASE_8x16 0x0 + +void FurnaceCV::putText(int fontBase, bool fontHeight, String text, int x, int y) { + int initX=x; + for (const char* i=text.c_str(); *i; i++) { + if (*i=='\n') { + x=initX; + y+=fontHeight?2:1; + continue; + } + if (y>=28) break; + tile1[y][x]=fontBase+((*i)&15)+(((*i)&(~15))<<(fontHeight?2:1)); + if (fontHeight) { + tile1[y+1][x]=fontBase+((*i)&15)+32+(((*i)&(~15))<<(fontHeight?2:1)); + } + x++; + if (x>=40) { + x=initX; + y+=fontHeight?2:1; + } + } +} + +void FurnaceCV::startTyping(const char* text, int x, int y) { + typeAddr=text; + typeX=x; + typeY=y; + typeXStart=x; + typeYStart=y; + typeDelay=1; + soundEffect(SE_TYPEWRITER); +} + +void FurnaceCV::typeTick() { + if (typeAddr==NULL) return; + + unsigned char typeChar=(unsigned char)(*typeAddr); + + if (typeChar<0x20 || typeChar>=0x80) { + switch (typeChar) { + case '\n': + typeX=typeXStart; + typeY+=2; + if (typeY>=typeYEnd) typeY=typeYEnd; + break; + } + } else { + tile1[typeY][typeX]=(typeChar&15)|((typeChar&(~15))<<2); + tile1[typeY+1][typeX]=32|((typeChar&15)|((typeChar&(~15))<<2)); + + if (++typeX>typeXEnd) { + typeX=typeXStart; + typeY+=2; + + if (typeY>=typeYEnd) typeY=typeYEnd; + } + } + + if (*(++typeAddr)==0) { + typeAddr=NULL; + stopSoundEffect(SE_TYPEWRITER); + } +} + +void FurnaceCV::rasterH(int scanline) { + +} + +void FurnaceCV::render(unsigned char joyIn) { + // input + joyInputPrev=joyInput; + joyInput=joyIn; + joyInput|=( + (ImGui::IsKeyDown(ImGuiKey_X)?1:0)| + (ImGui::IsKeyDown(ImGuiKey_Z)?2:0)| + (ImGui::IsKeyDown(ImGuiKey_RightShift)?4:0)| + (ImGui::IsKeyDown(ImGuiKey_Enter)?8:0)| + (ImGui::IsKeyDown(ImGuiKey_UpArrow)?16:0)| + (ImGui::IsKeyDown(ImGuiKey_DownArrow)?32:0)| + (ImGui::IsKeyDown(ImGuiKey_LeftArrow)?64:0)| + (ImGui::IsKeyDown(ImGuiKey_RightArrow)?128:0) + ); + joyPressed=(joyInputPrev^0xff)&joyInput; + joyReleased=(joyInput^0xff)&joyInputPrev; + + // logic + typeTick(); + + int enemyCount=0; + + for (size_t i=0; ix+sprite[i]->collX0; + const short s_x1=sprite[i]->x+sprite[i]->collX1; + const short s_y0=sprite[i]->y+sprite[i]->collY0; + const short s_y1=sprite[i]->y+sprite[i]->collY1; + const short d_x0=sprite[j]->x+sprite[j]->collX0; + const short d_x1=sprite[j]->x+sprite[j]->collX1; + const short d_y0=sprite[j]->y+sprite[j]->collY0; + const short d_y1=sprite[j]->y+sprite[j]->collY1; + if (d_y0s_y0 && d_x0s_x0) { + sprite[i]->collision(sprite[j]); + sprite[j]->collision(sprite[i]); + } + } + sprite[i]->tick(); + if (sprite[i]->dead) { + delete sprite[i]; + sprite.erase(sprite.begin()+i); + i--; + } + } + + if (inGame) { + if (ticksToInit>0) { + if (--ticksToInit<1) { + e->changeSongP(0); + e->setOrder(0); + e->play(); + buildStage(stage); + createObject(160,112); + createObject(160-4,112-4); + soundEffect(SE_INIT); + } + } else { + bool hasEnemy=false; + for (FurnaceCVObject* i: sprite) { + if (i->type==CV_ENEMY) { + hasEnemy=true; + enemyCount++; + } + } + if (!hasEnemy) { + inTransition=true; + inGame=false; + transWait=100; + soundEffect(SE_TRANSITION1); + stopSoundEffect(0,0,0); + stopSoundEffect(0,3,0); + respawnTime=0; + for (FurnaceCVObject* i: sprite) { + i->dead=true; + } + memset(tile0,0,80*56*sizeof(short)); + memset(tile1,0,80*56*sizeof(short)); + } + } + + if (respawnTime>0) { + if (--respawnTime<1) { + if (lives>0) { + createObject(lastPlayerX,lastPlayerY); + createObject(lastPlayerX-4,lastPlayerY-4); + soundEffect(SE_RESPAWN); + lives--; + } else { + if (newHiScore) { + inGame=false; + inTransition=false; + for (FurnaceCVObject* i: sprite) { + i->dead=true; + } + memset(tile0,0,80*56*sizeof(short)); + memset(tile1,0,80*56*sizeof(short)); + startTyping(cvText[6],2,3); + e->setConf("cvHiScore",hiScore); + e->saveConf(); + curText=6; + textWait=90; + } else { + startTyping(cvText[5],15,13); + } + } + } + } + + // draw score + putText(CV_FONTBASE_8x8_RED,false,"1UP",0,0); + putText(CV_FONTBASE_8x8,false,fmt::sprintf("%8d",score),3,0); + + putText(CV_FONTBASE_8x8_RED,false,"HI",15,0); + putText(CV_FONTBASE_8x8,false,fmt::sprintf("%8d",hiScore),17,0); + tile1[0][31]=0x27e; + putText(CV_FONTBASE_8x8,false,fmt::sprintf("*%2d",enemyCount),32,0); + tile1[0][36]=0x27f; + putText(CV_FONTBASE_8x8,false,fmt::sprintf("*%2d",lives),37,0); + + } else { + if (inTransition) { + if (--transWait<0) { + stage++; + logV("stage %d",stage+1); + soundEffect(SE_TRANSITION2); + buildStage(stage); + createObject(lastPlayerX,lastPlayerY); + createObject(lastPlayerX-4,lastPlayerY-4); + inGame=true; + } + if (transWait==40) { + putText(CV_FONTBASE_8x16,true,fmt::sprintf("STAGE %d",stage+2),16,13); + } else if (transWait>40) { + for (int i=1; i<28; i++) { + for (int j=0; j<40; j++) { + int result=0x270+(j>>3)+(i>>3)+(transWait>>1)-32; + tile1[i][j]=(result>=0x270 && result<=0x27b)?result:0; + } + } + } else if (transWait==1) { + memset(tile1,0,80*56*sizeof(short)); + } + } else { + if (curText==1) { + if (typeAddr==NULL) { + textWait=1; + if (joyPressed&32) { + playSongs=false; + } + if (joyPressed) { + pleaseInitSongs=true; + textWait=0; + } + } + } else if (joyPressed&15 && curText<5) { + textWait=1; + typeAddr=NULL; + } + if (typeAddr==NULL) { + if (--textWait<0) { + if (curText==5) { + memset(tile1,0,80*56*sizeof(short)); + inGame=true; + } else { + memset(tile1,0,80*56*sizeof(short)); + startTyping(cvText[curText++],2,3); + textWait=90; + } + } + } + } + } + + // render + if (surface==NULL) return; + + SDL_LockSurface(surface); + + // render here + unsigned int* p=(unsigned int*)surface->pixels; + unsigned int* pCopy=p; + unsigned int* paletteInt=(unsigned int*)cvPalette; + unsigned char* pb=prioBuf; + unsigned short y0=scrollY[0]; + unsigned short y1=scrollY[1]; + for (int i=0; i<224; i++) { + rasterH(i); + + unsigned short x0=scrollX[0]%448; + unsigned short x1=scrollX[1]%448; + + y0%=448; + y1%=448; + + for (int j=0; j<320; j++) { + unsigned short t0=tile0[y0>>3][x0>>3]&0xfff; + unsigned short t1=tile1[y1>>3][x1>>3]&0xfff; + + unsigned char td0=tileData[((t0&31)<<3)|(x0&7)|((t0&(~31))<<6)|((y0&7)<<8)]; + unsigned char td1=tileData[((t1&31)<<3)|(x1&7)|((t1&(~31))<<6)|((y1&7)<<8)]; + + if (td1) { + *p++=paletteInt[td1]; + *pb++=2; + } else if (td0) { + *p++=paletteInt[td0]; + *pb++=1; + } else { + *p++=paletteInt[bgColor]; + *pb++=0; + } + + if (++x0>=640) x0=0; + if (++x1>=640) x1=0; + } + + y0++; + y1++; + } + + // draw sprites + p=pCopy; + for (FurnaceCVObject* i: sprite) { + int jk=0; + for (int j=0; jspriteHeight; j++) { + for (int k=0; kspriteWidth; k++) { + int dx=i->x-viewX+(k<<3); + int dy=i->y-viewY+(j<<3); + int ptr=dx+dy*320; + int ptrC=ptr; + unsigned short spriteTile=i->spriteDef[jk]; + for (int l=0; l<8; l++) { + dx=i->x-viewX+(k<<3); + if (dy>=0 && dy<224) for (int m=0; m<8; m++) { + if (dx>=0 && dx<320) { + unsigned char data=tileData[((spriteTile&31)<<3)|m|((spriteTile&(~31))<<6)|(l<<8)]; + if (data) { + if (i->prio>=prioBuf[ptr]) { + p[ptr]=paletteInt[data]; + } + } + } + dx++; + ptr++; + } + dy++; + ptrC+=320; + ptr=ptrC; + } + jk++; + } + } + } + + SDL_UnlockSurface(surface); +} + +void FurnaceCV::addScore(int amount) { + score+=amount; + if (score>=99999999) score=99999999; + if (score>hiScore) { + hiScore=score; + newHiScore=true; + } +} + +void _tileDataRead(void* user, struct GIF_WHDR* data) { + ((FurnaceCV*)user)->tileDataRead(data); +} + +void FurnaceCV::tileDataRead(struct GIF_WHDR* data) { + logV("got tile: %d %d",data->xdim,data->ydim); + logV("frd: %d %d fro: %d %d",data->frxd,data->fryd,data->frxo,data->fryo); + memcpy(tileData,data->bptr,data->xdim*data->ydim); +} + + +bool FurnaceCV::init(DivEngine* eng) { + e=eng; + + tileData=new unsigned char[8*8*4096]; + memset(tileData,0,8*8*4096); + GIF_Load((void*)tileDataC,tileDataC_len,_tileDataRead,NULL,this,0); + + surface=SDL_CreateRGBSurfaceWithFormat(0,320,224,32,SDL_PIXELFORMAT_ARGB8888); + if (surface==NULL) { + logE("FurnaceCV: couldn't create surface!"); + return false; + } + + prioBuf=new unsigned char[320*224]; + memset(prioBuf,0,320*224); + + loadInstruments(); + + return true; +} + +void FurnaceCV::unload() { + SDL_FreeSurface(surface); + delete[] tileData; + delete[] prioBuf; + + if (fxInsBase>=0) { + for (int i=e->song.insLen-1; i>=fxInsBase; i--) { + e->delInstrument(i); + } + } + if (fxChanBase>=0) { + e->removeSystem(e->song.systemLen-1); + } + + if (curStage!=NULL) { + delete[] curStage; + curStage=NULL; + } +} + +#define IS_VISIBLE ((x-cv->viewX+(spriteWidth<<3))>=0 && (x-cv->viewX)<320 && (y-cv->viewY+(spriteHeight<<3))>=0 && (y-cv->viewY)<224) +#define IS_IN_AREA ((x+(spriteWidth<<3))>=0 && (x)<640 && (y+(spriteHeight<<3))>=0 && (y)<448) +#define HITS_BORDER (x<0 || y<0 || (x+(spriteWidth<<3))>=640 || (y+(spriteHeight<<3))>=448) +#define CONFINE_TO_BORDER \ + if (x<0) x=0; \ + if (y<0) y=0; \ + if ((x+(spriteWidth<<3))>=640) x=639-(spriteWidth<<3); \ + if ((y+(spriteHeight<<3))>=448) y=447-(spriteHeight<<3); + +// FurnaceCVPlayer IMPLEMENTATION + +void FurnaceCVPlayer::collision(FurnaceCVObject* other) { + if (other->type==CV_ENEMY_BULLET || + other->type==CV_MINE || + other->type==CV_ENEMY) { + if (!invincible) { + dead=true; + cv->respawnTime=48; + cv->soundEffect(SE_DEATH_C1); + cv->soundEffect(SE_DEATH_C2); + cv->createObject(x-8,y); + cv->createObject(x+8,y); + cv->createObject(x,y-8); + cv->createObject(x,y+8); + cv->createObject(x,y); + } else if (other->type==CV_ENEMY || other->type==CV_MINE) { + cv->soundEffect(SE_EXPL1); + } + } +} + +static const int shootDirOffsX[8]={ + 16, 16, 8, 0, 0, 0, 8, 16 +}; + +static const int shootDirOffsY[8]={ + 8, 0, 0, 0, 8, 16, 16, 16 +}; + +static const int shootDirOrient[8]={ + 0x80, 0, 0, 0, 0x180, 0x100, 0x100, 0x100 +}; + +void FurnaceCVPlayer::tick() { + signed char sdX=0; + signed char sdY=0; + if (cv->joyInput&16) { + speedY-=12; + sdY=-1; + if (speedY<-64) speedY=-64; + } else if (cv->joyInput&32) { + speedY+=12; + sdY=1; + if (speedY>64) speedY=64; + } else { + if (speedY>0) { + speedY-=12; + if (speedY<0) speedY=0; + } else if (speedY<0) { + speedY+=12; + if (speedY>0) speedY=0; + } + } + if (cv->joyInput&64) { + speedX-=12; + sdX=-1; + if (speedX<-64) speedX=-64; + } else if (cv->joyInput&128) { + speedX+=12; + sdX=1; + if (speedX>64) speedX=64; + } else { + if (speedX>0) { + speedX-=12; + if (speedX<0) speedX=0; + } else if (speedX<0) { + speedX+=12; + if (speedX>0) speedX=0; + } + } + + // sqrt(2) + if (speedX && speedY) { + if (speedX>45) speedX=45; + if (speedX<-45) speedX=-45; + if (speedY>45) speedY=45; + if (speedY<-45) speedY=-45; + } + + subX+=speedX; + while (subX>=32) { + x++; + subX-=32; + } + while (subX<0) { + x--; + subX+=32; + } + + subY+=speedY; + while (subY>=32) { + y++; + subY-=32; + } + while (subY<0) { + y--; + subY+=32; + } + + if (HITS_BORDER) { + CONFINE_TO_BORDER; + } + + cv->lastPlayerX=x; + cv->lastPlayerY=y; + + if (sdX>0 && sdY>0) shootDir=7; + if (sdX>0 && sdY<0) shootDir=1; + if (sdX<0 && sdY>0) shootDir=5; + if (sdX<0 && sdY<0) shootDir=3; + if (sdX<0 && sdY==0) shootDir=4; + if (sdX>0 && sdY==0) shootDir=0; + if (sdX==0 && sdY<0) shootDir=2; + if (sdX==0 && sdY>0) shootDir=6; + + if (cv->joyPressed&1) { + shotTimer=(cv->shotType==2)?5:9; + if (cv->shotType==1) { + cv->soundEffect(SE_SHOT2); + } else { + cv->soundEffect(SE_SHOT1); + } + FurnaceCVBullet* b=cv->createObject(x+shootDirOffsX[shootDir],y+shootDirOffsY[shootDir]); + b->orient=shootDir; + b->setType((cv->shotType==1)?1:0); + switch (shootDir) { + case 0: + case 1: + case 7: + b->speedX=160; + break; + case 3: + case 4: + case 5: + b->speedX=-160; + break; + default: + b->speedX=0; + break; + } + switch (shootDir) { + case 1: + case 2: + case 3: + b->speedY=-160; + break; + case 5: + case 6: + case 7: + b->speedY=160; + break; + default: + b->speedY=0; + break; + } + } + + if (cv->joyInput&1) { + if (--shotTimer<1) { + shotTimer=(cv->shotType==2)?4:8; + if (cv->shotType==1) { + cv->soundEffect(SE_SHOT2); + } else { + cv->soundEffect(SE_SHOT1); + } + FurnaceCVBullet* b=cv->createObject(x+shootDirOffsX[shootDir],y+shootDirOffsY[shootDir]); + b->orient=shootDir; + b->setType((cv->shotType==1)?1:0); + switch (shootDir) { + case 0: + case 1: + case 7: + b->speedX=160; + break; + case 3: + case 4: + case 5: + b->speedX=-160; + break; + default: + b->speedX=0; + break; + } + switch (shootDir) { + case 1: + case 2: + case 3: + b->speedY=-160; + break; + case 5: + case 6: + case 7: + b->speedY=160; + break; + default: + b->speedY=0; + break; + } + + if (cv->shotType==2) { + b->speedX+=(rand()%64)-32; + b->speedY+=(rand()%64)-32; + } + } + } + + if (invincible>0) { + invincible--; + } + + if (invincible&1) { + memset(spriteDef,0,9*sizeof(unsigned short)); + } else { + spriteDef[0]=0x10+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[1]=0x11+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[2]=0x12+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[3]=0x30+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[4]=0x31+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[5]=0x32+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[6]=0x50+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[7]=0x51+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + spriteDef[8]=0x52+((animFrame>>6)<<2)+shootDirOrient[shootDir]; + } + + animFrame+=MAX(fabs(speedX),fabs(speedY)); + + // camera + cv->viewX=x-160+12; + cv->viewY=y-112+12; + if (cv->viewX<0) cv->viewX=0; + if (cv->viewX>320) cv->viewX=320; + if (cv->viewY<0) cv->viewY=0; + if (cv->viewY>224) cv->viewY=224; + cv->scrollX[0]=cv->viewX; + cv->scrollY[0]=cv->viewY; +} + +// FurnaceCVBullet IMPLEMENTATION + +void FurnaceCVBullet::setType(unsigned char t) { + bulletType=t; + + if (bulletType==1) { + spriteWidth=2; + spriteHeight=2; + + switch (orient) { + case 0: + spriteDef[0]=0x496; + spriteDef[1]=0x497; + spriteDef[2]=0x4b6; + spriteDef[3]=0x4b7; + break; + case 1: + spriteDef[0]=0x49c; + spriteDef[1]=0x49d; + spriteDef[2]=0x4bc; + spriteDef[3]=0x4bd; + break; + case 2: + spriteDef[0]=0x494; + spriteDef[1]=0x495; + spriteDef[2]=0x4b4; + spriteDef[3]=0x4b5; + break; + case 3: + spriteDef[0]=0x45e; + spriteDef[1]=0x45f; + spriteDef[2]=0x47e; + spriteDef[3]=0x47f; + break; + case 4: + spriteDef[0]=0x49a; + spriteDef[1]=0x49b; + spriteDef[2]=0x4ba; + spriteDef[3]=0x4bb; + break; + case 5: + spriteDef[0]=0x45c; + spriteDef[1]=0x45d; + spriteDef[2]=0x47c; + spriteDef[3]=0x47d; + break; + case 6: + spriteDef[0]=0x498; + spriteDef[1]=0x499; + spriteDef[2]=0x4b8; + spriteDef[3]=0x4b9; + break; + case 7: + spriteDef[0]=0x49e; + spriteDef[1]=0x49f; + spriteDef[2]=0x4be; + spriteDef[3]=0x4bf; + break; + } + + collX0=0; + collX1=15; + collY0=0; + collY1=15; + + life=11; + } +} + +void FurnaceCVBullet::killBullet() { + if (bulletType==1) { + cv->soundEffect(SE_EXPL1); + FurnaceCVBullet* b1=cv->createObject(x+4,y+4); + FurnaceCVBullet* b2=cv->createObject(x+4,y+4); + FurnaceCVBullet* b3=cv->createObject(x+4,y+4); + switch (orient) { + case 0: + b1->speedX=240; + b1->speedY=-100; + b2->speedX=240; + b2->speedY=0; + b3->speedX=240; + b3->speedY=100; + break; + case 1: + b1->speedX=130; + b1->speedY=-170; + b2->speedX=170; + b2->speedY=-170; + b3->speedX=170; + b3->speedY=-130; + break; + case 2: + b1->speedX=-100; + b1->speedY=-240; + b2->speedX=0; + b2->speedY=-240; + b3->speedX=100; + b3->speedY=-240; + break; + case 3: + b1->speedX=-130; + b1->speedY=-170; + b2->speedX=-170; + b2->speedY=-170; + b3->speedX=-170; + b3->speedY=-130; + break; + case 4: + b1->speedX=-240; + b1->speedY=-100; + b2->speedX=-240; + b2->speedY=0; + b3->speedX=-240; + b3->speedY=100; + break; + case 5: + b1->speedX=-130; + b1->speedY=170; + b2->speedX=-170; + b2->speedY=170; + b3->speedX=-170; + b3->speedY=130; + break; + case 6: + b1->speedX=-100; + b1->speedY=240; + b2->speedX=0; + b2->speedY=240; + b3->speedX=100; + b3->speedY=240; + break; + case 7: + b1->speedX=130; + b1->speedY=170; + b2->speedX=170; + b2->speedY=170; + b3->speedX=170; + b3->speedY=130; + break; + } + b1->orient=orient; + b2->orient=orient; + b3->orient=orient; + cv->createObject(x-8,y-8); + } else { + cv->createObject(x,y); + } +} + +void FurnaceCVBullet::collision(FurnaceCVObject* other) { + if (other->type==CV_ENEMY || other->type==CV_MINE) { + dead=true; + killBullet(); + } +} + +void FurnaceCVBullet::tick() { + subX+=speedX; + while (subX>=32) { + x++; + subX-=32; + } + while (subX<0) { + x--; + subX+=32; + } + + subY+=speedY; + while (subY>=32) { + y++; + subY-=32; + } + while (subY<0) { + y--; + subY+=32; + } + + if (life>0) { + if (--life<=0) { + dead=true; + killBullet(); + } + } + + if (!IS_IN_AREA) { + dead=true; + } +} + +// FurnaceCVEnemyBullet IMPLEMENTATION + +void FurnaceCVEnemyBullet::setType(unsigned char type) { + bulletType=type; +} + +void FurnaceCVEnemyBullet::tick() { + subX+=speedX; + while (subX>=32) { + x++; + subX-=32; + } + while (subX<0) { + x--; + subX+=32; + } + + subY+=speedY; + while (subY>=32) { + y++; + subY-=32; + } + while (subY<0) { + y--; + subY+=32; + } + + if (bulletType==1) { + animFrame+=10+(rand()%12); + spriteDef[0]=0x28+(animFrame>>6); + } + + if (!IS_IN_AREA) { + dead=true; + } +} + +// FurnaceCVEnemy1 IMPLEMENTATION + +void FurnaceCVEnemy1::collision(FurnaceCVObject* other) { + if (other->type==CV_BULLET || other->type==CV_PLAYER) { + if (--health<=0) { + dead=true; + if ((rand()%7)==0) { + switch (rand()%10) { + case 0: + cv->createObject(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0)); + break; + case 1: case 2: case 3: case 4: + cv->createObject(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0)); + break; + case 5: case 6: case 7: case 8: case 9: + cv->createObject(x+(enemyType>=2?8:0),y+(enemyType>=2?8:0)); + break; + } + } + cv->soundEffect(SE_EXPL1); + switch (enemyType) { + case 0: + cv->createObject(x-4,y-4); + cv->addScore(100); + break; + case 1: + cv->createObject(x-4,y-4); + cv->addScore(200); + break; + case 2: + cv->createObject(x-8,y); + cv->createObject(x+8,y); + cv->createObject(x,y-8); + cv->createObject(x,y+8); + cv->createObject(x,y); + cv->addScore(400); + break; + case 3: + cv->createObject(x-8,y); + cv->createObject(x+8,y); + cv->createObject(x,y-8); + cv->createObject(x,y+8); + cv->createObject(x,y); + cv->addScore(800); + break; + } + } else { + cv->soundEffect(SE_RESIST); + } + } else if (other->type==CV_ENEMY || other->type==CV_MINE) { + // reorient + orient=(orient+2)&3; + } +} + +void FurnaceCVEnemy1::tick() { + if (!stopped) { + switch (orient) { + case 0: + x+=MAX(1,enemyType); + break; + case 1: + y-=MAX(1,enemyType); + break; + case 2: + x-=MAX(1,enemyType); + break; + case 3: + y+=MAX(1,enemyType); + break; + } + animFrame+=0x15; + } + + if (--nextTime==0) { + nextTime=64+(rand()%600); + + stopped=((rand()%10)==0); + if (stopped) { + nextTime>>=2; + cv->stopSoundEffect(SE_TANKMOVE); + } else { + unsigned char oldOrient=orient; + orient=rand()&3; + if (orient==oldOrient) orient=(orient+1)&3; + cv->soundEffect(SE_TANKMOVE); + } + } + + if (shootCooldown>64) { + shootCooldown+=16*(enemyType+1); + } else if (--shootTime==0) { + shootTime=(enemyType>=2)?4:8; + for (FurnaceCVObject* i: cv->sprite) { + if (i->type==CV_PLAYER) { + float dist=sqrt(pow((y+8)-(i->y+12),2.0)+pow((i->x+12)-(x+8),2.0)); + float angle=atan2((y+8)-(i->y+12),(i->x+12)-(x+8))/(M_PI*0.5); + if (angle<0.0) angle+=4.0; + float angleDelta=angle-(float)orient; + if (angleDelta>=2.0) angleDelta-=4.0; + if (angleDelta<-2.0) angleDelta+=4.0; + if (fabs(angleDelta)<0.3 && dist<256.0 && IS_VISIBLE) { + cv->soundEffect(SE_SHOT1); + shootCooldown+=16-enemyType*2; + FurnaceCVEnemyBullet* b=cv->createObject(x+(enemyType>=2?8:4),y+(enemyType>=2?8:4)); + switch (orient) { + case 0: + b->speedX=160; + break; + case 1: + b->speedY=-160; + break; + case 2: + b->speedX=-160; + break; + case 3: + b->speedY=160; + break; + } + + if (enemyType>0) { + b->speedX+=(rand()%64)-32; + b->speedY+=(rand()%64)-32; + } + } + break; + } + } + } + + if (HITS_BORDER) { + if (x<0) orient=0; + if (x>=640-16) orient=2; + if (y<0) orient=3; + if (y>=224-16) orient=1; + cv->soundEffect(SE_TANKMOVE); + CONFINE_TO_BORDER; + } + + if (enemyType>=2) { + spriteWidth=3; + spriteHeight=3; + collX1=23; + collY1=23; + switch (orient) { + case 0: + spriteDef[0]=0x300+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[1]=0x301+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[2]=0x302+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[3]=0x320+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[4]=0x321+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[5]=0x322+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[6]=0x340+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[7]=0x341+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[8]=0x342+((animFrame>>7)<<2)+(enemyType==3?8:0); + break; + case 1: + spriteDef[0]=0x280+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[1]=0x281+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[2]=0x282+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[3]=0x2a0+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[4]=0x2a1+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[5]=0x2a2+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[6]=0x2c0+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[7]=0x2c1+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[8]=0x2c2+((animFrame>>7)<<2)+(enemyType==3?8:0); + break; + case 2: + spriteDef[0]=0x400+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[1]=0x401+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[2]=0x402+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[3]=0x420+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[4]=0x421+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[5]=0x422+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[6]=0x440+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[7]=0x441+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[8]=0x442+((animFrame>>7)<<2)+(enemyType==3?8:0); + break; + case 3: + spriteDef[0]=0x380+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[1]=0x381+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[2]=0x382+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[3]=0x3a0+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[4]=0x3a1+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[5]=0x3a2+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[6]=0x3c0+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[7]=0x3c1+((animFrame>>7)<<2)+(enemyType==3?8:0); + spriteDef[8]=0x3c2+((animFrame>>7)<<2)+(enemyType==3?8:0); + break; + } + } else { + spriteWidth=2; + spriteHeight=2; + collX1=15; + collY1=15; + switch (orient) { + case 0: + spriteDef[0]=0x204+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[1]=0x205+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[2]=0x224+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[3]=0x225+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + break; + case 1: + spriteDef[0]=0x200+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[1]=0x201+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[2]=0x220+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[3]=0x221+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + break; + case 2: + spriteDef[0]=0x20c+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[1]=0x20d+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[2]=0x22c+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[3]=0x22d+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + break; + case 3: + spriteDef[0]=0x208+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[1]=0x209+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[2]=0x228+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + spriteDef[3]=0x229+((animFrame>>7)<<1)+(enemyType==1?0x40:0); + break; + } + } +} + +void FurnaceCVEnemy1::setType(unsigned char t) { + enemyType=t; + switch (enemyType) { + case 0: + health=1; + break; + case 1: + health=2; + break; + case 2: + health=8; + break; + case 3: + health=14; + break; + } +} + +// FurnaceCVExplTiny IMPLEMENTATION + +void FurnaceCVExplTiny::tick() { + spriteDef[0]=8+(animFrame>>1); + + if (animFrame>=4) { + spriteDef[0]=0; + dead=true; + } + + animFrame++; +} + +// FurnaceCVExplMedium IMPLEMENTATION + +void FurnaceCVExplMedium::tick() { + if ((animFrame/3)>=5) { + memset(spriteDef,0,9*sizeof(unsigned short)); + dead=true; + } else { + spriteDef[0]=0x210+(animFrame/3)*3; + spriteDef[1]=0x211+(animFrame/3)*3; + spriteDef[2]=0x212+(animFrame/3)*3; + spriteDef[3]=0x230+(animFrame/3)*3; + spriteDef[4]=0x231+(animFrame/3)*3; + spriteDef[5]=0x232+(animFrame/3)*3; + spriteDef[6]=0x250+(animFrame/3)*3; + spriteDef[7]=0x251+(animFrame/3)*3; + spriteDef[8]=0x252+(animFrame/3)*3; + } + + animFrame++; +} + +// FurnaceCVFurBallMedium IMPLEMENTATION + +void FurnaceCVFurBallMedium::tick() { + if ((animFrame/3)>=4) { + memset(spriteDef,0,9*sizeof(unsigned short)); + dead=true; + } else { + spriteDef[0]=0x410+(animFrame/3)*3; + spriteDef[1]=0x411+(animFrame/3)*3; + spriteDef[2]=0x412+(animFrame/3)*3; + spriteDef[3]=0x430+(animFrame/3)*3; + spriteDef[4]=0x431+(animFrame/3)*3; + spriteDef[5]=0x432+(animFrame/3)*3; + spriteDef[6]=0x450+(animFrame/3)*3; + spriteDef[7]=0x451+(animFrame/3)*3; + spriteDef[8]=0x452+(animFrame/3)*3; + } + + animFrame++; +} + +// FurnaceCVFurBallLarge IMPLEMENTATION + +void FurnaceCVFurBallLarge::tick() { + if ((animFrame/3)>=4) { + memset(spriteDef,0,16*sizeof(unsigned short)); + dead=true; + } else { + for (int i=0; i<4; i++) { + spriteDef[i<<2]=(i<<5)+0x390+((animFrame/3)<<2); + spriteDef[1+(i<<2)]=(i<<5)+0x391+((animFrame/3)<<2); + spriteDef[2+(i<<2)]=(i<<5)+0x392+((animFrame/3)<<2); + spriteDef[3+(i<<2)]=(i<<5)+0x393+((animFrame/3)<<2); + } + } + + animFrame++; +} + +// INSTRUMENTS + +static const unsigned char __00_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x06, 0x00, + 0x73, 0x68, 0x6f, 0x74, 0x31, 0x00, 0x4d, 0x41, 0x8c, 0x00, 0x08, 0x00, + 0x00, 0x0b, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0b, 0x09, 0x07, + 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x01, 0x10, 0xff, 0xff, 0x00, + 0xc1, 0x00, 0x01, 0x42, 0x00, 0x00, 0x40, 0x48, 0x00, 0x00, 0x40, 0x3c, + 0x00, 0x00, 0x40, 0x36, 0x00, 0x00, 0x40, 0x32, 0x00, 0x00, 0x40, 0x2f, + 0x00, 0x00, 0x40, 0x28, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, 0x40, 0x21, + 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x40, 0x24, + 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, 0x40, 0x24, + 0x00, 0x00, 0x40, 0x21, 0x00, 0x00, 0x40, 0x05, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x0e, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x0f, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0d, 0x10, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0e, 0x13, 0x01, 0xff, 0xff, 0x00, + 0x81, 0x00, 0x01, 0xd8, 0x75, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x03 +}; +static const unsigned int __00_fui_len = 167; +static const unsigned char __01_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0c, 0x00, + 0x65, 0x78, 0x70, 0x6c, 0x31, 0x20, 0x28, 0x47, 0x2d, 0x35, 0x29, 0x00, + 0x4d, 0x41, 0xc5, 0x00, 0x08, 0x00, 0x00, 0x3a, 0xff, 0xff, 0x00, 0x01, + 0x00, 0x01, 0x0a, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0e, 0x0f, 0x09, 0x0e, + 0x0d, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, + 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x25, 0x06, 0xff, 0x00, 0x41, 0x00, 0x01, 0xf5, 0xe9, 0xe7, 0xe5, + 0xe4, 0x04, 0x03, 0xf9, 0xf4, 0x01, 0xfa, 0x03, 0xf3, 0xf2, 0x00, 0xf4, + 0x04, 0x05, 0xf8, 0x00, 0xf9, 0x01, 0xf9, 0xfc, 0xfc, 0xf7, 0x02, 0xff, + 0xf8, 0x04, 0x00, 0xf7, 0xf7, 0xff, 0xfa, 0x00, 0xfb, 0x05, 0x06, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x0e, + 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x06, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x06, 0x10, 0x06, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x05, 0x04, 0x04, 0x04, 0x04, 0x0c, + 0x13, 0x06, 0xff, 0xff, 0x00, 0xc1, 0x00, 0x01, 0xad, 0x3a, 0x00, 0x00, + 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, + 0xaa, 0xaa, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, 0xff, 0x50, 0x4e, 0x01, + 0x00, 0x00 +}; +static const unsigned int __01_fui_len = 230; +static const unsigned char __02_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0e, 0x00, + 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x31, 0x20, 0x28, 0x47, 0x2d, 0x35, + 0x29, 0x00, 0x4d, 0x41, 0x5d, 0x00, 0x08, 0x00, 0x00, 0x21, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0f, 0x04, 0x04, 0x0c, 0x0c, 0x03, 0x03, + 0x0a, 0x0a, 0x02, 0x02, 0x08, 0x08, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x04, 0x00, 0xff, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x07, + 0x0c, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, + 0x55, 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __02_fui_len = 128; +static const unsigned char __03_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0e, 0x00, + 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x32, 0x20, 0x28, 0x41, 0x2d, 0x35, + 0x29, 0x00, 0x4d, 0x41, 0x44, 0x00, 0x08, 0x00, 0x00, 0x0a, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0e, 0x04, 0x0d, 0x0c, 0x03, 0x02, 0x02, + 0x01, 0x00, 0x01, 0x02, 0x00, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x07, + 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, 0x55, + 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __03_fui_len = 103; +static const unsigned char __04_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0f, 0x00, + 0x64, 0x65, 0x61, 0x74, 0x68, 0x20, 0x63, 0x31, 0x20, 0x28, 0x43, 0x2d, + 0x34, 0x29, 0x00, 0x4d, 0x41, 0xbf, 0x00, 0x08, 0x00, 0x00, 0x50, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0e, 0x0b, 0x09, 0x0f, 0x0f, 0x0f, + 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x09, + 0x08, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, + 0x09, 0x09, 0x09, 0x08, 0x08, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x01, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x10, 0x00, 0xff, 0x00, 0x41, 0x00, 0x01, 0xff, 0xf7, 0xf0, + 0xef, 0x06, 0x02, 0xfd, 0xfb, 0xf7, 0xf5, 0xf3, 0xf1, 0xf0, 0xee, 0xec, + 0xec, 0x04, 0x01, 0x00, 0xff, 0x01, 0x41, 0x00, 0x01, 0xf6, 0x05, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x10, 0x00, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x13, 0x01, 0xff, 0xff, 0x00, + 0x81, 0x00, 0x01, 0x55, 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __04_fui_len = 227; +static const unsigned char __05_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0f, 0x00, + 0x64, 0x65, 0x61, 0x74, 0x68, 0x20, 0x63, 0x32, 0x20, 0x28, 0x43, 0x2d, + 0x34, 0x29, 0x00, 0x4d, 0x41, 0xd8, 0x00, 0x08, 0x00, 0x00, 0x51, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x08, 0x0b, 0x0b, 0x0c, 0x0f, 0x0f, 0x0f, + 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x05, 0x07, 0x07, + 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, + 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x10, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x36, 0x15, + 0x0f, 0x0b, 0x39, 0x37, 0x35, 0x34, 0x33, 0x32, 0x31, 0x31, 0x30, 0x2f, + 0x2f, 0x2e, 0x04, 0x01, 0x00, 0xff, 0x01, 0x41, 0x00, 0x01, 0xf6, 0x05, + 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0e, 0x10, 0x00, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x00, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x13, 0x01, 0xff, 0xff, + 0x00, 0x81, 0x00, 0x01, 0xf5, 0x75, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __05_fui_len = 252; +static const unsigned char __07_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0b, 0x00, + 0x74, 0x79, 0x70, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x00, 0x4d, + 0x41, 0x4c, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x06, 0x05, 0x04, 0x00, 0x01, 0x01, 0x00, 0xff, 0x00, 0xc1, 0x00, + 0x01, 0x3e, 0x00, 0x00, 0x40, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x0e, 0x04, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x0f, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0e, 0x10, + 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x07, 0x13, 0x01, 0xff, 0xff, + 0x00, 0x81, 0x00, 0x01, 0xc5, 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x03 +}; +static const unsigned int __07_fui_len = 108; +static const unsigned char __08_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x12, 0x00, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x20, + 0x28, 0x47, 0x2d, 0x33, 0x29, 0x00, 0x4d, 0x41, 0xdf, 0x00, 0x08, 0x00, + 0x00, 0x5e, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0c, 0x0b, 0x0b, 0x0a, + 0x09, 0x08, 0x08, 0x08, 0x0f, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x0a, + 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, + 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, + 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x1b, 0x17, 0xff, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x04, 0x07, 0x04, 0x07, 0x0c, 0x07, 0x0c, 0x10, 0x0c, + 0x10, 0x13, 0x10, 0x13, 0x18, 0x13, 0x18, 0x1c, 0x18, 0x1c, 0x1f, 0x1c, + 0x1f, 0x24, 0x1f, 0x1c, 0x1f, 0x04, 0x26, 0x25, 0xff, 0x01, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x0e, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, + 0x00, 0x01, 0x55, 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __08_fui_len = 262; +static const unsigned char __09_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x12, 0x00, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x20, + 0x28, 0x43, 0x2d, 0x34, 0x29, 0x00, 0x4d, 0x41, 0x77, 0x00, 0x08, 0x00, + 0x00, 0x3b, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0e, 0x0c, 0x0b, + 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x02, 0x02, + 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x03, 0x03, + 0x02, 0x02, 0x01, 0x01, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, + 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x03, 0x03, 0x02, + 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x04, 0x00, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x04, 0x07, 0x0e, 0x12, 0x05, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x13, 0x01, + 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, 0x55, 0x55, 0xff, 0x50, 0x4e, 0x01, + 0x00, 0x00 +}; +static const unsigned int __09_fui_len = 158; +static const unsigned char __0a_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0b, 0x00, + 0x69, 0x6e, 0x69, 0x74, 0x20, 0x28, 0x43, 0x2d, 0x34, 0x29, 0x00, 0x4d, + 0x41, 0x6a, 0x00, 0x08, 0x00, 0x00, 0x29, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x0f, 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, + 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x00, 0x01, 0x09, 0x03, 0xff, 0x00, 0x01, + 0x00, 0x01, 0x07, 0x13, 0x07, 0x0b, 0x07, 0x04, 0x08, 0x0e, 0x04, 0x05, + 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x01, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, 0x55, 0x55, + 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __0a_fui_len = 138; +static const unsigned char __0b_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4e, 0x41, 0x0e, 0x00, + 0x72, 0x65, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x20, 0x28, 0x43, 0x2d, 0x34, + 0x29, 0x00, 0x4d, 0x41, 0x69, 0x00, 0x08, 0x00, 0x00, 0x29, 0xff, 0xff, + 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0c, 0x0b, 0x0a, 0x05, 0x0f, 0x0c, 0x0b, + 0x0a, 0x05, 0x0f, 0x0c, 0x0b, 0x0a, 0x05, 0x0f, 0x0c, 0x0b, 0x0a, 0x05, + 0x0f, 0x0c, 0x0b, 0x0a, 0x05, 0x0f, 0x0c, 0x0b, 0x0a, 0x05, 0x0f, 0x0c, + 0x0b, 0x08, 0x05, 0x0f, 0x0d, 0x0b, 0x09, 0x05, 0x00, 0x01, 0x08, 0x08, + 0xff, 0x00, 0x01, 0x00, 0x05, 0x10, 0x0f, 0x0d, 0x15, 0x14, 0x0d, 0x0f, + 0x10, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, + 0x55, 0x55, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __0b_fui_len = 140; +static const unsigned char __0c_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x39, 0x00, 0x4e, 0x41, 0x09, 0x00, + 0x74, 0x61, 0x6e, 0x6b, 0x6d, 0x6f, 0x76, 0x65, 0x00, 0x4d, 0x41, 0x92, + 0x01, 0x08, 0x00, 0x00, 0xff, 0x0b, 0xff, 0x00, 0x01, 0x00, 0x01, 0x04, + 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x04, 0x05, 0x04, + 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, + 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x05, + 0x05, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, + 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, + 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, + 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, + 0x05, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x05, 0x04, 0x04, 0x05, + 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, + 0x05, 0x04, 0x05, 0x04, 0x04, 0x05, 0x05, 0x04, 0x05, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x04, + 0x05, 0x04, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x04, 0x01, 0x02, 0x00, 0xff, 0x00, 0x41, 0x00, 0x01, 0xf4, 0xce, + 0x04, 0x10, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, 0xb8, 0x00, 0xd9, 0x00, + 0x02, 0x01, 0x18, 0x01, 0xd7, 0x00, 0xa3, 0x00, 0x79, 0x00, 0x59, 0x00, + 0x3e, 0x00, 0x2b, 0x00, 0x1b, 0x00, 0x0f, 0x00, 0x05, 0x00, 0xfe, 0xff, + 0xfe, 0xff, 0xf5, 0xff, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x06, 0x02, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x52, 0x00, 0x07, + 0x02, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x15, 0x00, 0x0e, 0x01, 0xff, + 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x02, 0x00, 0xff, 0x00, 0x01, + 0x00, 0x01, 0x02, 0x0d, 0x10, 0x02, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x0c, 0x0a, 0x11, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x12, + 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0b, 0x13, 0x01, 0x00, 0xff, + 0x00, 0x81, 0x00, 0x01, 0xaa, 0x5a, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __0c_fui_len = 432; +static const unsigned char __0d_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x39, 0x00, 0x4e, 0x41, 0x0b, 0x00, + 0x76, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x6d, 0x6f, 0x76, 0x65, 0x00, 0x4d, + 0x41, 0x68, 0x00, 0x08, 0x00, 0x00, 0x10, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x0a, 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06, 0x06, 0x07, 0x08, 0x09, + 0x0b, 0x0b, 0x0c, 0x0c, 0x00, 0x01, 0x0f, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x06, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x3a, 0x07, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x01, 0x11, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x01, 0x12, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0x50, + 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __0d_fui_len = 136; +static const unsigned char __0e_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x39, 0x00, 0x4e, 0x41, 0x0c, 0x00, + 0x76, 0x6f, 0x72, 0x74, 0x65, 0x78, 0x73, 0x68, 0x6f, 0x6f, 0x74, 0x00, + 0x4d, 0x41, 0xc1, 0x00, 0x08, 0x00, 0x00, 0x3c, 0xff, 0xff, 0x00, 0x01, + 0x00, 0x01, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, + 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07, 0x07, + 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x01, 0x00, 0x01, 0x3c, 0xff, 0xff, 0x00, 0x41, 0x00, 0x01, 0x0b, 0x09, + 0x0b, 0x07, 0x0b, 0x05, 0x0b, 0x03, 0x0b, 0x01, 0x0b, 0xfe, 0x0b, 0xfc, + 0x0b, 0xfa, 0x0b, 0x05, 0x0b, 0x04, 0x0b, 0x03, 0x0b, 0x02, 0x0b, 0x01, + 0x0b, 0x00, 0x0b, 0xff, 0x0b, 0xfe, 0x0b, 0xfd, 0x0b, 0xfc, 0x0b, 0xfb, + 0x0b, 0xfa, 0x0b, 0xf9, 0x0b, 0xf7, 0x0b, 0xf6, 0x0b, 0xf5, 0x0b, 0xf4, + 0x0b, 0xf3, 0x0b, 0xf2, 0x0b, 0xf1, 0x0b, 0xef, 0x0b, 0xee, 0x05, 0x01, + 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0c, 0x06, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0xff, 0x07, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x04, 0x0e, 0x01, 0x00, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x11, 0x01, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x12, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x00, 0xff, 0x50, 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __0e_fui_len = 226; +static const unsigned char __06_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4d, 0x41, 0xbf, 0x00, + 0x08, 0x00, 0x00, 0x1c, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x0e, + 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, + 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, + 0x01, 0x00, 0x01, 0x15, 0xff, 0xff, 0x00, 0xc1, 0x00, 0x01, 0x5d, 0x00, + 0x00, 0x40, 0x63, 0x00, 0x00, 0x40, 0x35, 0x00, 0x00, 0x40, 0x35, 0x00, + 0x00, 0x40, 0x31, 0x00, 0x00, 0x40, 0x2e, 0x00, 0x00, 0x40, 0x2b, 0x00, + 0x00, 0x40, 0x29, 0x00, 0x00, 0x40, 0x27, 0x00, 0x00, 0x40, 0x26, 0x00, + 0x00, 0x40, 0x24, 0x00, 0x00, 0x40, 0x23, 0x00, 0x00, 0x40, 0x22, 0x00, + 0x00, 0x40, 0x1e, 0x00, 0x00, 0x40, 0x1d, 0x00, 0x00, 0x40, 0x1c, 0x00, + 0x00, 0x40, 0x1b, 0x00, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x40, 0x1a, 0x00, + 0x00, 0x40, 0x19, 0x00, 0x00, 0x40, 0x18, 0x00, 0x00, 0x40, 0x05, 0x03, + 0x04, 0x04, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x0e, 0x01, 0x01, + 0x04, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x03, 0x04, 0x04, 0x00, 0x01, + 0x00, 0x01, 0x0d, 0x0d, 0x01, 0x10, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, + 0x01, 0x0e, 0x13, 0x03, 0x05, 0x04, 0x00, 0xc1, 0x00, 0x01, 0xd8, 0x75, + 0x00, 0x00, 0xaa, 0xea, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xff, 0x50, + 0x4e, 0x01, 0x00, 0x00 +}; +static const unsigned int __06_fui_len = 208; +static const unsigned char __0f_fui[] = { + 0x46, 0x49, 0x4e, 0x53, 0xc4, 0x00, 0x38, 0x00, 0x4d, 0x41, 0x54, 0x00, + 0x08, 0x00, 0x00, 0x0b, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x0f, 0x09, + 0x06, 0x04, 0x04, 0x03, 0x03, 0x02, 0x01, 0x01, 0x00, 0x01, 0x02, 0x00, + 0xff, 0x00, 0xc1, 0x00, 0x02, 0x3e, 0x00, 0x00, 0x40, 0x4e, 0x00, 0x00, + 0x40, 0x05, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0e, 0x01, + 0x06, 0xff, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0f, 0x01, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x01, 0x04, 0x10, 0x01, 0xff, 0xff, 0x00, 0x01, 0x00, 0x01, + 0x09, 0x13, 0x01, 0xff, 0xff, 0x00, 0x81, 0x00, 0x01, 0xc5, 0x55, 0xff, + 0x50, 0x4e, 0x01, 0x00, 0x03 +}; +static const unsigned int __0f_fui_len = 101; + +#define LOAD_INS(x,y) { \ + DivInstrument* newIns=new DivInstrument; \ + SafeReader reader(x,y); \ + newIns->readInsData(reader,DIV_ENGINE_VERSION,&e->song); \ + newIns->std.volMacro.speed*=macroMul; \ + newIns->std.arpMacro.speed*=macroMul; \ + newIns->std.dutyMacro.speed*=macroMul; \ + newIns->std.waveMacro.speed*=macroMul; \ + newIns->std.pitchMacro.speed*=macroMul; \ + newIns->std.phaseResetMacro.speed*=macroMul; \ + newIns->std.ex1Macro.speed*=macroMul; \ + newIns->std.ex2Macro.speed*=macroMul; \ + newIns->std.ex3Macro.speed*=macroMul; \ + newIns->std.ex4Macro.speed*=macroMul; \ + newIns->std.ex5Macro.speed*=macroMul; \ + newIns->std.ex6Macro.speed*=macroMul; \ + newIns->std.ex7Macro.speed*=macroMul; \ + newIns->std.ex8Macro.speed*=macroMul; \ + e->addInstrumentPtr(newIns); \ +} + +void FurnaceCV::loadInstruments() { + logV("loadInstruments"); + fxInsBase=e->song.ins.size(); + fxChanBase=e->getTotalChannelCount(); + + int macroMul=(int)((e->curSubSong->hz+20.0)/60.0); + + int sys=e->song.systemLen; + if (e->addSystem(DIV_SYSTEM_POWERNOISE)) { + if (e->song.masterVol<0.1) { + e->song.systemVol[sys]=12.0; + } else { + e->song.systemVol[sys]=1.2/e->song.masterVol; + } + } + + + LOAD_INS(__00_fui,__00_fui_len); + LOAD_INS(__01_fui,__01_fui_len); + LOAD_INS(__02_fui,__02_fui_len); + LOAD_INS(__03_fui,__03_fui_len); + LOAD_INS(__04_fui,__04_fui_len); + LOAD_INS(__05_fui,__05_fui_len); + LOAD_INS(__06_fui,__06_fui_len); + LOAD_INS(__07_fui,__07_fui_len); + LOAD_INS(__08_fui,__08_fui_len); + LOAD_INS(__09_fui,__09_fui_len); + LOAD_INS(__0a_fui,__0a_fui_len); + LOAD_INS(__0b_fui,__0b_fui_len); + LOAD_INS(__0c_fui,__0c_fui_len); + LOAD_INS(__0d_fui,__0d_fui_len); + LOAD_INS(__0e_fui,__0e_fui_len); + LOAD_INS(__0f_fui,__0f_fui_len); +} + +// FurnaceCVMine IMPLEMENTATION + +void FurnaceCVMine::collision(FurnaceCVObject* other) { + if (other->type==CV_BULLET || other->type==CV_PLAYER) { + dead=true; + cv->createObject(x-4,y-4); + cv->soundEffect(SE_EXPL1); + cv->addScore(rand()%50); + } +} + +// FurnaceCVPowerupP IMPLEMENTATION + +void FurnaceCVPowerupP::collision(FurnaceCVObject* other) { + if (other->type==CV_PLAYER) { + dead=true; + cv->shotType=1; + cv->soundEffect(SE_PICKUP2); + cv->addScore(200); + } +} + +void FurnaceCVPowerupP::tick() { + if (--life==0) dead=true; + + if (life>64 || (life&1)) { + spriteDef[0]=0x490; + spriteDef[1]=0x491; + spriteDef[2]=0x4b0; + spriteDef[3]=0x4b1; + } else { + spriteDef[0]=0; + spriteDef[1]=0; + spriteDef[2]=0; + spriteDef[3]=0; + } +} + +// FurnaceCVPowerupS IMPLEMENTATION + +void FurnaceCVPowerupS::collision(FurnaceCVObject* other) { + if (other->type==CV_PLAYER) { + dead=true; + cv->shotType=2; + cv->soundEffect(SE_PICKUP2); + cv->addScore(200); + } +} + +void FurnaceCVPowerupS::tick() { + if (--life==0) dead=true; + + if (life>64 || (life&1)) { + spriteDef[0]=0x492; + spriteDef[1]=0x493; + spriteDef[2]=0x4b2; + spriteDef[3]=0x4b3; + } else { + spriteDef[0]=0; + spriteDef[1]=0; + spriteDef[2]=0; + spriteDef[3]=0; + } +} + +// FurnaceCVExtraLife IMPLEMENTATION + +void FurnaceCVExtraLife::collision(FurnaceCVObject* other) { + if (other->type==CV_PLAYER) { + dead=true; + cv->soundEffect(SE_PICKUP1); + cv->lives++; + } +} + +void FurnaceCVExtraLife::tick() { + if (--life==0) dead=true; + + if (life>64 || (life&1)) { + spriteDef[0]=0x0c; + spriteDef[1]=0x0d; + spriteDef[2]=0x2c; + spriteDef[3]=0x2d; + } else { + spriteDef[0]=0; + spriteDef[1]=0; + spriteDef[2]=0; + spriteDef[3]=0; + } +} + +// FurnaceCVEnemyVortex IMPLEMENTATION + +void FurnaceCVEnemyVortex::collision(FurnaceCVObject* other) { + if (other->type==CV_BULLET || other->type==CV_PLAYER) { + dead=true; + if ((rand()%2)==0) { + switch (rand()%10) { + case 0: + cv->createObject(x,y); + break; + case 1: case 2: case 3: case 4: + cv->createObject(x,y); + break; + case 5: case 6: case 7: case 8: case 9: + cv->createObject(x,y); + break; + } + } + cv->soundEffect(SE_EXPL1); + cv->createObject(x-4,y-4); + cv->addScore(1000); + } +} + +void FurnaceCVEnemyVortex::tick() { + x+=speedX; + y+=speedY; + animFrame+=0x08; + + if (--nextTime==0) { + nextTime=10+(rand()%160); + speedX=(rand()%5)-2; + speedY=(rand()%5)-2; + cv->soundEffect(SE_VORTEXMOVE); + } + + if (--shootTime==0) { + shootTime=6+(rand()%100); + cv->soundEffect(SE_VORTEXSHOOT); + for (int i=0; i<6+cv->stage; i++) { + float fraction=(float)i/(float)(5+cv->stage); + float xs=cos(fraction*M_PI*2.0)*28; + float ys=sin(fraction*M_PI*2.0)*28; + FurnaceCVEnemyBullet* b=cv->createObject(x+4,y+4); + b->setType(1); + b->speedX=xs; + b->speedY=ys; + } + } + + if (HITS_BORDER) { + CONFINE_TO_BORDER; + } + + spriteDef[0]=0x480+((animFrame>>5)<<1); + spriteDef[1]=0x481+((animFrame>>5)<<1); + spriteDef[2]=0x4a0+((animFrame>>5)<<1); + spriteDef[3]=0x4a1+((animFrame>>5)<<1); +} diff --git a/src/main.cpp b/src/main.cpp index a954759a7..34c02e480 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -645,6 +645,7 @@ int main(int argc, char** argv) { if (benchMode) { logI("starting benchmark!"); + e.setNumTimesPlayed(-1); if (benchMode==2) { e.benchmarkSeek(); } else { @@ -655,6 +656,7 @@ int main(int argc, char** argv) { } if (outName!="" || vgmOutName!="" || cmdOutName!="") { + e.setNumTimesPlayed(-1); if (cmdOutName!="") { SafeWriter* w=e.saveCommand(); if (w!=NULL) { @@ -698,6 +700,7 @@ int main(int argc, char** argv) { if (consoleMode) { bool cliSuccess=false; + e.setNumTimesPlayed(-1); cli.bindEngine(&e); if (!cli.init()) { reportError("error while starting CLI!");